186 lines
5.3 KiB
TypeScript
186 lines
5.3 KiB
TypeScript
import { parseProviderSource, generateCacheKey, isGitHubSource } from './provider-url-parser';
|
|
|
|
describe('provider-url-parser', () => {
|
|
describe('parseProviderSource', () => {
|
|
it('parses HTTPS GitHub URLs correctly', () => {
|
|
const result = parseProviderSource('https://github.com/user/repo');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'main',
|
|
path: '',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses HTTPS GitHub URLs with branch', () => {
|
|
const result = parseProviderSource('https://github.com/user/repo/tree/develop');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'develop',
|
|
path: '',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses HTTPS GitHub URLs with path', () => {
|
|
const result = parseProviderSource('https://github.com/user/repo/tree/main/src/providers');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'main',
|
|
path: 'src/providers',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses GitHub URLs with .git extension', () => {
|
|
const result = parseProviderSource('https://github.com/user/repo.git');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'main',
|
|
path: '',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses SSH GitHub URLs', () => {
|
|
const result = parseProviderSource('git@github.com:user/repo.git');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'main',
|
|
path: '',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses shorthand GitHub references', () => {
|
|
const result = parseProviderSource('user/repo');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'main',
|
|
path: '',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses shorthand GitHub references with branch', () => {
|
|
const result = parseProviderSource('user/repo@develop');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'develop',
|
|
path: '',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses shorthand GitHub references with path', () => {
|
|
const result = parseProviderSource('user/repo@main/src/providers');
|
|
expect(result).toEqual({
|
|
type: 'github',
|
|
owner: 'user',
|
|
repo: 'repo',
|
|
branch: 'main',
|
|
path: 'src/providers',
|
|
url: 'https://github.com/user/repo',
|
|
});
|
|
});
|
|
|
|
it('parses local relative paths', () => {
|
|
const result = parseProviderSource('./my-provider');
|
|
expect(result).toEqual({
|
|
type: 'local',
|
|
path: './my-provider',
|
|
});
|
|
});
|
|
|
|
it('parses local absolute paths', () => {
|
|
const result = parseProviderSource('/path/to/provider');
|
|
expect(result).toEqual({
|
|
type: 'local',
|
|
path: '/path/to/provider',
|
|
});
|
|
});
|
|
|
|
it('parses Windows paths', () => {
|
|
const result = parseProviderSource('C:\\path\\to\\provider');
|
|
expect(result).toEqual({
|
|
type: 'local',
|
|
path: 'C:\\path\\to\\provider',
|
|
});
|
|
});
|
|
|
|
it('parses NPM package names', () => {
|
|
const result = parseProviderSource('my-provider-package');
|
|
expect(result).toEqual({
|
|
type: 'npm',
|
|
packageName: 'my-provider-package',
|
|
});
|
|
});
|
|
|
|
it('parses scoped NPM package names', () => {
|
|
const result = parseProviderSource('@scope/my-provider');
|
|
expect(result).toEqual({
|
|
type: 'npm',
|
|
packageName: '@scope/my-provider',
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('generateCacheKey', () => {
|
|
it('generates valid cache keys for GitHub URLs', () => {
|
|
const urlInfo = {
|
|
type: 'github' as const,
|
|
owner: 'user',
|
|
repo: 'my-repo',
|
|
branch: 'develop',
|
|
url: 'https://github.com/user/my-repo',
|
|
};
|
|
|
|
const key = generateCacheKey(urlInfo);
|
|
expect(key).toBe('github_user_my-repo_develop');
|
|
});
|
|
|
|
it('handles special characters in cache keys', () => {
|
|
const urlInfo = {
|
|
type: 'github' as const,
|
|
owner: 'user-name',
|
|
repo: 'my.repo',
|
|
branch: 'feature/branch',
|
|
url: 'https://github.com/user-name/my.repo',
|
|
};
|
|
|
|
const key = generateCacheKey(urlInfo);
|
|
expect(key).toBe('github_user-name_my_repo_feature_branch');
|
|
});
|
|
});
|
|
|
|
describe('isGitHubSource', () => {
|
|
it('identifies GitHub URLs correctly', () => {
|
|
expect(isGitHubSource('https://github.com/user/repo')).toBe(true);
|
|
expect(isGitHubSource('git@github.com:user/repo.git')).toBe(true);
|
|
expect(isGitHubSource('user/repo')).toBe(true);
|
|
expect(isGitHubSource('user/repo@develop')).toBe(true);
|
|
});
|
|
|
|
it('identifies non-GitHub sources correctly', () => {
|
|
expect(isGitHubSource('./local-provider')).toBe(false);
|
|
expect(isGitHubSource('/absolute/path')).toBe(false);
|
|
expect(isGitHubSource('npm-package')).toBe(false);
|
|
expect(isGitHubSource('@scope/package')).toBe(false);
|
|
});
|
|
});
|
|
});
|