243e5975ec2c232305a2a4033a36757bcb1e657b
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / pages / IndexPageTest.kt
1 package net.pterodactylus.sone.web.pages
2
3 import com.google.common.base.Optional.fromNullable
4 import com.google.common.base.Predicate
5 import net.pterodactylus.sone.data.Post
6 import net.pterodactylus.sone.data.Sone
7 import net.pterodactylus.sone.notify.PostVisibilityFilter
8 import net.pterodactylus.sone.test.mock
9 import net.pterodactylus.sone.test.whenever
10 import net.pterodactylus.util.collection.Pagination
11 import net.pterodactylus.util.web.Method.GET
12 import org.hamcrest.MatcherAssert.assertThat
13 import org.hamcrest.Matchers.contains
14 import org.hamcrest.Matchers.equalTo
15 import org.junit.Before
16 import org.junit.Test
17 import org.mockito.ArgumentMatchers
18
19 /**
20  * Unit test for [IndexPage].
21  */
22 class IndexPageTest : WebPageTest() {
23
24         private val postVisibilityFilter = mock<PostVisibilityFilter>()
25         private val page = IndexPage(template, webInterface, postVisibilityFilter)
26
27         @Test
28         fun `page returns correct path`() {
29             assertThat(page.path, equalTo("index.html"))
30         }
31
32         @Test
33         fun `page requires login`() {
34             assertThat(page.requiresLogin(), equalTo(true))
35         }
36
37         @Test
38         fun `page returns correct title`() {
39                 whenever(l10n.getString("Page.Index.Title")).thenReturn("index page title")
40             assertThat(page.getPageTitle(freenetRequest), equalTo("index page title"))
41         }
42
43         @Before
44         fun setupPostVisibilityFilter() {
45                 whenever(postVisibilityFilter.isVisible(ArgumentMatchers.eq(currentSone))).thenReturn(Predicate<Post> { true })
46         }
47
48         @Before
49         fun setupCurrentSone() {
50                 whenever(currentSone.id).thenReturn("current")
51         }
52
53         @Before
54         fun setupDirectedPosts() {
55                 whenever(core.getDirectedPosts("current")).thenReturn(emptyList())
56         }
57
58         private fun createPost(time: Long, directed: Boolean = false) = mock<Post>().apply {
59                 whenever(this.time).thenReturn(time)
60                 whenever(recipient).thenReturn(fromNullable(if (directed) currentSone else null))
61         }
62
63         @Test
64         fun `index page shows all posts of current sone`() {
65                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
66                 whenever(currentSone.posts).thenReturn(posts)
67                 request("", GET)
68                 page.processTemplate(freenetRequest, templateContext)
69                 @Suppress("UNCHECKED_CAST")
70                 assertThat(templateContext["posts"] as Iterable<Post>, contains(*posts.toTypedArray()))
71         }
72
73         @Test
74         fun `index page shows posts directed at current sone from non-followed sones`() {
75                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
76                 whenever(currentSone.posts).thenReturn(posts)
77                 val notFollowedSone = mock<Sone>()
78                 val notFollowedPosts = listOf(createPost(2500, true), createPost(1500))
79                 whenever(notFollowedSone.posts).thenReturn(notFollowedPosts)
80                 addSone("notfollowed1", notFollowedSone)
81                 request("", GET)
82                 whenever(core.getDirectedPosts("current")).thenReturn(listOf(notFollowedPosts[0]))
83                 page.processTemplate(freenetRequest, templateContext)
84                 @Suppress("UNCHECKED_CAST")
85                 assertThat(templateContext["posts"] as Iterable<Post>, contains(
86                                 posts[0], notFollowedPosts[0], posts[1], posts[2]
87                 ))
88         }
89
90         @Test
91         fun `index page does not show duplicate posts`() {
92                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
93                 whenever(currentSone.posts).thenReturn(posts)
94                 val followedSone = mock<Sone>()
95                 val followedPosts = listOf(createPost(2500, true), createPost(1500))
96                 whenever(followedSone.posts).thenReturn(followedPosts)
97                 whenever(currentSone.friends).thenReturn(listOf("followed1", "followed2"))
98                 addSone("followed1", followedSone)
99                 request("", GET)
100                 page.processTemplate(freenetRequest, templateContext)
101                 @Suppress("UNCHECKED_CAST")
102                 assertThat(templateContext["posts"] as Iterable<Post>, contains(
103                                 posts[0], followedPosts[0], posts[1], followedPosts[1], posts[2]
104                 ))
105         }
106
107         @Test
108         fun `index page uses post visibility filter`() {
109                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
110                 whenever(currentSone.posts).thenReturn(posts)
111                 val followedSone = mock<Sone>()
112                 val followedPosts = listOf(createPost(2500, true), createPost(1500))
113                 whenever(followedSone.posts).thenReturn(followedPosts)
114                 whenever(currentSone.friends).thenReturn(listOf("followed1", "followed2"))
115                 whenever(postVisibilityFilter.isVisible(ArgumentMatchers.eq(currentSone))).thenReturn(Predicate<Post> { (it?.time ?: 10000) < 2500 })
116                 addSone("followed1", followedSone)
117                 request("", GET)
118                 page.processTemplate(freenetRequest, templateContext)
119                 @Suppress("UNCHECKED_CAST")
120                 assertThat(templateContext["posts"] as Iterable<Post>, contains(
121                                 posts[1], followedPosts[1], posts[2]
122                 ))
123         }
124
125         @Test
126         fun `index page sets pagination correctly`() {
127                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
128                 whenever(currentSone.posts).thenReturn(posts)
129                 request("", GET)
130                 page.processTemplate(freenetRequest, templateContext)
131                 @Suppress("UNCHECKED_CAST")
132                 assertThat((templateContext["pagination"] as Pagination<Post>).items, contains(
133                                 posts[0], posts[1], posts[2]
134                 ))
135         }
136
137         @Test
138         fun `index page sets page correctly`() {
139                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
140                 whenever(currentSone.posts).thenReturn(posts)
141                 request("", GET)
142                 core.preferences.postsPerPage = 1
143                 addHttpRequestParameter("page", "2")
144                 page.processTemplate(freenetRequest, templateContext)
145                 @Suppress("UNCHECKED_CAST")
146                 assertThat((templateContext["pagination"] as Pagination<Post>).page, equalTo(2))
147         }
148
149 }