From e4728af320271f4f10b958117ddd13a2de889285 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Wed, 30 Aug 2017 22:41:20 +0200 Subject: [PATCH] Add getPlaylists api call. Signed-off-by: Yahor Berdnikau --- .../subsonic/SubsonicApiGetPlaylistsTest.kt | 50 +++++++++++++++++++ .../resources/get_playlists_ok.json | 20 ++++++++ .../api/subsonic/SubsonicAPIDefinition.kt | 4 ++ .../api/subsonic/models/Playlist.kt | 1 + .../subsonic/response/GetPlaylistsResponse.kt | 19 +++++++ 5 files changed, 94 insertions(+) create mode 100644 subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt create mode 100644 subsonic-api/src/integrationTest/resources/get_playlists_ok.json create mode 100644 subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt new file mode 100644 index 00000000..dc9794ee --- /dev/null +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt @@ -0,0 +1,50 @@ +package org.moire.ultrasonic.api.subsonic + +import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should equal` +import org.amshove.kluent.`should not be` +import org.junit.Test +import org.moire.ultrasonic.api.subsonic.models.Playlist + +/** + * Integration test for [SubsonicAPIClient] for getPlaylists call. + */ +class SubsonicApiGetPlaylistsTest : SubsonicAPIClientTest() { + @Test + fun `Should parse error call`() { + val response = checkErrorCallParsed(mockWebServerRule) { + client.api.getPlaylists().execute() + } + + response.playlists `should not be` null + response.playlists `should equal` emptyList() + } + + @Test + fun `Should parse ok response`() { + mockWebServerRule.enqueueResponse("get_playlists_ok.json") + + val response = client.api.getPlaylists().execute() + + assertResponseSuccessful(response) + with(response.body().playlists) { + size `should equal to` 1 + this[0] `should equal` Playlist(id = 0, name = "Aug 27, 2017 11:17 AM", + owner = "admin", public = false, songCount = 16, duration = 3573, + comment = "Some comment", + created = parseDate("2017-08-27T11:17:26.216Z"), + changed = parseDate("2017-08-27T11:17:26.218Z"), + coverArt = "pl-0") + } + } + + @Test + fun `Should pass username as a parameter`() { + val username = "SomeUsername" + + mockWebServerRule.assertRequestParam(responseResourceName = "get_playlists_ok.json", + expectedParam = "username=$username") { + client.api.getPlaylists(username = username).execute() + } + } +} diff --git a/subsonic-api/src/integrationTest/resources/get_playlists_ok.json b/subsonic-api/src/integrationTest/resources/get_playlists_ok.json new file mode 100644 index 00000000..27d0b71c --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/get_playlists_ok.json @@ -0,0 +1,20 @@ +{ + "subsonic-response" : { + "status" : "ok", + "version" : "1.15.0", + "playlists" : { + "playlist" : [ { + "id" : "0", + "name" : "Aug 27, 2017 11:17 AM", + "comment" : "Some comment", + "owner" : "admin", + "public" : false, + "songCount" : 16, + "duration" : 3573, + "created" : "2017-08-27T11:17:26.216Z", + "changed" : "2017-08-27T11:17:26.218Z", + "coverArt" : "pl-0" + } ] + } + } +} \ 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 4c0d3fcb..409dff08 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 @@ -6,6 +6,7 @@ import org.moire.ultrasonic.api.subsonic.response.GetArtistsResponse import org.moire.ultrasonic.api.subsonic.response.GetIndexesResponse import org.moire.ultrasonic.api.subsonic.response.GetMusicDirectoryResponse import org.moire.ultrasonic.api.subsonic.response.GetPlaylistResponse +import org.moire.ultrasonic.api.subsonic.response.GetPlaylistsResponse import org.moire.ultrasonic.api.subsonic.response.LicenseResponse import org.moire.ultrasonic.api.subsonic.response.MusicFoldersResponse import org.moire.ultrasonic.api.subsonic.response.SearchResponse @@ -87,4 +88,7 @@ interface SubsonicAPIDefinition { @GET("getPlaylist.view") fun getPlaylist(@Query("id") id: Long): Call + + @GET("getPlaylists.view") + fun getPlaylists(@Query("username") username: String? = null): Call } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt index fc6e372f..04186edf 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt @@ -7,6 +7,7 @@ data class Playlist( val id: Long = -1, val name: String = "", val owner: String = "", + val comment: String = "", val public: Boolean = false, val songCount: Int = 0, val duration: Long = 0, diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt new file mode 100644 index 00000000..8b31d438 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt @@ -0,0 +1,19 @@ +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.Playlist + +class GetPlaylistsResponse(status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?) + : SubsonicResponse(status, version, error) { + @JsonProperty("playlists") + private val playlistsWrapper: PlaylistsWrapper = PlaylistsWrapper() + + val playlists: List + get() = playlistsWrapper.playlistList +} + +private class PlaylistsWrapper(@JsonProperty("playlist") val playlistList: List = emptyList())