import { describe, expect, it } from 'vitest'; import { ClientAbortedError, InsufficientStorageError, PayloadTooLargeError, ValidationError, } from '../src/errors.js'; import { hidePartSuffix, normalizeStreamError } from '../src/lib/storage.js'; function withCode(code: string): Error { return Object.assign(new Error('boom'), { code }); } describe('hidePartSuffix', () => { it('retire le suffixe .mediadrop-part du message et de la pile', () => { const error = new Error("ENOENT: open '/data/videos/clip.mp4.mediadrop-part'"); const result = hidePartSuffix(error); expect(result).toBe(error); expect(result.message).toBe("ENOENT: open '/data/videos/clip.mp4'"); expect(result.stack).not.toContain('.mediadrop-part'); }); it('laisse intact un message sans suffixe', () => { expect(hidePartSuffix(new Error('autre')).message).toBe('autre'); }); }); describe('normalizeStreamError', () => { it('conserve les AppError telles quelles', () => { const error = new ValidationError('x'); expect(normalizeStreamError(error)).toBe(error); }); it('convertit le dépassement multipart en 413', () => { expect(normalizeStreamError(withCode('FST_REQ_FILE_TOO_LARGE'))).toBeInstanceOf( PayloadTooLargeError, ); }); it.each(['ECONNRESET', 'ECONNABORTED', 'ERR_STREAM_PREMATURE_CLOSE'])( 'convertit %s (client parti) en ClientAbortedError', (code) => { expect(normalizeStreamError(withCode(code))).toBeInstanceOf(ClientAbortedError); }, ); it('convertit ENOSPC en InsufficientStorageError (507)', () => { const result = normalizeStreamError(withCode('ENOSPC')); expect(result).toBeInstanceOf(InsufficientStorageError); expect((result as InsufficientStorageError).statusCode).toBe(507); }); it('laisse passer les autres erreurs et enveloppe les valeurs non-Error', () => { const other = withCode('EACCES'); expect(normalizeStreamError(other)).toBe(other); expect(normalizeStreamError('texte')).toBeInstanceOf(Error); }); });