返回 DeepSeek-Reasonix
bridge-breadcrumbs.test.ts
根目录 / desktop / frontend / src / __tests__ / bridge-breadcrumbs.test.ts
1 // Run: tsx src/__tests__/bridge-breadcrumbs.test.ts
2
3 import { snapshotBreadcrumbs } from "../lib/breadcrumbs";
4 import { app } from "../lib/bridge";
5
6 let passed = 0;
7 let failed = 0;
8
9 function ok(value: boolean, label: string) {
10 if (value) {
11 process.stdout.write(` PASS ${label}\n`);
12 passed += 1;
13 } else {
14 process.stdout.write(` FAIL ${label}\n`);
15 failed += 1;
16 }
17 }
18
19 function ensureWindow() {
20 if (typeof window === "undefined") {
21 (globalThis as Record<string, unknown>).window = {} as Window & typeof globalThis;
22 }
23 }
24
25 function newBreadcrumbMessages(since: number, cat: string): string[] {
26 return snapshotBreadcrumbs()
27 .slice(since)
28 .filter((crumb) => crumb.cat === cat)
29 .map((crumb) => crumb.msg);
30 }
31
32 console.log("\nbridge breadcrumbs");
33
34 const previousPerformance = (globalThis as { performance?: Performance }).performance;
35 let now = 0;
36 (globalThis as Record<string, unknown>).performance = { now: () => now };
37
38 ensureWindow();
39 const previousGo = window.go;
40 window.go = {
41 main: {
42 App: {
43 async IsMainWindowMaximised() {
44 now = 42;
45 return true;
46 },
47 async CheckUpdate() {
48 now = 125;
49 throw new Error("offline");
50 },
51 } as never,
52 },
53 };
54
55 const successStart = snapshotBreadcrumbs().length;
56 now = 10;
57 await app.IsMainWindowMaximised();
58 const successBridge = newBreadcrumbMessages(successStart, "bridge");
59 ok(
60 successBridge.includes("window IsMainWindowMaximised") &&
61 successBridge.includes("window IsMainWindowMaximised done ms=32"),
62 "records bridge start and completion timing breadcrumbs",
63 );
64
65 const errorStart = snapshotBreadcrumbs().length;
66 now = 100;
67 try {
68 await app.CheckUpdate("");
69 } catch {
70 // Expected: this branch verifies the breadcrumb emitted by the proxy rejection path.
71 }
72 const errorBridge = newBreadcrumbMessages(errorStart, "bridge");
73 const bridgeErrors = newBreadcrumbMessages(errorStart, "bridge.error");
74 ok(errorBridge.includes("update CheckUpdate"), "records bridge start breadcrumb before failed calls");
75 ok(bridgeErrors.includes("CheckUpdate ms=25"), "records bridge failure timing breadcrumbs");
76
77 window.go = previousGo;
78 if (previousPerformance) {
79 (globalThis as Record<string, unknown>).performance = previousPerformance;
80 } else {
81 delete (globalThis as { performance?: Performance }).performance;
82 }
83
84 console.log(`\n${passed} passed, ${failed} failed`);
85 if (failed > 0) process.exit(1);
86
86 lines TYPESCRIPT