apiyt2jellyfin/src/utils/validators.test.ts
2026-02-25 22:54:49 +01:00

92 lines
3.0 KiB
TypeScript

import { describe, test, expect } from 'bun:test';
import { validateYoutubeUrl, validateFormat, sanitizeFilename } from './validators';
describe('validateYoutubeUrl', () => {
test('accepte les URLs YouTube valides', () => {
const validUrls = [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'https://youtube.com/watch?v=dQw4w9WgXcQ',
'http://www.youtube.com/watch?v=dQw4w9WgXcQ',
'https://youtu.be/dQw4w9WgXcQ',
'https://www.youtube.com/shorts/abc123',
'youtube.com/watch?v=dQw4w9WgXcQ',
];
validUrls.forEach((url) => {
const result = validateYoutubeUrl(url);
expect(result.isValid).toBe(true);
});
});
test('rejette les URLs non-YouTube', () => {
const invalidUrls = [
'https://vimeo.com/123456',
'https://google.com',
'not a url',
'',
'ftp://youtube.com/watch?v=123',
];
invalidUrls.forEach((url) => {
const result = validateYoutubeUrl(url);
expect(result.isValid).toBe(false);
});
});
test('rejette les URLs avec caractères dangereux', () => {
const dangerousUrls = [
'https://youtube.com/watch?v=123; rm -rf /',
'https://youtube.com/watch?v=123 | cat /etc/passwd',
'https://youtube.com/watch?v=123`whoami`',
'https://youtube.com/watch?v=123$USER',
'https://youtube.com/watch?v=123 && echo hacked',
];
dangerousUrls.forEach((url) => {
const result = validateYoutubeUrl(url);
expect(result.isValid).toBe(false);
});
});
});
describe('validateFormat', () => {
test('accepte les formats valides', () => {
expect(validateFormat('mp3').isValid).toBe(true);
expect(validateFormat('flac').isValid).toBe(true);
});
test('rejette les formats invalides', () => {
expect(validateFormat('wav').isValid).toBe(false);
expect(validateFormat('ogg').isValid).toBe(false);
expect(validateFormat('').isValid).toBe(false);
expect(validateFormat(null).isValid).toBe(false);
expect(validateFormat(123).isValid).toBe(false);
});
});
describe('sanitizeFilename', () => {
test('supprime les caractères dangereux', () => {
expect(sanitizeFilename('test<>file')).toBe('testfile');
expect(sanitizeFilename('test:file')).toBe('testfile');
expect(sanitizeFilename('test/file')).toBe('testfile');
expect(sanitizeFilename('test\\file')).toBe('testfile');
expect(sanitizeFilename('test|file')).toBe('testfile');
expect(sanitizeFilename('test?file')).toBe('testfile');
expect(sanitizeFilename('test*file')).toBe('testfile');
});
test('remplace les espaces par des underscores', () => {
expect(sanitizeFilename('my song name')).toBe('my_song_name');
expect(sanitizeFilename('song with spaces')).toBe('song_with_spaces');
});
test('limite la longueur à 255 caractères', () => {
const longName = 'a'.repeat(300);
expect(sanitizeFilename(longName).length).toBe(255);
});
test('gère les points multiples', () => {
expect(sanitizeFilename('file...name')).toBe('file.name');
});
});