import { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { describe, expect, it } from "vitest";
const DASHBOARD_ROOT = join(process.cwd(), "dashboard");
const DASHBOARD_DIST = join(DASHBOARD_ROOT, "dist");
describe("dashboard build artifacts", () => {
it("index.html exists", () => {
expect(existsSync(join(DASHBOARD_ROOT, "index.html"))).toBe(true);
});
it("app.js exists in dist", () => {
expect(existsSync(join(DASHBOARD_DIST, "app.js"))).toBe(true);
});
it("app.css exists in dist", () => {
expect(existsSync(join(DASHBOARD_DIST, "app.css"))).toBe(true);
});
it("index.html contains placeholder tokens", () => {
const html = readFileSync(join(DASHBOARD_ROOT, "index.html"), "utf8");
expect(html).toContain("__REASONIX_TOKEN__");
expect(html).toContain("__REASONIX_MODE__");
});
it("app.js references tauri-bridge", () => {
const js = readFileSync(join(DASHBOARD_DIST, "app.js"), "utf8");
expect(js).toContain("tauri-bridge");
});
it("app.js is non-empty", () => {
const js = readFileSync(join(DASHBOARD_DIST, "app.js"), "utf8");
expect(js.length).toBeGreaterThan(10_000);
});
it("app.css is non-empty", () => {
const css = readFileSync(join(DASHBOARD_DIST, "app.css"), "utf8");
expect(css.length).toBeGreaterThan(1_000);
});
});
describe("dashboard server integration", () => {
it("assets.ts resolveAssetDir finds dashboard", async () => {
const { serveAsset } = await import("../src/server/assets.js");
const appJs = await serveAsset("app.js");
expect(appJs).not.toBeNull();
expect(appJs?.contentType).toMatch(/javascript/);
});
it("renderIndexHtml replaces all token placeholders", async () => {
const { renderIndexHtml } = await import("../src/server/assets.js");
const html = await renderIndexHtml("test-token-123", "standalone");
expect(html).not.toContain("__REASONIX_TOKEN__");
expect(html).not.toContain("__REASONIX_MODE__");
expect(html).toContain("testtoken123");
expect(html).toContain("standalone");
});
it("serveAsset rewrites cross-chunk imports in app.js to carry the token", async () => {
const { serveAsset } = await import("../src/server/assets.js");
const asset = await serveAsset("app.js", "tkn123");
expect(asset).not.toBeNull();
const body = asset?.body as string;
const vendorImports = body.match(/from\s*["']\.\/vendor-[\w-]+\.js[^"']*["']/g) ?? [];
expect(vendorImports.length).toBeGreaterThan(0);
for (const imp of vendorImports) {
expect(imp).toContain("?token=tkn123");
}
});
it("serveAsset rewrites cross-chunk imports inside vendor chunks too", async () => {
const { serveAsset } = await import("../src/server/assets.js");
const asset = await serveAsset("vendor-markdown.js", "tkn456");
if (asset == null) return;
const body = asset.body as string;
const vendorImports = body.match(/from\s*["']\.\/vendor-[\w-]+\.js[^"']*["']/g) ?? [];
for (const imp of vendorImports) {
expect(imp).toContain("?token=tkn456");
}
});
it("serveAsset injects the token into CSS url() font references", async () => {
const { serveAsset } = await import("../src/server/assets.js");
const asset = await serveAsset("app.css", "tknfont");
expect(asset).not.toBeNull();
const body = asset?.body as string;
const assetUrls =
body.match(/url\([^)]*\/assets\/[\w./-]+\.(?:woff2?|ttf|otf|png|svg)[^)]*\)/g) ?? [];
expect(assetUrls.length).toBeGreaterThan(0);
for (const u of assetUrls) {
expect(u).toContain("?token=tknfont");
}
});
it("vendor CSS files are served when present", async () => {
const { serveAsset } = await import("../src/server/assets.js");
const hljs = await serveAsset("vendor-hljs.css");
const uplot = await serveAsset("vendor-uplot.css");
if (hljs) {
expect(hljs.contentType).toMatch(/css/);
}
if (uplot) {
expect(uplot.contentType).toMatch(/css/);
}
});
});