返回 DeepSeek-Reasonix
restored-turn-rate-dom.test.tsx
根目录 / desktop / frontend / src / __tests__ / restored-turn-rate-dom.test.tsx
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
38 lines Plain Text