Add unit test for get sone command, fix some bugs
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / fcp / GetSoneCommandTest.kt
diff --git a/src/test/kotlin/net/pterodactylus/sone/fcp/GetSoneCommandTest.kt b/src/test/kotlin/net/pterodactylus/sone/fcp/GetSoneCommandTest.kt
new file mode 100644 (file)
index 0000000..710a5df
--- /dev/null
@@ -0,0 +1,93 @@
+package net.pterodactylus.sone.fcp
+
+import net.pterodactylus.sone.core.Core
+import net.pterodactylus.sone.freenet.fcp.FcpException
+import net.pterodactylus.sone.test.asOptional
+import net.pterodactylus.sone.test.whenever
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.equalTo
+import org.hamcrest.Matchers.nullValue
+import org.junit.Test
+
+/**
+ * Unit test for [GetSoneCommand].
+ */
+class GetSoneCommandTest : SoneCommandTest() {
+
+       private val sone = createSone("SoneId", "Sone", "Sone", "#1", 1000).apply {
+               profile.addField("Test").value = "true"
+               profile.addField("More Test").value = "also true"
+       }
+
+       override fun createCommand(core: Core) = GetSoneCommand(core)
+
+       @Test
+       fun `command does not require write access`() {
+               assertThat(command.requiresWriteAccess(), equalTo(false))
+       }
+
+       @Test
+       fun `request without any parameters results in fcp exception`() {
+               requestWithoutAnyParameterResultsInFcpException()
+       }
+
+       @Test
+       fun `request with empty Sone parameter results in fcp exception`() {
+               requestWithEmptySoneParameterResultsInFcpException()
+       }
+
+       @Test
+       fun `request with invalid Sone parameter results in fcp exception`() {
+               requestWithInvalidSoneParameterResultsInFcpException()
+       }
+
+       @Test
+       fun `request with valid Sone parameter results in response with Sone information`() {
+               whenever(core.getSone("SoneId")).thenReturn(sone.asOptional())
+               whenever(core.getSone(null)).thenReturn(null.asOptional())
+               parameters += "Sone" to "SoneId"
+               val replyParameters = command.execute(parameters).replyParameters
+               assertThat(replyParameters["Message"], equalTo("Sone"))
+               assertThat(replyParameters.parseSone("Sone."), matchesSone(sone))
+               assertThat(replyParameters["Sone.Followed"], nullValue())
+       }
+
+       @Test
+       fun `request with local sone parameter results in followed being true for friend sone`() {
+               whenever(core.getSone("SoneId")).thenReturn(sone.asOptional())
+               whenever(core.getSone("LocalSone")).thenReturn(localSone.asOptional())
+               whenever(localSone.id).thenReturn("LocalSone")
+               whenever(localSone.hasFriend("SoneId")).thenReturn(true)
+               parameters += "Sone" to "SoneId"
+               parameters += "LocalSone" to "LocalSone"
+               val replyParameters = command.execute(parameters).replyParameters
+               assertThat(replyParameters["Message"], equalTo("Sone"))
+               assertThat(replyParameters.parseSone("Sone."), matchesSone(sone))
+               assertThat(replyParameters["Sone.Followed"], equalTo("true"))
+       }
+       
+       @Test
+       fun `request with local sone parameter results in followed being false for non-friend sone`() {
+               whenever(core.getSone("SoneId")).thenReturn(sone.asOptional())
+               whenever(core.getSone("LocalSone")).thenReturn(localSone.asOptional())
+               whenever(localSone.id).thenReturn("LocalSone")
+               parameters += "Sone" to "SoneId"
+               parameters += "LocalSone" to "LocalSone"
+               val replyParameters = command.execute(parameters).replyParameters
+               assertThat(replyParameters["Message"], equalTo("Sone"))
+               assertThat(replyParameters.parseSone("Sone."), matchesSone(sone))
+               assertThat(replyParameters["Sone.Followed"], equalTo("false"))
+       }
+
+       @Test
+       fun `request with remote sone as local sone parameter results in fcp exception`() {
+               whenever(core.getSone("SoneId")).thenReturn(sone.asOptional())
+               whenever(core.getSone("RemoteSone")).thenReturn(remoteSone.asOptional())
+               whenever(localSone.id).thenReturn("RemoteSone")
+               parameters += "Sone" to "SoneId"
+               parameters += "LocalSone" to "RemoteSone"
+               expectedException.expect(FcpException::class.java)
+               command.execute(parameters)
+       }
+
+}