Skip to content
Draft
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import io.music_assistant.client.data.model.server.MediaType
import io.music_assistant.client.data.model.server.QueueOption
import io.music_assistant.client.data.model.server.SearchResult
import io.music_assistant.client.data.model.server.ServerMediaItem
import io.music_assistant.client.ui.Timings
import io.music_assistant.client.utils.DataConnectionState
import io.music_assistant.client.utils.SessionState
import io.music_assistant.client.utils.resultAs
Expand Down Expand Up @@ -51,7 +52,7 @@ class AutoLibrary(
searchFlow
.filterNotNull()
.filter { it.first.isNotEmpty() }
.debounce(SEARCH_DEBOUNCE_MS)
.debounce(Timings.INPUT_DEBOUNCE)
.collect { (query, result) ->
val answer = apiClient.sendRequest(
request = Request.Library.search(
Expand Down Expand Up @@ -321,7 +322,6 @@ class AutoLibrary(
)

private companion object {
const val SEARCH_DEBOUNCE_MS = 500L
const val WAIT_FOR_AUTHENTICATED_TIMEOUT_MS = 30_000L

// Encoded media item IDs are `tab__type__provider__providerItemId` — exactly 4 parts.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package io.music_assistant.client.feature

import androidx.compose.ui.test.junit4.createComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.music_assistant.client.api.ServiceClient
import io.music_assistant.client.data.model.server.PlayerState
import io.music_assistant.client.data.model.server.ServerMediaItem
import io.music_assistant.client.support.FakeServiceClient
import io.music_assistant.client.support.Qualifiers
import io.music_assistant.client.support.ServerMediaItemFixtures
import io.music_assistant.client.support.ServerPlayerFixtures
import io.music_assistant.client.support.launchLoggedInApp
import io.music_assistant.client.support.pages.Page
import io.music_assistant.client.support.pages.assertCurrentPlayer
import io.music_assistant.client.support.pages.pause
import io.music_assistant.client.support.pages.playMedia
import io.music_assistant.client.support.rules.createTestRuleChain
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert.assertThat
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.koin.java.KoinJavaComponent.inject
import org.robolectric.annotation.Config

@RunWith(AndroidJUnit4::class)
@Config(qualifiers = Qualifiers.MEDIUM_PHONE)
class PlayerTest {
@get:Rule
val testRuleChain = createTestRuleChain()

@get:Rule
val composeTestRule = createComposeRule()

private val serviceClient: FakeServiceClient by inject(ServiceClient::class.java)

@Test
fun `can play album`() {
val album = ServerMediaItemFixtures.album()
val track = ServerMediaItemFixtures.track(album = album)
serviceClient.addToLibrary(track)

val player = ServerPlayerFixtures.player()
serviceClient.addPlayer(player)

launchLoggedInApp(composeTestRule, serviceClient)
.clickOnMedia(album)
.clickPlay()
.assertCurrentPlayer(player.displayName, playing = true, item = track.name)
.assertPlayerState(
serviceClient,
player.playerId,
playerState = PlayerState.PLAYING,
serverMediaItem = track,
)
}

@Test
fun `can play track from album`() {
val album = ServerMediaItemFixtures.album()
val track1 = ServerMediaItemFixtures.track(album = album)
val track2 = ServerMediaItemFixtures.track(album = album)
serviceClient.addToLibrary(track1, track2)

val player = ServerPlayerFixtures.player()
serviceClient.addPlayer(player)

launchLoggedInApp(composeTestRule, serviceClient)
.clickOnMedia(album)
.playMedia(track2)
.assertCurrentPlayer(player.displayName, playing = true, item = track2.name)
.assertPlayerState(
serviceClient,
player.playerId,
playerState = PlayerState.PLAYING,
serverMediaItem = track2,
)
.playMedia(track1)
.assertCurrentPlayer(player.displayName, playing = true, item = track1.name)
.assertPlayerState(
serviceClient,
player.playerId,
playerState = PlayerState.PLAYING,
serverMediaItem = track1,
)
}

@Test
fun `can pause playback`() {
val track = ServerMediaItemFixtures.track()
serviceClient.addToLibrary(track)

val player = ServerPlayerFixtures.player()
serviceClient.addPlayer(player)

launchLoggedInApp(composeTestRule, serviceClient)
.playMedia(track)
.assertCurrentPlayer(player.displayName, playing = true, item = track.name)
.pause()
.assertCurrentPlayer(player.displayName, playing = false, item = track.name)
.assertPlayerState(
serviceClient,
player.playerId,
playerState = PlayerState.PAUSED,
serverMediaItem = track,
)
}
}

private fun <T : Page> T.assertPlayerState(
serviceClient: FakeServiceClient,
playerId: String,
playerState: PlayerState,
serverMediaItem: ServerMediaItem?,
): T {
assertThat(serviceClient.getState(playerId), equalTo(playerState))
assertThat(serviceClient.getCurrentlyPlaying(playerId), equalTo(serverMediaItem))
return this
}
Loading