Network errors
Loading "Network Errors (π solution)"
Run locally for transcripts
I will start from implementing the error handling for network errors in
get-auth-token.ts
module.Unlike error responses, network errors will reject the
fetch
promise. This means that I can handle those errors in the catch
callback attached to that promise:const response = await fetch('https://api.example.com/auth', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(credentials),
}).catch((error) => {
throw new Error('Authentication failed: network error', { cause: error })
})
π¦ I am setting the originalerror
as thecause
property of the consumer-facing error for debugging purposes.
Next, let's mock the network error in the test.
In the
get-auth-token.test.ts
, I will head to the new empty test case and add a runtime handler that will always respond with a network error:test('handles network errors', async () => {
server.use(
http.post('https://api.example.com/auth', () => {
return Response.error()
}),
)
await expect(() =>
getAuthToken({
email: 'kody@epicweb.dev',
password: 'supersecret123',
}),
).rejects.toThrow('Authentication failed: network error')
})
With this request handler, any request to the
POST https://api.example.com/auth
endpoint within this test will result in a network error. Note that I'm not trying to make the responses input-dependent, and instead introducing behavior-driven test cases to provide clarity and isolation for the tested code.Finally, I will add an assertion for the
getAuthToken()
promise to verify that it rejects with the correct error message:await expect(() =>
getAuthToken({
email: 'kody@epicweb.dev',
password: 'supersecret123',
}),
).rejects.toThrow('Authentication failed: network error')