feat(preview): GET /api/mb/release-groups/[rgMbid]/tracks

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan
2026-07-12 01:36:28 +02:00
parent e9759b8ef2
commit f3cb306a19
2 changed files with 37 additions and 0 deletions
@@ -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);
});
});
@@ -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 });
}
}