import { describe, it, expect } from 'vitest'; import { DEFAULT_PROJECT_URL_WHITELIST, BASE_NAVIGATE_HOSTS, escapeDomain, buildNavigateWhitelistPatterns, buildWebFetchWhitelistPatterns, buildCommitMessageUrlPattern, } from './url-whitelist-rules.mjs'; describe('escapeDomain', () => { it('escapes dots, leaves slash literal', () => { expect(escapeDomain('liderra.ru')).toBe('liderra\\.ru'); expect(escapeDomain('github.com/liderra')).toBe('github\\.com/liderra'); expect(escapeDomain('127.0.0.1')).toBe('127\\.0\\.0\\.1'); }); }); describe('buildNavigateWhitelistPatterns', () => { it('default project → byte-identical to current navigate pattern', () => { expect(buildNavigateWhitelistPatterns(['liderra.ru'])).toEqual([ '^https?://(?:localhost|127\\.0\\.0\\.1|liderra\\.ru)(?:[:/?#]|$)']); }); it('drops path-qualified domains; empty → base only (fail-CLOSED)', () => { expect(buildNavigateWhitelistPatterns(['github.com/liderra'])).toEqual([ '^https?://(?:localhost|127\\.0\\.0\\.1)(?:[:/?#]|$)']); expect(buildNavigateWhitelistPatterns([])).toEqual([ '^https?://(?:localhost|127\\.0\\.0\\.1)(?:[:/?#]|$)']); }); }); describe('buildWebFetchWhitelistPatterns', () => { it('appends project domains, keeps base; empty → base only', () => { const r = buildWebFetchWhitelistPatterns(['liderra.ru', 'github.com/liderra']); expect(r).toContain('^https?://liderra\\.ru/'); expect(r).toContain('^https?://github\\.com/liderra/'); expect(r).toContain('^https?://docs\\.anthropic\\.com/'); expect(buildWebFetchWhitelistPatterns([]).some((p) => /liderra/.test(p))).toBe(false); }); }); describe('buildCommitMessageUrlPattern', () => { it('default: liderra/anthropic allowed, external blocked', () => { const re = buildCommitMessageUrlPattern(['liderra.ru', 'github.com/liderra']); expect(re.test('see https://liderra.ru/x')).toBe(false); expect(re.test('see https://docs.anthropic.com/x')).toBe(false); expect(re.test('see http://evil.example.com/p')).toBe(true); }); it('empty → liderra blocked (fail-CLOSED), anthropic ok', () => { const re = buildCommitMessageUrlPattern([]); expect(re.test('see https://liderra.ru/x')).toBe(true); expect(re.test('see https://docs.anthropic.com/x')).toBe(false); }); it('flags subdomain-suffix spoof of a whitelisted host (anchor)', () => { const re = buildCommitMessageUrlPattern(['liderra.ru', 'github.com/liderra']); expect(re.test('see https://liderra.ru.evil.com/x')).toBe(true); expect(re.test('see https://github.com/liderra-evil/x')).toBe(true); expect(re.test('see https://liderra.ru/admin')).toBe(false); }); }); describe('defaults', () => { it('expected values', () => { expect(DEFAULT_PROJECT_URL_WHITELIST).toEqual(['liderra.ru', 'github.com/liderra']); expect(BASE_NAVIGATE_HOSTS).toEqual(['localhost', '127.0.0.1']); }); });