import { describe, expect, it } from "vitest"; import { hasUnseenCompletion, resolveThreadStatusPill } from "./Sidebar.logic"; function makeLatestTurn(overrides?: { completedAt?: string | null; startedAt?: string | null; }): Parameters[0]["latestTurn"] { return { turnId: "turn-1" as never, state: "completed", assistantMessageId: null, requestedAt: "2026-03-09T10:00:00.000Z", startedAt: overrides?.startedAt ?? "2026-03-09T10:00:00.000Z", completedAt: overrides?.completedAt ?? "2026-03-09T10:05:00.000Z", }; } describe("hasUnseenCompletion", () => { it("returns true when a thread completed after its last visit", () => { expect( hasUnseenCompletion({ interactionMode: "default", latestTurn: makeLatestTurn(), lastVisitedAt: "2026-03-09T10:04:00.000Z", proposedPlans: [], session: null, }), ).toBe(true); }); }); describe("resolveThreadStatusPill", () => { const baseThread = { interactionMode: "plan" as const, latestTurn: null, lastVisitedAt: undefined, proposedPlans: [], session: { provider: "codex" as const, status: "running" as const, createdAt: "2026-03-09T10:00:00.000Z", updatedAt: "2026-03-09T10:00:00.000Z", orchestrationStatus: "running" as const, }, }; it("shows pending approval before all other statuses", () => { expect( resolveThreadStatusPill({ thread: baseThread, hasPendingApprovals: true, hasPendingUserInput: true, }), ).toMatchObject({ label: "Pending Approval", pulse: false }); }); it("shows awaiting input when plan mode is blocked on user answers", () => { expect( resolveThreadStatusPill({ thread: baseThread, hasPendingApprovals: false, hasPendingUserInput: true, }), ).toMatchObject({ label: "Awaiting Input", pulse: false }); }); it("falls back to working when the thread is actively running without blockers", () => { expect( resolveThreadStatusPill({ thread: baseThread, hasPendingApprovals: false, hasPendingUserInput: false, }), ).toMatchObject({ label: "Working", pulse: true }); }); it("shows plan ready when a settled plan turn has a proposed plan ready for follow-up", () => { expect( resolveThreadStatusPill({ thread: { ...baseThread, latestTurn: makeLatestTurn(), proposedPlans: [ { id: "plan-1" as never, turnId: "turn-1" as never, createdAt: "2026-03-09T10:00:00.000Z", updatedAt: "2026-03-09T10:05:00.000Z", planMarkdown: "# Plan", }, ], session: { ...baseThread.session, status: "ready", orchestrationStatus: "ready", }, }, hasPendingApprovals: false, hasPendingUserInput: false, }), ).toMatchObject({ label: "Plan Ready", pulse: false }); }); it("shows completed when there is an unseen completion and no active blocker", () => { expect( resolveThreadStatusPill({ thread: { ...baseThread, interactionMode: "default", latestTurn: makeLatestTurn(), lastVisitedAt: "2026-03-09T10:04:00.000Z", session: { ...baseThread.session, status: "ready", orchestrationStatus: "ready", }, }, hasPendingApprovals: false, hasPendingUserInput: false, }), ).toMatchObject({ label: "Completed", pulse: false }); }); });