From f686ebfb16c1cf407850fdbe9ecff37b5b8dd6b0 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Thu, 6 Apr 2017 15:55:36 +0200 Subject: [PATCH] Update kotlin and android dependencies. --- dependencies.gradle | 8 +- .../api/subsonic/SubsonicAPITest.kt | 74 +++++++++++++++++++ .../resources/get_indexes_ok.json | 30 ++++++++ .../api/subsonic/SubsonicAPIDefinition.kt | 10 ++- .../ultrasonic/api/subsonic/models/Artist.kt | 7 ++ .../ultrasonic/api/subsonic/models/Index.kt | 7 ++ .../ultrasonic/api/subsonic/models/Indexes.kt | 9 +++ .../subsonic/response/GetIndexesResponse.kt | 11 +++ 8 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 subsonic-api/src/integrationTest/resources/get_indexes_ok.json create mode 100644 subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt create mode 100644 subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt create mode 100644 subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt create mode 100644 subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt diff --git a/dependencies.gradle b/dependencies.gradle index 78926565..a6920af1 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,14 +1,14 @@ ext.versions = [ minSdk : 14, targetSdk : 22, - compileSdk : 22, + compileSdk : 26, - buildTools : "25.0.2", - androidTools : "2.3.0", + buildTools : "25.0.3", + androidTools : "2.3.3", androidSupport : "22.2.1", - kotlin : "1.1.0", + kotlin : "1.1.2-5", retrofit : "2.1.0", jackson : "2.8.7", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPITest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPITest.kt index ac110997..7691cf44 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPITest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPITest.kt @@ -3,11 +3,14 @@ package org.moire.ultrasonic.api.subsonic import okhttp3.mockwebserver.MockResponse import okio.Okio import org.amshove.kluent.`should be` +import org.amshove.kluent.`should contain` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Before import org.junit.Rule import org.junit.Test +import org.moire.ultrasonic.api.subsonic.models.Artist +import org.moire.ultrasonic.api.subsonic.models.Index import org.moire.ultrasonic.api.subsonic.models.License import org.moire.ultrasonic.api.subsonic.models.MusicFolder import org.moire.ultrasonic.api.subsonic.response.SubsonicResponse @@ -97,6 +100,77 @@ class SubsonicAPITest { response.musicFolders `should be` null } + @Test + fun `Should parse get indexes ok response`() { + // TODO: check for shortcut parsing + enqueueResponse("get_indexes_ok.json") + + val response = api.getApi().getIndexes(null, null).execute() + + assertResponseSuccessful(response) + response.body().indexes `should not be` null + with(response.body().indexes!!) { + lastModified `should equal` 1491069027523 + ignoredArticles `should equal` "The El La Los Las Le Les" + shortcuts `should be` null + indexList `should equal` mutableListOf( + Index("A", listOf( + Artist(50L, "Ace Of Base", parseDate("2017-04-02T20:16:29.815Z")), + Artist(379L, "A Perfect Circle", null) + )), + Index("H", listOf( + Artist(299, "Haddaway", null), + Artist(297, "Halestorm", null) + )) + ) + } + } + + @Test + fun `Should add music folder id as a query param for getIndexes api call`() { + enqueueResponse("get_indexes_ok.json") + val musicFolderId = 9L + + api.getApi().getIndexes(musicFolderId, null).execute() + + with(mockWebServerRule.mockWebServer.takeRequest()) { + requestLine `should contain` "musicFolderId=$musicFolderId" + } + } + + @Test + fun `Should add ifModifiedSince as a query param for getIndexes api call`() { + enqueueResponse("get_indexes_ok.json") + val ifModifiedSince = System.currentTimeMillis() + + api.getApi().getIndexes(null, ifModifiedSince).execute() + + with(mockWebServerRule.mockWebServer.takeRequest()) { + requestLine `should contain` "ifModifiedSince=$ifModifiedSince" + } + } + + @Test + fun `Should add both params to query for getIndexes api call`() { + enqueueResponse("get_indexes_ok.json") + val musicFolderId = 110L + val ifModifiedSince = System.currentTimeMillis() + + api.getApi().getIndexes(musicFolderId, ifModifiedSince).execute() + + with(mockWebServerRule.mockWebServer.takeRequest()) { + requestLine `should contain` "musicFolderId=$musicFolderId" + requestLine `should contain` "ifModifiedSince=$ifModifiedSince" + } + } + + @Test + fun `Should parse get indexes error response`() { + val response = checkErrorCallParsed { api.getApi().getIndexes(null, null).execute() } + + response.indexes `should be` null + } + private fun enqueueResponse(resourceName: String) { mockWebServerRule.mockWebServer.enqueue(MockResponse() .setBody(loadJsonResponse(resourceName))) diff --git a/subsonic-api/src/integrationTest/resources/get_indexes_ok.json b/subsonic-api/src/integrationTest/resources/get_indexes_ok.json new file mode 100644 index 00000000..b604c939 --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/get_indexes_ok.json @@ -0,0 +1,30 @@ +{ + "subsonic-response" : { + "status" : "ok", + "version" : "1.13.0", + "indexes" : { + "lastModified" : 1491069027523, + "ignoredArticles" : "The El La Los Las Le Les", + "index" : [ { + "name" : "A", + "artist" : [ { + "id" : "50", + "name" : "Ace Of Base", + "starred" : "2017-04-02T20:16:29.815Z" + }, { + "id" : "379", + "name" : "A Perfect Circle" + } ] + }, { + "name" : "H", + "artist" : [ { + "id" : "299", + "name" : "Haddaway" + }, { + "id" : "297", + "name" : "Halestorm" + } ] + } ] + } + } +} \ 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 15559da6..9db3df4e 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 @@ -1,13 +1,17 @@ package org.moire.ultrasonic.api.subsonic +import org.moire.ultrasonic.api.subsonic.response.GetIndexesResponse import org.moire.ultrasonic.api.subsonic.response.LicenseResponse import org.moire.ultrasonic.api.subsonic.response.MusicFoldersResponse import org.moire.ultrasonic.api.subsonic.response.SubsonicResponse import retrofit2.Call import retrofit2.http.GET +import retrofit2.http.Query /** - * // TODO + * Subsonic API calls. + * + * For methods description see [http://www.subsonic.org/pages/api.jsp]. */ interface SubsonicAPIDefinition { @GET("ping.view") @@ -18,4 +22,8 @@ interface SubsonicAPIDefinition { @GET("getMusicFolders.view") fun getMusicFolders(): Call + + @GET("getIndexes.view") + fun getIndexes(@Query("musicFolderId") musicFolderId: Long?, + @Query("ifModifiedSince") ifModifiedSince: Long?): Call } \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt new file mode 100644 index 00000000..b616c753 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt @@ -0,0 +1,7 @@ +package org.moire.ultrasonic.api.subsonic.models + +import java.util.* + +data class Artist(val id: Long, + val name: String, + val starred: Calendar?) \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt new file mode 100644 index 00000000..fd42a465 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt @@ -0,0 +1,7 @@ +package org.moire.ultrasonic.api.subsonic.models + +import com.fasterxml.jackson.annotation.JsonProperty + +data class Index(val name: String, + @JsonProperty("artist") + val artists: List) \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt new file mode 100644 index 00000000..93c74297 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt @@ -0,0 +1,9 @@ +package org.moire.ultrasonic.api.subsonic.models + +import com.fasterxml.jackson.annotation.JsonProperty + +data class Indexes(val lastModified: Long, + val ignoredArticles: String?, + @JsonProperty("index") + val indexList: List, + val shortcuts: List?) \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt new file mode 100644 index 00000000..0224def3 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt @@ -0,0 +1,11 @@ +package org.moire.ultrasonic.api.subsonic.response + +import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions +import org.moire.ultrasonic.api.subsonic.SubsonicError +import org.moire.ultrasonic.api.subsonic.models.Indexes + +class GetIndexesResponse(status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val indexes: Indexes?) : + SubsonicResponse(status, version, error) \ No newline at end of file