import { writeFileSync } from 'fs'; /** * Crée un fichier MP3 simulé pour les tests * Utilise un buffer MP3 valide (frame MP3 avec silence) pour que le backend * puisse extraire les métadonnées (durée, etc.) sans bloquer */ export function createMockMP3File(filePath: string): void { // Petit buffer représentant une frame MP3 valide (silence) // Ce buffer contient des headers MP3 valides et des métadonnées ID3 // qui permettront au backend d'extraire les informations nécessaires const validMp3Buffer = Buffer.from( '//OEAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAEAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD//OEAAAAAAAAAAAAAAAAAAAAAAAATGF2YzU4LjU0AAAAAAAAAAAAAAAAJAAAAAAAAAAAASAAAAAAAASAAAAAAA//OEAAAAAAAAAAAAAAAAAAAAAAAALAAA', 'base64', ); writeFileSync(filePath, validMp3Buffer); } /** * Crée un buffer MP3 valide pour les tests d'upload * Utilisé avec setInputFiles() dans Playwright */ export function createMockMP3Buffer(): Buffer { // Buffer MP3 valide minimal (Header ID3 + Frame Silence) return Buffer.from( '4944330300000000000a544954320000000500000054657374fffb90440000000000000000000000000000000000000000', 'hex', ); } /** * Crée un fichier MP3 plus volumineux pour tester le chunked upload * @param filePath - Chemin où créer le fichier * @param sizeInMB - Taille du fichier en MB (défaut: 15 MB) */ export function createLargeMockMP3File(filePath: string, sizeInMB: number = 15): void { const sizeInBytes = sizeInMB * 1024 * 1024; const baseBuffer = createMockMP3Buffer(); // Répéter le buffer pour atteindre la taille désirée const chunks = Math.ceil(sizeInBytes / baseBuffer.length); const buffers: Buffer[] = []; for (let i = 0; i < chunks; i++) { buffers.push(baseBuffer); } const largeBuffer = Buffer.concat(buffers).slice(0, sizeInBytes); writeFileSync(filePath, largeBuffer); } /** * Crée un buffer MP3 large pour les tests d'upload chunké (in-memory) * Utilisé avec setInputFiles() dans Playwright pour les gros fichiers * * @param sizeInMB - Taille du fichier en MB (défaut: 15 MB) * @returns Buffer - Buffer MP3 valide de la taille spécifiée * * @example * const largeBuffer = createLargeMockMP3Buffer(20); // 20 MB * await fileInput.setInputFiles({ * name: 'large-track.mp3', * mimeType: 'audio/mpeg', * buffer: largeBuffer, * }); */ export function createLargeMockMP3Buffer(sizeInMB: number = 15): Buffer { const sizeInBytes = sizeInMB * 1024 * 1024; const baseBuffer = createMockMP3Buffer(); // Répéter le buffer pour atteindre la taille désirée const chunks = Math.ceil(sizeInBytes / baseBuffer.length); const buffers: Buffer[] = []; for (let i = 0; i < chunks; i++) { buffers.push(baseBuffer); } const largeBuffer = Buffer.concat(buffers).slice(0, sizeInBytes); return largeBuffer; } /** * Formats de fichiers audio supportés pour les tests */ export const SUPPORTED_AUDIO_FORMATS = { mp3: { mimeType: 'audio/mpeg', extension: '.mp3', }, flac: { mimeType: 'audio/flac', extension: '.flac', }, wav: { mimeType: 'audio/wav', extension: '.wav', }, ogg: { mimeType: 'audio/ogg', extension: '.ogg', }, m4a: { mimeType: 'audio/mp4', extension: '.m4a', }, aac: { mimeType: 'audio/aac', extension: '.aac', }, } as const;