perf(test): speed up model provider page observation polling (#127085)

This commit is contained in:
Peter Steinberger
2026-08-21 00:40:36 -07:00
committed by GitHub
parent 58127fa73e
commit 8ac7dd254c
@@ -4,6 +4,7 @@ import { afterEach, describe, expect, it, vi } from "vitest";
import type { GatewayBrowserClient } from "../../api/gateway.ts";
import type { ModelsProbeResult } from "../../api/types.ts";
import type { ApplicationContext, ApplicationGatewaySnapshot } from "../../app/context.ts";
import { waitForFast } from "../../test-helpers/wait-for.ts";
import type { DefaultModelSelection, ModelProviderLogoutTarget } from "./data.ts";
import { EMPTY_MODEL_PROVIDERS_DATA, type ModelProvidersData } from "./load.ts";
import type { ModelProvidersRouteData } from "./model-providers-page.ts";
@@ -191,7 +192,7 @@ describe("ModelProvidersPage agent scope", () => {
it("switches application ownership from the concrete agent picker", async () => {
const { agentSelection, context } = createHarness("main");
const page = appendPage(context);
await vi.waitFor(() => expect(page.querySelector("openclaw-agent-select")).not.toBeNull());
await waitForFast(() => expect(page.querySelector("openclaw-agent-select")).not.toBeNull());
page.querySelector<AgentSelectElement>("openclaw-agent-select")?.onSelect("writer");
@@ -212,7 +213,7 @@ describe("ModelProvidersPage agent scope", () => {
it("patches thinking and fast mode through the shared config draft", async () => {
const { context, runtimeConfig } = createHarness("main");
const page = appendPage(context);
await vi.waitFor(() => expect(page.querySelector("#settings-model-behavior")).not.toBeNull());
await waitForFast(() => expect(page.querySelector("#settings-model-behavior")).not.toBeNull());
const groups = page.querySelectorAll<HTMLElement & { value: string }>("wa-radio-group");
expect(groups).toHaveLength(2);
@@ -236,7 +237,7 @@ describe("ModelProvidersPage agent scope", () => {
it("removes thinking and fast overrides through the shared config draft", async () => {
const { context, runtimeConfig } = createHarness("main");
const page = appendPage(context);
await vi.waitFor(() => expect(page.querySelector("#settings-model-behavior")).not.toBeNull());
await waitForFast(() => expect(page.querySelector("#settings-model-behavior")).not.toBeNull());
const groups = page.querySelectorAll<HTMLElement & { value: string }>(
"#settings-model-behavior wa-radio-group",
@@ -265,7 +266,7 @@ describe("ModelProvidersPage agent scope", () => {
agents: { defaults: { thinkingDefault: 42, fastModeDefault: "bogus" } },
} as unknown as typeof runtimeConfig.state.configForm;
const page = appendPage(context);
await vi.waitFor(() => expect(page.querySelector("#settings-model-behavior")).not.toBeNull());
await waitForFast(() => expect(page.querySelector("#settings-model-behavior")).not.toBeNull());
const behavior = page.querySelector("#settings-model-behavior")!;
const groups = behavior.querySelectorAll<HTMLElement & { value: string }>("wa-radio-group");
@@ -294,7 +295,7 @@ describe("ModelProvidersPage agent scope", () => {
runtimeConfig.state.lastError = "config.get failed after provider-key commit";
});
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
page.keyEditorProvider = "openai";
page.keyDraft = "replacement";
@@ -315,7 +316,7 @@ describe("ModelProvidersPage agent scope", () => {
runtimeConfig.state.lastError = "config.get failed after provider add";
});
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
page.addProviderOpen = true;
page.addProviderId = "anthropic";
page.addProviderKey = "new-provider-key";
@@ -338,7 +339,7 @@ describe("ModelProvidersPage agent scope", () => {
runtimeConfig.state.lastError = "config.get failed after saving default models";
});
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
const selection: DefaultModelSelection = {
primary: "openai/gpt-5",
fallbacks: [],
@@ -362,7 +363,7 @@ describe("ModelProvidersPage agent scope", () => {
const gate = deferred<void>();
runtimeConfig.ensureLoaded.mockImplementationOnce(async () => gate.promise);
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
const selection: DefaultModelSelection = {
primary: "openai/gpt-5",
fallbacks: [],
@@ -389,7 +390,7 @@ describe("ModelProvidersPage agent scope", () => {
const gate = deferred<void>();
runtimeConfig.ensureLoaded.mockImplementationOnce(async () => gate.promise);
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
page.keyEditorProvider = "openai";
page.keyDraft = "main-agent-key";
@@ -420,7 +421,7 @@ describe("ModelProvidersPage agent scope", () => {
const gate = deferred<void>();
runtimeConfig.ensureLoaded.mockImplementationOnce(async () => gate.promise);
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
page.addProviderOpen = true;
page.addProviderId = "anthropic";
page.addProviderKey = "shared-provider-key";
@@ -447,7 +448,7 @@ describe("ModelProvidersPage agent scope", () => {
it("stops queued agent-scoped logouts after the selected agent changes", async () => {
const { agentSelection, context, notifySelection, request } = createHarness("main");
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
request.mockClear();
const firstLogout = deferred<unknown>();
request.mockImplementationOnce(async () => firstLogout.promise);
@@ -480,7 +481,7 @@ describe("ModelProvidersPage agent scope", () => {
it("stops queued agent-scoped logouts when route data changes the selected agent", async () => {
const { agentSelection, context, request, snapshot } = createHarness("main");
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
request.mockClear();
const firstLogout = deferred<unknown>();
request.mockImplementationOnce(async () => firstLogout.promise);
@@ -532,7 +533,7 @@ describe("ModelProvidersPage agent scope", () => {
agentSelection.state.scopeId = "writer";
notifySelection();
await vi.waitFor(() =>
await waitForFast(() =>
expect(request).toHaveBeenCalledWith(
"models.authStatus",
{ agentId: "writer" },
@@ -549,7 +550,7 @@ describe("ModelProvidersPage agent scope", () => {
const page = appendPage(context);
await vi.waitFor(() =>
await waitForFast(() =>
expect(request).toHaveBeenCalledWith(
"models.authStatus",
{ agentId: "writer" },
@@ -614,14 +615,14 @@ describe("ModelProvidersPage agent scope", () => {
notifySelection();
release();
await vi.waitFor(() =>
await waitForFast(() =>
expect(request).toHaveBeenCalledWith(
"models.authStatus",
{ agentId: "writer" },
{ signal: expect.any(AbortSignal) },
),
);
await vi.waitFor(() => expect(page.data?.updatedAt).toEqual(expect.any(Number)));
await waitForFast(() => expect(page.data?.updatedAt).toEqual(expect.any(Number)));
});
it("discards stale route data when selection changes during preload", async () => {
@@ -634,7 +635,7 @@ describe("ModelProvidersPage agent scope", () => {
page.routeData = { data: staleData, client: snapshot.client, agentId: "main" };
document.body.append(page);
await vi.waitFor(() =>
await waitForFast(() =>
expect(request).toHaveBeenCalledWith(
"models.authStatus",
{ agentId: "writer" },
@@ -648,7 +649,7 @@ describe("ModelProvidersPage agent scope", () => {
it("probes credentials in the selected agent scope", async () => {
const { context, request } = createHarness("writer");
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
request.mockClear();
await page.probe("openai", ["openai"]);
@@ -662,7 +663,7 @@ describe("ModelProvidersPage agent scope", () => {
it("stops queued provider probes after switching away from and back to the selected agent", async () => {
const { agentSelection, context, notifySelection, request } = createHarness("main");
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
request.mockClear();
const firstProbe = deferred<ModelsProbeResult>();
request.mockImplementationOnce(() => firstProbe.promise);
@@ -693,7 +694,7 @@ describe("ModelProvidersPage agent scope", () => {
it("discards an in-flight probe result after the selected agent changes", async () => {
const { agentSelection, context, notifySelection, request } = createHarness("main");
const page = appendPage(context);
await vi.waitFor(() => expect(page.data?.config).toEqual({}));
await waitForFast(() => expect(page.data?.config).toEqual({}));
const pending = deferred<ModelsProbeResult>();
request.mockImplementationOnce(() => pending.promise);