/** * Example WrNexus tests. Run with `wrnexus test` (or `bun test`). * * - renderComponent: compile + render a .wrn component to HTML * - callRoute: call an API handler with a fake Request * - createHarness: boot the whole app on an ephemeral port and fetch real routes * * Everything comes from one import: `@wrnexus/test`. */ import { test, expect, describe, beforeAll, afterAll, renderComponent, callRoute, createHarness, type Harness, } from "@wrnexus/test"; // --- Component-level (fast, no server) ------------------------------------- const COUNTER = `component Counter { props { start = 0 label = "Count" } state count = start view { } }`; test("Counter renders its label and initial value", async () => { const html = await renderComponent(COUNTER, { start: 5, label: "Clicks" }); expect(html).toContain("Clicks"); expect(html).toContain("5"); }); // --- Route-level (fast, no server) ----------------------------------------- test("POST /api/echo echoes the JSON body", async () => { const { POST } = await import("./api/echo.ts"); const res = await callRoute( POST, new Request("http://test/api/echo", { method: "POST", body: JSON.stringify({ hi: "there" }), headers: { "content-type": "application/json" }, }), ); expect(await res.json()).toEqual({ received: { hi: "there" } }); }); // --- App-level integration (real in-process server) ------------------------ describe("full app", () => { let app: Harness; beforeAll(async () => { app = await createHarness(import.meta.dir + "/.."); }); afterAll(() => app?.close()); test("home page responds with HTML", async () => { const res = await app.fetch("/"); expect(res.status).toBe(200); expect(res.headers.get("content-type")).toContain("text/html"); }); test("GET /api/hello returns a translated greeting", async () => { const res = await app.fetch("/api/hello"); expect(res.status).toBe(200); const body = (await res.json()) as { message: string; lang: string }; expect(typeof body.message).toBe("string"); expect(body.lang).toBeTruthy(); }); });