From 975b989de6d2aabb189cb6affb4ad3545e822819 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 16:26:35 +0100 Subject: [PATCH] test: reduce module reload churn --- ...ext.remote-profile-tab-ops.test-helpers.ts | 56 ++++++++++--------- src/gateway/exec-approval-ios-push.test.ts | 14 ++--- src/gateway/server-plugins.test.ts | 3 +- src/secrets/provider-env-vars.dynamic.test.ts | 30 +++++----- src/secrets/provider-env-vars.ts | 13 +++++ 5 files changed, 67 insertions(+), 49 deletions(-) diff --git a/extensions/browser/src/browser/server-context.remote-profile-tab-ops.test-helpers.ts b/extensions/browser/src/browser/server-context.remote-profile-tab-ops.test-helpers.ts index df558dc5432..69038e5cf40 100644 --- a/extensions/browser/src/browser/server-context.remote-profile-tab-ops.test-helpers.ts +++ b/extensions/browser/src/browser/server-context.remote-profile-tab-ops.test-helpers.ts @@ -13,33 +13,37 @@ export type RemoteProfileTestDeps = { originalFetch: typeof import("./server-context.remote-tab-ops.harness.js").originalFetch; }; +let remoteProfileTestDepsPromise: Promise | undefined; + export async function loadRemoteProfileTestDeps(): Promise { - vi.resetModules(); - await import("./server-context.chrome-test-harness.js"); - const chromeModule = await import("./chrome.js"); - const { InvalidBrowserNavigationUrlError } = await import("./navigation-guard.js"); - const pwAiModule = await import("./pw-ai-module.js"); - const { closePlaywrightBrowserConnection } = await import("./pw-session.js"); - const { createBrowserRouteContext } = await import("./server-context.js"); - const { - createJsonListFetchMock, - createRemoteRouteHarness, - createSequentialPageLister, - makeState, - originalFetch, - } = await import("./server-context.remote-tab-ops.harness.js"); - return { - chromeModule, - InvalidBrowserNavigationUrlError, - pwAiModule, - closePlaywrightBrowserConnection, - createBrowserRouteContext, - createJsonListFetchMock, - createRemoteRouteHarness, - createSequentialPageLister, - makeState, - originalFetch, - }; + remoteProfileTestDepsPromise ??= (async () => { + await import("./server-context.chrome-test-harness.js"); + const chromeModule = await import("./chrome.js"); + const { InvalidBrowserNavigationUrlError } = await import("./navigation-guard.js"); + const pwAiModule = await import("./pw-ai-module.js"); + const { closePlaywrightBrowserConnection } = await import("./pw-session.js"); + const { createBrowserRouteContext } = await import("./server-context.js"); + const { + createJsonListFetchMock, + createRemoteRouteHarness, + createSequentialPageLister, + makeState, + originalFetch, + } = await import("./server-context.remote-tab-ops.harness.js"); + return { + chromeModule, + InvalidBrowserNavigationUrlError, + pwAiModule, + closePlaywrightBrowserConnection, + createBrowserRouteContext, + createJsonListFetchMock, + createRemoteRouteHarness, + createSequentialPageLister, + makeState, + originalFetch, + }; + })(); + return await remoteProfileTestDepsPromise; } export function installRemoteProfileTestLifecycle(deps: RemoteProfileTestDeps): void { diff --git a/src/gateway/exec-approval-ios-push.test.ts b/src/gateway/exec-approval-ios-push.test.ts index faf0c681fc0..6e15acb1c4c 100644 --- a/src/gateway/exec-approval-ios-push.test.ts +++ b/src/gateway/exec-approval-ios-push.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const listDevicePairingMock = vi.fn(); const loadApnsRegistrationMock = vi.fn(); @@ -6,6 +6,7 @@ const resolveApnsAuthConfigFromEnvMock = vi.fn(); const resolveApnsRelayConfigFromEnvMock = vi.fn(); const sendApnsExecApprovalAlertMock = vi.fn(); const sendApnsExecApprovalResolvedWakeMock = vi.fn(); +let createExecApprovalIosPushDelivery: typeof import("./exec-approval-ios-push.js").createExecApprovalIosPushDelivery; type Deferred = { promise: Promise; @@ -73,8 +74,11 @@ vi.mock("../infra/push-apns.js", () => ({ })); describe("createExecApprovalIosPushDelivery", () => { + beforeAll(async () => { + ({ createExecApprovalIosPushDelivery } = await import("./exec-approval-ios-push.js")); + }); + beforeEach(() => { - vi.resetModules(); vi.clearAllMocks(); listDevicePairingMock.mockResolvedValue({ pending: [], paired: [] }); loadApnsRegistrationMock.mockResolvedValue({ @@ -133,7 +137,6 @@ describe("createExecApprovalIosPushDelivery", () => { ], }); - const { createExecApprovalIosPushDelivery } = await import("./exec-approval-ios-push.js"); const delivery = createExecApprovalIosPushDelivery({ log: {} }); const accepted = await delivery.handleRequested({ @@ -151,7 +154,6 @@ describe("createExecApprovalIosPushDelivery", () => { it("targets iOS devices when the active operator token includes operator.approvals", async () => { mockPairedIosOperator(["operator.approvals", "operator.read"]); - const { createExecApprovalIosPushDelivery } = await import("./exec-approval-ios-push.js"); const delivery = createExecApprovalIosPushDelivery({ log: {} }); const accepted = await delivery.handleRequested({ @@ -179,7 +181,6 @@ describe("createExecApprovalIosPushDelivery", () => { transport: "direct", }); - const { createExecApprovalIosPushDelivery } = await import("./exec-approval-ios-push.js"); const delivery = createExecApprovalIosPushDelivery({ log: { warn } }); const accepted = await delivery.handleRequested({ @@ -211,7 +212,6 @@ describe("createExecApprovalIosPushDelivery", () => { }>(); sendApnsExecApprovalAlertMock.mockReturnValue(requestedPush.promise); - const { createExecApprovalIosPushDelivery } = await import("./exec-approval-ios-push.js"); const delivery = createExecApprovalIosPushDelivery({ log: {} }); const requested = delivery.handleRequested({ @@ -245,7 +245,6 @@ describe("createExecApprovalIosPushDelivery", () => { it("skips cleanup pushes when the original request target set is unknown", async () => { const debug = vi.fn(); - const { createExecApprovalIosPushDelivery } = await import("./exec-approval-ios-push.js"); const delivery = createExecApprovalIosPushDelivery({ log: { debug } }); await delivery.handleResolved({ @@ -265,7 +264,6 @@ describe("createExecApprovalIosPushDelivery", () => { it("sends cleanup pushes only to the original request targets", async () => { mockPairedIosOperator(["operator.approvals", "operator.read"]); - const { createExecApprovalIosPushDelivery } = await import("./exec-approval-ios-push.js"); const delivery = createExecApprovalIosPushDelivery({ log: {} }); await delivery.handleRequested({ diff --git a/src/gateway/server-plugins.test.ts b/src/gateway/server-plugins.test.ts index 1d047880181..29d821bf23f 100644 --- a/src/gateway/server-plugins.test.ts +++ b/src/gateway/server-plugins.test.ts @@ -200,8 +200,7 @@ async function createSubagentRuntime( async function reloadServerPluginsModule(): Promise { vi.resetModules(); - await loadTestModules(); - return serverPluginsModule; + return await import("./server-plugins.js"); } function loadGatewayPluginsForTest( diff --git a/src/secrets/provider-env-vars.dynamic.test.ts b/src/secrets/provider-env-vars.dynamic.test.ts index cf10f9d5e69..94485213047 100644 --- a/src/secrets/provider-env-vars.dynamic.test.ts +++ b/src/secrets/provider-env-vars.dynamic.test.ts @@ -1,4 +1,12 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; +import { + __testing, + getProviderEnvVars, + listKnownProviderAuthEnvVarNames, + listKnownSecretEnvVarNames, + PROVIDER_AUTH_ENV_VAR_CANDIDATES, + PROVIDER_ENV_VARS, +} from "./provider-env-vars.js"; type MockManifestRegistry = { plugins: Array<{ @@ -21,9 +29,9 @@ vi.mock("../plugins/manifest-registry.js", () => ({ describe("provider env vars dynamic manifest metadata", () => { beforeEach(() => { - vi.resetModules(); loadPluginManifestRegistry.mockReset(); loadPluginManifestRegistry.mockReturnValue({ plugins: [], diagnostics: [] }); + __testing.resetProviderEnvVarCachesForTests(); }); it("includes later-installed plugin env vars without a bundled generated map", async () => { @@ -43,12 +51,10 @@ describe("provider env vars dynamic manifest metadata", () => { diagnostics: [], }); - const mod = await import("./provider-env-vars.js"); - - expect(mod.getProviderEnvVars("fireworks")).toEqual(["FIREWORKS_ALT_API_KEY"]); - expect(mod.getProviderEnvVars("fireworks-plan")).toEqual(["FIREWORKS_ALT_API_KEY"]); - expect(mod.listKnownProviderAuthEnvVarNames()).toContain("FIREWORKS_ALT_API_KEY"); - expect(mod.listKnownSecretEnvVarNames()).toContain("FIREWORKS_ALT_API_KEY"); + expect(getProviderEnvVars("fireworks")).toEqual(["FIREWORKS_ALT_API_KEY"]); + expect(getProviderEnvVars("fireworks-plan")).toEqual(["FIREWORKS_ALT_API_KEY"]); + expect(listKnownProviderAuthEnvVarNames()).toContain("FIREWORKS_ALT_API_KEY"); + expect(listKnownSecretEnvVarNames()).toContain("FIREWORKS_ALT_API_KEY"); }); it("keeps lazy manifest-backed exports cold until accessed and resolves them once", async () => { @@ -65,16 +71,14 @@ describe("provider env vars dynamic manifest metadata", () => { diagnostics: [], }); - const mod = await import("./provider-env-vars.js"); - expect(loadPluginManifestRegistry).not.toHaveBeenCalled(); - expect(mod.PROVIDER_ENV_VARS.fireworks).toEqual(["FIREWORKS_ALT_API_KEY"]); - expect(mod.PROVIDER_AUTH_ENV_VAR_CANDIDATES.fireworks).toEqual(["FIREWORKS_ALT_API_KEY"]); + expect(PROVIDER_ENV_VARS.fireworks).toEqual(["FIREWORKS_ALT_API_KEY"]); + expect(PROVIDER_AUTH_ENV_VAR_CANDIDATES.fireworks).toEqual(["FIREWORKS_ALT_API_KEY"]); const initialLoads = loadPluginManifestRegistry.mock.calls.length; expect(initialLoads).toBeGreaterThan(0); - void mod.PROVIDER_ENV_VARS.fireworks; - void mod.PROVIDER_AUTH_ENV_VAR_CANDIDATES.fireworks; + void PROVIDER_ENV_VARS.fireworks; + void PROVIDER_AUTH_ENV_VAR_CANDIDATES.fireworks; expect(loadPluginManifestRegistry).toHaveBeenCalledTimes(initialLoads); }); diff --git a/src/secrets/provider-env-vars.ts b/src/secrets/provider-env-vars.ts index 82402aac36a..c8dc009dd95 100644 --- a/src/secrets/provider-env-vars.ts +++ b/src/secrets/provider-env-vars.ts @@ -124,10 +124,15 @@ export function resolveProviderEnvVars( }; } +const lazyRecordCacheResetters = new Set<() => void>(); + function createLazyReadonlyRecord( resolve: () => Record, ): Record { let cached: Record | undefined; + lazyRecordCacheResetters.add(() => { + cached = undefined; + }); const getResolved = (): Record => { cached ??= resolve(); return cached; @@ -186,6 +191,14 @@ export const PROVIDER_AUTH_ENV_VAR_CANDIDATES = createLazyReadonlyRecord(() => */ export const PROVIDER_ENV_VARS = createLazyReadonlyRecord(() => resolveProviderEnvVars()); +export const __testing = { + resetProviderEnvVarCachesForTests(): void { + for (const reset of lazyRecordCacheResetters) { + reset(); + } + }, +}; + export function getProviderEnvVars( providerId: string, params?: ProviderEnvVarLookupParams,