From 85eb9e6e0e0c4456913f3975baa8d22e1ca24019 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 30 May 2026 15:34:40 +0900 Subject: [PATCH] test(background-agent): isolate logger mocks --- .../abort-with-timeout.test.ts | 20 +++++++++-------- .../background-agent/process-cleanup.test.ts | 1 + .../session-status-classifier.test.ts | 22 ++++++++++++++----- src/shared/logger.test.ts | 6 ++++- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/features/background-agent/abort-with-timeout.test.ts b/src/features/background-agent/abort-with-timeout.test.ts index c0f3787af..e070dbfd5 100644 --- a/src/features/background-agent/abort-with-timeout.test.ts +++ b/src/features/background-agent/abort-with-timeout.test.ts @@ -1,15 +1,12 @@ -import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test" +import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test" const logMock = mock(() => {}) -mock.module("../../shared/logger", () => ({ - log: logMock, -})) - import type { OpencodeClient } from "./opencode-client" +import type { abortWithTimeout as abortWithTimeoutFunction } from "./abort-with-timeout" -const { abortWithTimeout } = await import("./abort-with-timeout") -mock.restore() +let abortWithTimeout: typeof abortWithTimeoutFunction +let importCounter = 0 function createClient(abort: (...args: Array) => Promise): OpencodeClient { return { @@ -20,11 +17,16 @@ function createClient(abort: (...args: Array) => Promise): Ope } describe("abortWithTimeout", () => { - beforeEach(() => { + beforeEach(async () => { logMock.mockClear() + mock.module("../../shared/logger", () => ({ + log: logMock, + })) + ;({ abortWithTimeout } = await import(`./abort-with-timeout?test=${importCounter}`)) + importCounter += 1 }) - afterAll(() => { + afterEach(() => { mock.restore() }) diff --git a/src/features/background-agent/process-cleanup.test.ts b/src/features/background-agent/process-cleanup.test.ts index 5dbf48bc0..797749249 100644 --- a/src/features/background-agent/process-cleanup.test.ts +++ b/src/features/background-agent/process-cleanup.test.ts @@ -24,6 +24,7 @@ type CleanupManager = { // This prevents bun test from exiting with non-zero code if any test // called scheduleForcedExit() with exitCode=1 afterAll(() => { + mock.restore() process.exitCode = 0 }) diff --git a/src/features/background-agent/session-status-classifier.test.ts b/src/features/background-agent/session-status-classifier.test.ts index c5d322315..79b680e18 100644 --- a/src/features/background-agent/session-status-classifier.test.ts +++ b/src/features/background-agent/session-status-classifier.test.ts @@ -1,12 +1,24 @@ -import { describe, test, expect, mock, afterAll } from "bun:test" +import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test" +import type { + isActiveSessionStatus as isActiveSessionStatusFunction, + isTerminalSessionStatus as isTerminalSessionStatusFunction, +} from "./session-status-classifier" const mockLog = mock() -mock.module("../../shared/logger", () => ({ log: mockLog })) +let isActiveSessionStatus: typeof isActiveSessionStatusFunction +let isTerminalSessionStatus: typeof isTerminalSessionStatusFunction +let importCounter = 0 -afterAll(() => { mock.restore() }) +beforeEach(async () => { + mockLog.mockClear() + mock.module("../../shared/logger", () => ({ log: mockLog })) + ;({ isActiveSessionStatus, isTerminalSessionStatus } = await import(`./session-status-classifier?test=${importCounter}`)) + importCounter += 1 +}) -const { isActiveSessionStatus, isTerminalSessionStatus } = await import("./session-status-classifier") -mock.restore() +afterEach(() => { + mock.restore() +}) describe("isActiveSessionStatus", () => { describe("#given a known active session status", () => { diff --git a/src/shared/logger.test.ts b/src/shared/logger.test.ts index ff85e493b..ed15ff285 100644 --- a/src/shared/logger.test.ts +++ b/src/shared/logger.test.ts @@ -5,7 +5,7 @@ // re-exports this logger) cannot leak a no-op `log` into our imports. See // script/run-ci-tests.ts — the `mock.module(` substring routes the file out of // the shared batch. -import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test" +import { afterAll, afterEach, beforeEach, describe, expect, mock, test } from "bun:test" mock.module("./logger-test-isolation", () => ({})) import * as fs from "fs" @@ -16,6 +16,10 @@ type LoggerModule = typeof import("./logger") const TEST_PREFIX = "oh-my-opencode-logger-test" +afterAll(() => { + mock.restore() +}) + function makeTempDir(): string { return fs.mkdtempSync(path.join(os.tmpdir(), `${TEST_PREFIX}-`)) }