1 package net.pterodactylus.sone.fcp
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
19 * Unit test for [GetPostCommand].
21 class GetPostCommandTest : SoneCommandTest() {
23 private val sone = mock<Sone>().apply {
24 whenever(id).thenReturn("SoneId")
26 private val post = createPost()
28 override fun createCommand(core: Core) = GetPostCommand(core)
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))
37 createPostReply("ReplyId1", sone1, 1000, "Reply 1"),
38 createPostReply("ReplyId2", sone2, 2000, "Reply 2")
40 whenever(core.getReplies("ValidPostId")).thenReturn(replies)
44 fun `command does not require write access`() {
45 assertThat(command.requiresWriteAccess(), equalTo(false))
49 fun `request without any parameter results in fcp exception`() {
50 requestWithoutAnyParameterResultsInFcpException()
54 fun `request with invalid post parameter results in fcp exception`() {
55 parameters.putSingle("Post", "InvalidPostId")
56 executeCommandAndExpectFcpException()
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)
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")
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"))
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"))
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)
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())
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)
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())