/** * Tests for TaskHeader — pure renderer with no domain branching. */ import { describe, it, expect, afterEach } from "vitest"; import { render, screen, cleanup } from "@testing-library/react"; import { TaskHeader } from "./TaskHeader"; const WAITING_FOR_INPUT = "WAITING_FOR_INPUT"; const WAITING_FOR_INPUT_LABEL = "Waiting for input"; afterEach(cleanup); describe("TaskHeader", () => { it("renders title plus identifier when provided", () => { render(); expect(screen.getByText("Implement feature")).toBeTruthy(); expect(screen.getByText("ABC-123")).toBeTruthy(); }); it("renders title alone when identifier is absent", () => { render(); expect(screen.getByText("Implement feature")).toBeTruthy(); }); it("renders the state pill when state is provided", () => { render(); expect(screen.getByText("IN_PROGRESS")).toBeTruthy(); }); it("renders assignee name when provided", () => { render(); expect(screen.getByText("Alice")).toBeTruthy(); }); // the open-task header text badge reflects the // task-level activity aggregate — background-running reads distinctly and never // as a done state, even when the coarse workflow state is COMPLETED. it("reflects background-running in the badge instead of a done coarse state", () => { render(); expect(screen.getByText("Background running")).toBeTruthy(); expect(screen.queryByText("COMPLETED")).toBeNull(); }); it("reflects generating in the badge over a done coarse state", () => { render(); expect(screen.getByText("Generating")).toBeTruthy(); expect(screen.queryByText("COMPLETED")).toBeNull(); }); it("keeps the coarse state in the badge when no session is active", () => { render(); expect(screen.getByText("COMPLETED")).toBeTruthy(); }); // the header badge carries the sidebar's rich // "needs me" reading, distinct from done and from running. it("reads a plain WAITING_FOR_INPUT state as 'Waiting for input'", () => { render(); expect(screen.getByText(WAITING_FOR_INPUT_LABEL)).toBeTruthy(); expect(screen.queryByText(WAITING_FOR_INPUT)).toBeNull(); }); it("reads a pending clarification as 'Waiting for input' even over a non-waiting coarse state", () => { render(); expect(screen.getByText(WAITING_FOR_INPUT_LABEL)).toBeTruthy(); }); it("reads a pending permission as 'Permission requested', taking precedence over clarification", () => { render( , ); expect(screen.getByText("Permission requested")).toBeTruthy(); }); it("lets a pending permission take precedence over live activity in the badge", () => { render( , ); expect(screen.getByText("Permission requested")).toBeTruthy(); expect(screen.queryByText("Background running")).toBeNull(); }); it("lets a pending clarification take precedence over generating in the badge", () => { render( , ); expect(screen.getByText(WAITING_FOR_INPUT_LABEL)).toBeTruthy(); expect(screen.queryByText("Generating")).toBeNull(); }); it("lets generating activity win over a coarse waiting state without pending input", () => { render(); expect(screen.getByText("Generating")).toBeTruthy(); expect(screen.queryByText(WAITING_FOR_INPUT_LABEL)).toBeNull(); }); it("lets background activity win over a coarse waiting state without pending input", () => { render(); expect(screen.getByText("Background running")).toBeTruthy(); expect(screen.queryByText(WAITING_FOR_INPUT_LABEL)).toBeNull(); }); });