Skip to content

Commit 014fbca

Browse files
tom-laplaceTom Laplace-piedplat
andauthored
feat: 500+ error handling (#9)
Co-authored-by: Tom Laplace-piedplat <tom.laplace-piedplat@pole-emploi.fr>
1 parent 0cac856 commit 014fbca

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

src/request.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,7 @@ import {
2424
SuperAgentSerializer,
2525
ApiRequestHooks,
2626
} from './types.js'
27-
import {
28-
dumpRequest,
29-
dumpRequestBody,
30-
dumpRequestCookies,
31-
dumpRequestHeaders,
32-
stackToError,
33-
} from './utils.js'
27+
import { dumpRequest, dumpRequestBody, dumpRequestCookies, dumpRequestHeaders } from './utils.js'
3428

3529
const DUMP_CALLS = {
3630
request: dumpRequest,
@@ -176,13 +170,9 @@ export class ApiRequest extends Macroable {
176170
}
177171

178172
/**
179-
* Raise exception when received 500 status code from the server
173+
* For all HTTP errors (including 500+), return the error response
174+
* This allows proper handling of server errors via ApiResponse
180175
*/
181-
if (error.response.status >= 500) {
182-
await this.#setupRunner.cleanup(error, this)
183-
throw stackToError(error.response.text)
184-
}
185-
186176
response = error.response
187177
}
188178

tests/response/error_handling.spec.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,34 @@ test.group('Response | error handling', (group) => {
3737
assert.equal(response.status(), 401)
3838
})
3939

40-
test('raise fatal errors raised by the server', async ({ assert }) => {
40+
test('returns ApiResponse for 500 errors', async ({ assert }) => {
4141
httpServer.onRequest((_, res) => {
42-
try {
43-
throw new Error('Something went wrong')
44-
} catch (error) {
45-
res.statusCode = 500
46-
res.end(error.stack)
47-
}
42+
res.statusCode = 500
43+
res.end('Internal server error')
44+
})
45+
46+
const request = new ApiRequest({ baseUrl: httpServer.baseUrl, method: 'GET', endpoint: '/' })
47+
const response = await request
48+
49+
assert.equal(response.status(), 500)
50+
assert.isTrue(response.hasFatalError())
51+
assert.isTrue(response.hasServerError())
52+
})
53+
54+
test('handles server errors with response body', async ({ assert }) => {
55+
httpServer.onRequest((_, res) => {
56+
res.statusCode = 500
57+
res.setHeader('Content-Type', 'application/json')
58+
res.end(JSON.stringify({ error: 'Something went wrong', code: 'INTERNAL_ERROR' }))
4859
})
4960

5061
const request = new ApiRequest({ baseUrl: httpServer.baseUrl, method: 'GET', endpoint: '/' })
62+
const response = await request
5163

52-
await assert.rejects(() => request, 'Error: Something went wrong')
64+
assert.equal(response.status(), 500)
65+
assert.deepEqual(response.body(), {
66+
error: 'Something went wrong',
67+
code: 'INTERNAL_ERROR',
68+
})
5369
})
5470
})

0 commit comments

Comments
 (0)