From 871eaa389dee8096d2b76b4b9dae09459c4ca7e0 Mon Sep 17 00:00:00 2001 From: roboomp Date: Wed, 15 Jul 2026 14:03:18 +0000 Subject: [PATCH] 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 --- .../test/job-model-badge-renderer.test.ts | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/coding-agent/test/job-model-badge-renderer.test.ts b/packages/coding-agent/test/job-model-badge-renderer.test.ts index 932054808..8826dd5a0 100644 --- a/packages/coding-agent/test/job-model-badge-renderer.test.ts +++ b/packages/coding-agent/test/job-model-badge-renderer.test.ts @@ -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(); + const finish = Promise.withResolvers(); + 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";