From 98b4755b496bbfb1b182cb4d2632c9d930d300ea Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Tue, 21 Apr 2026 00:16:24 -0400 Subject: [PATCH] test(api): add library seed fixtures --- internal/api/library_fixtures_test.go | 87 +++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 internal/api/library_fixtures_test.go diff --git a/internal/api/library_fixtures_test.go b/internal/api/library_fixtures_test.go new file mode 100644 index 00000000..abb8833b --- /dev/null +++ b/internal/api/library_fixtures_test.go @@ -0,0 +1,87 @@ +package api + +import ( + "context" + "testing" + "time" + + "github.com/jackc/pgx/v5/pgtype" + "github.com/jackc/pgx/v5/pgxpool" + + "git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq" +) + +// truncateLibrary clears the music tables between tests. Sessions/users are +// cleared by testHandlers. CASCADE covers tracks→albums→artists FK chain. +func truncateLibrary(t *testing.T, pool *pgxpool.Pool) { + t.Helper() + if _, err := pool.Exec(context.Background(), + "TRUNCATE tracks, albums, artists RESTART IDENTITY CASCADE"); err != nil { + t.Fatalf("truncate: %v", err) + } +} + +// seedArtist inserts an artist with deterministic sort_name = name. +func seedArtist(t *testing.T, pool *pgxpool.Pool, name string) dbq.Artist { + t.Helper() + a, err := dbq.New(pool).UpsertArtist(context.Background(), dbq.UpsertArtistParams{ + Name: name, + SortName: name, + Mbid: nil, + }) + if err != nil { + t.Fatalf("UpsertArtist(%s): %v", name, err) + } + return a +} + +// seedAlbum inserts an album belonging to artistID. releaseYear=0 leaves +// release_date unset. +func seedAlbum(t *testing.T, pool *pgxpool.Pool, artistID pgtype.UUID, title string, releaseYear int) dbq.Album { + t.Helper() + var rel pgtype.Date + if releaseYear > 0 { + rel = pgtype.Date{Time: time.Date(releaseYear, 1, 1, 0, 0, 0, 0, time.UTC), Valid: true} + } + a, err := dbq.New(pool).UpsertAlbum(context.Background(), dbq.UpsertAlbumParams{ + Title: title, + SortTitle: title, + ArtistID: artistID, + ReleaseDate: rel, + Mbid: nil, + CoverArtPath: nil, + }) + if err != nil { + t.Fatalf("UpsertAlbum(%s): %v", title, err) + } + return a +} + +// seedTrack inserts a track. trackNumber<=0 leaves it NULL. filePath is +// synthesized from title to stay unique across seeds. +func seedTrack(t *testing.T, pool *pgxpool.Pool, albumID, artistID pgtype.UUID, title string, trackNumber int, durationMs int32) dbq.Track { + t.Helper() + var tn *int32 + if trackNumber > 0 { + v := int32(trackNumber) + tn = &v + } + tr, err := dbq.New(pool).UpsertTrack(context.Background(), dbq.UpsertTrackParams{ + Title: title, + AlbumID: albumID, + ArtistID: artistID, + TrackNumber: tn, + DiscNumber: nil, + DurationMs: durationMs, + FilePath: "/seed/" + title + ".flac", + FileSize: 1024, + FileFormat: "flac", + Bitrate: nil, + Mbid: nil, + Genre: nil, + }) + if err != nil { + t.Fatalf("UpsertTrack(%s): %v", title, err) + } + return tr +}