test(tui): covered hub task job model snapshots

Exercise the live AsyncJobManager progress-to-hub snapshot path so runtime fallback selectors are rendered once while a task remains running.

Fixes #5060
This commit is contained in:
roboomp
2026-07-15 14:03:18 +00:00
parent 80b64676c4
commit 871eaa389d
@@ -1,7 +1,9 @@
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "bun:test";
import { AsyncJobManager } from "../src/async/job-manager";
import { Settings, settings } from "../src/config/settings";
import { getThemeByName, setThemeInstance, type Theme } from "../src/modes/theme/theme";
import { jobsRenderResult } from "../src/tools/hub/jobs";
import type { ToolSession } from "../src/tools";
import { jobsRenderResult, snapshotJobs } from "../src/tools/hub/jobs";
import type { CoordinationDetails } from "../src/tools/hub/types";
const ansiPattern = /\x1b\[[0-9;]*m/g;
@@ -63,6 +65,36 @@ describe("hub jobs task model badges", () => {
expect(text.split(selector).length - 1).toBe(1);
});
it("renders the latest runtime selector from a running task job snapshot", async () => {
settings.override("task.showResolvedModelBadge", true);
const selector = "openai-codex/gpt-5.6-luna:max";
const reported = Promise.withResolvers<void>();
const finish = Promise.withResolvers<string>();
const manager = new AsyncJobManager({ onJobComplete: () => {} });
const id = manager.register(
"task",
"Architect",
async ({ reportProgress }) => {
await reportProgress("running", {
progress: [{ id: "Architect", resolvedModel: selector }],
});
reported.resolve();
return finish.promise;
},
{ id: "Architect" },
);
await reported.promise;
const session = { asyncJobManager: manager } as unknown as ToolSession;
const text = renderJobText({ jobs: snapshotJobs(session, manager.getAllJobs()) });
expect(text).toContain(selector);
expect(text.split(selector).length - 1).toBe(1);
finish.resolve("done");
await manager.getJob(id)?.promise;
});
it("hides a task job's resolved model selector when the badge setting is disabled", () => {
settings.override("task.showResolvedModelBadge", false);
const selector = "anthropic/claude-sonnet-4-20250514:high";