7187847f0d843650bedd0230fe6a818546762a40
[Sone.git] / src / test / java / net / pterodactylus / sone / notify / ReplyVisibilityFilterTest.java
1 package net.pterodactylus.sone.notify;
2
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.is;
5 import static org.hamcrest.Matchers.sameInstance;
6 import static org.mockito.Mockito.mock;
7 import static org.mockito.Mockito.when;
8
9 import net.pterodactylus.sone.data.Post;
10 import net.pterodactylus.sone.data.PostReply;
11 import net.pterodactylus.sone.data.Sone;
12 import net.pterodactylus.sone.freenet.wot.OwnIdentity;
13
14 import com.google.common.base.Optional;
15 import com.google.inject.Guice;
16 import com.google.inject.Injector;
17 import org.junit.Test;
18
19 /**
20  * Unit test for {@link ReplyVisibilityFilterTest}.
21  *
22  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
23  */
24 public class ReplyVisibilityFilterTest {
25
26         private static final String LOCAL_ID = "local-id";
27
28         private final PostVisibilityFilter postVisibilityFilter = mock(PostVisibilityFilter.class);
29         private final ReplyVisibilityFilter replyVisibilityFilter = new ReplyVisibilityFilter(postVisibilityFilter);
30
31         private final Sone localSone = mock(Sone.class);
32         private final OwnIdentity localIdentity = mock(OwnIdentity.class);
33         private final Post post = mock(Post.class);
34         private final PostReply postReply = mock(PostReply.class);
35
36         public ReplyVisibilityFilterTest() {
37                 when(localSone.getId()).thenReturn(LOCAL_ID);
38                 when(localSone.isLocal()).thenReturn(true);
39                 when(localSone.getIdentity()).thenReturn(localIdentity);
40                 when(post.getRecipientId()).thenReturn(Optional.<String>absent());
41         }
42
43         @Test
44         public void replyVisibilityFilterIsOnlyCreatedOnce() {
45                 Injector injector = Guice.createInjector();
46                 ReplyVisibilityFilter firstFilter = injector.getInstance(ReplyVisibilityFilter.class);
47                 ReplyVisibilityFilter secondFilter = injector.getInstance(ReplyVisibilityFilter.class);
48                 assertThat(firstFilter, sameInstance(secondFilter));
49         }
50
51         private void makePostPresent() {
52                 when(postReply.getPost()).thenReturn(Optional.of(post));
53         }
54
55         @Test
56         public void replyIsNotVisibleIfPostIsNotVisible() {
57                 makePostPresent();
58                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), is(false));
59         }
60
61         private void makePostAbsent() {
62                 when(postReply.getPost()).thenReturn(Optional.<Post>absent());
63         }
64
65         @Test
66         public void replyIsNotVisibleIfPostIsNotPresent() {
67                 makePostAbsent();
68                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), is(false));
69         }
70
71         private void makePostPresentAndVisible() {
72                 makePostPresent();
73                 when(postVisibilityFilter.isPostVisible(localSone, post)).thenReturn(true);
74         }
75
76         private void makeReplyComeFromFuture() {
77                 when(postReply.getTime()).thenReturn(System.currentTimeMillis() + 1000);
78         }
79
80         @Test
81         public void replyIsNotVisibleIfItIsFromTheFuture() {
82                 makePostPresentAndVisible();
83                 makeReplyComeFromFuture();
84                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), is(false));
85         }
86
87         @Test
88         public void replyIsVisibleIfItIsNotFromTheFuture() {
89                 makePostPresentAndVisible();
90                 assertThat(replyVisibilityFilter.isReplyVisible(localSone, postReply), is(true));
91         }
92
93         @Test
94         public void predicateCorrectlyRecognizesVisibleReply() {
95                 makePostPresentAndVisible();
96                 assertThat(replyVisibilityFilter.isVisible(localSone).apply(postReply), is(true));
97         }
98
99         @Test
100         public void predicateCorrectlyRecognizesNotVisibleReply() {
101                 makePostPresentAndVisible();
102                 makeReplyComeFromFuture();
103                 assertThat(replyVisibilityFilter.isVisible(localSone).apply(postReply), is(false));
104         }
105
106 }