From: David ‘Bombe’ Roden Date: Sun, 27 Nov 2016 13:18:25 +0000 (+0100) Subject: Add unit test for known sones page X-Git-Tag: 0.9.7^2~383 X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=commitdiff_plain;h=87eef7bb2fe60e0357ba9d8fd2351a930eb9f55c Add unit test for known sones page --- diff --git a/src/test/kotlin/net/pterodactylus/sone/web/KnownSonesPageTest.kt b/src/test/kotlin/net/pterodactylus/sone/web/KnownSonesPageTest.kt new file mode 100644 index 0000000..f0ee9db --- /dev/null +++ b/src/test/kotlin/net/pterodactylus/sone/web/KnownSonesPageTest.kt @@ -0,0 +1,182 @@ +package net.pterodactylus.sone.web + +import net.pterodactylus.sone.data.Album +import net.pterodactylus.sone.data.Image +import net.pterodactylus.sone.data.Post +import net.pterodactylus.sone.data.PostReply +import net.pterodactylus.sone.data.Profile +import net.pterodactylus.sone.data.Sone +import net.pterodactylus.sone.freenet.wot.Identity +import net.pterodactylus.sone.freenet.wot.OwnIdentity +import net.pterodactylus.sone.test.mock +import net.pterodactylus.sone.test.whenever +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.contains +import org.junit.Before +import org.junit.Test + +/** + * Unit test for [KnownSonesPage]. + */ +class KnownSonesPageTest : WebPageTest() { + + private val page = KnownSonesPage(template, webInterface) + + private val sones = listOf( + createSone(1000, 4, 7, 2, "sone2", true, true), + createSone(2000, 3, 2, 3, "Sone1", false, true), + createSone(3000, 3, 8, 1, "Sone3", true, false), + createSone(4000, 1, 6, 0, "sone0", false, false) + ) + + @Before + fun setupSones() { + addSone("sone1", sones[0]) + addSone("sone2", sones[1]) + addSone("sone3", sones[2]) + addSone("sone4", sones[3]) + } + + private fun createSone(time: Long, posts: Int, replies: Int, images: Int, name: String, local: Boolean, new: Boolean) = mock().apply { + whenever(identity).thenReturn(if (local) mock() else mock()) + whenever(isKnown).thenReturn(!new) + whenever(this.time).thenReturn(time) + whenever(this.posts).thenReturn((0..(posts - 1)).map { mock() }) + whenever(this.replies).thenReturn((0..(replies - 1)).map { mock() }.toSet()) + val album = mock() + whenever(album.images).thenReturn(((0..(images - 1)).map { mock() })) + val rootAlbum = mock().apply { + whenever(albums).thenReturn(listOf(album)) + } + whenever(this.rootAlbum).thenReturn(rootAlbum) + whenever(this.profile).thenReturn(mock()) + whenever(id).thenReturn(name.toLowerCase()) + whenever(this.name).thenReturn(name) + } + + private fun verifySonesAreInOrder(vararg indices: Int) { + @Suppress("UNCHECKED_CAST") + assertThat(templateContext["knownSones"] as Iterable, contains( + *indices.map { sones[it] }.toTypedArray() + )) + } + + @Test + fun `default known sones are sorted newest first`() { + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 2, 1, 0) + } + + @Test + fun `known sones can be sorted by oldest first`() { + addHttpRequestParameter("order", "asc") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(0, 1, 2, 3) + } + + @Test + fun `known sones can be sorted by posts, most posts first`() { + addHttpRequestParameter("sort", "posts") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(0, 2, 1, 3) + } + + @Test + fun `known sones can be sorted by posts, least posts first`() { + addHttpRequestParameter("sort", "posts") + addHttpRequestParameter("order", "asc") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 1, 2, 0) + } + + @Test + fun `known sones can be sorted by images, most images first`() { + addHttpRequestParameter("sort", "images") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(1, 0, 2, 3) + } + + @Test + fun `known sones can be sorted by images, least images first`() { + addHttpRequestParameter("sort", "images") + addHttpRequestParameter("order", "asc") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 2, 0, 1) + } + + @Test + fun `known sones can be sorted by nice name, ascending`() { + addHttpRequestParameter("sort", "name") + addHttpRequestParameter("order", "asc") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 1, 0, 2) + } + + @Test + fun `known sones can be sorted by nice name, descending`() { + addHttpRequestParameter("sort", "name") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(2, 0, 1, 3) + } + + @Test + fun `known sones can be filtered by local sones`() { + addHttpRequestParameter("filter", "own") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(2, 0) + } + + @Test + fun `known sones can be filtered by non-local sones`() { + addHttpRequestParameter("filter", "not-own") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 1) + } + + @Test + fun `known sones can be filtered by new sones`() { + addHttpRequestParameter("filter", "new") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(1, 0) + } + + @Test + fun `known sones can be filtered by known sones`() { + addHttpRequestParameter("filter", "not-new") + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 2) + } + + @Test + fun `known sones can be filtered by followed sones`() { + addHttpRequestParameter("filter", "followed") + listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) } + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(2, 1) + } + + @Test + fun `known sones can be filtered by not-followed sones`() { + addHttpRequestParameter("filter", "not-followed") + listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) } + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 0) + } + + @Test + fun `known sones can not be filtered by followed sones if there is no current sone`() { + addHttpRequestParameter("filter", "followed") + unsetCurrentSone() + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 2, 1, 0) + } + + @Test + fun `known sones can not be filtered by not-followed sones if there is no current sone`() { + addHttpRequestParameter("filter", "not-followed") + unsetCurrentSone() + page.handleRequest(freenetRequest, templateContext) + verifySonesAreInOrder(3, 2, 1, 0) + } + +}