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') }) })