import type { GitStatusLocalResult, GitStatusRemoteResult, GitStatusStreamEvent, } from "@t3tools/contracts"; import { describe, expect, it, vi } from "vitest"; vi.mock("./wsTransport", () => ({ WsTransport: class WsTransport { dispose = vi.fn(async () => undefined); reconnect = vi.fn(async () => undefined); request = vi.fn(); requestStream = vi.fn(); subscribe = vi.fn(() => () => undefined); }, })); import { createWsRpcClient } from "./wsRpcClient"; import { type WsTransport } from "./wsTransport"; const baseLocalStatus: GitStatusLocalResult = { isRepo: true, hasOriginRemote: true, isDefaultBranch: false, branch: "feature/demo", hasWorkingTreeChanges: false, workingTree: { files: [], insertions: 0, deletions: 0 }, }; const baseRemoteStatus: GitStatusRemoteResult = { hasUpstream: true, aheadCount: 0, behindCount: 0, pr: null, }; describe("wsRpcClient", () => { it("reduces git status stream events into flat status snapshots", () => { const subscribe = vi.fn((_connect: unknown, listener: (value: TValue) => void) => { for (const event of [ { _tag: "snapshot", local: baseLocalStatus, remote: null, }, { _tag: "remoteUpdated", remote: baseRemoteStatus, }, { _tag: "localUpdated", local: { ...baseLocalStatus, hasWorkingTreeChanges: true, }, }, ] satisfies GitStatusStreamEvent[]) { listener(event as TValue); } return () => undefined; }); const transport = { dispose: vi.fn(async () => undefined), reconnect: vi.fn(async () => undefined), request: vi.fn(), requestStream: vi.fn(), subscribe, } satisfies Pick< WsTransport, "dispose" | "reconnect" | "request" | "requestStream" | "subscribe" >; const client = createWsRpcClient(transport as unknown as WsTransport); const listener = vi.fn(); client.git.onStatus({ cwd: "/repo" }, listener); expect(listener.mock.calls).toEqual([ [ { ...baseLocalStatus, hasUpstream: false, aheadCount: 0, behindCount: 0, pr: null, }, ], [ { ...baseLocalStatus, ...baseRemoteStatus, }, ], [ { ...baseLocalStatus, ...baseRemoteStatus, hasWorkingTreeChanges: true, }, ], ]); }); });