26e6f63c6c524011daa31760e1f1ed924fb5764e
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / notify / ReplyVisibilityFilterTest.kt
1 package net.pterodactylus.sone.notify
2
3 import com.google.common.base.Optional
4 import com.google.inject.Guice
5 import net.pterodactylus.sone.data.Post
6 import net.pterodactylus.sone.data.PostReply
7 import net.pterodactylus.sone.data.Sone
8 import net.pterodactylus.sone.freenet.wot.OwnIdentity
9 import net.pterodactylus.sone.test.getInstance
10 import net.pterodactylus.sone.test.mock
11 import net.pterodactylus.sone.test.whenever
12 import org.hamcrest.MatcherAssert.assertThat
13 import org.hamcrest.Matchers.equalTo
14 import org.hamcrest.Matchers.sameInstance
15 import org.junit.Test
16
17 /**
18  * Unit test for [ReplyVisibilityFilterTest].
19  */
20 class ReplyVisibilityFilterTest {
21
22         private val postVisibilityFilter = mock<PostVisibilityFilter>()
23         private val replyVisibilityFilter = ReplyVisibilityFilter(postVisibilityFilter)
24         private val localSone = mock<Sone>()
25         private val localIdentity = mock<OwnIdentity>()
26         private val post = mock<Post>()
27         private val postReply = mock<PostReply>()
28
29         @Test
30         fun `reply visibility filter is only created once`() {
31                 val injector = Guice.createInjector()
32                 val firstFilter = injector.getInstance<ReplyVisibilityFilter>()
33                 val secondFilter = injector.getInstance<ReplyVisibilityFilter>()
34                 assertThat(firstFilter, sameInstance(secondFilter))
35         }
36
37         private fun makePostPresent() {
38                 whenever(postReply.post).thenReturn(Optional.of(post))
39         }
40
41         @Test
42         fun `reply is not visible if post is not visible`() {
43                 makePostPresent()
44                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), equalTo(false))
45         }
46
47         private fun makePostAbsent() {
48                 whenever(postReply.post).thenReturn(Optional.absent())
49         }
50
51         @Test
52         fun `reply is not visible if post is not present`() {
53                 makePostAbsent()
54                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), equalTo(false))
55         }
56
57         private fun makePostPresentAndVisible() {
58                 makePostPresent()
59                 whenever(postVisibilityFilter.isPostVisible(localSone, post)).thenReturn(true)
60         }
61
62         private fun makeReplyComeFromFuture() {
63                 whenever(postReply.time).thenReturn(System.currentTimeMillis() + 1000)
64         }
65
66         @Test
67         fun `reply is not visible if it is from the future`() {
68                 makePostPresentAndVisible()
69                 makeReplyComeFromFuture()
70                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), equalTo(false))
71         }
72
73         @Test
74         fun `reply is visible if it is not from the future`() {
75                 makePostPresentAndVisible()
76                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), equalTo(true))
77         }
78
79         @Test
80         fun `predicate correctly recognizes visible reply`() {
81                 makePostPresentAndVisible()
82                 assertThat(replyVisibilityFilter.isVisible(localSone).test(postReply), equalTo(true))
83         }
84
85         @Test
86         fun `predicate correctly recognizes not visible reply`() {
87                 makePostPresentAndVisible()
88                 makeReplyComeFromFuture()
89                 assertThat(replyVisibilityFilter.isVisible(localSone).test(postReply), equalTo(false))
90         }
91
92         init {
93                 whenever(localSone.id).thenReturn(LOCAL_ID)
94                 whenever(localSone.isLocal).thenReturn(true)
95                 whenever(localSone.identity).thenReturn(localIdentity)
96                 whenever(post.recipientId).thenReturn(Optional.absent())
97         }
98
99 }
100
101 private const val LOCAL_ID = "local-id"