Spaces:
Running
Running
| const test = require('node:test'); | |
| const assert = require('node:assert/strict'); | |
| test('asyncController hides internal error messages in production for 5xx', async () => { | |
| const originalEnv = process.env.NODE_ENV; | |
| process.env.NODE_ENV = 'production'; | |
| const isProduction = process.env.NODE_ENV === 'production'; | |
| const internalError = new Error('MongoNetworkError: connection refused to cluster0.example.com'); | |
| internalError.statusCode = 503; | |
| const safeMessage = isProduction && internalError.statusCode >= 500 | |
| ? 'An internal error occurred' | |
| : internalError.message; | |
| assert.equal(safeMessage, 'An internal error occurred', 'In production, 5xx errors must use generic message'); | |
| process.env.NODE_ENV = originalEnv; | |
| }); | |
| test('asyncController passes through 4xx messages in production', async () => { | |
| process.env.NODE_ENV = 'production'; | |
| const isProduction = process.env.NODE_ENV === 'production'; | |
| const validationError = new Error('Title is required'); | |
| validationError.statusCode = 400; | |
| const safeMessage = isProduction && validationError.statusCode >= 500 | |
| ? 'An internal error occurred' | |
| : validationError.message; | |
| assert.equal(safeMessage, 'Title is required', '4xx messages must pass through'); | |
| process.env.NODE_ENV = 'development'; | |
| }); | |
| test('asyncController error response includes success=false and code', async () => { | |
| const { asyncController } = require('../utils/asyncController'); | |
| let capturedStatus; | |
| let capturedBody; | |
| const req = { originalUrl: '/test', method: 'GET', headers: {}, ip: '', user: null, body: {} }; | |
| const res = { | |
| statusCode: 200, | |
| headersSent: false, | |
| status(code) { capturedStatus = code; this.statusCode = code; return this; }, | |
| json(body) { capturedBody = body; }, | |
| }; | |
| const handler = async () => { | |
| const err = new Error('Validation failed'); | |
| err.statusCode = 400; | |
| throw err; | |
| }; | |
| await asyncController(handler)(req, res, () => {}); | |
| assert.equal(capturedStatus, 400); | |
| assert.equal(capturedBody.success, false); | |
| assert.equal(capturedBody.code, 'BAD_REQUEST'); | |
| assert.equal(capturedBody.message, 'Validation failed'); | |
| }); | |
| test('asyncController uses INTERNAL_SERVER_ERROR code for 5xx', async () => { | |
| const { asyncController } = require('../utils/asyncController'); | |
| let capturedBody; | |
| const req = { originalUrl: '/test', method: 'GET', headers: {}, ip: '', user: null, body: {} }; | |
| const res = { | |
| statusCode: 200, | |
| headersSent: false, | |
| status() { return this; }, | |
| json(body) { capturedBody = body; }, | |
| }; | |
| const handler = async () => { throw new Error('DB exploded'); }; | |
| await asyncController(handler)(req, res, () => {}); | |
| assert.equal(capturedBody.success, false); | |
| assert.equal(capturedBody.code, 'INTERNAL_SERVER_ERROR'); | |
| }); | |