/** * errand-wizard.test.tsx — Tests for the ErrandWizard Ink component. * * Verifies: * - Renders step 1 (description) on mount * - Shows step indicators (Step 1/4, etc.) * - Enter on description advances to scope * - Escape on first step triggers onCancel * - Escape on later steps goes back * - Review step shows all collected values * - Enter on review step triggers onSubmit with ErrandSpec * - Empty description shows error * - Scope and objectives are optional (Enter to skip) */ import { describe, test, expect, mock } from "bun:test"; import React from "react"; import { renderToString } from "ink"; import { ErrandWizard } from "./errand-wizard"; // --------------------------------------------------------------------------- // Static render tests // --------------------------------------------------------------------------- describe("ErrandWizard (static rendering)", () => { test("renders step 1 description label on mount", () => { const output = renderToString( {}} onCancel={() => {}} /> ); expect(output).toContain("Description"); expect(output).toContain("Step 1"); }); test("shows step counter", () => { const output = renderToString( {}} onCancel={() => {}} /> ); expect(output).toContain("1/4"); }); test("displays instructions for description step", () => { const output = renderToString( {}} onCancel={() => {}} /> ); expect(output).toContain("What needs to be done"); }); test("shows cancel hint on first step", () => { const output = renderToString( {}} onCancel={() => {}} /> ); expect(output).toContain("Esc"); // The footer says "Ctrl+S: next | Esc: cancel" expect(output).toContain("cancel"); }); }); // --------------------------------------------------------------------------- // State management tests (pure functions) // --------------------------------------------------------------------------- describe("ErrandWizard state", () => { test("initial state has step 0 and empty values", () => { // Test via initial rendering that we start at description step const output = renderToString( {}} onCancel={() => {}} /> ); expect(output).toContain("Description"); }); });