package org.moire.ultrasonic.api.subsonic

import org.amshove.kluent.`should be`
import org.amshove.kluent.`should be equal to`
import org.amshove.kluent.`should not be`
import org.junit.Test
import org.moire.ultrasonic.api.subsonic.models.MusicDirectory
import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild

/**
 * Integration test for [SubsonicAPIClient] for getMusicDirectory request.
 */
class SubsonicApiGetMusicDirectoryTest : SubsonicAPIClientTest() {
    @Test
    fun `Should parse getMusicDirectory error response`() {
        val response = checkErrorCallParsed(mockWebServerRule) {
            client.api.getMusicDirectory("1").execute()
        }

        response.musicDirectory `should not be` null
        response.musicDirectory `should be equal to` MusicDirectory()
    }

    @Test
    fun `GetMusicDirectory should add directory id to query params`() {
        val directoryId = "124"

        mockWebServerRule.assertRequestParam(
            responseResourceName = "get_music_directory_ok.json",
            expectedParam = "id=$directoryId"
        ) {
            client.api.getMusicDirectory(directoryId).execute()
        }
    }

    @Test
    fun `Should parse get music directory ok response`() {
        mockWebServerRule.enqueueResponse("get_music_directory_ok.json")

        val response = client.api.getMusicDirectory("1").execute()

        assertResponseSuccessful(response)

        response.body()!!.musicDirectory `should not be` null
        with(response.body()!!.musicDirectory) {
            id `should be equal to` "4836"
            parent `should be equal to` "300"
            name `should be equal to` "12 Stones"
            userRating `should be equal to` 5
            averageRating `should be equal to` 5.0f
            starred `should be equal to` null
            playCount `should be equal to` 1
            childList.size `should be` 2
            childList[0] `should be equal to` MusicDirectoryChild(
                id = "4844", parent = "4836",
                isDir = false, title = "Crash", album = "12 Stones", artist = "12 Stones",
                track = 1, year = 2002, genre = "Alternative Rock", coverArt = "4836",
                size = 5348318L, contentType = "audio/mpeg", suffix = "mp3", duration = 222,
                bitRate = 192, path = "12 Stones/12 Stones/01 Crash.mp3", isVideo = false,
                playCount = 0, discNumber = 1,
                created = parseDate("2016-10-23T15:19:10.000Z"),
                albumId = "454", artistId = "288", type = "music"
            )
            childList[1] `should be equal to` MusicDirectoryChild(
                id = "4845", parent = "4836",
                isDir = false, title = "Broken", album = "12 Stones", artist = "12 Stones",
                track = 2, year = 2002, genre = "Alternative Rock", coverArt = "4836",
                size = 4309043L, contentType = "audio/mpeg", suffix = "mp3", duration = 179,
                bitRate = 192, path = "12 Stones/12 Stones/02 Broken.mp3", isVideo = false,
                playCount = 0, discNumber = 1,
                created = parseDate("2016-10-23T15:19:09.000Z"),
                albumId = "454", artistId = "288", type = "music"
            )
        }
    }
}
