104 lines · 2.5 KB · TypeScript
RawDownload
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(<TValue>(_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,        },      ],    ]);  });});