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:
@@ -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 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user