package backend import ( "context" "os" "testing" "time" "music-server/internal/db/repository" "music-server/internal/testutil/fakedb" "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestLibrarySoundtracks(t *testing.T) { store := fakedb.New() b := store.AddSoundtrack(repository.Soundtrack{SoundtrackName: "B Game", TimesPlayed: 3}) a := store.AddSoundtrack(repository.Soundtrack{SoundtrackName: "A Game"}) deleted := time.Now() store.AddSoundtrack(repository.Soundtrack{SoundtrackName: "Gone", Deleted: &deleted}) soundtracks, err := NewLibraryService(store).Soundtracks(context.Background()) require.NoError(t, err) require.Len(t, soundtracks, 2) assert.Equal(t, Soundtrack{Uuid: a.Uuid, Name: "A Game"}, soundtracks[0]) assert.Equal(t, b.Uuid, soundtracks[1].Uuid) assert.Equal(t, int32(3), soundtracks[1].TimesPlayed) } func TestLibrarySoundtrackWithSongs(t *testing.T) { store := fakedb.New() st := addSoundtrackWithSongs(t, store, t.TempDir(), "Game A", 0, "Song B", "Song A") l := NewLibraryService(store) result, err := l.Soundtrack(context.Background(), st.Uuid) require.NoError(t, err) assert.Equal(t, "Game A", result.Name) require.Len(t, result.Songs, 2) assert.Equal(t, "Song A", result.Songs[0].Name) assert.Equal(t, st.Uuid, result.Songs[0].SoundtrackUuid) assert.Equal(t, "Game A", result.Songs[0].SoundtrackName) _, err = l.Soundtrack(context.Background(), uuid.New()) assert.ErrorIs(t, err, ErrNotFound) } func TestLibrarySong(t *testing.T) { store := fakedb.New() st := addSoundtrackWithSongs(t, store, t.TempDir(), "Game A", 0, "Song") song := store.SongsOf(st.ID)[0] l := NewLibraryService(store) ctx := context.Background() result, err := l.Song(ctx, song.Uuid) require.NoError(t, err) assert.Equal(t, Song{Uuid: song.Uuid, Name: "Song", FileName: song.FileName, SoundtrackUuid: st.Uuid, SoundtrackName: "Game A"}, result) path, err := l.SongPath(ctx, song.Uuid) require.NoError(t, err) assert.Equal(t, song.Path, path) require.NoError(t, os.Remove(song.Path)) _, err = l.SongPath(ctx, song.Uuid) assert.ErrorIs(t, err, ErrNotFound, "missing files are not served") _, err = l.Song(ctx, uuid.New()) assert.ErrorIs(t, err, ErrNotFound) } func TestLibraryHidesSongsOfDeletedSoundtracks(t *testing.T) { store := fakedb.New() st := addSoundtrackWithSongs(t, store, t.TempDir(), "Game A", 0, "Song") song := store.SongsOf(st.ID)[0] require.NoError(t, store.MarkSoundtracksDeletedExcept(context.Background(), nil)) _, err := NewLibraryService(store).Song(context.Background(), song.Uuid) assert.ErrorIs(t, err, ErrNotFound) _, err = NewLibraryService(store).Soundtrack(context.Background(), st.Uuid) assert.ErrorIs(t, err, ErrNotFound) }