- 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>
59 lines
2 KiB
TypeScript
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);
|
|
});
|
|
});
|