import { describe, expect, it } from 'vitest'; import { BridgeError, errors } from '../../src/lib/errors.js'; describe('BridgeError', () => { it('toJSON serialise code + message + details', () => { const err = new BridgeError('VALIDATION_ERROR', 400, 'invalid', { field: 'x' }); expect(err.toJSON()).toEqual({ error: { code: 'VALIDATION_ERROR', message: 'invalid', details: { field: 'x' } }, }); }); it('toJSON sans details : pas de cle details', () => { const err = new BridgeError('NOT_FOUND', 404, 'gone'); expect(err.toJSON()).toEqual({ error: { code: 'NOT_FOUND', message: 'gone' } }); }); it('preserve name = BridgeError', () => { const err = new BridgeError('INTERNAL', 500, 'x'); expect(err.name).toBe('BridgeError'); }); }); describe('errors helpers', () => { it('authRequired', () => { const e = errors.authRequired(); expect(e.code).toBe('AUTH_REQUIRED'); expect(e.status).toBe(401); }); it('authInvalid', () => { expect(errors.authInvalid().status).toBe(401); }); it('forbidden inclut le scope dans details', () => { const e = errors.forbidden('admin:write'); expect(e.code).toBe('FORBIDDEN_SCOPE'); expect(e.status).toBe(403); expect(e.details).toEqual({ scope: 'admin:write' }); }); it('notFound', () => { const e = errors.notFound('Row', 99); expect(e.status).toBe(404); expect(e.details).toEqual({ entity: 'Row', id: 99 }); }); it('validation', () => { const e = errors.validation([{ message: 'bad' }]); expect(e.status).toBe(400); expect(e.code).toBe('VALIDATION_ERROR'); }); it('rateLimited', () => { const e = errors.rateLimited(60); expect(e.status).toBe(429); expect(e.details).toEqual({ retry_after: 60 }); }); it('baserowDown', () => { expect(errors.baserowDown().status).toBe(502); }); it('docmostDown', () => { expect(errors.docmostDown().status).toBe(502); }); it('internal', () => { expect(errors.internal('boom').status).toBe(500); }); });