Add more tests for the known Sones page
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / pages / KnownSonesPageTest.kt
1 package net.pterodactylus.sone.web.pages
2
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
19 import org.junit.Test
20
21 /**
22  * Unit test for [KnownSonesPage].
23  */
24 class KnownSonesPageTest : WebPageTest() {
25
26         private val page = KnownSonesPage(template, webInterface)
27
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)
33         )
34
35         @Before
36         fun setupSones() {
37                 addSone("sone1", sones[0])
38                 addSone("sone2", sones[1])
39                 addSone("sone3", sones[2])
40                 addSone("sone4", sones[3])
41         }
42
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))
53                 }
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)
58         }
59
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()
64                 ))
65         }
66
67         @Test
68         fun `page returns correct path`() {
69             assertThat(page.path, equalTo("knownSones.html"))
70         }
71
72         @Test
73         fun `page does not require login`() {
74             assertThat(page.requiresLogin(), equalTo(false))
75         }
76
77         @Test
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"))
81         }
82
83         @Test
84         fun `default known sones are sorted newest first`() {
85                 page.handleRequest(freenetRequest, templateContext)
86                 verifySonesAreInOrder(3, 2, 1, 0)
87         }
88
89         @Test
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)
94         }
95
96         @Test
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)
101         }
102
103         @Test
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)
109         }
110
111         @Test
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)
116         }
117
118         @Test
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)
124         }
125
126         @Test
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)
132         }
133
134         @Test
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)
139         }
140
141         @Test
142         fun `known sones can be filtered by local sones`() {
143                 addHttpRequestParameter("filter", "own")
144                 page.handleRequest(freenetRequest, templateContext)
145                 verifySonesAreInOrder(2, 0)
146         }
147
148         @Test
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)
153         }
154
155         @Test
156         fun `known sones can be filtered by new sones`() {
157                 addHttpRequestParameter("filter", "new")
158                 page.handleRequest(freenetRequest, templateContext)
159                 verifySonesAreInOrder(1, 0)
160         }
161
162         @Test
163         fun `known sones can be filtered by known sones`() {
164                 addHttpRequestParameter("filter", "not-new")
165                 page.handleRequest(freenetRequest, templateContext)
166                 verifySonesAreInOrder(3, 2)
167         }
168
169         @Test
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)
175         }
176
177         @Test
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)
183         }
184
185         @Test
186         fun `known sones can not be filtered by followed sones if there is no current sone`() {
187                 addHttpRequestParameter("filter", "followed")
188                 unsetCurrentSone()
189                 page.handleRequest(freenetRequest, templateContext)
190                 verifySonesAreInOrder(3, 2, 1, 0)
191         }
192
193         @Test
194         fun `known sones can not be filtered by not-followed sones if there is no current sone`() {
195                 addHttpRequestParameter("filter", "not-followed")
196                 unsetCurrentSone()
197                 page.handleRequest(freenetRequest, templateContext)
198                 verifySonesAreInOrder(3, 2, 1, 0)
199         }
200
201 }