From a312408ee2c35c9380f7b6bea204206136c2a4d8 Mon Sep 17 00:00:00 2001 From: Rin Date: Sun, 3 May 2026 19:45:02 +0700 Subject: [PATCH] test: add unit tests for parseRepoNameFromUrl and sanitizeRepoName in git.test.ts --- gitnexus/test/unit/git.test.ts | 42 +++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/gitnexus/test/unit/git.test.ts b/gitnexus/test/unit/git.test.ts index 1e13facda..36d8a03a4 100644 --- a/gitnexus/test/unit/git.test.ts +++ b/gitnexus/test/unit/git.test.ts @@ -1,6 +1,12 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { execSync } from 'child_process'; -import { isGitRepo, getCurrentCommit, getGitRoot } from '../../src/storage/git.js'; +import { + isGitRepo, + getCurrentCommit, + getGitRoot, + parseRepoNameFromUrl, + sanitizeRepoName, +} from '../../src/storage/git.js'; // Mock child_process.execSync vi.mock('child_process', () => ({ @@ -92,4 +98,38 @@ describe('git utilities', () => { expect(result!.trim()).toBe(result); }); }); + + describe('sanitizeRepoName', () => { + it('strips leading dashes', () => { + expect(sanitizeRepoName('--repo')).toBe('repo'); + }); + + it('replaces unsafe characters with underscores', () => { + expect(sanitizeRepoName('repo')).toBe('repo_tag_'); + expect(sanitizeRepoName('repo:name')).toBe('repo_name'); + expect(sanitizeRepoName('repo"quoted"')).toBe('repo_quoted_'); + }); + + it('returns unknown for empty or invalid input', () => { + expect(sanitizeRepoName('')).toBe('unknown'); + expect(sanitizeRepoName('---')).toBe('unknown'); + }); + }); + + describe('parseRepoNameFromUrl', () => { + it('extracts and sanitizes name from HTTPS URL', () => { + expect(parseRepoNameFromUrl('https://github.com/user/my-repo.git')).toBe('my-repo'); + expect(parseRepoNameFromUrl('https://github.com/user/--payload.git')).toBe('payload'); + }); + + it('extracts and sanitizes name from SSH URL', () => { + expect(parseRepoNameFromUrl('git@github.com:user/my-repo.git')).toBe('my-repo'); + expect(parseRepoNameFromUrl('git@github.com:--payload.git')).toBe('payload'); + }); + + it('returns null for empty URL', () => { + expect(parseRepoNameFromUrl('')).toBeNull(); + expect(parseRepoNameFromUrl(null)).toBeNull(); + }); + }); });