Extract common test methods for all commands
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / fcp / CreatePostCommandTest.kt
1 package net.pterodactylus.sone.fcp
2
3 import com.google.common.base.Optional
4 import com.google.common.base.Optional.absent
5 import com.google.common.base.Optional.of
6 import net.pterodactylus.sone.core.Core
7 import net.pterodactylus.sone.data.Post
8 import net.pterodactylus.sone.freenet.fcp.FcpException
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.equalTo
13 import org.hamcrest.Matchers.notNullValue
14 import org.junit.Test
15
16 /**
17  * Unit test for [CreatePostCommand].
18  */
19 class CreatePostCommandTest : SoneCommandTest() {
20
21         override fun createCommand(core: Core) = CreatePostCommand(core)
22
23         @Test
24         fun `command requires write access`() {
25                 assertThat(command.requiresWriteAccess(), equalTo(true))
26         }
27
28         @Test
29         fun `request without any parameters results in fcp exception`() {
30                 requestWithoutAnyParameterResultsInFcpException()
31         }
32
33         @Test
34         fun `request with empty Sone parameter results in fcp exception`() {
35             requestWithEmptySoneParameterResultsInFcpException()
36         }
37
38         @Test
39         fun `request with invalid Sone parameter results in fcp exception`() {
40                 requestWithInvalidSoneParameterResultsInFcpException()
41         }
42
43         @Test
44         fun `request with valid remote Sone parameter results in fcp exception`() {
45                 requestWithValidRemoteSoneParameterResultsInFcpException()
46         }
47
48         @Test
49         fun `request without text results in fcp exception`() {
50                 parameters.putSingle("Sone", "LocalSoneId")
51                 whenever(core.getSone("LocalSoneId")).thenReturn(Optional.of(localSone))
52                 expectedException.expect(FcpException::class.java)
53                 command.execute(parameters, null, null)
54         }
55
56         @Test
57         fun `request with text creates post`() {
58                 parameters.putSingle("Sone", "LocalSoneId")
59                 parameters.putSingle("Text", "Test")
60                 whenever(core.getSone("LocalSoneId")).thenReturn(of(localSone))
61                 val post = mock<Post>().apply { whenever(id).thenReturn("PostId") }
62                 whenever(core.createPost(localSone, absent(), "Test")).thenReturn(post)
63                 val response = command.execute(parameters, null, null)
64                 assertThat(response.replyParameters.get("Message"), equalTo("PostCreated"))
65                 assertThat(response.replyParameters.get("Post"), equalTo("PostId"))
66         }
67
68         @Test
69         fun `request with invalid recipient results in fcp exception`() {
70                 parameters.putSingle("Sone", "LocalSoneId")
71                 parameters.putSingle("Text", "Test")
72                 parameters.putSingle("Recipient", "InvalidSoneId")
73                 whenever(core.getSone("LocalSoneId")).thenReturn(of(localSone))
74                 expectedException.expect(FcpException::class.java)
75                 command.execute(parameters, null, null)
76         }
77
78         @Test
79         fun `request with recipient the same as the sender returns an error response`() {
80                 parameters.putSingle("Sone", "LocalSoneId")
81                 parameters.putSingle("Text", "Test")
82                 parameters.putSingle("Recipient", "LocalSoneId")
83                 whenever(core.getSone("LocalSoneId")).thenReturn(of(localSone))
84                 val response = command.execute(parameters, null, null)
85                 assertThat(response.replyParameters["Message"], equalTo("Error"))
86                 assertThat(response.replyParameters["ErrorMessage"], notNullValue())
87         }
88
89         @Test
90         fun `request with text and recipient creates post`() {
91                 parameters.putSingle("Sone", "LocalSoneId")
92                 parameters.putSingle("Text", "Test")
93                 parameters.putSingle("Recipient", "RemoteSoneId")
94                 whenever(core.getSone("LocalSoneId")).thenReturn(of(localSone))
95                 whenever(core.getSone("RemoteSoneId")).thenReturn(of(remoteSone))
96                 val post = mock<Post>().apply { whenever(id).thenReturn("PostId") }
97                 whenever(core.createPost(localSone, of(remoteSone), "Test")).thenReturn(post)
98                 val response = command.execute(parameters, null, null)
99                 assertThat(response.replyParameters.get("Message"), equalTo("PostCreated"))
100                 assertThat(response.replyParameters.get("Post"), equalTo("PostId"))
101         }
102
103 }