test: trim model startup retry partial mocks

This commit is contained in:
Peter Steinberger
2026-04-03 21:10:13 +01:00
parent 756597e6ad
commit 93e716e775
3 changed files with 20 additions and 15 deletions

View File

@@ -11,9 +11,6 @@ let hookCacheCleared = false;
const clearProviderRuntimeHookCacheMock = vi.fn<() => void>(() => {
hookCacheCleared = true;
});
const resolveProviderRuntimePluginMock = vi.fn<(params: unknown) => unknown>(() =>
hookCacheCleared ? { id: "openai", label: "OpenAI", auth: [] } : undefined,
);
const prepareProviderDynamicModelMock = vi.fn<(params: unknown) => Promise<void>>(async () => {});
const runProviderDynamicModelMock = vi.fn<(params: unknown) => unknown>(() =>
hookCacheCleared
@@ -37,24 +34,21 @@ vi.mock("../pi-model-discovery.js", () => ({
discoverModels: discoverModelsMock,
}));
vi.mock("../../plugins/provider-runtime.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../../plugins/provider-runtime.js")>();
return {
...actual,
describe("resolveModelAsync startup retry", () => {
const runtimeHooks = {
applyProviderResolvedModelCompatWithPlugins: () => undefined,
buildProviderUnknownModelHintWithPlugin: () => undefined,
clearProviderRuntimeHookCache: clearProviderRuntimeHookCacheMock,
normalizeProviderResolvedModelWithPlugin: () => undefined,
normalizeProviderTransportWithPlugin: () => undefined,
prepareProviderDynamicModel: (params: unknown) => prepareProviderDynamicModelMock(params),
resolveProviderRuntimePlugin: (params: unknown) => resolveProviderRuntimePluginMock(params),
runProviderDynamicModel: (params: unknown) => runProviderDynamicModelMock(params),
applyProviderResolvedTransportWithPlugin: () => undefined,
};
});
describe("resolveModelAsync startup retry", () => {
beforeEach(() => {
hookCacheCleared = false;
clearProviderRuntimeHookCacheMock.mockClear();
resolveProviderRuntimePluginMock.mockClear();
prepareProviderDynamicModelMock.mockClear();
runProviderDynamicModelMock.mockClear();
discoverAuthStorageMock.mockClear();
@@ -71,6 +65,7 @@ describe("resolveModelAsync startup retry", () => {
{},
{
retryTransientProviderRuntimeMiss: true,
runtimeHooks,
},
);
@@ -81,19 +76,25 @@ describe("resolveModelAsync startup retry", () => {
api: "openai-codex-responses",
});
expect(clearProviderRuntimeHookCacheMock).toHaveBeenCalledTimes(1);
expect(resolveProviderRuntimePluginMock).toHaveBeenCalledTimes(2);
expect(prepareProviderDynamicModelMock).toHaveBeenCalledTimes(2);
expect(runProviderDynamicModelMock).toHaveBeenCalledTimes(2);
});
it("does not clear the hook cache during steady-state misses", async () => {
const { resolveModelAsync } = await import("./model.js");
const result = await resolveModelAsync("openai-codex", "gpt-5.4", "/tmp/agent", {});
const result = await resolveModelAsync(
"openai-codex",
"gpt-5.4",
"/tmp/agent",
{},
{ runtimeHooks },
);
expect(result.model).toBeUndefined();
expect(result.error).toBe("Unknown model: openai-codex/gpt-5.4");
expect(clearProviderRuntimeHookCacheMock).not.toHaveBeenCalled();
expect(resolveProviderRuntimePluginMock).toHaveBeenCalledTimes(1);
expect(prepareProviderDynamicModelMock).toHaveBeenCalledTimes(1);
expect(runProviderDynamicModelMock).toHaveBeenCalledTimes(1);
});
});

View File

@@ -1158,6 +1158,7 @@ describe("resolveModel", () => {
runtimeHooks: {
applyProviderResolvedModelCompatWithPlugins: () => undefined,
buildProviderUnknownModelHintWithPlugin: () => undefined,
clearProviderRuntimeHookCache: () => {},
prepareProviderDynamicModel: async () => {},
runProviderDynamicModel: () => undefined,
applyProviderResolvedTransportWithPlugin: ({ provider, context }) =>

View File

@@ -54,6 +54,7 @@ type ProviderRuntimeHooks = {
buildProviderUnknownModelHintWithPlugin: (
params: Parameters<typeof buildProviderUnknownModelHintWithPlugin>[0],
) => string | undefined;
clearProviderRuntimeHookCache: () => void;
prepareProviderDynamicModel: (
params: Parameters<typeof prepareProviderDynamicModel>[0],
) => Promise<void>;
@@ -70,6 +71,7 @@ const DEFAULT_PROVIDER_RUNTIME_HOOKS: ProviderRuntimeHooks = {
applyProviderResolvedModelCompatWithPlugins,
applyProviderResolvedTransportWithPlugin,
buildProviderUnknownModelHintWithPlugin,
clearProviderRuntimeHookCache,
prepareProviderDynamicModel,
runProviderDynamicModel,
normalizeProviderResolvedModelWithPlugin,
@@ -80,6 +82,7 @@ const STATIC_PROVIDER_RUNTIME_HOOKS: ProviderRuntimeHooks = {
applyProviderResolvedModelCompatWithPlugins: () => undefined,
applyProviderResolvedTransportWithPlugin: () => undefined,
buildProviderUnknownModelHintWithPlugin: () => undefined,
clearProviderRuntimeHookCache: () => {},
prepareProviderDynamicModel: async () => {},
runProviderDynamicModel: () => undefined,
normalizeProviderResolvedModelWithPlugin: () => undefined,
@@ -720,7 +723,7 @@ export async function resolveModelAsync(
const providerConfig = resolveConfiguredProviderConfig(cfg, provider);
const resolveDynamicAttempt = async (attemptOptions?: { clearHookCache?: boolean }) => {
if (attemptOptions?.clearHookCache) {
clearProviderRuntimeHookCache();
runtimeHooks.clearProviderRuntimeHookCache();
}
await runtimeHooks.prepareProviderDynamicModel({
provider,