diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt new file mode 100644 index 00000000..910c58a0 --- /dev/null +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt @@ -0,0 +1,45 @@ +package org.moire.ultrasonic.api.subsonic + +import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should equal` +import org.junit.Test +import org.moire.ultrasonic.api.subsonic.models.ChatMessage + +/** + * Integration test for [SubsonicAPIDefinition.getChatMessages] call. + */ +class SubsonicApiGetChatMessagesTest : SubsonicAPIClientTest() { + @Test + fun `Should handle error response`() { + val response = checkErrorCallParsed(mockWebServerRule) { + client.api.getChatMessages().execute() + } + + response.chatMessages `should equal` emptyList() + } + + @Test + fun `Should handle ok response`() { + mockWebServerRule.enqueueResponse("get_chat_messages_ok.json") + + val response = client.api.getChatMessages().execute() + + assertResponseSuccessful(response) + with(response.body().chatMessages) { + size `should equal to` 2 + this[0] `should equal` ChatMessage(username = "sindre", time = 1269771845310, + message = "Sindre was here") + this[1] `should equal` ChatMessage(username = "ben", time = 1269771842504, + message = "Ben too") + } + } + + @Test + fun `Should pass since in request param`() { + val since = 21388L + + mockWebServerRule.assertRequestParam(expectedParam = "since=$since") { + client.api.getChatMessages(since = since).execute() + } + } +} diff --git a/subsonic-api/src/integrationTest/resources/get_chat_messages_ok.json b/subsonic-api/src/integrationTest/resources/get_chat_messages_ok.json new file mode 100644 index 00000000..b406b539 --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/get_chat_messages_ok.json @@ -0,0 +1,17 @@ +{ + "subsonic-response" : { + "status" : "ok", + "version" : "1.15.0", + "chatMessages" : { + "chatMessage" : [ { + "username" : "sindre", + "time" : 1269771845310, + "message" : "Sindre was here" + }, { + "username" : "ben", + "time" : 1269771842504, + "message" : "Ben too" + } ] + } + } +} \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt index 276fcda0..c315e313 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt @@ -3,6 +3,7 @@ package org.moire.ultrasonic.api.subsonic import okhttp3.ResponseBody import org.moire.ultrasonic.api.subsonic.models.AlbumListType import org.moire.ultrasonic.api.subsonic.models.JukeboxAction +import org.moire.ultrasonic.api.subsonic.response.ChatMessagesResponse import org.moire.ultrasonic.api.subsonic.response.GenresResponse import org.moire.ultrasonic.api.subsonic.response.GetAlbumList2Response import org.moire.ultrasonic.api.subsonic.response.GetAlbumListResponse @@ -212,6 +213,8 @@ interface SubsonicAPIDefinition { @Query("musicFolderId") musicFolderId: Long? = null): Call @GET("getUser.view") - fun getUser( - @Query("username") username: String): Call + fun getUser(@Query("username") username: String): Call + + @GET("getChatMessages.view") + fun getChatMessages(@Query("since") since: Long? = null): Call } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/ChatMessage.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/ChatMessage.kt new file mode 100644 index 00000000..7e76a466 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/ChatMessage.kt @@ -0,0 +1,6 @@ +package org.moire.ultrasonic.api.subsonic.models + +data class ChatMessage( + val username: String = "", + val time: Long = 0, + val message: String = "") diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/ChatMessagesResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/ChatMessagesResponse.kt new file mode 100644 index 00000000..4e41ccc8 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/ChatMessagesResponse.kt @@ -0,0 +1,18 @@ +package org.moire.ultrasonic.api.subsonic.response + +import com.fasterxml.jackson.annotation.JsonProperty +import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions +import org.moire.ultrasonic.api.subsonic.SubsonicError +import org.moire.ultrasonic.api.subsonic.models.ChatMessage + +class ChatMessagesResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?) : SubsonicResponse(status, version, error) { + @JsonProperty("chatMessages") private val wrapper = ChatMessagesWrapper() + + val chatMessages: List get() = wrapper.messagesList +} + +internal class ChatMessagesWrapper( + @JsonProperty("chatMessage") val messagesList: List = emptyList())