67 lines
2.3 KiB
JavaScript
67 lines
2.3 KiB
JavaScript
// Unit tests for validateUrl.normalizeHttpUrl / isSafeHttpUrl.
|
|
// Used by P1-UX-3 to gate lesson_plans.meet_url and .classroom_url.
|
|
|
|
const { isSafeHttpUrl, normalizeHttpUrl } = require('../src/utils/validateUrl');
|
|
|
|
describe('isSafeHttpUrl', () => {
|
|
it('treats null/undefined/empty as valid (means "no link")', () => {
|
|
expect(isSafeHttpUrl(null)).toBe(true);
|
|
expect(isSafeHttpUrl(undefined)).toBe(true);
|
|
expect(isSafeHttpUrl('')).toBe(true);
|
|
});
|
|
|
|
it('rejects non-string values', () => {
|
|
expect(isSafeHttpUrl(42)).toBe(false);
|
|
expect(isSafeHttpUrl({})).toBe(false);
|
|
expect(isSafeHttpUrl([])).toBe(false);
|
|
expect(isSafeHttpUrl(true)).toBe(false);
|
|
});
|
|
|
|
it('accepts http and https URLs', () => {
|
|
expect(isSafeHttpUrl('http://meet.example.com/abc')).toBe(true);
|
|
expect(isSafeHttpUrl('https://meet.google.com/abc-defg-hij')).toBe(true);
|
|
expect(isSafeHttpUrl('https://classroom.google.com/c/12345')).toBe(true);
|
|
});
|
|
|
|
it('rejects non-http schemes', () => {
|
|
expect(isSafeHttpUrl('javascript:alert(1)')).toBe(false);
|
|
expect(isSafeHttpUrl('ftp://files.example.com')).toBe(false);
|
|
expect(isSafeHttpUrl('file:///etc/passwd')).toBe(false);
|
|
expect(isSafeHttpUrl('data:text/plain;base64,QQ==')).toBe(false);
|
|
});
|
|
|
|
it('rejects unparseable strings', () => {
|
|
expect(isSafeHttpUrl('not a url')).toBe(false);
|
|
expect(isSafeHttpUrl('://no-scheme')).toBe(false);
|
|
expect(isSafeHttpUrl('http://')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('normalizeHttpUrl', () => {
|
|
it('returns null for null/undefined', () => {
|
|
expect(normalizeHttpUrl(null)).toBe(null);
|
|
expect(normalizeHttpUrl(undefined)).toBe(null);
|
|
});
|
|
|
|
it('returns null for empty / whitespace-only strings', () => {
|
|
expect(normalizeHttpUrl('')).toBe(null);
|
|
expect(normalizeHttpUrl(' ')).toBe(null);
|
|
});
|
|
|
|
it('trims a valid URL and returns it', () => {
|
|
expect(normalizeHttpUrl(' https://meet.google.com/abc ')).toBe(
|
|
'https://meet.google.com/abc'
|
|
);
|
|
});
|
|
|
|
it('returns null (NOT the original input) for invalid URLs', () => {
|
|
expect(normalizeHttpUrl('javascript:alert(1)')).toBe(null);
|
|
expect(normalizeHttpUrl('not a url')).toBe(null);
|
|
});
|
|
|
|
it('returns null for non-string values', () => {
|
|
expect(normalizeHttpUrl(123)).toBe(null);
|
|
expect(normalizeHttpUrl({})).toBe(null);
|
|
});
|
|
});
|