






















@@ -22,10 +22,24 @@ const refreshVisibleToolsEffectiveForCurrentSessionMock = vi.hoisted(() =>
2222state.toolsEffectiveResult = { agentId, profile: "coding", groups: [] };
2323}),
2424);
25+const loadSessionsMock = vi.hoisted(() =>
26+vi.fn(async (state: AppViewState) => {
27+const res = await state.client?.request("sessions.list", {
28+includeGlobal: true,
29+includeUnknown: true,
30+});
31+if (res) {
32+state.sessionsResult = res as AppViewState["sessionsResult"];
33+}
34+}),
35+);
25362637vi.mock("../controllers/agents.ts", () => ({
2738refreshVisibleToolsEffectiveForCurrentSession: refreshVisibleToolsEffectiveForCurrentSessionMock,
2839}));
40+vi.mock("../controllers/sessions.ts", () => ({
41+loadSessions: loadSessionsMock,
42+}));
29433044function createChatHeaderState(
3145overrides: {
@@ -146,11 +160,19 @@ function createChatHeaderState(
146160return { state, request };
147161}
148162149-async function flushTasks() {
150-return new Promise<void>((resolve) => queueMicrotask(resolve));
163+async function flushTasks(turns = 6) {
164+for (let i = 0; i < turns; i += 1) {
165+await Promise.resolve();
166+}
167+await new Promise<void>((resolve) => setTimeout(resolve, 0));
168+for (let i = 0; i < turns; i += 1) {
169+await Promise.resolve();
170+}
151171}
152172153173afterEach(() => {
174+loadSessionsMock.mockClear();
175+refreshVisibleToolsEffectiveForCurrentSessionMock.mockClear();
154176vi.unstubAllGlobals();
155177});
156178@@ -174,13 +196,10 @@ describe("chat session controls", () => {
174196model: "openai/gpt-5-mini",
175197});
176198expect(request).not.toHaveBeenCalledWith("chat.history", expect.anything());
177-await vi.waitFor(
178-() => {
179-expect(state.sessionsResult?.sessions[0]?.model).toBe("gpt-5-mini");
180-expect(state.sessionsResult?.sessions[0]?.modelProvider).toBe("openai");
181-},
182-{ interval: 1, timeout: 100 },
183-);
199+await flushTasks();
200+expect(loadSessionsMock).toHaveBeenCalledTimes(1);
201+expect(state.sessionsResult?.sessions[0]?.model).toBe("gpt-5-mini");
202+expect(state.sessionsResult?.sessions[0]?.modelProvider).toBe("openai");
184203});
185204186205it("reloads effective tools after a chat-header model switch for the active tools panel", async () => {
@@ -203,15 +222,11 @@ describe("chat session controls", () => {
203222204223modelSelect!.value = "openai/gpt-5-mini";
205224modelSelect!.dispatchEvent(new Event("change", { bubbles: true }));
206-await vi.waitFor(
207-() => {
208-expect(request).toHaveBeenCalledWith("tools.effective", {
209-agentId: "main",
210-sessionKey: "main",
211-});
212-},
213-{ interval: 1, timeout: 100 },
214-);
225+await flushTasks();
226+expect(request).toHaveBeenCalledWith("tools.effective", {
227+agentId: "main",
228+sessionKey: "main",
229+});
215230expect(state.toolsEffectiveResultKey).toBe("main:main:model=openai/gpt-5-mini");
216231});
217232@@ -233,12 +248,9 @@ describe("chat session controls", () => {
233248key: "main",
234249model: null,
235250});
236-await vi.waitFor(
237-() => {
238-expect(state.sessionsResult?.sessions[0]?.model).toBeUndefined();
239-},
240-{ interval: 1, timeout: 100 },
241-);
251+await flushTasks();
252+expect(loadSessionsMock).toHaveBeenCalledTimes(1);
253+expect(state.sessionsResult?.sessions[0]?.model).toBeUndefined();
242254});
243255244256it("disables the chat header model picker while a run is active", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。