/** * 两套 SPA 静态托管共存于同一个 Fastify 实例。 * * 这是 ADR-0029 的承重约束的回归测试:filelib-web 的 appDir 若用 SvelteKit 默认的 * `_app`,就会与 admin-web 在根上注册的 `/_app/*` 撞成重复路由,Fastify 启动即抛错。 * 改名为 `_filelib` 后两者共存 —— 这里把两个注册函数挂到同一实例上验证。 */ import Fastify from "fastify"; import { describe, expect, it } from "vitest"; import { registerStaticSpa } from "../../src/admin/static.js"; import { registerDatabaseSpa } from "../../src/database/static.js"; describe("SPA static route registration", () => { it("admin-web and filelib-web shells coexist without duplicate routes", async () => { const app = Fastify({ logger: false }); await registerStaticSpa(app); await registerDatabaseSpa(app); await expect(app.ready()).resolves.toBeDefined(); await app.close(); }); it("serves the same index.html at /app and /database, and assets under /_filelib", async () => { const app = Fastify({ logger: false }); await registerDatabaseSpa(app); await app.ready(); const appShell = await app.inject({ method: "GET", url: "/app" }); const dbShell = await app.inject({ method: "GET", url: "/database/dashboard/users" }); // 前置:构建产物必须存在。缺失时 registerDatabaseSpa 只 warn 不注册路由, // 断言会全部落到 404 —— 那说明该先跑 `npm run build --prefix filelib-web`, // 不是测试不适用,所以这里不跳过而是直接失败。 expect(appShell.statusCode).toBe(200); expect(dbShell.statusCode).toBe(200); // 同一份字节:SPA 回退不读请求(ADR-0029)。 expect(dbShell.body).toBe(appShell.body); expect(appShell.headers["content-type"]).toContain("text/html"); // 资源用绝对路径引用(paths.relative=false),否则深层 URL 下会解析错。 expect(appShell.body).toContain("/_filelib/"); await app.close(); }); });