Move web pages to their own package
[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.junit.Before
18 import org.junit.Test
19
20 /**
21  * Unit test for [KnownSonesPage].
22  */
23 class KnownSonesPageTest : WebPageTest() {
24
25         private val page = KnownSonesPage(template, webInterface)
26
27         private val sones = listOf(
28                         createSone(1000, 4, 7, 2, "sone2", true, true),
29                         createSone(2000, 3, 2, 3, "Sone1", false, true),
30                         createSone(3000, 3, 8, 1, "Sone3", true, false),
31                         createSone(4000, 1, 6, 0, "sone0", false, false)
32         )
33
34         @Before
35         fun setupSones() {
36                 addSone("sone1", sones[0])
37                 addSone("sone2", sones[1])
38                 addSone("sone3", sones[2])
39                 addSone("sone4", sones[3])
40         }
41
42         private fun createSone(time: Long, posts: Int, replies: Int, images: Int, name: String, local: Boolean, new: Boolean) = mock<Sone>().apply {
43                 whenever(identity).thenReturn(if (local) mock<OwnIdentity>() else mock<Identity>())
44                 whenever(isKnown).thenReturn(!new)
45                 whenever(this.time).thenReturn(time)
46                 whenever(this.posts).thenReturn((0..(posts - 1)).map { mock<Post>() })
47                 whenever(this.replies).thenReturn((0..(replies - 1)).map { mock<PostReply>() }.toSet())
48                 val album = mock<Album>()
49                 whenever(album.images).thenReturn(((0..(images - 1)).map { mock<Image>() }))
50                 val rootAlbum = mock<Album>().apply {
51                         whenever(albums).thenReturn(listOf(album))
52                 }
53                 whenever(this.rootAlbum).thenReturn(rootAlbum)
54                 whenever(this.profile).thenReturn(mock<Profile>())
55                 whenever(id).thenReturn(name.toLowerCase())
56                 whenever(this.name).thenReturn(name)
57         }
58
59         private fun verifySonesAreInOrder(vararg indices: Int) {
60                 @Suppress("UNCHECKED_CAST")
61                 assertThat(templateContext["knownSones"] as Iterable<Sone>, contains(
62                                 *indices.map { sones[it] }.toTypedArray()
63                 ))
64         }
65
66         @Test
67         fun `default known sones are sorted newest first`() {
68                 page.handleRequest(freenetRequest, templateContext)
69                 verifySonesAreInOrder(3, 2, 1, 0)
70         }
71
72         @Test
73         fun `known sones can be sorted by oldest first`() {
74                 addHttpRequestParameter("order", "asc")
75                 page.handleRequest(freenetRequest, templateContext)
76                 verifySonesAreInOrder(0, 1, 2, 3)
77         }
78
79         @Test
80         fun `known sones can be sorted by posts, most posts first`() {
81                 addHttpRequestParameter("sort", "posts")
82                 page.handleRequest(freenetRequest, templateContext)
83                 verifySonesAreInOrder(0, 2, 1, 3)
84         }
85
86         @Test
87         fun `known sones can be sorted by posts, least posts first`() {
88                 addHttpRequestParameter("sort", "posts")
89                 addHttpRequestParameter("order", "asc")
90                 page.handleRequest(freenetRequest, templateContext)
91                 verifySonesAreInOrder(3, 1, 2, 0)
92         }
93
94         @Test
95         fun `known sones can be sorted by images, most images first`() {
96                 addHttpRequestParameter("sort", "images")
97                 page.handleRequest(freenetRequest, templateContext)
98                 verifySonesAreInOrder(1, 0, 2, 3)
99         }
100
101         @Test
102         fun `known sones can be sorted by images, least images first`() {
103                 addHttpRequestParameter("sort", "images")
104                 addHttpRequestParameter("order", "asc")
105                 page.handleRequest(freenetRequest, templateContext)
106                 verifySonesAreInOrder(3, 2, 0, 1)
107         }
108
109         @Test
110         fun `known sones can be sorted by nice name, ascending`() {
111                 addHttpRequestParameter("sort", "name")
112                 addHttpRequestParameter("order", "asc")
113                 page.handleRequest(freenetRequest, templateContext)
114                 verifySonesAreInOrder(3, 1, 0, 2)
115         }
116
117         @Test
118         fun `known sones can be sorted by nice name, descending`() {
119                 addHttpRequestParameter("sort", "name")
120                 page.handleRequest(freenetRequest, templateContext)
121                 verifySonesAreInOrder(2, 0, 1, 3)
122         }
123
124         @Test
125         fun `known sones can be filtered by local sones`() {
126                 addHttpRequestParameter("filter", "own")
127                 page.handleRequest(freenetRequest, templateContext)
128                 verifySonesAreInOrder(2, 0)
129         }
130
131         @Test
132         fun `known sones can be filtered by non-local sones`() {
133                 addHttpRequestParameter("filter", "not-own")
134                 page.handleRequest(freenetRequest, templateContext)
135                 verifySonesAreInOrder(3, 1)
136         }
137
138         @Test
139         fun `known sones can be filtered by new sones`() {
140                 addHttpRequestParameter("filter", "new")
141                 page.handleRequest(freenetRequest, templateContext)
142                 verifySonesAreInOrder(1, 0)
143         }
144
145         @Test
146         fun `known sones can be filtered by known sones`() {
147                 addHttpRequestParameter("filter", "not-new")
148                 page.handleRequest(freenetRequest, templateContext)
149                 verifySonesAreInOrder(3, 2)
150         }
151
152         @Test
153         fun `known sones can be filtered by followed sones`() {
154                 addHttpRequestParameter("filter", "followed")
155                 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
156                 page.handleRequest(freenetRequest, templateContext)
157                 verifySonesAreInOrder(2, 1)
158         }
159
160         @Test
161         fun `known sones can be filtered by not-followed sones`() {
162                 addHttpRequestParameter("filter", "not-followed")
163                 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
164                 page.handleRequest(freenetRequest, templateContext)
165                 verifySonesAreInOrder(3, 0)
166         }
167
168         @Test
169         fun `known sones can not be filtered by followed sones if there is no current sone`() {
170                 addHttpRequestParameter("filter", "followed")
171                 unsetCurrentSone()
172                 page.handleRequest(freenetRequest, templateContext)
173                 verifySonesAreInOrder(3, 2, 1, 0)
174         }
175
176         @Test
177         fun `known sones can not be filtered by not-followed sones if there is no current sone`() {
178                 addHttpRequestParameter("filter", "not-followed")
179                 unsetCurrentSone()
180                 page.handleRequest(freenetRequest, templateContext)
181                 verifySonesAreInOrder(3, 2, 1, 0)
182         }
183
184 }