diff --git a/src/features/tmux-subagent/pane-state-querier-runner.test.ts b/src/features/tmux-subagent/pane-state-querier-runner.test.ts new file mode 100644 index 000000000..e3965c34b --- /dev/null +++ b/src/features/tmux-subagent/pane-state-querier-runner.test.ts @@ -0,0 +1,76 @@ +import { beforeEach, describe, expect, it, mock } from "bun:test" + +import type { TmuxCommandResult } from "../../shared/tmux" + +const paneStateQuerierSpecifier = import.meta.resolve("./pane-state-querier") +const loggerSpecifier = import.meta.resolve("../../shared") +const runnerSpecifier = import.meta.resolve("../../shared/tmux") +const tmuxPathResolverSpecifier = import.meta.resolve("../../tools/interactive-bash/tmux-path-resolver") + +const runTmuxCommandMock = mock(async (): Promise => ({ + success: true, + output: "", + stdout: "", + stderr: "", + exitCode: 0, +})) +const getTmuxPathMock = mock(async (): Promise => "sh") +const logMock = mock(() => undefined) + +async function loadQueryWindowState(): Promise { + const module = await import(`${paneStateQuerierSpecifier}?test=${crypto.randomUUID()}`) + return module.queryWindowState +} + +function registerModuleMocks(): void { + mock.module(loggerSpecifier, () => ({ log: logMock })) + mock.module(runnerSpecifier, () => ({ runTmuxCommand: runTmuxCommandMock })) + mock.module(tmuxPathResolverSpecifier, () => ({ getTmuxPath: getTmuxPathMock })) +} + +describe("queryWindowState runner integration", () => { + beforeEach(() => { + mock.restore() + registerModuleMocks() + runTmuxCommandMock.mockClear() + getTmuxPathMock.mockClear() + logMock.mockClear() + + runTmuxCommandMock.mockResolvedValue({ + success: true, + output: "%0\t120\t40\t0\t0\t1\t120\t40\t\n%1\t60\t40\t60\t0\t0\t120\t40\tagent", + stdout: "%0\t120\t40\t0\t0\t1\t120\t40\t\n%1\t60\t40\t60\t0\t0\t120\t40\tagent", + stderr: "", + exitCode: 0, + }) + getTmuxPathMock.mockResolvedValue("sh") + }) + + it("#given source pane id #when queryWindowState called #then delegates list-panes to shared runner", async () => { + // given + const queryWindowState = await loadQueryWindowState() + + // when + const result = await queryWindowState("%0") + + // then + expect(result).not.toBeNull() + if (!result?.mainPane) { + throw new Error("Expected window state") + } + expect(result.mainPane.paneId).toBe("%0") + expect(result.agentPanes.map((pane) => pane.paneId)).toEqual(["%1"]) + expect(runTmuxCommandMock.mock.calls).toEqual([ + [ + expect.any(String), + [ + "list-panes", + "-t", + "%0", + "-F", + "#{pane_id}\t#{pane_width}\t#{pane_height}\t#{pane_left}\t#{pane_top}\t#{pane_active}\t#{window_width}\t#{window_height}\t#{pane_title}", + ], + ], + ]) + }) +})