package net.pterodactylus.sone.web.pages import net.pterodactylus.sone.data.Profile import net.pterodactylus.sone.data.Sone import net.pterodactylus.sone.freenet.wot.OwnIdentity import net.pterodactylus.sone.test.getInstance import net.pterodactylus.sone.test.mock import net.pterodactylus.sone.test.whenever import net.pterodactylus.sone.web.baseInjector import net.pterodactylus.sone.web.page.* import net.pterodactylus.util.web.Method.POST import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.contains import org.hamcrest.Matchers.equalTo import org.hamcrest.Matchers.notNullValue import org.junit.Test import org.mockito.ArgumentMatchers.anyString import org.mockito.Mockito.verify /** * Unit test for [CreateSonePage]. */ class CreateSonePageTest : WebPageTest(::CreateSonePage) { private val localSones_ = listOf( createSone("local-sone1"), createSone("local-sone2"), createSone("local-sone3") ) private fun createSone(id: String) = mock().apply { whenever(this.id).thenReturn(id) whenever(profile).thenReturn(Profile(this)) } private val ownIdentities_ = listOf( createOwnIdentity("own-id-1", "Sone"), createOwnIdentity("own-id-2", "Test", "Foo"), createOwnIdentity("own-id-3"), createOwnIdentity("own-id-4", "Sone") ) private fun createOwnIdentity(id: String, vararg contexts: String) = mock().apply { whenever(this.id).thenReturn(id) whenever(this.nickname).thenReturn(id) whenever(this.contexts).thenReturn(contexts.toSet()) whenever(this.hasContext(anyString())).thenAnswer { invocation -> invocation.getArgument(0) in contexts } } @Test fun `page returns correct path`() { assertThat(page.path, equalTo("createSone.html")) } @Test fun `page does not require login`() { assertThat(page.requiresLogin(), equalTo(false)) } private fun addExistingSones() { listOf(2, 0, 1).map { localSones_[it] }.forEach { addLocalSone(it.id, it) } } @Test @Suppress("UNCHECKED_CAST") fun `get request stores sorted list of local sones in template context`() { addExistingSones() page.processTemplate(freenetRequest, templateContext) assertThat(templateContext["sones"] as Collection, contains(localSones_[0], localSones_[1], localSones_[2])) } private fun addExistingOwnIdentities() { listOf(2, 0, 3, 1).map { ownIdentities_[it] }.forEach { addOwnIdentity(it) } } @Test @Suppress("UNCHECKED_CAST") fun `get request stores sorted sones without sone context in the template context`() { addExistingOwnIdentities() page.processTemplate(freenetRequest, templateContext) assertThat(templateContext["identitiesWithoutSone"] as Collection, contains(ownIdentities_[1], ownIdentities_[2])) } @Test fun `sone is created and logged in`() { addExistingOwnIdentities() setMethod(POST) addHttpRequestPart("identity", "own-id-3") val newSone = mock() whenever(core.createSone(ownIdentities_[2])).thenReturn(newSone) verifyRedirect("index.html") { verify(webInterface).setCurrentSone(toadletContext, newSone) } } @Test fun `on invalid identity id a flag is set in the template context`() { setMethod(POST) addHttpRequestParameter("identity", "own-id-3") page.processTemplate(freenetRequest, templateContext) assertThat(templateContext["errorNoIdentity"], equalTo(true)) } @Test fun `if sone is not created user is still redirected to index`() { addExistingOwnIdentities() setMethod(POST) addHttpRequestPart("identity", "own-id-3") whenever(core.createSone(ownIdentities_[2])).thenReturn(null) verifyRedirect("index.html") { verify(core).createSone(ownIdentities_[2]) verify(webInterface).setCurrentSone(toadletContext, null) } } @Test fun `create sone is not shown in menu if full access is required but client doesn’t have full access`() { core.preferences.newRequireFullAccess = true assertThat(page.isEnabled(toadletContext), equalTo(false)) } @Test fun `create sone is shown in menu if no sone is logged in`() { unsetCurrentSone() assertThat(page.isEnabled(toadletContext), equalTo(true)) } @Test fun `create sone is shown in menu if a single sone exists`() { addLocalSone("local-sone", localSones_[0]) assertThat(page.isEnabled(toadletContext), equalTo(true)) } @Test fun `create sone is not shown in menu if more than one sone exists`() { addLocalSone("local-sone1", localSones_[0]) addLocalSone("local-sone2", localSones_[1]) assertThat(page.isEnabled(toadletContext), equalTo(false)) } @Test fun `create sone is shown in menu if no sone is logged in and client has full access`() { core.preferences.newRequireFullAccess = true whenever(toadletContext.isAllowedFullAccess).thenReturn(true) unsetCurrentSone() assertThat(page.isEnabled(toadletContext), equalTo(true)) } @Test fun `page can be created by dependency injection`() { assertThat(baseInjector.getInstance(), notNullValue()) } @Test fun `page is annotated with the correct menuname`() { assertThat(page.menuName, equalTo("CreateSone")) } }