Open History to see the last commit
1import { ProjectId, ThreadId, type DesktopAppActivationRequest } from "@t3tools/contracts";
2import { describe, expect, it, vi } from "vite-plus/test";
3
4import { DesktopAppActivationBroker } from "./DesktopAppActivationBroker.ts";
5
6const request: DesktopAppActivationRequest = {
7 version: 1,
8 requestId: "request-1",
9 type: "open-workspace",
10 workspaceRoot: "/workspace/project",
11 platform: "linux",
12};
13
14describe("DesktopAppActivationBroker", () => {
15 it("focuses immediately and waits for renderer readiness", async () => {
16 const activate = vi.fn();
17 const send = vi.fn();
18 const broker = new DesktopAppActivationBroker({ requestTimeoutMs: 1_000, activate });
19
20 const response = broker.request(request);
21 expect(activate).toHaveBeenCalledOnce();
22 expect(send).not.toHaveBeenCalled();
23
24 broker.registerRenderer(send);
25 expect(send).toHaveBeenCalledWith(request);
26 broker.complete({
27 version: 1,
28 requestId: request.requestId,
29 ok: true,
30 projectId: ProjectId.make("project-1"),
31 threadId: ThreadId.make("thread-1"),
32 });
33
34 await expect(response).resolves.toMatchObject({ ok: true, projectId: "project-1" });
35 broker.close();
36 });
37
38 it("fails an in-flight request when the renderer goes away", async () => {
39 const broker = new DesktopAppActivationBroker({ requestTimeoutMs: 1_000, activate: vi.fn() });
40 broker.registerRenderer(vi.fn());
41
42 const response = broker.request(request);
43 broker.clearRenderer();
44
45 await expect(response).resolves.toMatchObject({
46 ok: false,
47 code: "renderer-unavailable",
48 });
49 broker.close();
50 });
51
52 it("never sends a canceled request that was queued behind another request", async () => {
53 const send = vi.fn();
54 const broker = new DesktopAppActivationBroker({ requestTimeoutMs: 1_000, activate: vi.fn() });
55 broker.registerRenderer(send);
56 const secondRequest = { ...request, requestId: "request-2" };
57
58 const firstResponse = broker.request(request);
59 const secondResponse = broker.request(secondRequest);
60 expect(send).toHaveBeenCalledTimes(1);
61 expect(send).toHaveBeenLastCalledWith(request);
62
63 broker.cancel(secondRequest.requestId);
64 broker.complete({
65 version: 1,
66 requestId: request.requestId,
67 ok: true,
68 projectId: ProjectId.make("project-1"),
69 threadId: ThreadId.make("thread-1"),
70 });
71
72 await expect(firstResponse).resolves.toMatchObject({ ok: true });
73 await expect(secondResponse).resolves.toMatchObject({ ok: false });
74 expect(send).toHaveBeenCalledTimes(1);
75 broker.close();
76 });
77});