Move web pages to their own package
[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.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         @Before
28         fun setupPostVisibilityFilter() {
29                 whenever(postVisibilityFilter.isVisible(ArgumentMatchers.eq(currentSone))).thenReturn(object : Predicate<Post> {
30                         override fun apply(input: Post?) = true
31                 })
32         }
33
34         private fun createPost(time: Long, directed: Boolean = false) = mock<Post>().apply {
35                 whenever(this.time).thenReturn(time)
36                 whenever(recipient).thenReturn(fromNullable(if (directed) currentSone else null))
37         }
38
39         @Test
40         fun `index page shows all posts of current sone`() {
41                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
42                 whenever(currentSone.posts).thenReturn(posts)
43                 request("", GET)
44                 page.handleRequest(freenetRequest, templateContext)
45                 @Suppress("UNCHECKED_CAST")
46                 assertThat(templateContext["posts"] as Iterable<Post>, contains(*posts.toTypedArray()))
47         }
48
49         @Test
50         fun `index page shows posts directed at current sone from non-followed sones`() {
51                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
52                 whenever(currentSone.posts).thenReturn(posts)
53                 val notFollowedSone = mock<Sone>()
54                 val notFollowedPosts = listOf(createPost(2500, true), createPost(1500))
55                 whenever(notFollowedSone.posts).thenReturn(notFollowedPosts)
56                 addSone("notfollowed1", notFollowedSone)
57                 request("", GET)
58                 page.handleRequest(freenetRequest, templateContext)
59                 @Suppress("UNCHECKED_CAST")
60                 assertThat(templateContext["posts"] as Iterable<Post>, contains(
61                                 posts[0], notFollowedPosts[0], posts[1], posts[2]
62                 ))
63         }
64
65         @Test
66         fun `index page does not show duplicate posts`() {
67                 val posts = listOf(createPost(3000), createPost(2000), createPost(1000))
68                 whenever(currentSone.posts).thenReturn(posts)
69                 val followedSone = mock<Sone>()
70                 val followedPosts = listOf(createPost(2500, true), createPost(1500))
71                 whenever(followedSone.posts).thenReturn(followedPosts)
72                 whenever(currentSone.friends).thenReturn(listOf("followed1", "followed2"))
73                 addSone("followed1", followedSone)
74                 request("", GET)
75                 page.handleRequest(freenetRequest, templateContext)
76                 @Suppress("UNCHECKED_CAST")
77                 assertThat(templateContext["posts"] as Iterable<Post>, contains(
78                                 posts[0], followedPosts[0], posts[1], followedPosts[1], posts[2]
79                 ))
80         }
81
82 }