From 75163ea483fa6931985764483395a275163e4b39 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sun, 17 May 2026 15:05:18 -0400 Subject: [PATCH] test: correct the A regression + finish B residual (coverart boot, stale system_test) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A redo: the prior commit truncated cover_art_sources_meta, but SettingsService.reconcile() only READS that singleton (seeded once by migration 0018) and never recreates it → ~45 coverart/api tests hard- failed "get current sources version: no rows". Correct reset: keep cover_art_provider_settings in the truncate set (boot idempotently re-UpsertProviderSettings), drop cover_art_sources_meta from it, and instead `UPDATE cover_art_sources_meta SET current_version = 1` so the row survives while cross-test version accumulation is cleared. B residual (exposed once the play_events FK fix let these run): - seedQuarantine used reason 'test-hide', invalid for the lidarr_quarantine_reason enum (bad_rip/wrong_file/wrong_tags/ duplicate/other) → use 'other'. - TestBuildSystemPlaylists_SufficientActivity predated #411/#352: the variant switch errored on the 5 new seedless mixes and capped track_count at 25. Accept deep_cuts/rediscover/new_for_you/ on_this_day/first_listens as seedless; raise the cap to 100. Test/test-harness only. Co-Authored-By: Claude Opus 4.7 (1M context) --- internal/dbtest/reset.go | 23 ++++++++++++++++------- internal/playlists/system_test.go | 13 ++++++++----- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/internal/dbtest/reset.go b/internal/dbtest/reset.go index cd42e423..eba016c9 100644 --- a/internal/dbtest/reset.go +++ b/internal/dbtest/reset.go @@ -55,14 +55,13 @@ var dataTables = []string{ "playlist_tracks", "playlists", "library_changes", // M7 #357 — must reset to keep cursor isolated per test - // Cover-art provider settings + the monotonic source-version - // counter (cover_art_sources_meta, seeded at 1 by migration 0018). - // Not resetting these let the version accumulate across tests in - // internal/coverart (CurrentVersion=4 want 1, key-only-bump - // assertions, enricher source skips). SettingsService re-seeds both - // at boot, so a truncated start is the correct fresh state. + // SettingsService.reconcile() idempotently re-UpsertProviderSettings + // for every registered provider at boot, so truncating this is the + // correct per-test reset (clears test-modified enabled/api_key rows). + // cover_art_sources_meta is NOT truncated — boot only READS it + // (never recreates the singleton, seeded once by 0018); ResetDB + // resets its counter via UPDATE below instead. "cover_art_provider_settings", - "cover_art_sources_meta", "tracks", "albums", "artists", @@ -84,4 +83,14 @@ func ResetDB(t *testing.T, pool *pgxpool.Pool) { ); err != nil { t.Fatalf("dbtest.ResetDB delete test users: %v", err) } + // Reset the monotonic cover-art source-version counter to its + // post-migration seeded value. Truncating the row would break + // SettingsService boot, which reads (never recreates) this + // singleton; an UPDATE keeps the row while clearing cross-test + // version accumulation (CurrentVersion=4 want 1, key-only-bump). + if _, err := pool.Exec(ctx, + "UPDATE cover_art_sources_meta SET current_version = 1", + ); err != nil { + t.Fatalf("dbtest.ResetDB reset cover-art version: %v", err) + } } diff --git a/internal/playlists/system_test.go b/internal/playlists/system_test.go index 6d5fea50..2e5fb5cf 100644 --- a/internal/playlists/system_test.go +++ b/internal/playlists/system_test.go @@ -45,7 +45,7 @@ func seedQuarantine(t *testing.T, pool *pgxpool.Pool, userID, trackID pgtype.UUI t.Helper() _, err := pool.Exec(context.Background(), ` INSERT INTO lidarr_quarantine (user_id, track_id, reason) - VALUES ($1, $2, 'test-hide') + VALUES ($1, $2, 'other') `, userID, trackID) if err != nil { t.Fatalf("seed quarantine: %v", err) @@ -112,16 +112,19 @@ func TestBuildSystemPlaylists_SufficientActivity(t *testing.T) { if !r.SeedArtistID.Valid { t.Errorf("songs_like_artist row should have non-NULL seed_artist_id") } - case "discover": - // Discover playlist is valid — no seed_artist_id required. + case "discover", "deep_cuts", "rediscover", "new_for_you", "on_this_day", "first_listens": + // Discover + the #411 discovery mixes are all seedless — + // no seed_artist_id required. default: t.Errorf("unknown system_variant=%q", *r.SystemVariant) } if r.TrackCount == 0 { t.Errorf("row %s: empty track_count", uuidString(r.ID)) } - if r.TrackCount > 25 { - t.Errorf("row %s: track_count=%d exceeds 25", uuidString(r.ID), r.TrackCount) + // For-You / Discover / the discovery mixes are sized to ~100 + // (#352/#411); songs_like_artist stays at systemMixLength (25). + if r.TrackCount > 100 { + t.Errorf("row %s: track_count=%d exceeds 100", uuidString(r.ID), r.TrackCount) } } if !hasForYou {