diff --git a/src/shared/tmux/tmux-utils/pane-dimensions.test.ts b/src/shared/tmux/tmux-utils/pane-dimensions.test.ts new file mode 100644 index 000000000..f526035cb --- /dev/null +++ b/src/shared/tmux/tmux-utils/pane-dimensions.test.ts @@ -0,0 +1,51 @@ +import { beforeEach, describe, expect, it, mock } from "bun:test" + +import type { TmuxCommandResult } from "../runner" + +const paneDimensionsSpecifier = import.meta.resolve("./pane-dimensions") +const runnerSpecifier = import.meta.resolve("../runner") +const tmuxPathResolverSpecifier = import.meta.resolve("../../../tools/interactive-bash/tmux-path-resolver") + +const runTmuxCommandMock = mock(async (): Promise => ({ + success: true, + output: "80,160", + stdout: "80,160", + stderr: "", + exitCode: 0, +})) +const getTmuxPathMock = mock(async (): Promise => "sh") + +async function loadGetPaneDimensions(): Promise { + const module = await import(`${paneDimensionsSpecifier}?test=${crypto.randomUUID()}`) + return module.getPaneDimensions +} + +function registerModuleMocks(): void { + mock.module(runnerSpecifier, () => ({ runTmuxCommand: runTmuxCommandMock })) + mock.module(tmuxPathResolverSpecifier, () => ({ getTmuxPath: getTmuxPathMock })) +} + +describe("getPaneDimensions runner integration", () => { + beforeEach(() => { + registerModuleMocks() + runTmuxCommandMock.mockClear() + getTmuxPathMock.mockClear() + + runTmuxCommandMock.mockResolvedValue({ success: true, output: "80,160", stdout: "80,160", stderr: "", exitCode: 0 }) + getTmuxPathMock.mockResolvedValue("sh") + }) + + it("#given pane id #when getPaneDimensions called #then delegates display to shared runner", async () => { + // given + const getPaneDimensions = await loadGetPaneDimensions() + + // when + const result = await getPaneDimensions("%42") + + // then + expect(result).toEqual({ paneWidth: 80, windowWidth: 160 }) + expect(runTmuxCommandMock.mock.calls).toEqual([ + [[expect.any(String), ["display", "-p", "-t", "%42", "#{pane_width},#{window_width}"]]][0], + ]) + }) +}) diff --git a/src/shared/tmux/tmux-utils/pane-dimensions.ts b/src/shared/tmux/tmux-utils/pane-dimensions.ts index d16238e85..aeda1448e 100644 --- a/src/shared/tmux/tmux-utils/pane-dimensions.ts +++ b/src/shared/tmux/tmux-utils/pane-dimensions.ts @@ -1,4 +1,3 @@ -import { spawn } from "../../bun-spawn-shim" import { getTmuxPath } from "../../../tools/interactive-bash/tmux-path-resolver" export interface PaneDimensions { @@ -11,17 +10,13 @@ export async function getPaneDimensions( ): Promise { const tmux = await getTmuxPath() if (!tmux) return null + const { runTmuxCommand } = await import("../runner") - const proc = spawn( - [tmux, "display", "-p", "-t", paneId, "#{pane_width},#{window_width}"], - { stdout: "pipe", stderr: "pipe" }, - ) - const exitCode = await proc.exited - const stdout = await new Response(proc.stdout).text() + const result = await runTmuxCommand(tmux, ["display", "-p", "-t", paneId, "#{pane_width},#{window_width}"]) - if (exitCode !== 0) return null + if (result.exitCode !== 0) return null - const [paneWidth, windowWidth] = stdout.trim().split(",").map(Number) + const [paneWidth, windowWidth] = result.output.trim().split(",").map(Number) if (Number.isNaN(paneWidth) || Number.isNaN(windowWidth)) return null return { paneWidth, windowWidth }