import { cp, mkdtemp, readdir, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; import { describe, expect, it } from "vitest"; import type { CanvasServer } from "../src/server.ts"; describe.skipIf(process.env["PI_EXT_VERIFY_CANVAS_PACKAGE"] !== "1")( "canvas relocated package", () => { it("serves browser JS, CSS, fonts and authenticated state after relocation", async () => { const root = await mkdtemp(join(tmpdir(), "canvas-package-")); const target = join(root, "canvas"); let server: CanvasServer | undefined; try { await cp( fileURLToPath(new URL("../../../dist/canvas", import.meta.url)), target, { recursive: true }, ); const packaged: typeof import("../server-test.ts") = await import( pathToFileURL(join(target, "server-test.ts")).href ); server = await packaged.startCanvasServer( packaged.emptyState, () => undefined, ); const url = server.url; const page = await fetch(url); expect(page.status).toBe(200); expect(await page.text()).toContain("/browser/main.js"); expect((await fetch(new URL("/api/state", url))).status).toBe(401); const state = await fetch(new URL("/api/state", url), { headers: { Authorization: `Bearer ${new URL(url).hash.slice(1)}`, }, }); expect(await state.json()).toMatchObject({ revision: 0, elements: [] }); const browser = await fetch(new URL("/browser/main.js", url)); expect(browser.status).toBe(200); expect(await browser.text()).toContain("Pi sharing status"); const css = await fetch(new URL("/browser/excalidraw.css", url)); expect(css.status).toBe(200); expect((await css.text()).length).toBeGreaterThan(0); const fontName = ( await readdir(join(target, "browser/fonts/Excalifont")) ).find((name) => name.endsWith(".woff2")); expect(fontName).toBeDefined(); const font = await fetch( new URL(`/browser/fonts/Excalifont/${fontName}`, url), ); expect(font.status).toBe(200); expect((await font.arrayBuffer()).byteLength).toBeGreaterThan(0); } finally { await server?.close(); await rm(root, { recursive: true, force: true }); } }, 60000); }, );