fix(agent-teams): lock team deletion behind config mutex
This commit is contained in:
parent
cf42082c5f
commit
805df45722
48
src/tools/agent-teams/team-config-store.test.ts
Normal file
48
src/tools/agent-teams/team-config-store.test.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/// <reference types="bun-types" />
|
||||||
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test"
|
||||||
|
import { mkdtempSync, rmSync } from "node:fs"
|
||||||
|
import { tmpdir } from "node:os"
|
||||||
|
import { join } from "node:path"
|
||||||
|
import { acquireLock } from "../../features/claude-tasks/storage"
|
||||||
|
import { getTeamDir } from "./paths"
|
||||||
|
import { createTeamConfig, deleteTeamData, teamExists } from "./team-config-store"
|
||||||
|
|
||||||
|
describe("agent-teams team config store", () => {
|
||||||
|
let originalCwd: string
|
||||||
|
let tempProjectDir: string
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
originalCwd = process.cwd()
|
||||||
|
tempProjectDir = mkdtempSync(join(tmpdir(), "agent-teams-config-store-"))
|
||||||
|
process.chdir(tempProjectDir)
|
||||||
|
createTeamConfig("core", "Core team", "ses-main", tempProjectDir, "sisyphus")
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
if (teamExists("core")) {
|
||||||
|
deleteTeamData("core")
|
||||||
|
}
|
||||||
|
process.chdir(originalCwd)
|
||||||
|
rmSync(tempProjectDir, { recursive: true, force: true })
|
||||||
|
})
|
||||||
|
|
||||||
|
test("deleteTeamData waits for team lock before removing team files", () => {
|
||||||
|
//#given
|
||||||
|
const lock = acquireLock(getTeamDir("core"))
|
||||||
|
expect(lock.acquired).toBe(true)
|
||||||
|
|
||||||
|
//#when
|
||||||
|
const deleteWhileLocked = () => deleteTeamData("core")
|
||||||
|
|
||||||
|
//#then
|
||||||
|
expect(deleteWhileLocked).toThrow("team_lock_unavailable")
|
||||||
|
expect(teamExists("core")).toBe(true)
|
||||||
|
|
||||||
|
//#when
|
||||||
|
lock.release()
|
||||||
|
deleteTeamData("core")
|
||||||
|
|
||||||
|
//#then
|
||||||
|
expect(teamExists("core")).toBe(false)
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -173,14 +173,16 @@ export function assignNextColor(config: TeamConfig): string {
|
|||||||
|
|
||||||
export function deleteTeamData(teamName: string): void {
|
export function deleteTeamData(teamName: string): void {
|
||||||
assertValidTeamName(teamName)
|
assertValidTeamName(teamName)
|
||||||
const teamDir = getTeamDir(teamName)
|
withTeamLock(teamName, () => {
|
||||||
const taskDir = getTeamTaskDir(teamName)
|
const teamDir = getTeamDir(teamName)
|
||||||
|
const taskDir = getTeamTaskDir(teamName)
|
||||||
|
|
||||||
if (existsSync(teamDir)) {
|
if (existsSync(teamDir)) {
|
||||||
rmSync(teamDir, { recursive: true, force: true })
|
rmSync(teamDir, { recursive: true, force: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (existsSync(taskDir)) {
|
if (existsSync(taskDir)) {
|
||||||
rmSync(taskDir, { recursive: true, force: true })
|
rmSync(taskDir, { recursive: true, force: true })
|
||||||
}
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user