mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-05 15:20:23 +00:00
test: trim model startup retry partial mocks
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1158,6 +1158,7 @@ describe("resolveModel", () => {
|
||||
runtimeHooks: {
|
||||
applyProviderResolvedModelCompatWithPlugins: () => undefined,
|
||||
buildProviderUnknownModelHintWithPlugin: () => undefined,
|
||||
clearProviderRuntimeHookCache: () => {},
|
||||
prepareProviderDynamicModel: async () => {},
|
||||
runProviderDynamicModel: () => undefined,
|
||||
applyProviderResolvedTransportWithPlugin: ({ provider, context }) =>
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user