feat: M3 weighted shuffle v1 — real /api/radio with scoring #21

Merged
bvandeusen merged 262 commits from dev into main 2026-04-27 11:00:29 -04:00
Showing only changes of commit 7250f1f0e0 - Show all commits
@@ -5,6 +5,7 @@ import com.fabledsword.minstrel.cache.sync.SyncController
import com.fabledsword.minstrel.library.data.LibraryRepository
import com.fabledsword.minstrel.models.AlbumRef
import com.fabledsword.minstrel.models.ArtistRef
import com.fabledsword.minstrel.player.PlayerController
import com.fabledsword.minstrel.testutil.MainDispatcherExtension
import io.mockk.every
import io.mockk.mockk
@@ -26,7 +27,11 @@ class LibraryViewModelTest {
every { repo.observeArtists() } returns MutableSharedFlow()
every { repo.observeAlbums() } returns MutableSharedFlow()
val vm = LibraryViewModel(repo, mockk<SyncController>(relaxed = true))
val vm = LibraryViewModel(
repo,
mockk<SyncController>(relaxed = true),
mockk<PlayerController>(relaxed = true),
)
assertEquals(LibraryUiState.Loading, vm.uiState.value)
}
@@ -44,7 +49,11 @@ class LibraryViewModelTest {
every { repo.observeArtists() } returns flowOf(emptyList())
every { repo.observeAlbums() } returns flowOf(emptyList())
val vm = LibraryViewModel(repo, mockk<SyncController>(relaxed = true))
val vm = LibraryViewModel(
repo,
mockk<SyncController>(relaxed = true),
mockk<PlayerController>(relaxed = true),
)
vm.uiState.test {
assertEquals(LibraryUiState.Empty, awaitItem())
@@ -60,7 +69,11 @@ class LibraryViewModelTest {
every { repo.observeAlbums() } returns
flowOf(listOf(AlbumRef(id = "al1", title = "Geogaddi", artistId = "a1")))
val vm = LibraryViewModel(repo, mockk<SyncController>(relaxed = true))
val vm = LibraryViewModel(
repo,
mockk<SyncController>(relaxed = true),
mockk<PlayerController>(relaxed = true),
)
vm.uiState.test {
val success = awaitItem() as LibraryUiState.Success
@@ -79,7 +92,11 @@ class LibraryViewModelTest {
flow { throw IllegalStateException("DAO blew up") }
every { repo.observeAlbums() } returns flowOf(emptyList())
val vm = LibraryViewModel(repo, mockk<SyncController>(relaxed = true))
val vm = LibraryViewModel(
repo,
mockk<SyncController>(relaxed = true),
mockk<PlayerController>(relaxed = true),
)
vm.uiState.test {
val error = awaitItem() as LibraryUiState.Error