From eb776bdaa26216179cbea8db293843d0c3267a4a Mon Sep 17 00:00:00 2001 From: bvandeusen Date: Sun, 19 Apr 2026 19:26:59 +0000 Subject: [PATCH] test(subsonic): cover stream helpers (#296) findSidecarCover priority (cover.* wins over folder.*), imageContentType mapping, and nowPlayingMap write/read round-trip. --- internal/subsonic/stream_test.go | 78 ++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 internal/subsonic/stream_test.go diff --git a/internal/subsonic/stream_test.go b/internal/subsonic/stream_test.go new file mode 100644 index 00000000..67fddf24 --- /dev/null +++ b/internal/subsonic/stream_test.go @@ -0,0 +1,78 @@ +package subsonic + +import ( + "os" + "path/filepath" + "testing" + + "github.com/jackc/pgx/v5/pgtype" +) + +func TestFindSidecarCover(t *testing.T) { + dir := t.TempDir() + track := filepath.Join(dir, "01 - song.mp3") + if err := os.WriteFile(track, []byte("audio"), 0o644); err != nil { + t.Fatalf("write track: %v", err) + } + + // Empty dir first: no cover. + if got := findSidecarCover(track); got != "" { + t.Errorf("no sidecar → %q, want empty", got) + } + + // folder.jpg lower priority than cover.jpg: add folder first, expect hit; + // then add cover.jpg, expect cover to win. + folder := filepath.Join(dir, "folder.jpg") + if err := os.WriteFile(folder, []byte("jpg"), 0o644); err != nil { + t.Fatal(err) + } + if got := findSidecarCover(track); got != folder { + t.Errorf("folder.jpg fallback = %q, want %q", got, folder) + } + cover := filepath.Join(dir, "cover.jpg") + if err := os.WriteFile(cover, []byte("jpg"), 0o644); err != nil { + t.Fatal(err) + } + if got := findSidecarCover(track); got != cover { + t.Errorf("cover.jpg priority = %q, want %q", got, cover) + } +} + +func TestImageContentType(t *testing.T) { + cases := map[string]string{ + "cover.jpg": "image/jpeg", + "cover.JPEG": "image/jpeg", + "art.png": "image/png", + "thumb.gif": "image/gif", + "square.webp": "image/webp", + "unknown.tiff": "application/octet-stream", + } + for in, want := range cases { + if got := imageContentType(in); got != want { + t.Errorf("imageContentType(%q) = %q, want %q", in, got, want) + } + } +} + +func TestNowPlayingMap(t *testing.T) { + m := newNowPlayingMap() + user := "user-1" + if _, ok := m.Get(user); ok { + t.Fatalf("unexpected entry on fresh map") + } + + var trackID pgtype.UUID + _ = trackID.Scan("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + m.Set(user, trackID) + + entry, ok := m.Get(user) + if !ok { + t.Fatalf("Set did not persist") + } + if uuidToID(entry.TrackID) != "6ba7b810-9dad-11d1-80b4-00c04fd430c8" { + t.Errorf("trackID round-trip broke: %q", uuidToID(entry.TrackID)) + } + if entry.At.IsZero() { + t.Errorf("At timestamp not set") + } +}