Files
vue-tui/packages/testing/tests/render.test.tsx
T
Yunfei He 71c517b79f feat(testing): test harness for @vue-tui/runtime
Provides render() for integration testing — async with auto-flush,
trimmed frames, fake terminal with resize(), stdin.write() with
auto-flush, and auto-cleanup via afterEach.

Exports: render, cleanup, RenderResult, RenderOptions, Terminal

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:13:47 +08:00

40 lines
1.3 KiB
TypeScript

import { nextTick, ref } from "vue";
import { expect, test } from "vite-plus/test";
import { render } from "../src/index.ts";
import { Text } from "@vue-tui/runtime";
test("lastFrame captures rendered output", async () => {
const { lastFrame } = await render(() => <Text>hello</Text>);
expect(lastFrame()).toContain("hello");
});
test("frames accumulate on reactive updates", async () => {
const message = ref("first");
const { lastFrame, frames } = await render(() => <Text>{message.value}</Text>);
const initialCount = frames.length;
expect(lastFrame()).toContain("first");
message.value = "second";
await nextTick();
expect(lastFrame()).toContain("second");
expect(frames.length).toBeGreaterThan(initialCount);
});
test("render with custom columns", async () => {
const { lastFrame } = await render(() => <Text>hello</Text>, { columns: 20 });
expect(lastFrame()).toContain("hello");
});
test("lastFrame trims trailing whitespace", async () => {
const { lastFrame } = await render(() => <Text>hi</Text>);
const frame = lastFrame()!;
for (const line of frame.split("\n")) {
expect(line).toBe(line.trimEnd());
}
});
test("auto cleanup — no manual unmount needed", async () => {
const { lastFrame } = await render(() => <Text>auto</Text>);
expect(lastFrame()).toContain("auto");
});