test(tmux): restore process.kill in afterEach to prevent cross-file leak
Oracle noted that loadSweeper() monkey-patches process.kill without ever restoring it. Added afterEach hook to set process.kill back to the captured original. Individual file runs already passed, and script/run-ci-tests.ts confirms the full CI suite - 4781 pass, 0 fail across 491 files - but this makes the test file safe under non-isolated local runs as well.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { beforeEach, describe, expect, it, mock } from "bun:test"
|
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test"
|
||||||
|
|
||||||
type SweepStaleOmoAgentSessions = typeof import("./stale-session-sweep").sweepStaleOmoAgentSessions
|
type SweepStaleOmoAgentSessions = typeof import("./stale-session-sweep").sweepStaleOmoAgentSessions
|
||||||
|
|
||||||
@@ -64,8 +64,9 @@ function registerModuleMocks(): void {
|
|||||||
mock.module(sessionKillSpecifier, () => ({ killTmuxSessionIfExists: killTmuxSessionMock }))
|
mock.module(sessionKillSpecifier, () => ({ killTmuxSessionIfExists: killTmuxSessionMock }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const originalProcessKill = process.kill
|
||||||
|
|
||||||
async function loadSweeper(overrideProcessAlive?: (pid: number) => boolean): Promise<SweepStaleOmoAgentSessions> {
|
async function loadSweeper(overrideProcessAlive?: (pid: number) => boolean): Promise<SweepStaleOmoAgentSessions> {
|
||||||
const originalKill = process.kill
|
|
||||||
const processAlive = overrideProcessAlive ?? isProcessAliveMock
|
const processAlive = overrideProcessAlive ?? isProcessAliveMock
|
||||||
process.kill = ((pid: number, signal?: number | string): true => {
|
process.kill = ((pid: number, signal?: number | string): true => {
|
||||||
if (signal === 0) {
|
if (signal === 0) {
|
||||||
@@ -76,7 +77,7 @@ async function loadSweeper(overrideProcessAlive?: (pid: number) => boolean): Pro
|
|||||||
err.code = "ESRCH"
|
err.code = "ESRCH"
|
||||||
throw err
|
throw err
|
||||||
}
|
}
|
||||||
return originalKill.call(process, pid, signal)
|
return originalProcessKill.call(process, pid, signal)
|
||||||
}) as typeof process.kill
|
}) as typeof process.kill
|
||||||
const module = await import(`${sweepSpecifier}?test=${crypto.randomUUID()}`)
|
const module = await import(`${sweepSpecifier}?test=${crypto.randomUUID()}`)
|
||||||
return module.sweepStaleOmoAgentSessions
|
return module.sweepStaleOmoAgentSessions
|
||||||
@@ -100,6 +101,10 @@ describe("sweepStaleOmoAgentSessions", () => {
|
|||||||
isProcessAliveMock.mockImplementation((_pid: number): boolean => false)
|
isProcessAliveMock.mockImplementation((_pid: number): boolean => false)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
process.kill = originalProcessKill
|
||||||
|
})
|
||||||
|
|
||||||
it("#given not inside tmux #when sweepStaleOmoAgentSessions called #then returns 0 without spawn", async () => {
|
it("#given not inside tmux #when sweepStaleOmoAgentSessions called #then returns 0 without spawn", async () => {
|
||||||
// given
|
// given
|
||||||
isInsideTmuxMock.mockImplementation((): boolean => false)
|
isInsideTmuxMock.mockImplementation((): boolean => false)
|
||||||
|
|||||||
Reference in New Issue
Block a user