feat(team-mode): add close-team-member-pane command with tests
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
/// <reference types="bun-types" />
|
||||
|
||||
import { afterEach, beforeEach, describe, expect, test, mock, spyOn } from "bun:test"
|
||||
|
||||
import * as sharedModule from "../../../shared"
|
||||
import * as sharedTmuxModule from "../../../shared/tmux"
|
||||
import { closeTeamMemberPane } from "./close-team-member-pane"
|
||||
|
||||
const closeTmuxPaneMock = mock(async (): Promise<boolean> => true)
|
||||
const logMock = mock(() => undefined)
|
||||
|
||||
describe("closeTeamMemberPane", () => {
|
||||
afterEach(() => {
|
||||
mock.restore()
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
closeTmuxPaneMock.mockClear()
|
||||
logMock.mockClear()
|
||||
|
||||
closeTmuxPaneMock.mockResolvedValue(true)
|
||||
spyOn(sharedModule, "log").mockImplementation(logMock)
|
||||
spyOn(sharedTmuxModule, "closeTmuxPane").mockImplementation(closeTmuxPaneMock)
|
||||
})
|
||||
|
||||
test("#given member has both tmuxPaneId and tmuxGridPaneId #when closeTeamMemberPane runs #then close is invoked for both ids (2 calls) and returns true when either succeeds", async () => {
|
||||
// given
|
||||
closeTmuxPaneMock.mockResolvedValueOnce(false)
|
||||
closeTmuxPaneMock.mockResolvedValueOnce(true)
|
||||
|
||||
// when
|
||||
const result = await closeTeamMemberPane({ tmuxPaneId: "%42", tmuxGridPaneId: "%84" })
|
||||
|
||||
// then
|
||||
expect(result).toBe(true)
|
||||
expect(closeTmuxPaneMock).toHaveBeenCalledTimes(2)
|
||||
expect(closeTmuxPaneMock).toHaveBeenCalledWith("%42")
|
||||
expect(closeTmuxPaneMock).toHaveBeenCalledWith("%84")
|
||||
})
|
||||
|
||||
test("#given member has only tmuxPaneId #when closeTeamMemberPane runs #then close is invoked once and returns true when it succeeds", async () => {
|
||||
// when
|
||||
const result = await closeTeamMemberPane({ tmuxPaneId: "%42" })
|
||||
|
||||
// then
|
||||
expect(result).toBe(true)
|
||||
expect(closeTmuxPaneMock).toHaveBeenCalledTimes(1)
|
||||
expect(closeTmuxPaneMock).toHaveBeenCalledWith("%42")
|
||||
})
|
||||
|
||||
test("#given both closes fail #when closeTeamMemberPane runs #then returns false", async () => {
|
||||
// given
|
||||
closeTmuxPaneMock.mockResolvedValue(false)
|
||||
|
||||
// when
|
||||
const result = await closeTeamMemberPane({ tmuxPaneId: "%42", tmuxGridPaneId: "%84" })
|
||||
|
||||
// then
|
||||
expect(result).toBe(false)
|
||||
expect(closeTmuxPaneMock).toHaveBeenCalledTimes(2)
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,31 @@
|
||||
/// <reference types="bun-types" />
|
||||
|
||||
import type { RuntimeStateMember } from "../types"
|
||||
|
||||
type TeamMemberPaneIds = Pick<RuntimeStateMember, "tmuxPaneId" | "tmuxGridPaneId">
|
||||
|
||||
export async function closeTeamMemberPane(member: TeamMemberPaneIds): Promise<boolean> {
|
||||
const paneIds = [member.tmuxPaneId, member.tmuxGridPaneId].filter((paneId): paneId is string => paneId !== undefined && paneId.length > 0)
|
||||
if (paneIds.length === 0) {
|
||||
return false
|
||||
}
|
||||
|
||||
const [{ log }, { closeTmuxPane }] = await Promise.all([
|
||||
import("../../../shared"),
|
||||
import("../../../shared/tmux"),
|
||||
])
|
||||
|
||||
const results = await Promise.all(paneIds.map(async (paneId) => {
|
||||
try {
|
||||
return await closeTmuxPane(paneId)
|
||||
} catch (error) {
|
||||
log("[closeTeamMemberPane] FAILED", {
|
||||
paneId,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
})
|
||||
return false
|
||||
}
|
||||
}))
|
||||
|
||||
return results.some(Boolean)
|
||||
}
|
||||
Reference in New Issue
Block a user