diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt new file mode 100644 index 00000000..ea66eef9 --- /dev/null +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt @@ -0,0 +1,46 @@ +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.MusicDirectoryChild + +/** + * Integration test for [SubsonicAPIDefinition.getBookmarks] call. + */ +class SubsonicApiGetBookmarksTest : SubsonicAPIClientTest() { + @Test + fun `Should handle error response`() { + val response = checkErrorCallParsed(mockWebServerRule) { + client.api.getBookmarks().execute() + } + + response.bookmarkList `should equal` emptyList() + } + + @Test + fun `Should handle ok response`() { + mockWebServerRule.enqueueResponse("get_bookmarks_ok.json") + + val response = client.api.getBookmarks().execute() + + assertResponseSuccessful(response) + response.body().bookmarkList.size `should equal to` 1 + with(response.body().bookmarkList[0]) { + position `should equal to` 107914 + username `should equal to` "CaptainEurope" + comment `should equal to` "Look at this" + created `should equal` parseDate("2017-11-18T15:22:22.144Z") + changed `should equal` parseDate("2017-11-18T15:22:22.144Z") + entry `should equal` MusicDirectoryChild(id = 10349, parent = 10342, + isDir = false, title = "Amerika", album = "Home of the Strange", + artist = "Young the Giant", track = 1, year = 2016, genre = "Indie Rock", + coverArt = "10342", size = 9628673, contentType = "audio/mpeg", + suffix = "mp3", duration = 240, bitRate = 320, + path = "Young the Giant/Home of the Strange/01 Amerika.mp3", + isVideo = false, playCount = 2, discNumber = 1, + created = parseDate("2017-11-01T17:46:52.000Z"), + albumId = 984, artistId = 571, type = "music") + } + } +} diff --git a/subsonic-api/src/integrationTest/resources/get_bookmarks_ok.json b/subsonic-api/src/integrationTest/resources/get_bookmarks_ok.json new file mode 100644 index 00000000..deb9dec6 --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/get_bookmarks_ok.json @@ -0,0 +1,40 @@ +{ + "subsonic-response" : { + "status" : "ok", + "version" : "1.15.0", + "bookmarks" : { + "bookmark" : [ { + "position" : 107914, + "username" : "CaptainEurope", + "comment" : "Look at this", + "created" : "2017-11-18T15:22:22.144Z", + "changed" : "2017-11-18T15:22:22.144Z", + "entry" : { + "id" : "10349", + "parent" : "10342", + "isDir" : false, + "title" : "Amerika", + "album" : "Home of the Strange", + "artist" : "Young the Giant", + "track" : 1, + "year" : 2016, + "genre" : "Indie Rock", + "coverArt" : "10342", + "size" : 9628673, + "contentType" : "audio/mpeg", + "suffix" : "mp3", + "duration" : 240, + "bitRate" : 320, + "path" : "Young the Giant/Home of the Strange/01 Amerika.mp3", + "isVideo" : false, + "playCount" : 2, + "discNumber" : 1, + "created" : "2017-11-01T17:46:52.000Z", + "albumId" : "984", + "artistId" : "571", + "type" : "music" + } + } ] + } + } +} \ 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 ae06b3ab..04bb260a 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.BookmarksResponse import org.moire.ultrasonic.api.subsonic.response.ChatMessagesResponse import org.moire.ultrasonic.api.subsonic.response.GenresResponse import org.moire.ultrasonic.api.subsonic.response.GetAlbumList2Response @@ -220,4 +221,7 @@ interface SubsonicAPIDefinition { @GET("addChatMessage.view") fun addChatMessage(@Query("message") message: String): Call + + @GET("getBookmarks.view") + fun getBookmarks(): Call } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Bookmark.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Bookmark.kt new file mode 100644 index 00000000..f527b068 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Bookmark.kt @@ -0,0 +1,11 @@ +package org.moire.ultrasonic.api.subsonic.models + +import java.util.Calendar + +data class Bookmark( + val position: Long = 0, + val username: String = "", + val comment: String = "", + val created: Calendar? = null, + val changed: Calendar? = null, + val entry: MusicDirectoryChild = MusicDirectoryChild()) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/BookmarksResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/BookmarksResponse.kt new file mode 100644 index 00000000..4eaae226 --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/BookmarksResponse.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.Bookmark + +class BookmarksResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?) : SubsonicResponse(status, version, error) { + @JsonProperty("bookmarks") private val bookmarksWrapper = BookmarkWrapper() + + val bookmarkList: List get() = bookmarksWrapper.bookmarkList +} + +internal class BookmarkWrapper( + @JsonProperty("bookmark") val bookmarkList: List = emptyList())