first commit
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
* 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 { <button @click="count++">{label}: {count}</button> }
|
||||
}`;
|
||||
|
||||
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();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user