import { describe, it, expect } from 'vitest'; import { isSafeUrl, sanitizeUrl } from '../../utils/url-safety'; describe('isSafeUrl', () => { it('accepts http and https URLs', () => { expect(isSafeUrl('https://example.com')).toBe(true); expect(isSafeUrl('http://example.com')).toBe(true); expect(isSafeUrl('https://example.com/path?q=1')).toBe(true); }); it('accepts mailto and tel URLs', () => { expect(isSafeUrl('mailto:foo@example.org')).toBe(true); expect(isSafeUrl('tel:+15551234567')).toBe(true); }); it('accepts same-document and relative URLs', () => { expect(isSafeUrl('#anchor')).toBe(true); expect(isSafeUrl('/page')).toBe(true); expect(isSafeUrl('./page')).toBe(true); expect(isSafeUrl('../page')).toBe(true); }); it('rejects javascript: URLs', () => { expect(isSafeUrl('javascript:alert(1)')).toBe(false); expect(isSafeUrl('javascript:/* */alert(1)')).toBe(false); }); it('rejects data: URLs', () => { expect(isSafeUrl('data:text/html,')).toBe(false); expect(isSafeUrl('data:image/png;base64,AAA')).toBe(false); }); it('rejects file: URLs', () => { expect(isSafeUrl('file:///etc/passwd')).toBe(false); }); it('rejects URLs with whitespace, angle brackets, or quotes', () => { expect(isSafeUrl('https://example.com/ foo')).toBe(false); expect(isSafeUrl('https://example.com/