1 package net.pterodactylus.sone.web.pages
3 import net.pterodactylus.sone.data.Album
4 import net.pterodactylus.sone.data.Image
5 import net.pterodactylus.sone.data.Post
6 import net.pterodactylus.sone.data.PostReply
7 import net.pterodactylus.sone.data.Profile
8 import net.pterodactylus.sone.data.Sone
9 import net.pterodactylus.sone.freenet.wot.Identity
10 import net.pterodactylus.sone.freenet.wot.OwnIdentity
11 import net.pterodactylus.sone.test.mock
12 import net.pterodactylus.sone.test.whenever
13 import net.pterodactylus.sone.web.pages.KnownSonesPage
14 import net.pterodactylus.sone.web.pages.WebPageTest
15 import org.hamcrest.MatcherAssert.assertThat
16 import org.hamcrest.Matchers.contains
17 import org.hamcrest.Matchers.equalTo
18 import org.junit.Before
22 * Unit test for [KnownSonesPage].
24 class KnownSonesPageTest : WebPageTest() {
26 private val page = KnownSonesPage(template, webInterface)
28 private val sones = listOf(
29 createSone(1000, 4, 7, 2, "sone2", true, true),
30 createSone(2000, 3, 2, 3, "Sone1", false, true),
31 createSone(3000, 3, 8, 1, "Sone3", true, false),
32 createSone(4000, 1, 6, 0, "sone0", false, false)
37 addSone("sone1", sones[0])
38 addSone("sone2", sones[1])
39 addSone("sone3", sones[2])
40 addSone("sone4", sones[3])
43 private fun createSone(time: Long, posts: Int, replies: Int, images: Int, name: String, local: Boolean, new: Boolean) = mock<Sone>().apply {
44 whenever(identity).thenReturn(if (local) mock<OwnIdentity>() else mock<Identity>())
45 whenever(isKnown).thenReturn(!new)
46 whenever(this.time).thenReturn(time)
47 whenever(this.posts).thenReturn((0..(posts - 1)).map { mock<Post>() })
48 whenever(this.replies).thenReturn((0..(replies - 1)).map { mock<PostReply>() }.toSet())
49 val album = mock<Album>()
50 whenever(album.images).thenReturn(((0..(images - 1)).map { mock<Image>() }))
51 val rootAlbum = mock<Album>().apply {
52 whenever(albums).thenReturn(listOf(album))
54 whenever(this.rootAlbum).thenReturn(rootAlbum)
55 whenever(this.profile).thenReturn(mock<Profile>())
56 whenever(id).thenReturn(name.toLowerCase())
57 whenever(this.name).thenReturn(name)
60 private fun verifySonesAreInOrder(vararg indices: Int) {
61 @Suppress("UNCHECKED_CAST")
62 assertThat(templateContext["knownSones"] as Iterable<Sone>, contains(
63 *indices.map { sones[it] }.toTypedArray()
68 fun `page returns correct path`() {
69 assertThat(page.path, equalTo("knownSones.html"))
73 fun `page does not require login`() {
74 assertThat(page.requiresLogin(), equalTo(false))
78 fun `page returns correct title`() {
79 whenever(l10n.getString("Page.KnownSones.Title")).thenReturn("known sones page title")
80 assertThat(page.getPageTitle(freenetRequest), equalTo("known sones page title"))
84 fun `default known sones are sorted newest first`() {
85 page.handleRequest(freenetRequest, templateContext)
86 verifySonesAreInOrder(3, 2, 1, 0)
90 fun `known sones can be sorted by oldest first`() {
91 addHttpRequestParameter("order", "asc")
92 page.handleRequest(freenetRequest, templateContext)
93 verifySonesAreInOrder(0, 1, 2, 3)
97 fun `known sones can be sorted by posts, most posts first`() {
98 addHttpRequestParameter("sort", "posts")
99 page.handleRequest(freenetRequest, templateContext)
100 verifySonesAreInOrder(0, 2, 1, 3)
104 fun `known sones can be sorted by posts, least posts first`() {
105 addHttpRequestParameter("sort", "posts")
106 addHttpRequestParameter("order", "asc")
107 page.handleRequest(freenetRequest, templateContext)
108 verifySonesAreInOrder(3, 1, 2, 0)
112 fun `known sones can be sorted by images, most images first`() {
113 addHttpRequestParameter("sort", "images")
114 page.handleRequest(freenetRequest, templateContext)
115 verifySonesAreInOrder(1, 0, 2, 3)
119 fun `known sones can be sorted by images, least images first`() {
120 addHttpRequestParameter("sort", "images")
121 addHttpRequestParameter("order", "asc")
122 page.handleRequest(freenetRequest, templateContext)
123 verifySonesAreInOrder(3, 2, 0, 1)
127 fun `known sones can be sorted by nice name, ascending`() {
128 addHttpRequestParameter("sort", "name")
129 addHttpRequestParameter("order", "asc")
130 page.handleRequest(freenetRequest, templateContext)
131 verifySonesAreInOrder(3, 1, 0, 2)
135 fun `known sones can be sorted by nice name, descending`() {
136 addHttpRequestParameter("sort", "name")
137 page.handleRequest(freenetRequest, templateContext)
138 verifySonesAreInOrder(2, 0, 1, 3)
142 fun `known sones can be filtered by local sones`() {
143 addHttpRequestParameter("filter", "own")
144 page.handleRequest(freenetRequest, templateContext)
145 verifySonesAreInOrder(2, 0)
149 fun `known sones can be filtered by non-local sones`() {
150 addHttpRequestParameter("filter", "not-own")
151 page.handleRequest(freenetRequest, templateContext)
152 verifySonesAreInOrder(3, 1)
156 fun `known sones can be filtered by new sones`() {
157 addHttpRequestParameter("filter", "new")
158 page.handleRequest(freenetRequest, templateContext)
159 verifySonesAreInOrder(1, 0)
163 fun `known sones can be filtered by known sones`() {
164 addHttpRequestParameter("filter", "not-new")
165 page.handleRequest(freenetRequest, templateContext)
166 verifySonesAreInOrder(3, 2)
170 fun `known sones can be filtered by followed sones`() {
171 addHttpRequestParameter("filter", "followed")
172 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
173 page.handleRequest(freenetRequest, templateContext)
174 verifySonesAreInOrder(2, 1)
178 fun `known sones can be filtered by not-followed sones`() {
179 addHttpRequestParameter("filter", "not-followed")
180 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
181 page.handleRequest(freenetRequest, templateContext)
182 verifySonesAreInOrder(3, 0)
186 fun `known sones can not be filtered by followed sones if there is no current sone`() {
187 addHttpRequestParameter("filter", "followed")
189 page.handleRequest(freenetRequest, templateContext)
190 verifySonesAreInOrder(3, 2, 1, 0)
194 fun `known sones can not be filtered by not-followed sones if there is no current sone`() {
195 addHttpRequestParameter("filter", "not-followed")
197 page.handleRequest(freenetRequest, templateContext)
198 verifySonesAreInOrder(3, 2, 1, 0)