| 1 | import assert from "node:assert/strict"; |
| 2 | import { act } from "react"; |
| 3 | import { installDom, renderComposer } from "./composerInboxHarness"; |
| 4 | |
| 5 | const dom = installDom(); |
| 6 | const originalNow = Date.now; |
| 7 | const now = 426_000; |
| 8 | Date.now = () => now; |
| 9 | let quarters = 40; |
| 10 | const listeners = new Set<() => void>(); |
| 11 | const live = { id: "restored", text: "x".repeat(52_040), reasoning: "", reasoningComplete: false }; |
| 12 | const { root, rerender } = await renderComposer({ |
| 13 | running: true, tabId: "restored", turnStartAt: now - 425_000, |
| 14 | turnRateOutputQuarters: 0, turnModelActiveMs: 1_000, turnModelActiveAt: now, |
| 15 | liveStore: { |
| 16 | subscribe: (_tab, listener) => { listeners.add(listener); return () => { listeners.delete(listener); }; }, |
| 17 | getSnapshot: () => live, |
| 18 | getRateOutputQuarters: () => quarters, |
| 19 | }, |
| 20 | }); |
| 21 | const rate = () => document.querySelector(".composer-run-strip__metric--optional")?.textContent?.trim(); |
| 22 | try { |
| 23 | assert.equal(rate(), "10 t/s", "restored backlog does not inflate the visible rate"); |
| 24 | await act(async () => { quarters = 80; listeners.forEach(listener => listener()); }); |
| 25 | assert.equal(rate(), "20 t/s", "live-store samples update without a parent render"); |
| 26 | await act(async () => { (document.querySelector(".context-ring") as HTMLButtonElement).click(); }); |
| 27 | const ticker = document.querySelector(".context-ring-popover")?.textContent ?? ""; |
| 28 | assert.ok(ticker.includes("≈20 t/s"), ticker); |
| 29 | assert.ok(ticker.includes("13K"), "restored output remains in token totals"); |
| 30 | await rerender({ tabId: "other", liveStore: undefined, turnRateOutputQuarters: 0, turnModelActiveMs: 0 }); |
| 31 | assert.equal(rate(), undefined, "another session does not inherit the previous live sample"); |
| 32 | console.log("restored turn rate DOM: strip, popover, live updates and session isolation passed"); |
| 33 | } finally { |
| 34 | await act(async () => { root.unmount(); }); |
| 35 | Date.now = originalNow; |
| 36 | dom.window.close(); |
| 37 | } |
| 38 |