Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/canvas/__serial__/package.test.ts

Raw
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);
	},
);