Add more tests for index page
[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.sone.web.pages.IndexPage
11 import net.pterodactylus.sone.web.pages.WebPageTest
12 import net.pterodactylus.util.web.Method.GET
13 import org.hamcrest.MatcherAssert.assertThat
14 import org.hamcrest.Matchers.contains
15 import org.hamcrest.Matchers.equalTo
16 import org.junit.Before
17 import org.junit.Test
18 import org.mockito.ArgumentMatchers
19
20 /**
21  * Unit test for [IndexPage].
22  */
23 class IndexPageTest : WebPageTest() {
24
25         private val postVisibilityFilter = mock<PostVisibilityFilter>()
26         private val page = IndexPage(template, webInterface, postVisibilityFilter)
27
28         @Test
29         fun `page returns correct path`() {
30             assertThat(page.path, equalTo("index.html"))
31         }
32
33         @Test
34         fun `page requires login`() {
35             assertThat(page.requiresLogin(), equalTo(true))
36         }
37
38         @Test
39         fun `page returns correct title`() {
40                 whenever(l10n.getString("Page.Index.Title")).thenReturn("index page title")
41             assertThat(page.getPageTitle(freenetRequest), equalTo("index page title"))
42         }
43
44         @Before
45         fun setupPostVisibilityFilter() {
46                 whenever(postVisibilityFilter.isVisible(ArgumentMatchers.eq(currentSone))).thenReturn(Predicate<Post> { true })
47         }
48
49         private fun createPost(time: Long, directed: Boolean = false) = mock<Post>().apply {
50                 whenever(this.time).thenReturn(time)
51                 whenever(recipient).thenReturn(fromNullable(if (directed) currentSone else null))
52         }
53
54         @Test
55         fun `index page shows all posts of current sone`() {
56                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
57                 whenever(currentSone.posts).thenReturn(posts)
58                 request("", GET)
59                 page.handleRequest(freenetRequest, templateContext)
60                 @Suppress("UNCHECKED_CAST")
61                 assertThat(templateContext["posts"] as Iterable<Post>, contains(*posts.toTypedArray()))
62         }
63
64         @Test
65         fun `index page shows posts directed at current sone from non-followed sones`() {
66                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
67                 whenever(currentSone.posts).thenReturn(posts)
68                 val notFollowedSone = mock<Sone>()
69                 val notFollowedPosts = listOf(createPost(2500, true), createPost(1500))
70                 whenever(notFollowedSone.posts).thenReturn(notFollowedPosts)
71                 addSone("notfollowed1", notFollowedSone)
72                 request("", GET)
73                 page.handleRequest(freenetRequest, templateContext)
74                 @Suppress("UNCHECKED_CAST")
75                 assertThat(templateContext["posts"] as Iterable<Post>, contains(
76                                 posts[0], notFollowedPosts[0], posts[1], posts[2]
77                 ))
78         }
79
80         @Test
81         fun `index page does not show duplicate posts`() {
82                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
83                 whenever(currentSone.posts).thenReturn(posts)
84                 val followedSone = mock<Sone>()
85                 val followedPosts = listOf(createPost(2500, true), createPost(1500))
86                 whenever(followedSone.posts).thenReturn(followedPosts)
87                 whenever(currentSone.friends).thenReturn(listOf("followed1", "followed2"))
88                 addSone("followed1", followedSone)
89                 request("", GET)
90                 page.handleRequest(freenetRequest, templateContext)
91                 @Suppress("UNCHECKED_CAST")
92                 assertThat(templateContext["posts"] as Iterable<Post>, contains(
93                                 posts[0], followedPosts[0], posts[1], followedPosts[1], posts[2]
94                 ))
95         }
96
97 }