🔀 Merge branch 'release/v82'
[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.*
4 import net.pterodactylus.sone.data.impl.*
5 import net.pterodactylus.sone.freenet.wot.*
6 import net.pterodactylus.sone.test.*
7 import net.pterodactylus.sone.utils.*
8 import net.pterodactylus.sone.web.*
9 import net.pterodactylus.sone.web.page.*
10 import org.hamcrest.MatcherAssert.*
11 import org.hamcrest.Matchers.*
12 import org.junit.*
13
14 /**
15  * Unit test for [KnownSonesPage].
16  */
17 class KnownSonesPageTest : WebPageTest(::KnownSonesPage) {
18
19         private val sones = listOf(
20                         createSone(1000, 4, 7, 2, "sone2", true, true),
21                         createSone(2000, 3, 2, 3, "Sone1", false, true),
22                         createSone(3000, 3, 8, 1, "Sone3", true, false),
23                         createSone(4000, 1, 6, 0, "sone0", false, false)
24         )
25
26         @Before
27         fun setupSones() {
28                 addSone("sone1", sones[0])
29                 addSone("sone2", sones[1])
30                 addSone("sone3", sones[2])
31                 addSone("sone4", sones[3])
32         }
33
34         private fun createSone(time: Long, posts: Int, replies: Int, images: Int, name: String, local: Boolean, new: Boolean) = mock<Sone>().apply {
35                 whenever(identity).thenReturn(if (local) mock<OwnIdentity>() else mock<Identity>())
36                 whenever(this.isLocal).thenReturn(local)
37                 whenever(isKnown).thenReturn(!new)
38                 whenever(this.time).thenReturn(time)
39                 whenever(this.posts).thenReturn((0..(posts - 1)).map { mock<Post>() })
40                 whenever(this.replies).thenReturn((0..(replies - 1)).map { mock<PostReply>() }.toSet())
41                 val album = AlbumImpl(this)
42                 repeat(images) {
43                         ImageImpl().modify().setSone(this).update()
44                                         .also(album::addImage)
45                 }
46                 val rootAlbum = AlbumImpl(this).also { it.addAlbum(album) }
47                 whenever(this.rootAlbum).thenReturn(rootAlbum)
48                 whenever(this.profile).thenReturn(mock())
49                 whenever(id).thenReturn(name.toLowerCase())
50                 whenever(this.name).thenReturn(name)
51         }
52
53         private fun verifySonesAreInOrder(vararg indices: Int) {
54                 @Suppress("UNCHECKED_CAST")
55                 assertThat(templateContext["knownSones"] as Iterable<Sone>, contains(
56                                 *indices.map { sones[it] }.toTypedArray()
57                 ))
58         }
59
60         private fun verifyStoredFields(sort: String, order: String, filter: String) {
61                 assertThat(templateContext["sort"], equalTo<Any>(sort))
62                 assertThat(templateContext["order"], equalTo<Any>(order))
63                 assertThat(templateContext["filter"], equalTo<Any>(filter))
64         }
65
66         @Test
67         fun `page returns correct path`() {
68                 assertThat(page.path, equalTo("knownSones.html"))
69         }
70
71         @Test
72         fun `page does not require login`() {
73                 assertThat(page.requiresLogin(), equalTo(false))
74         }
75
76         @Test
77         fun `page returns correct title`() {
78                 addTranslation("Page.KnownSones.Title", "known sones page title")
79                 assertThat(page.getPageTitle(soneRequest), equalTo("known sones page title"))
80         }
81
82         @Test
83         fun `default known sones are sorted newest first`() {
84                 verifyNoRedirect {
85                         verifySonesAreInOrder(3, 2, 1, 0)
86                         verifyStoredFields("activity", "desc", "")
87                 }
88         }
89
90         @Test
91         fun `known sones can be sorted by oldest first`() {
92                 addHttpRequestParameter("order", "asc")
93                 verifyNoRedirect {
94                         verifySonesAreInOrder(0, 1, 2, 3)
95                         verifyStoredFields("activity", "asc", "")
96                 }
97         }
98
99         @Test
100         fun `known sones can be sorted by posts, most posts first`() {
101                 addHttpRequestParameter("sort", "posts")
102                 verifyNoRedirect {
103                         verifySonesAreInOrder(0, 2, 1, 3)
104                         verifyStoredFields("posts", "desc", "")
105                 }
106         }
107
108         @Test
109         fun `known sones can be sorted by posts, least posts first`() {
110                 addHttpRequestParameter("sort", "posts")
111                 addHttpRequestParameter("order", "asc")
112                 verifyNoRedirect {
113                         verifySonesAreInOrder(3, 1, 2, 0)
114                         verifyStoredFields("posts", "asc", "")
115                 }
116         }
117
118         @Test
119         fun `known sones can be sorted by images, most images first`() {
120                 addHttpRequestParameter("sort", "images")
121                 verifyNoRedirect {
122                         verifySonesAreInOrder(1, 0, 2, 3)
123                         verifyStoredFields("images", "desc", "")
124                 }
125         }
126
127         @Test
128         fun `known sones can be sorted by images, least images first`() {
129                 addHttpRequestParameter("sort", "images")
130                 addHttpRequestParameter("order", "asc")
131                 verifyNoRedirect {
132                         verifySonesAreInOrder(3, 2, 0, 1)
133                         verifyStoredFields("images", "asc", "")
134                 }
135         }
136
137         @Test
138         fun `known sones can be sorted by nice name, ascending`() {
139                 addHttpRequestParameter("sort", "name")
140                 addHttpRequestParameter("order", "asc")
141                 verifyNoRedirect {
142                         verifySonesAreInOrder(3, 1, 0, 2)
143                         verifyStoredFields("name", "asc", "")
144                 }
145         }
146
147         @Test
148         fun `known sones can be sorted by nice name, descending`() {
149                 addHttpRequestParameter("sort", "name")
150                 verifyNoRedirect {
151                         verifySonesAreInOrder(2, 0, 1, 3)
152                         verifyStoredFields("name", "desc", "")
153                 }
154         }
155
156         @Test
157         fun `known sones can be filtered by local sones`() {
158                 addHttpRequestParameter("filter", "own")
159                 verifyNoRedirect {
160                         verifySonesAreInOrder(2, 0)
161                         verifyStoredFields("activity", "desc", "own")
162                 }
163         }
164
165         @Test
166         fun `known sones can be filtered by non-local sones`() {
167                 addHttpRequestParameter("filter", "not-own")
168                 verifyNoRedirect {
169                         verifySonesAreInOrder(3, 1)
170                         verifyStoredFields("activity", "desc", "not-own")
171                 }
172         }
173
174         @Test
175         fun `known sones can be filtered by new sones`() {
176                 addHttpRequestParameter("filter", "new")
177                 verifyNoRedirect {
178                         verifySonesAreInOrder(1, 0)
179                         verifyStoredFields("activity", "desc", "new")
180                 }
181         }
182
183         @Test
184         fun `known sones can be filtered by known sones`() {
185                 addHttpRequestParameter("filter", "not-new")
186                 verifyNoRedirect {
187                         verifySonesAreInOrder(3, 2)
188                         verifyStoredFields("activity", "desc", "not-new")
189                 }
190         }
191
192         @Test
193         fun `known sones can be filtered by followed sones`() {
194                 addHttpRequestParameter("filter", "followed")
195                 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
196                 verifyNoRedirect {
197                         verifySonesAreInOrder(2, 1)
198                         verifyStoredFields("activity", "desc", "followed")
199                 }
200         }
201
202         @Test
203         fun `known sones can be filtered by not-followed sones`() {
204                 addHttpRequestParameter("filter", "not-followed")
205                 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
206                 verifyNoRedirect {
207                         verifySonesAreInOrder(3, 0)
208                         verifyStoredFields("activity", "desc", "not-followed")
209                 }
210         }
211
212         @Test
213         fun `known sones can not be filtered by followed sones if there is no current sone`() {
214                 addHttpRequestParameter("filter", "followed")
215                 unsetCurrentSone()
216                 verifyNoRedirect {
217                         verifySonesAreInOrder(3, 2, 1, 0)
218                         verifyStoredFields("activity", "desc", "followed")
219                 }
220         }
221
222         @Test
223         fun `known sones can not be filtered by not-followed sones if there is no current sone`() {
224                 addHttpRequestParameter("filter", "not-followed")
225                 unsetCurrentSone()
226                 verifyNoRedirect {
227                         verifySonesAreInOrder(3, 2, 1, 0)
228                         verifyStoredFields("activity", "desc", "not-followed")
229                 }
230         }
231
232         @Test
233         fun `pagination is set in template context`() {
234                 verifyNoRedirect {
235                         @Suppress("UNCHECKED_CAST")
236                         assertThat((templateContext["pagination"] as Pagination<Sone>).items, contains(*listOf(3, 2, 1, 0).map { sones[it] }.toTypedArray()))
237                 }
238         }
239
240         @Test
241         fun `page can be created by dependency injection`() {
242                 assertThat(baseInjector.getInstance<KnownSonesPage>(), notNullValue())
243         }
244
245         @Test
246         fun `page is annotated with the correct menuname`() {
247                 assertThat(page.menuName, equalTo("KnownSones"))
248         }
249
250         @Test
251         fun `page is annotated with corrrect template path`() {
252                 assertThat(page.templatePath, equalTo("/templates/knownSones.html"))
253         }
254
255 }