//go:build integration package backend import ( "context" "path/filepath" "testing" "music-server/internal/db/repository" "music-server/internal/testutil/pgtest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TestUploadWithPostgres uploads songs and checks the soundtrack in a real database. func TestUploadWithPostgres(t *testing.T) { ctx := context.Background() q := repository.New(pgtest.NewMigratedDatabase(t).Pool) musicDir := t.TempDir() writeFile(t, filepath.Join(musicDir, "Original", "01 Song.mp3"), string(mp3("original one"))) writeFile(t, filepath.Join(musicDir, "Original", "02 Song.mp3"), string(mp3("original two"))) s := NewSyncService(q, musicDir, nil) require.True(t, s.Start(false)) s.Wait() require.Empty(t, s.Result().CatchedErrors) library := NewLibraryService(q) uploads := NewUploadService(q, musicDir, s, library, 50<<20, 500<<20) upload := func(name string, songs map[string]string) Upload { u, err := uploads.Start(ctx, name) require.NoError(t, err) for file, content := range songs { _, err := uploads.PutFile(u.ID, file, mp3(content)) require.NoError(t, err) } return u } // The songs of an existing soundtrack under a new name are refused. duplicate := upload("Copy", map[string]string{"01 Song.mp3": "original one", "02 Song.mp3": "original two"}) _, err := uploads.Finish(ctx, duplicate.ID) assert.ErrorIs(t, err, ErrConflict) require.NoError(t, uploads.Cancel(duplicate.ID)) // The name of an existing soundtrack is refused. _, err = uploads.Start(ctx, "original") assert.ErrorIs(t, err, ErrConflict) added := upload("Uploaded Soundtrack", map[string]string{"1-01 First.mp3": "first", "1-02 Second.mp3": "second"}) soundtrack, err := uploads.Finish(ctx, added.ID) require.NoError(t, err) assert.Equal(t, "Uploaded Soundtrack", soundtrack.Name) require.Len(t, soundtrack.Songs, 2) assert.Equal(t, "1-01 First", soundtrack.Songs[0].Name) path, err := library.SongPath(ctx, soundtrack.Songs[0].Uuid) require.NoError(t, err) assert.FileExists(t, path) count, err := q.CountLibrary(ctx) require.NoError(t, err) assert.Equal(t, int64(2), count.Soundtracks) assert.Equal(t, int64(4), count.Songs) // A sync afterwards changes nothing. require.True(t, s.Start(false)) s.Wait() result := s.Result() assert.Empty(t, result.CatchedErrors) assert.Empty(t, result.SoundtracksAdded) assert.Empty(t, result.SoundtracksChangedTitle) assert.Empty(t, result.SoundtracksRemoved) again, err := library.Soundtrack(ctx, soundtrack.Uuid) require.NoError(t, err) assert.Len(t, again.Songs, 2) }