diff --git a/web/src/app/api/mb/release-groups/[rgMbid]/tracks/route.test.ts b/web/src/app/api/mb/release-groups/[rgMbid]/tracks/route.test.ts new file mode 100644 index 0000000..34ab4b3 --- /dev/null +++ b/web/src/app/api/mb/release-groups/[rgMbid]/tracks/route.test.ts @@ -0,0 +1,27 @@ +import { describe, it, expect, vi, afterEach } from "vitest"; + +vi.mock("@/lib/musicbrainz", () => ({ browseReleaseGroupTracks: vi.fn() })); +import { browseReleaseGroupTracks } from "@/lib/musicbrainz"; +import { GET } from "./route"; + +const mock = vi.mocked(browseReleaseGroupTracks); +afterEach(() => mock.mockReset()); + +function get(rgMbid: string) { + return GET(new Request(`http://localhost/api/mb/release-groups/${rgMbid}/tracks`), { + params: Promise.resolve({ rgMbid }), + }); +} + +describe("release-group tracks API", () => { + it("returns tracks", async () => { + mock.mockResolvedValue([{ position: 1, title: "One", lengthMs: 1000 }]); + const body = await (await get("rg1")).json(); + expect(body.tracks).toEqual([{ position: 1, title: "One", lengthMs: 1000 }]); + }); + + it("502s on MB failure", async () => { + mock.mockRejectedValue(new Error("down")); + expect((await get("rg1")).status).toBe(502); + }); +}); diff --git a/web/src/app/api/mb/release-groups/[rgMbid]/tracks/route.ts b/web/src/app/api/mb/release-groups/[rgMbid]/tracks/route.ts new file mode 100644 index 0000000..7099ee6 --- /dev/null +++ b/web/src/app/api/mb/release-groups/[rgMbid]/tracks/route.ts @@ -0,0 +1,10 @@ +import { browseReleaseGroupTracks } from "@/lib/musicbrainz"; + +export async function GET(_request: Request, { params }: { params: Promise<{ rgMbid: string }> }) { + const { rgMbid } = await params; + try { + return Response.json({ tracks: await browseReleaseGroupTracks(rgMbid) }); + } catch { + return Response.json({ error: "MusicBrainz unavailable" }, { status: 502 }); + } +}