109 lines
3.8 KiB
TypeScript
109 lines
3.8 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { parseGitRemote, parseGitHubRepository } from "../detectRepository";
|
|
|
|
describe("parseGitRemote", () => {
|
|
// HTTPS
|
|
test("parses HTTPS URL: https://github.com/owner/repo.git", () => {
|
|
const result = parseGitRemote("https://github.com/owner/repo.git");
|
|
expect(result).toEqual({ host: "github.com", owner: "owner", name: "repo" });
|
|
});
|
|
|
|
test("parses HTTPS URL without .git suffix", () => {
|
|
const result = parseGitRemote("https://github.com/owner/repo");
|
|
expect(result).toEqual({ host: "github.com", owner: "owner", name: "repo" });
|
|
});
|
|
|
|
test("parses HTTPS URL with subdirectory path (only takes first 2 segments)", () => {
|
|
const result = parseGitRemote("https://github.com/owner/repo.git");
|
|
expect(result).not.toBeNull();
|
|
expect(result!.name).toBe("repo");
|
|
});
|
|
|
|
// SSH
|
|
test("parses SSH URL: git@github.com:owner/repo.git", () => {
|
|
const result = parseGitRemote("git@github.com:owner/repo.git");
|
|
expect(result).toEqual({ host: "github.com", owner: "owner", name: "repo" });
|
|
});
|
|
|
|
test("parses SSH URL without .git suffix", () => {
|
|
const result = parseGitRemote("git@github.com:owner/repo");
|
|
expect(result).toEqual({ host: "github.com", owner: "owner", name: "repo" });
|
|
});
|
|
|
|
// ssh://
|
|
test("parses ssh:// URL: ssh://git@github.com/owner/repo.git", () => {
|
|
const result = parseGitRemote("ssh://git@github.com/owner/repo.git");
|
|
expect(result).toEqual({ host: "github.com", owner: "owner", name: "repo" });
|
|
});
|
|
|
|
// git://
|
|
test("parses git:// URL", () => {
|
|
const result = parseGitRemote("git://github.com/owner/repo.git");
|
|
expect(result).toEqual({ host: "github.com", owner: "owner", name: "repo" });
|
|
});
|
|
|
|
// Boundary
|
|
test("returns null for invalid URL", () => {
|
|
expect(parseGitRemote("not-a-url")).toBeNull();
|
|
});
|
|
|
|
test("returns null for empty string", () => {
|
|
expect(parseGitRemote("")).toBeNull();
|
|
});
|
|
|
|
test("handles GHE hostname", () => {
|
|
const result = parseGitRemote("https://ghe.corp.com/team/project.git");
|
|
expect(result).toEqual({ host: "ghe.corp.com", owner: "team", name: "project" });
|
|
});
|
|
|
|
test("handles port number in URL", () => {
|
|
const result = parseGitRemote("https://github.com:443/owner/repo.git");
|
|
expect(result).not.toBeNull();
|
|
expect(result!.owner).toBe("owner");
|
|
expect(result!.name).toBe("repo");
|
|
});
|
|
|
|
test("rejects SSH config alias without real hostname", () => {
|
|
expect(parseGitRemote("git@github.com-work:owner/repo.git")).toBeNull();
|
|
});
|
|
|
|
test("handles repo names with dots", () => {
|
|
const result = parseGitRemote("https://github.com/owner/cc.kurs.web.git");
|
|
expect(result).toEqual({ host: "github.com", owner: "owner", name: "cc.kurs.web" });
|
|
});
|
|
});
|
|
|
|
describe("parseGitHubRepository", () => {
|
|
test("extracts 'owner/repo' from valid remote URL", () => {
|
|
expect(parseGitHubRepository("https://github.com/owner/repo.git")).toBe("owner/repo");
|
|
});
|
|
|
|
test("handles plain 'owner/repo' string input", () => {
|
|
expect(parseGitHubRepository("owner/repo")).toBe("owner/repo");
|
|
});
|
|
|
|
test("returns null for non-GitHub host", () => {
|
|
expect(parseGitHubRepository("https://gitlab.com/owner/repo.git")).toBeNull();
|
|
});
|
|
|
|
test("returns null for invalid input", () => {
|
|
expect(parseGitHubRepository("not-valid")).toBeNull();
|
|
});
|
|
|
|
test("is case-sensitive for owner/repo", () => {
|
|
expect(parseGitHubRepository("Owner/Repo")).toBe("Owner/Repo");
|
|
});
|
|
|
|
test("handles SSH format for github.com", () => {
|
|
expect(parseGitHubRepository("git@github.com:owner/repo.git")).toBe("owner/repo");
|
|
});
|
|
|
|
test("returns null for GHE SSH URL", () => {
|
|
expect(parseGitHubRepository("git@ghe.corp.com:owner/repo.git")).toBeNull();
|
|
});
|
|
|
|
test("handles plain owner/repo with .git suffix", () => {
|
|
expect(parseGitHubRepository("owner/repo.git")).toBe("owner/repo");
|
|
});
|
|
});
|