1 package net.pterodactylus.sone.web.pages
3 import net.pterodactylus.sone.data.*
4 import net.pterodactylus.sone.freenet.wot.*
5 import net.pterodactylus.sone.test.*
6 import net.pterodactylus.sone.utils.*
7 import net.pterodactylus.sone.web.*
8 import net.pterodactylus.sone.web.page.*
9 import org.hamcrest.MatcherAssert.*
10 import org.hamcrest.Matchers.*
14 * Unit test for [KnownSonesPage].
16 class KnownSonesPageTest : WebPageTest(::KnownSonesPage) {
18 private val sones = listOf(
19 createSone(1000, 4, 7, 2, "sone2", true, true),
20 createSone(2000, 3, 2, 3, "Sone1", false, true),
21 createSone(3000, 3, 8, 1, "Sone3", true, false),
22 createSone(4000, 1, 6, 0, "sone0", false, false)
27 addSone("sone1", sones[0])
28 addSone("sone2", sones[1])
29 addSone("sone3", sones[2])
30 addSone("sone4", sones[3])
33 private fun createSone(time: Long, posts: Int, replies: Int, images: Int, name: String, local: Boolean, new: Boolean) = mock<Sone>().apply {
34 whenever(identity).thenReturn(if (local) mock<OwnIdentity>() else mock<Identity>())
35 whenever(this.isLocal).thenReturn(local)
36 whenever(isKnown).thenReturn(!new)
37 whenever(this.time).thenReturn(time)
38 whenever(this.posts).thenReturn((0..(posts - 1)).map { mock<Post>() })
39 whenever(this.replies).thenReturn((0..(replies - 1)).map { mock<PostReply>() }.toSet())
40 val album = mock<Album>()
41 whenever(album.images).thenReturn(((0..(images - 1)).map { mock<Image>() }))
42 val rootAlbum = mock<Album>().apply {
43 whenever(albums).thenReturn(listOf(album))
45 whenever(this.rootAlbum).thenReturn(rootAlbum)
46 whenever(this.profile).thenReturn(mock())
47 whenever(id).thenReturn(name.toLowerCase())
48 whenever(this.name).thenReturn(name)
51 private fun verifySonesAreInOrder(vararg indices: Int) {
52 @Suppress("UNCHECKED_CAST")
53 assertThat(templateContext["knownSones"] as Iterable<Sone>, contains(
54 *indices.map { sones[it] }.toTypedArray()
58 private fun verifyStoredFields(sort: String, order: String, filter: String) {
59 assertThat(templateContext["sort"], equalTo<Any>(sort))
60 assertThat(templateContext["order"], equalTo<Any>(order))
61 assertThat(templateContext["filter"], equalTo<Any>(filter))
65 fun `page returns correct path`() {
66 assertThat(page.path, equalTo("knownSones.html"))
70 fun `page does not require login`() {
71 assertThat(page.requiresLogin(), equalTo(false))
75 fun `page returns correct title`() {
76 whenever(l10n.getString("Page.KnownSones.Title")).thenReturn("known sones page title")
77 assertThat(page.getPageTitle(soneRequest), equalTo("known sones page title"))
81 fun `default known sones are sorted newest first`() {
83 verifySonesAreInOrder(3, 2, 1, 0)
84 verifyStoredFields("activity", "desc", "")
89 fun `known sones can be sorted by oldest first`() {
90 addHttpRequestParameter("order", "asc")
92 verifySonesAreInOrder(0, 1, 2, 3)
93 verifyStoredFields("activity", "asc", "")
98 fun `known sones can be sorted by posts, most posts first`() {
99 addHttpRequestParameter("sort", "posts")
101 verifySonesAreInOrder(0, 2, 1, 3)
102 verifyStoredFields("posts", "desc", "")
107 fun `known sones can be sorted by posts, least posts first`() {
108 addHttpRequestParameter("sort", "posts")
109 addHttpRequestParameter("order", "asc")
111 verifySonesAreInOrder(3, 1, 2, 0)
112 verifyStoredFields("posts", "asc", "")
117 fun `known sones can be sorted by images, most images first`() {
118 addHttpRequestParameter("sort", "images")
120 verifySonesAreInOrder(1, 0, 2, 3)
121 verifyStoredFields("images", "desc", "")
126 fun `known sones can be sorted by images, least images first`() {
127 addHttpRequestParameter("sort", "images")
128 addHttpRequestParameter("order", "asc")
130 verifySonesAreInOrder(3, 2, 0, 1)
131 verifyStoredFields("images", "asc", "")
136 fun `known sones can be sorted by nice name, ascending`() {
137 addHttpRequestParameter("sort", "name")
138 addHttpRequestParameter("order", "asc")
140 verifySonesAreInOrder(3, 1, 0, 2)
141 verifyStoredFields("name", "asc", "")
146 fun `known sones can be sorted by nice name, descending`() {
147 addHttpRequestParameter("sort", "name")
149 verifySonesAreInOrder(2, 0, 1, 3)
150 verifyStoredFields("name", "desc", "")
155 fun `known sones can be filtered by local sones`() {
156 addHttpRequestParameter("filter", "own")
158 verifySonesAreInOrder(2, 0)
159 verifyStoredFields("activity", "desc", "own")
164 fun `known sones can be filtered by non-local sones`() {
165 addHttpRequestParameter("filter", "not-own")
167 verifySonesAreInOrder(3, 1)
168 verifyStoredFields("activity", "desc", "not-own")
173 fun `known sones can be filtered by new sones`() {
174 addHttpRequestParameter("filter", "new")
176 verifySonesAreInOrder(1, 0)
177 verifyStoredFields("activity", "desc", "new")
182 fun `known sones can be filtered by known sones`() {
183 addHttpRequestParameter("filter", "not-new")
185 verifySonesAreInOrder(3, 2)
186 verifyStoredFields("activity", "desc", "not-new")
191 fun `known sones can be filtered by followed sones`() {
192 addHttpRequestParameter("filter", "followed")
193 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
195 verifySonesAreInOrder(2, 1)
196 verifyStoredFields("activity", "desc", "followed")
201 fun `known sones can be filtered by not-followed sones`() {
202 addHttpRequestParameter("filter", "not-followed")
203 listOf("sone1", "sone3").forEach { whenever(currentSone.hasFriend(it)).thenReturn(true) }
205 verifySonesAreInOrder(3, 0)
206 verifyStoredFields("activity", "desc", "not-followed")
211 fun `known sones can not be filtered by followed sones if there is no current sone`() {
212 addHttpRequestParameter("filter", "followed")
215 verifySonesAreInOrder(3, 2, 1, 0)
216 verifyStoredFields("activity", "desc", "followed")
221 fun `known sones can not be filtered by not-followed sones if there is no current sone`() {
222 addHttpRequestParameter("filter", "not-followed")
225 verifySonesAreInOrder(3, 2, 1, 0)
226 verifyStoredFields("activity", "desc", "not-followed")
231 fun `pagination is set in template context`() {
233 @Suppress("UNCHECKED_CAST")
234 assertThat((templateContext["pagination"] as Pagination<Sone>).items, contains(*listOf(3, 2, 1, 0).map { sones[it] }.toTypedArray()))
239 fun `page can be created by dependency injection`() {
240 assertThat(baseInjector.getInstance<KnownSonesPage>(), notNullValue())
244 fun `page is annotated with the correct menuname`() {
245 assertThat(page.menuName, equalTo("KnownSones"))
249 fun `page is annotated with corrrect template path`() {
250 assertThat(page.templatePath, equalTo("/templates/knownSones.html"))