/** * status-view.test.tsx — Tests for the StatusView component. * * Verifies: * - StatusView renders a status message * - StatusView accepts custom status text * - StatusView displays a counter * - StatusView can be mounted/unmounted as a child of Shell */ import { describe, test, expect } from "bun:test"; import React from "react"; import { renderToString, render, Text } from "ink"; import { StatusView } from "./status-view"; import { Shell } from "./shell"; import { PassThrough } from "node:stream"; // --------------------------------------------------------------------------- // Helpers // --------------------------------------------------------------------------- function createTestStreams() { const stdout = new PassThrough() as unknown as NodeJS.WriteStream; (stdout as any).columns = 80; (stdout as any).rows = 24; const stdin = new PassThrough() as unknown as NodeJS.ReadStream; (stdin as any).isTTY = true; (stdin as any).setRawMode = () => stdin; (stdin as any).ref = () => stdin; (stdin as any).unref = () => stdin; return { stdin, stdout }; } // --------------------------------------------------------------------------- // Tests // --------------------------------------------------------------------------- describe("StatusView", () => { test("renders default status message", () => { const output = renderToString(); expect(output).toContain("idle"); }); test("accepts custom status text", () => { const output = renderToString(); expect(output).toContain("running"); }); test("displays agent count", () => { const output = renderToString(); expect(output).toContain("5"); }); test("mounts as child of Shell", () => { const output = renderToString( ); expect(output).toContain("active"); expect(output).toContain("3"); }); test("can be dynamically swapped in live render", async () => { const { stdin, stdout } = createTestStreams(); const chunks: string[] = []; stdout.on("data", (chunk: Buffer) => { chunks.push(chunk.toString()); }); // Mount with StatusView const instance = render( , { stdout, stdin, debug: true, exitOnCtrlC: false, patchConsole: false, } ); await new Promise((resolve) => setTimeout(resolve, 50)); // Re-render with different child (proves child swap works) instance.rerender( ); await new Promise((resolve) => setTimeout(resolve, 50)); instance.unmount(); await instance.waitUntilExit(); const output = chunks.join(""); expect(output).toContain("first"); expect(output).toContain("second"); }); });