Skip to content

Commit 7e9812a

Browse files
committed
fix(tests): fix test isolation issues in terminal-multiplexer tests
- detection.test.ts: Save and restore env vars properly - tmux-utils.test.ts: Delete env vars when originally undefined - tmux-adapter.test.ts: Add cleanup to kill created tmux sessions Fixes test isolation issues identified by cubic-dev-ai in PR code-yeongyu#1226. Without these fixes, tests can be flaky when run inside tmux/zellij and orphaned sessions accumulate.
1 parent dacca33 commit 7e9812a

File tree

3 files changed

+76
-4
lines changed

3 files changed

+76
-4
lines changed

src/shared/terminal-multiplexer/detection.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,38 @@ import { TmuxAdapter } from "./tmux-adapter"
44
import { ZellijAdapter } from "./zellij-adapter"
55

66
describe("detectMultiplexer", () => {
7+
let savedTmux: string | undefined
8+
let savedZellij: string | undefined
9+
let savedZellijSession: string | undefined
10+
711
beforeEach(() => {
812
resetDetectionCache()
13+
savedTmux = process.env.TMUX
14+
savedZellij = process.env.ZELLIJ
15+
savedZellijSession = process.env.ZELLIJ_SESSION_NAME
916
delete process.env.TMUX
1017
delete process.env.ZELLIJ
1118
delete process.env.ZELLIJ_SESSION_NAME
1219
})
1320

1421
afterEach(() => {
1522
resetDetectionCache()
23+
// Restore or delete based on original state
24+
if (savedTmux !== undefined) {
25+
process.env.TMUX = savedTmux
26+
} else {
27+
delete process.env.TMUX
28+
}
29+
if (savedZellij !== undefined) {
30+
process.env.ZELLIJ = savedZellij
31+
} else {
32+
delete process.env.ZELLIJ
33+
}
34+
if (savedZellijSession !== undefined) {
35+
process.env.ZELLIJ_SESSION_NAME = savedZellijSession
36+
} else {
37+
delete process.env.ZELLIJ_SESSION_NAME
38+
}
1639
})
1740

1841
it("returns 'tmux' when $TMUX env var is set", async () => {

src/shared/terminal-multiplexer/tmux-adapter.test.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { describe, it, expect, beforeEach, mock } from "bun:test"
1+
import { describe, it, expect, beforeEach, afterEach, mock } from "bun:test"
22
import { TmuxAdapter } from "./tmux-adapter"
33

44
const mockConfig = {
@@ -148,9 +148,27 @@ describe("TmuxAdapter", () => {
148148
})
149149

150150
describe("ensureSession", () => {
151+
const createdSessions: string[] = []
152+
153+
beforeEach(() => {
154+
createdSessions.length = 0
155+
})
156+
157+
afterEach(async () => {
158+
for (const sessionName of createdSessions) {
159+
try {
160+
await adapter.killSession(sessionName)
161+
} catch {
162+
// Ignore errors if session doesn't exist
163+
}
164+
}
165+
createdSessions.length = 0
166+
})
167+
151168
it("accepts session name and creates session", async () => {
152169
//#given
153170
const sessionName = "omo-test-session"
171+
createdSessions.push(sessionName)
154172

155173
//#when
156174
const ensurePromise = adapter.ensureSession(sessionName)
@@ -162,6 +180,7 @@ describe("TmuxAdapter", () => {
162180
it("succeeds when session already exists", async () => {
163181
//#given
164182
const sessionName = "omo-existing-session"
183+
createdSessions.push(sessionName)
165184
await adapter.ensureSession(sessionName)
166185

167186
//#when
@@ -173,9 +192,27 @@ describe("TmuxAdapter", () => {
173192
})
174193

175194
describe("killSession", () => {
195+
const createdSessions: string[] = []
196+
197+
beforeEach(() => {
198+
createdSessions.length = 0
199+
})
200+
201+
afterEach(async () => {
202+
for (const sessionName of createdSessions) {
203+
try {
204+
await adapter.killSession(sessionName)
205+
} catch {
206+
// Ignore errors if session doesn't exist
207+
}
208+
}
209+
createdSessions.length = 0
210+
})
211+
176212
it("accepts session name and kills session", async () => {
177213
//#given
178214
const sessionName = "omo-kill-test"
215+
createdSessions.push(sessionName)
179216
await adapter.ensureSession(sessionName)
180217

181218
//#when

src/shared/tmux/tmux-utils.test.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,21 @@ describe("isInsideTmux", () => {
2424
})
2525

2626
afterEach(() => {
27-
process.env.TMUX = savedTmux
28-
process.env.ZELLIJ = savedZellij
29-
process.env.ZELLIJ_SESSION_NAME = savedZellijSession
27+
if (savedTmux !== undefined) {
28+
process.env.TMUX = savedTmux
29+
} else {
30+
delete process.env.TMUX
31+
}
32+
if (savedZellij !== undefined) {
33+
process.env.ZELLIJ = savedZellij
34+
} else {
35+
delete process.env.ZELLIJ
36+
}
37+
if (savedZellijSession !== undefined) {
38+
process.env.ZELLIJ_SESSION_NAME = savedZellijSession
39+
} else {
40+
delete process.env.ZELLIJ_SESSION_NAME
41+
}
3042
})
3143

3244
test("returns true when TMUX env is set", () => {

0 commit comments

Comments
 (0)