From 64475d45dcb76d799b157bfed5de63a6d7947009 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Mon, 4 May 2026 15:04:23 -0400 Subject: [PATCH] fix(server/m7-353): log retry-missing errors + tighten 404 test + cover EnrichRetryMissing --- internal/coverart/enricher.go | 5 ++- internal/coverart/enricher_test.go | 63 +++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/internal/coverart/enricher.go b/internal/coverart/enricher.go index d4b4dbd5..def97899 100644 --- a/internal/coverart/enricher.go +++ b/internal/coverart/enricher.go @@ -144,7 +144,10 @@ func (e *Enricher) EnrichRetryMissing(ctx context.Context, limit int) (int, erro if ctx.Err() != nil { return processed, ctx.Err() } - _ = e.EnrichAlbum(ctx, r.ID) + if err := e.EnrichAlbum(ctx, r.ID); err != nil { + e.logger.Warn("coverart: retry-missing entry failed", + "album_id", uuidString(r.ID), "err", err) + } processed++ } return processed, nil diff --git a/internal/coverart/enricher_test.go b/internal/coverart/enricher_test.go index eb0a9930..bd5432a4 100644 --- a/internal/coverart/enricher_test.go +++ b/internal/coverart/enricher_test.go @@ -164,7 +164,9 @@ func TestEnrichAlbum_MBCAA404_RecordsNone(t *testing.T) { f := NewFetcher(FetcherConfig{BaseURL: upstream.URL, UserAgent: "test", MinPeriod: 0, HTTPClient: upstream.Client()}) e := NewEnricher(pool, discardLogger(), f, true) - _ = e.EnrichAlbum(context.Background(), id) + if err := e.EnrichAlbum(context.Background(), id); err != nil { + t.Fatalf("enrich: %v", err) + } row, err := dbq.New(pool).GetAlbumWithFirstTrackPath(context.Background(), id) if err != nil { @@ -267,3 +269,62 @@ func TestRetryAlbum_DeletesMbcaaFileAndRefetches(t *testing.T) { t.Errorf("source after retry = %v, want 'mbcaa'", row.CoverArtSource) } } + +func TestEnrichRetryMissing_DrainsNullAndNone(t *testing.T) { + pool := newPool(t) + // Three albums: + // id1: NULL source, has sidecar → drains, becomes 'sidecar'. + // id2: 'none' source, has sidecar → cleared then drained, becomes 'sidecar'. + // id3: 'sidecar' source already → NOT touched. + id1, dir1 := seedAlbumWithTrack(t, pool, "RM1", "A", "") + if err := os.WriteFile(filepath.Join(dir1, "cover.jpg"), []byte("c1"), 0o644); err != nil { + t.Fatal(err) + } + + id2, dir2 := seedAlbumWithTrack(t, pool, "RM2", "B", "") + if err := os.WriteFile(filepath.Join(dir2, "cover.jpg"), []byte("c2"), 0o644); err != nil { + t.Fatal(err) + } + none := "none" + if err := dbq.New(pool).SetAlbumCover(context.Background(), dbq.SetAlbumCoverParams{ + ID: id2, Column2: "", CoverArtSource: &none, + }); err != nil { + t.Fatal(err) + } + + id3, dir3 := seedAlbumWithTrack(t, pool, "RM3", "C", "") + if err := os.WriteFile(filepath.Join(dir3, "cover.jpg"), []byte("c3"), 0o644); err != nil { + t.Fatal(err) + } + sidecar := "sidecar" + preservedPath := filepath.Join(dir3, "cover.jpg") + if err := dbq.New(pool).SetAlbumCover(context.Background(), dbq.SetAlbumCoverParams{ + ID: id3, Column2: preservedPath, CoverArtSource: &sidecar, + }); err != nil { + t.Fatal(err) + } + + e := NewEnricher(pool, discardLogger(), nil, false) + processed, err := e.EnrichRetryMissing(context.Background(), 100) + if err != nil { + t.Fatalf("retry missing: %v", err) + } + if processed != 2 { + t.Errorf("processed = %d, want 2 (id1 NULL + id2 'none'; id3 already 'sidecar' not touched)", processed) + } + + q := dbq.New(pool) + for _, c := range []struct { + id pgtype.UUID + want string + }{ + {id1, "sidecar"}, + {id2, "sidecar"}, + {id3, "sidecar"}, + } { + row, _ := q.GetAlbumWithFirstTrackPath(context.Background(), c.id) + if row.CoverArtSource == nil || *row.CoverArtSource != c.want { + t.Errorf("album %v source = %v, want %q", c.id, row.CoverArtSource, c.want) + } + } +}