diff --git a/docs/plans/2026-07-21-fix-review-findings.md b/docs/plans/2026-07-21-fix-review-findings.md index 830d953..9a1546c 100644 --- a/docs/plans/2026-07-21-fix-review-findings.md +++ b/docs/plans/2026-07-21-fix-review-findings.md @@ -76,9 +76,9 @@ Problem: Three separate filter implementations (`musicbrainz.FilterReleaseGroups - [x] Run tests - must pass before task 7 ### Task 7: Handle ErrArtistNotFound in ScanArtist gracefully -- [ ] In `ScanArtist`, wrap `GetArtistSettings` call; if `ErrArtistNotFound`, use empty `TypeFilter` (no filtering) instead of returning error -- [ ] Write test: create external_releases row for non-existent artist_id, verify ScanArtist succeeds and returns missing releases (with default no-filter behavior) -- [ ] Run tests - must pass before task 8 +- [x] In `ScanArtist`, wrap `GetArtistSettings` call; if `ErrArtistNotFound`, use empty `TypeFilter` (no filtering) instead of returning error +- [x] Write test: create external_releases row for non-existent artist_id, verify ScanArtist succeeds and returns missing releases (with default no-filter behavior) +- [x] Run tests - must pass before task 8 ### Task 8: Fix NotifyOnce map key to use composite ArtistID+RGID - [ ] Change `missingByRGID` map key from `m.RGID` to `m.ArtistID + "|" + m.RGID` (or use a struct key) diff --git a/internal/scanner/scan_test.go b/internal/scanner/scan_test.go index 3ed972c..be5e360 100644 --- a/internal/scanner/scan_test.go +++ b/internal/scanner/scan_test.go @@ -247,6 +247,46 @@ func seedArtistUnmonitored(t *testing.T, db *database.DB, id, name string) { } } +// TestScanArtist_ErrArtistNotFound verifies that ScanArtist handles ErrArtistNotFound +// by using empty TypeFilter (no filtering) instead of returning an error. +func TestScanArtist_ErrArtistNotFound(t *testing.T) { + db := newTestDB(t) + defer db.Close() + + // Disable foreign key constraints to allow inserting external_releases without artist_settings + if _, err := db.Conn().Exec("PRAGMA foreign_keys = OFF"); err != nil { + t.Fatalf("disable foreign keys: %v", err) + } + // Re-enable foreign keys when we're done + defer func() { + if _, err := db.Conn().Exec("PRAGMA foreign_keys = ON"); err != nil { + t.Fatalf("re-enable foreign keys: %v", err) + } + }() + + // Don't create artist settings - this will cause GetArtistSettings to return ErrArtistNotFound + // Insert external release directly to bypass FK constraint for testing inconsistent state + if _, err := db.Conn().Exec( + "INSERT INTO external_releases (rgid, artist_id, title, type, release_date, is_ignored) VALUES (?, ?, ?, ?, ?, ?)", + "rg1", "nonexistent-artist", "Test Album", "Album", "", false, + ); err != nil { + t.Fatalf("insert external release: %v", err) + } + + missing, err := ScanArtist(context.Background(), db, "nonexistent-artist", 0) + if err != nil { + t.Fatalf("ScanArtist() error: %v", err) + } + + // Should return the release as missing (no filtering applied) + if len(missing) != 1 { + t.Errorf("expected 1 missing release, got %d", len(missing)) + } + if missing[0].RGID != "rg1" { + t.Errorf("expected rg1 to be missing, got %v", missing[0].RGID) + } +} + // TestScanArtist_TypeToggle verifies that ScanArtist honors the artist's // ignore_singles / ignore_compilations toggles at read time, so a toggled // artist stops reporting those categories as missing immediately (without