Add unit test for get post command
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / fcp / GetPostCommandTest.kt
1 package net.pterodactylus.sone.fcp
2
3 import freenet.support.SimpleFieldSet
4 import net.pterodactylus.sone.core.Core
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.test.asOptional
9 import net.pterodactylus.sone.test.mock
10 import net.pterodactylus.sone.test.whenever
11 import org.hamcrest.MatcherAssert.assertThat
12 import org.hamcrest.Matchers.containsInAnyOrder
13 import org.hamcrest.Matchers.equalTo
14 import org.hamcrest.Matchers.nullValue
15 import org.junit.Before
16 import org.junit.Test
17
18 /**
19  * Unit test for [GetPostCommand].
20  */
21 class GetPostCommandTest : SoneCommandTest() {
22
23         private val sone = mock<Sone>().apply {
24                 whenever(id).thenReturn("SoneId")
25         }
26         private val post = createPost()
27
28         override fun createCommand(core: Core) = GetPostCommand(core)
29
30         @Before
31         fun setupPostWithLikesAndReplies() {
32                 whenever(core.getPost("ValidPostId")).thenReturn(post.asOptional())
33                 val sone1 = mock<Sone>().apply { whenever(id).thenReturn("Sone1") }
34                 val sone2 = mock<Sone>().apply { whenever(id).thenReturn("Sone2") }
35                 whenever(core.getLikes(post)).thenReturn(setOf(sone1, sone2))
36                 val replies = listOf(
37                                 createPostReply("ReplyId1", sone1, 1000, "Reply 1"),
38                                 createPostReply("ReplyId2", sone2, 2000, "Reply 2")
39                 )
40                 whenever(core.getReplies("ValidPostId")).thenReturn(replies)
41         }
42
43         @Test
44         fun `command does not require write access`() {
45                 assertThat(command.requiresWriteAccess(), equalTo(false))
46         }
47
48         @Test
49         fun `request without any parameter results in fcp exception`() {
50                 requestWithoutAnyParameterResultsInFcpException()
51         }
52
53         @Test
54         fun `request with invalid post parameter results in fcp exception`() {
55                 parameters.putSingle("Post", "InvalidPostId")
56                 executeCommandAndExpectFcpException()
57         }
58
59         private fun createPostReply(id: String, sone: Sone, time: Long, text: String) = mock<PostReply>().apply {
60                 whenever(this.id).thenReturn(id)
61                 whenever(this.sone).thenReturn(sone)
62                 whenever(this.time).thenReturn(time)
63                 whenever(this.text).thenReturn(text)
64         }
65
66         private fun createPost() = mock<Post>().apply {
67                 whenever(id).thenReturn("ValidPostId")
68                 whenever(this.sone).thenReturn(this@GetPostCommandTest.sone)
69                 whenever(recipientId).thenReturn(null.asOptional())
70                 whenever(time).thenReturn(1000)
71                 whenever(text).thenReturn("Post Text\r\nSecond \\Line")
72         }
73
74         private fun verifyPostWithLikes(replyParameters: SimpleFieldSet) {
75                 assertThat(replyParameters["Message"], equalTo("Post"))
76                 assertThat(replyParameters["Post.ID"], equalTo("ValidPostId"))
77                 assertThat(replyParameters["Post.Sone"], equalTo("SoneId"))
78                 assertThat(replyParameters["Post.Time"], equalTo("1000"))
79                 assertThat(replyParameters["Post.Text"], equalTo("Post Text\\r\\nSecond \\\\Line"))
80                 assertThat(replyParameters["Post.Likes.Count"], equalTo("2"))
81                 assertThat((0..1).map { replyParameters["Post.Likes.$it.ID"] }, containsInAnyOrder("Sone1", "Sone2"))
82         }
83
84         private fun verifyReplies(replyParameters: SimpleFieldSet) {
85                 assertThat(replyParameters["Post.Replies.Count"], equalTo("2"))
86                 assertThat(replyParameters["Post.Replies.0.ID"], equalTo("ReplyId1"))
87                 assertThat(replyParameters["Post.Replies.0.Sone"], equalTo("Sone1"))
88                 assertThat(replyParameters["Post.Replies.0.Time"], equalTo("1000"))
89                 assertThat(replyParameters["Post.Replies.0.Text"], equalTo("Reply 1"))
90                 assertThat(replyParameters["Post.Replies.1.ID"], equalTo("ReplyId2"))
91                 assertThat(replyParameters["Post.Replies.1.Sone"], equalTo("Sone2"))
92                 assertThat(replyParameters["Post.Replies.1.Time"], equalTo("2000"))
93                 assertThat(replyParameters["Post.Replies.1.Text"], equalTo("Reply 2"))
94         }
95
96         @Test
97         fun `request with valid post parameter returns post response`() {
98                 parameters.putSingle("Post", "ValidPostId")
99                 val replyParameters = command.execute(parameters).replyParameters
100                 verifyPostWithLikes(replyParameters)
101                 assertThat(replyParameters["Post.Recipient"], nullValue())
102                 verifyReplies(replyParameters)
103         }
104
105         @Test
106         fun `request with valid post parameter without replies returns post response without replies`() {
107                 parameters.putSingle("Post", "ValidPostId")
108                 parameters.putSingle("IncludeReplies", "false")
109                 val replyParameters = command.execute(parameters).replyParameters
110                 verifyPostWithLikes(replyParameters)
111                 assertThat(replyParameters["Post.Recipient"], nullValue())
112                 assertThat(replyParameters["Post.Replies.Count"], nullValue())
113         }
114
115         @Test
116         fun `request with valid post parameter returns post response with recipient`() {
117                 parameters.putSingle("Post", "ValidPostId")
118                 whenever(post.recipientId).thenReturn("Sone2".asOptional())
119                 val replyParameters = command.execute(parameters).replyParameters
120                 verifyPostWithLikes(replyParameters)
121                 assertThat(replyParameters["Post.Recipient"], equalTo("Sone2"))
122                 verifyReplies(replyParameters)
123         }
124
125         @Test
126         fun `request with valid post parameter without replies returns post response without replies but with recipient`() {
127                 parameters.putSingle("Post", "ValidPostId")
128                 parameters.putSingle("IncludeReplies", "false")
129                 whenever(post.recipientId).thenReturn("Sone2".asOptional())
130                 val replyParameters = command.execute(parameters).replyParameters
131                 verifyPostWithLikes(replyParameters)
132                 assertThat(replyParameters["Post.Recipient"], equalTo("Sone2"))
133                 assertThat(replyParameters["Post.Replies.Count"], nullValue())
134         }
135
136 }