Syntax previewClick to edit
1234
export default function sanitizeHrefUrl(input) {
throw new Error('Not implemented');
}
Syntax previewClick to edit
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
import sanitizeHrefUrl from './sanitizeHrefUrl';
describe('sanitizeHrefUrl', () => {
test('blocks dangerous schemes with mixed casing and outer spaces', () => {
expect(sanitizeHrefUrl('javascript:alert(1)')).toBe(null);
expect(sanitizeHrefUrl(' JaVaScRiPt:alert(1) ')).toBe(null);
expect(sanitizeHrefUrl('data:text/html,<svg onload=alert(1)>')).toBe(null);
expect(sanitizeHrefUrl('vbscript:msgbox(1)')).toBe(null);
});
test('rejects raw, encoded, and embedded ASCII controls', () => {
expect(sanitizeHrefUrl('\u0000 javascript:alert(1)')).toBe(null);
expect(sanitizeHrefUrl('java\u0000script:alert(1)')).toBe(null);
expect(sanitizeHrefUrl('\r\njavascript:alert(1)')).toBe(null);
expect(sanitizeHrefUrl('java%0Ascript:alert(1)')).toBe(null);
expect(sanitizeHrefUrl('/safe%1fpath')).toBe(null);
expect(sanitizeHrefUrl('https://example.com/%7F')).toBe(null);
expect(sanitizeHrefUrl('\t/settings')).toBe(null);
});
test('blocks protocol-relative URLs and every literal backslash', () => {
expect(sanitizeHrefUrl('//evil.com')).toBe(null);
expect(sanitizeHrefUrl(' //evil.com ')).toBe(null);
expect(sanitizeHrefUrl('\\\\evil.com')).toBe(null);
expect(sanitizeHrefUrl('/\\evil.com')).toBe(null);
expect(sanitizeHrefUrl('/safe\\segment')).toBe(null);
});
test('allows same-origin relative URLs, queries, and fragments', () => {
expect(sanitizeHrefUrl('/settings')).toBe('/settings');
expect(sanitizeHrefUrl('./settings')).toBe('./settings');
expect(sanitizeHrefUrl('../settings')).toBe('../settings');
expect(sanitizeHrefUrl('?q=test')).toBe('?q=test');
expect(sanitizeHrefUrl('#section')).toBe('#section');
expect(sanitizeHrefUrl('profile')).toBe('profile');
});
test('allows and normalizes the documented explicit schemes', () => {
expect(sanitizeHrefUrl(' https://example.com ')).toBe('https://example.com/');
expect(sanitizeHrefUrl('HTTP://EXAMPLE.COM')).toBe('http://example.com/');
expect(sanitizeHrefUrl('https://example.com/path')).toBe('https://example.com/path');
expect(sanitizeHrefUrl('mailto:hi@example.com')).toBe('mailto:hi@example.com');
expect(sanitizeHrefUrl('tel:+15551234567')).toBe('tel:+15551234567');
});
test('returns null for empty or malformed input', () => {
expect(sanitizeHrefUrl('')).toBe(null);
expect(sanitizeHrefUrl(' ')).toBe(null);
expect(sanitizeHrefUrl('https://')).toBe(null);
});
});
Run tests to see results.