92 lines
3.0 KiB
TypeScript
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');
|
|
});
|
|
});
|