import { get, html, stubNetwork } from "../helpers.ts"; import { assertEquals, assertFalse } from "@std/assert"; import type { YouTubePlaylist } from "../../../shared/player.ts"; function ytPage(data: unknown): string { return ``; } const YT_DATA = { metadata: { playlistMetadataRenderer: { title: "My mix" } }, contents: { list: [ { lockupViewModel: { contentType: "LOCKUP_CONTENT_TYPE_VIDEO", contentId: "vid1", metadata: { lockupMetadataViewModel: { title: { content: "First" } }, }, contentImage: { overlays: [{ thumbnailBadgeViewModel: { text: "1:02:03" } }], }, }, }, { lockupViewModel: { contentType: "LOCKUP_CONTENT_TYPE_PLAYLIST", contentId: "ignored", }, }, { playlistVideoRenderer: { videoId: "vid2", title: { runs: [{ text: "Second" }] }, lengthSeconds: "235", }, }, ], }, }; Deno.test("GET /api/youtube/playlist: resolves and validates the id", async () => { let cookie: string | null = null; using net = stubNetwork((url, init) => { cookie = new Headers(init?.headers).get("cookie"); return url.searchParams.get("list") === "PLgone" ? new Response("", { status: 404 }) : html(ytPage(YT_DATA)); }); const ok = await get("/api/youtube/playlist?list=PLgood"); assertEquals(ok.status, 200); assertEquals(ok.data.tracks.length, 2); assertEquals(ok.headers.get("cache-control"), "public, max-age=3600"); // The pre-answered consent cookie keeps EU requests off the consent page. assertEquals(cookie, "SOCS=CAI"); await get("/api/youtube/playlist?list=PLgood"); // cached assertEquals(net.calls.length, 1); assertEquals((await get("/api/youtube/playlist?list=bad%20id")).status, 400); assertEquals((await get("/api/youtube/playlist")).status, 400); assertEquals((await get("/api/youtube/playlist?list=PLgone")).status, 502); assertFalse(net.calls.some((u) => u.searchParams.get("list") === "bad id")); });