165 lines · 5.3 KB · TypeScript
RawDownload
import type { VcsStatusRemoteResult, VcsStatusResult } from "@t3tools/contracts";import { describe, expect, it } from "vite-plus/test"; import {  applyGitStatusStreamEvent,  buildTemporaryWorktreeBranchName,  isTemporaryWorktreeBranch,  normalizeGitRemoteUrl,  parseGitHubRepositoryNameWithOwnerFromRemoteUrl,  WORKTREE_BRANCH_PREFIX,} from "./git.ts"; describe("normalizeGitRemoteUrl", () => {  it("canonicalizes equivalent GitHub remotes across protocol variants", () => {    expect(normalizeGitRemoteUrl("git@github.com:T3Tools/T3Code.git")).toBe(      "github.com/t3tools/t3code",    );    expect(normalizeGitRemoteUrl("https://github.com/T3Tools/T3Code.git")).toBe(      "github.com/t3tools/t3code",    );    expect(normalizeGitRemoteUrl("ssh://git@github.com/T3Tools/T3Code")).toBe(      "github.com/t3tools/t3code",    );  });   it("preserves nested group paths for providers like GitLab", () => {    expect(normalizeGitRemoteUrl("git@gitlab.com:T3Tools/platform/T3Code.git")).toBe(      "gitlab.com/t3tools/platform/t3code",    );    expect(normalizeGitRemoteUrl("https://gitlab.com/T3Tools/platform/T3Code.git")).toBe(      "gitlab.com/t3tools/platform/t3code",    );  });   it("drops explicit ports from URL-shaped remotes", () => {    expect(normalizeGitRemoteUrl("https://gitlab.company.com:8443/team/project.git")).toBe(      "gitlab.company.com/team/project",    );    expect(normalizeGitRemoteUrl("ssh://git@gitlab.company.com:2222/team/project.git")).toBe(      "gitlab.company.com/team/project",    );  });}); describe("parseGitHubRepositoryNameWithOwnerFromRemoteUrl", () => {  it("extracts the owner and repository from common GitHub remote shapes", () => {    expect(      parseGitHubRepositoryNameWithOwnerFromRemoteUrl("git@github.com:T3Tools/T3Code.git"),    ).toBe("T3Tools/T3Code");    expect(      parseGitHubRepositoryNameWithOwnerFromRemoteUrl("https://github.com/T3Tools/T3Code.git"),    ).toBe("T3Tools/T3Code");  });}); describe("isTemporaryWorktreeBranch", () => {  it("matches the generated temporary worktree refName format", () => {    expect(      isTemporaryWorktreeBranch(        buildTemporaryWorktreeBranchName((byteLength) => {          expect(byteLength).toBe(4);          return "DEADBEEF";        }),      ),    ).toBe(true);  });   it("matches generated temporary worktree refs", () => {    expect(isTemporaryWorktreeBranch(`${WORKTREE_BRANCH_PREFIX}/deadbeef`)).toBe(true);    expect(isTemporaryWorktreeBranch(` ${WORKTREE_BRANCH_PREFIX}/deadbeef `)).toBe(true);    expect(isTemporaryWorktreeBranch(`${WORKTREE_BRANCH_PREFIX}/DEADBEEF`)).toBe(true);  });   it("normalizes a UUID-shaped random callback to the canonical 8-hex form", () => {    expect(buildTemporaryWorktreeBranchName(() => "f4ae4e0e-f971-4d48-b4f2-9cf0aa54ab12")).toBe(      `${WORKTREE_BRANCH_PREFIX}/f4ae4e0e`,    );  });   it("matches legacy UUID-shaped temporary worktree refs from older mobile builds", () => {    expect(      isTemporaryWorktreeBranch(`${WORKTREE_BRANCH_PREFIX}/f4ae4e0e-f971-4d48-b4f2-9cf0aa54ab12`),    ).toBe(true);  });   it("rejects UUID-shaped refs that are not RFC 4122 v4", () => {    // version nibble is not 4    expect(      isTemporaryWorktreeBranch(`${WORKTREE_BRANCH_PREFIX}/f4ae4e0e-f971-1d48-b4f2-9cf0aa54ab12`),    ).toBe(false);    // variant nibble is not [89ab]    expect(      isTemporaryWorktreeBranch(`${WORKTREE_BRANCH_PREFIX}/f4ae4e0e-f971-4d48-c4f2-9cf0aa54ab12`),    ).toBe(false);  });   it("rejects non-temporary refName names", () => {    expect(isTemporaryWorktreeBranch(`${WORKTREE_BRANCH_PREFIX}/feature/demo`)).toBe(false);    expect(isTemporaryWorktreeBranch("main")).toBe(false);    expect(isTemporaryWorktreeBranch(`${WORKTREE_BRANCH_PREFIX}/deadbeef-extra`)).toBe(false);  });}); describe("applyGitStatusStreamEvent", () => {  it("treats a remote-only update as a repository when local state is missing", () => {    const remote: VcsStatusRemoteResult = {      hasUpstream: true,      aheadCount: 2,      behindCount: 1,      pr: null,    };     expect(applyGitStatusStreamEvent(null, { _tag: "remoteUpdated", remote })).toEqual({      isRepo: true,      hasPrimaryRemote: false,      isDefaultRef: false,      refName: null,      hasWorkingTreeChanges: false,      workingTree: { files: [], insertions: 0, deletions: 0 },      hasUpstream: true,      aheadCount: 2,      behindCount: 1,      pr: null,    });  });   it("preserves local-only fields when applying a remote update", () => {    const current: VcsStatusResult = {      isRepo: true,      sourceControlProvider: {        kind: "github",        name: "GitHub",        baseUrl: "https://github.com",      },      hasPrimaryRemote: true,      isDefaultRef: false,      refName: "feature/demo",      hasWorkingTreeChanges: true,      workingTree: {        files: [{ path: "src/demo.ts", insertions: 1, deletions: 0 }],        insertions: 1,        deletions: 0,      },      hasUpstream: false,      aheadCount: 0,      behindCount: 0,      pr: null,    };     const remote: VcsStatusRemoteResult = {      hasUpstream: true,      aheadCount: 2,      behindCount: 1,      pr: null,    };     expect(applyGitStatusStreamEvent(current, { _tag: "remoteUpdated", remote })).toEqual({      ...current,      hasUpstream: true,      aheadCount: 2,      behindCount: 1,      pr: null,    });  });});