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/