124 lines · 3.6 KB · TypeScript
RawDownload
import { describe, expect, it } from "vitest"; import { hasUnseenCompletion, resolveThreadStatusPill } from "./Sidebar.logic"; function makeLatestTurn(overrides?: {  completedAt?: string | null;  startedAt?: string | null;}): Parameters<typeof hasUnseenCompletion>[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 });  });});