From 33c8b7f6758771058c9fa94577fc13ce440cc153 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Wed, 1 Apr 2026 04:29:52 +0900 Subject: [PATCH] fix(tests): resolve 6 test isolation failures in full suite 3 failures in fallback.cliproxyapi-matrix.test.ts: - Root cause: leaked spyOn(getMainSessionID) in tool-execute-before-session-notification.test.ts was never restored, poisoning module state for subsequent tests in the same worker - Added mockRestore() call and _resetModelFallbackForTesting in afterEach 3 failures in background-agent/manager.test.ts: - Root cause: connected-providers-cache memConnected/memProviderModels persisted across test files, making isReachable() skip fallback candidates in retry tests - Added mock.module for connected-providers-cache at file level - Added _resetMemCacheForTesting export and global beforeEach cleanup Full suite: 4638/4638 pass, 0 fail --- src/features/background-agent/manager.test.ts | 12 +++++++++++- src/plugin/fallback.cliproxyapi-matrix.test.ts | 2 ++ .../tool-execute-before-session-notification.test.ts | 2 ++ src/shared/connected-providers-cache.ts | 7 +++++++ test-setup.ts | 2 ++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/features/background-agent/manager.test.ts b/src/features/background-agent/manager.test.ts index b190aff58..0d812329c 100644 --- a/src/features/background-agent/manager.test.ts +++ b/src/features/background-agent/manager.test.ts @@ -1,5 +1,15 @@ declare const require: (name: string) => any -const { describe, test, expect, beforeEach, afterEach, spyOn } = require("bun:test") +const { describe, test, expect, beforeEach, afterEach, spyOn, mock } = require("bun:test") + +mock.module("../../shared/connected-providers-cache", () => ({ + readConnectedProvidersCache: () => null, + readProviderModelsCache: () => null, + hasConnectedProvidersCache: () => false, + hasProviderModelsCache: () => false, + writeProviderModelsCache: () => {}, + updateConnectedProvidersCache: () => {}, +})) + import { getSessionPromptParams, clearSessionPromptParams } from "../../shared/session-prompt-params-state" import { tmpdir } from "node:os" import type { PluginInput } from "@opencode-ai/plugin" diff --git a/src/plugin/fallback.cliproxyapi-matrix.test.ts b/src/plugin/fallback.cliproxyapi-matrix.test.ts index 71dbc3631..d13930c6f 100644 --- a/src/plugin/fallback.cliproxyapi-matrix.test.ts +++ b/src/plugin/fallback.cliproxyapi-matrix.test.ts @@ -15,6 +15,7 @@ import { createChatMessageHandler } from "./chat-message" import { createModelFallbackHook } from "../hooks/model-fallback/hook" import { createRuntimeFallbackHook } from "../hooks/runtime-fallback" import { _resetForTesting } from "../features/claude-code-session-state" +import { _resetForTesting as _resetModelFallbackForTesting } from "../hooks/model-fallback/hook" import { SessionCategoryRegistry } from "../shared/session-category-registry" const PRIMARY_MODEL = { @@ -311,6 +312,7 @@ async function triggerAssistantMessageError( afterEach(() => { _resetForTesting() + _resetModelFallbackForTesting() SessionCategoryRegistry.clear() }) diff --git a/src/plugin/tool-execute-before-session-notification.test.ts b/src/plugin/tool-execute-before-session-notification.test.ts index 390f1fa88..970758d84 100644 --- a/src/plugin/tool-execute-before-session-notification.test.ts +++ b/src/plugin/tool-execute-before-session-notification.test.ts @@ -27,6 +27,8 @@ describe("createToolExecuteBeforeHandler session notification sessionID", () => expect(getMainSessionIDSpy).toHaveBeenCalled() expect(capturedSessionID).toBe(mainSessionID) + + getMainSessionIDSpy.mockRestore() }) }) diff --git a/src/shared/connected-providers-cache.ts b/src/shared/connected-providers-cache.ts index cf17852cd..444c93943 100644 --- a/src/shared/connected-providers-cache.ts +++ b/src/shared/connected-providers-cache.ts @@ -222,6 +222,11 @@ export function createConnectedProvidersCacheStore( } } + function _resetMemCacheForTesting(): void { + memConnected = undefined + memProviderModels = undefined + } + return { readConnectedProvidersCache, hasConnectedProvidersCache, @@ -229,6 +234,7 @@ export function createConnectedProvidersCacheStore( hasProviderModelsCache, writeProviderModelsCache, updateConnectedProvidersCache, + _resetMemCacheForTesting, } } @@ -269,4 +275,5 @@ export const { hasProviderModelsCache, writeProviderModelsCache, updateConnectedProvidersCache, + _resetMemCacheForTesting, } = defaultConnectedProvidersCacheStore diff --git a/test-setup.ts b/test-setup.ts index 5c6e5aa0d..6bb51814b 100644 --- a/test-setup.ts +++ b/test-setup.ts @@ -1,8 +1,10 @@ import { beforeEach } from "bun:test" import { _resetForTesting as resetClaudeSessionState } from "./src/features/claude-code-session-state/state" import { _resetForTesting as resetModelFallbackState } from "./src/hooks/model-fallback/hook" +import { _resetMemCacheForTesting as resetConnectedProvidersCache } from "./src/shared/connected-providers-cache" beforeEach(() => { resetClaudeSessionState() resetModelFallbackState() + resetConnectedProvidersCache() })