From 1502c4c9c8737501708b0c7662e041a8a4cd6a8f Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 11 Nov 2017 21:17:00 +0100 Subject: [PATCH] Add getGenres app call. Signed-off-by: Yahor Berdnikau --- .../api/subsonic/SubsonicApiGetGenresTest.kt | 37 +++++++++++++++++++ .../resources/get_genres_ok.json | 29 +++++++++++++++ .../api/subsonic/SubsonicAPIDefinition.kt | 4 ++ .../ultrasonic/api/subsonic/models/Genre.kt | 7 ++++ .../api/subsonic/response/GenresResponse.kt | 15 ++++++++ 5 files changed, 92 insertions(+) create mode 100644 subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt create mode 100644 subsonic-api/src/integrationTest/resources/get_genres_ok.json create mode 100644 subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt create mode 100644 subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt new file mode 100644 index 00000000..1f311f07 --- /dev/null +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt @@ -0,0 +1,37 @@ +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.Genre + +/** + * Integration test for [SubsonicAPIDefinition.getGenres] call. + */ +class SubsonicApiGetGenresTest : SubsonicAPIClientTest() { + @Test + fun `Should handle error response`() { + val response = checkErrorCallParsed(mockWebServerRule) { + client.api.getGenres().execute() + } + + response.genresList `should equal` emptyList() + } + + @Test + fun `Should handle ok response`() { + mockWebServerRule.enqueueResponse("get_genres_ok.json") + + val response = client.api.getGenres().execute() + + assertResponseSuccessful(response) + with(response.body().genresList) { + size `should equal to` 5 + this[0] `should equal` Genre(1186, 103, "Rock") + this[1] `should equal` Genre(896, 72, "Electronic") + this[2] `should equal` Genre(790, 59, "Alternative Rock") + this[3] `should equal` Genre(622, 97, "Trance") + this[4] `should equal` Genre(476, 36, "Hard Rock") + } + } +} diff --git a/subsonic-api/src/integrationTest/resources/get_genres_ok.json b/subsonic-api/src/integrationTest/resources/get_genres_ok.json new file mode 100644 index 00000000..a51ada16 --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/get_genres_ok.json @@ -0,0 +1,29 @@ +{ + "subsonic-response" : { + "status" : "ok", + "version" : "1.15.0", + "genres" : { + "genre" : [ { + "songCount" : 1186, + "albumCount" : 103, + "value" : "Rock" + }, { + "songCount" : 896, + "albumCount" : 72, + "value" : "Electronic" + }, { + "songCount" : 790, + "albumCount" : 59, + "value" : "Alternative Rock" + }, { + "songCount" : 622, + "albumCount" : 97, + "value" : "Trance" + }, { + "songCount" : 476, + "albumCount" : 36, + "value" : "Hard Rock" + } ] + } + } +} \ 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 afce5798..fde41c0a 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.GenresResponse import org.moire.ultrasonic.api.subsonic.response.GetAlbumList2Response import org.moire.ultrasonic.api.subsonic.response.GetAlbumListResponse import org.moire.ultrasonic.api.subsonic.response.GetAlbumResponse @@ -197,4 +198,7 @@ interface SubsonicAPIDefinition { fun createShare(@Query("id") idsToShare: List, @Query("description") description: String? = null, @Query("expires") expires: Long? = null): Call + + @GET("getGenres.view") + fun getGenres(): Call } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt new file mode 100644 index 00000000..6a54d43c --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt @@ -0,0 +1,7 @@ +package org.moire.ultrasonic.api.subsonic.models + +import com.fasterxml.jackson.annotation.JsonProperty + +data class Genre(val songCount: Int = 0, + val albumCount: Int = 0, + @JsonProperty("value") val name: String) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt new file mode 100644 index 00000000..fdf34c18 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt @@ -0,0 +1,15 @@ +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.Genre + +class GenresResponse(status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?) : SubsonicResponse(status, version, error) { + @JsonProperty("genres") private val genresWrapper = GenresWrapper() + val genresList: List get() = genresWrapper.genresList +} + +internal class GenresWrapper(@JsonProperty("genre") val genresList: List = emptyList())