import { describe, expect, it, vi } from "vitest"; import type { TuiStateAccess } from "./tui-types.js"; import { createSessionActions } from "./tui-session-actions.js"; describe("tui session actions", () => { it("queues session refreshes and applies the latest result", async () => { let resolveFirst: ((value: unknown) => void) | undefined; let resolveSecond: ((value: unknown) => void) | undefined; const listSessions = vi .fn() .mockImplementationOnce( () => new Promise((resolve) => { resolveFirst = resolve; }), ) .mockImplementationOnce( () => new Promise((resolve) => { resolveSecond = resolve; }), ); const state: TuiStateAccess = { agentDefaultId: "main", sessionMainKey: "agent:main:main", sessionScope: "global", agents: [], currentAgentId: "main", currentSessionKey: "agent:main:main", currentSessionId: null, activeChatRunId: null, historyLoaded: false, sessionInfo: {}, initialSessionApplied: true, isConnected: true, autoMessageSent: false, toolsExpanded: false, showThinking: false, connectionStatus: "connected", activityStatus: "idle", statusTimeout: null, lastCtrlCAt: 0, }; const updateFooter = vi.fn(); const updateAutocompleteProvider = vi.fn(); const requestRender = vi.fn(); const { refreshSessionInfo } = createSessionActions({ client: { listSessions } as { listSessions: typeof listSessions }, chatLog: { addSystem: vi.fn() } as unknown as import("./components/chat-log.js").ChatLog, tui: { requestRender } as unknown as import("@mariozechner/pi-tui").TUI, opts: {}, state, agentNames: new Map(), initialSessionInput: "", initialSessionAgentId: null, resolveSessionKey: vi.fn(), updateHeader: vi.fn(), updateFooter, updateAutocompleteProvider, setActivityStatus: vi.fn(), }); const first = refreshSessionInfo(); const second = refreshSessionInfo(); await Promise.resolve(); expect(listSessions).toHaveBeenCalledTimes(1); resolveFirst?.({ ts: Date.now(), path: "/tmp/sessions.json", count: 1, defaults: {}, sessions: [ { key: "agent:main:main", model: "old", modelProvider: "anthropic", }, ], }); await first; await Promise.resolve(); expect(listSessions).toHaveBeenCalledTimes(2); resolveSecond?.({ ts: Date.now(), path: "/tmp/sessions.json", count: 1, defaults: {}, sessions: [ { key: "agent:main:main", model: "Minimax-M2.1", modelProvider: "minimax", }, ], }); await second; expect(state.sessionInfo.model).toBe("Minimax-M2.1"); expect(updateAutocompleteProvider).toHaveBeenCalledTimes(2); expect(updateFooter).toHaveBeenCalledTimes(2); expect(requestRender).toHaveBeenCalledTimes(2); }); });