mediaDrop/tests/stream-errors.test.ts
Nicolas f7a43a5a0c fix(logs): afficher le nom du fichier déposé plutôt que celui du .part
- les logs de requêtes d'upload fragmenté portent un champ `file`
- le suffixe .mediadrop-part est retiré des messages/piles d'erreur loggés
- le log de purge des sessions expirées indique aussi le fichier

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 07:58:04 +02:00

59 lines
2 KiB
TypeScript

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