geocrop-platform./apps/nextgen/server/tests/validate-url.test.js

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);
});
});