Skip to content

Commit b4f47f7

Browse files
authored
[0.5.x] [BREAKING] Require Precognition-Success header (#41)
* Ensure precog-success header is present * test
1 parent 6baa631 commit b4f47f7

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

packages/core/src/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let requestFingerprintResolver: RequestFingerprintResolver = (config, axios) =>
1515
/**
1616
* The precognition success resolver.
1717
*/
18-
let successResolver: SuccessResolver = (response: AxiosResponse) => response.status === 204
18+
let successResolver: SuccessResolver = (response: AxiosResponse) => response.status === 204 && response.headers['precognition-success'] === 'true'
1919

2020
/**
2121
* The abort controller cache.

packages/core/tests/client.test.js

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ afterEach(() => {
1616
it('can handle a successful precognition response via config handler', async () => {
1717
expect.assertions(2)
1818

19-
const response = { headers: { precognition: 'true' }, status: 204, data: 'data' }
19+
const response = { headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' }
2020
axios.request.mockResolvedValueOnce(response)
2121

2222
await client.get('https://laravel.com', {}, {
@@ -31,7 +31,7 @@ it('can handle a successful precognition response via config handler', async ()
3131
it('can handle a success response via a fulfilled promise', async () => {
3232
expect.assertions(1)
3333

34-
const response = { headers: { precognition: 'true' }, status: 204, data: 'data' }
34+
const response = { headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' }
3535
axios.request.mockResolvedValueOnce(response)
3636

3737
await client.post('https://laravel.com').then(r => expect(r).toBe(response))
@@ -197,14 +197,34 @@ it('can provide input names to validate via config', async () => {
197197
it('throws an error if the precognition header is not present on a success response', async () => {
198198
expect.assertions(2)
199199

200-
axios.request.mockResolvedValueOnce({ headers: { status: 204 } })
200+
axios.request.mockResolvedValueOnce({ headers: {}, status: 204 })
201201

202202
await client.get('https://laravel.com').catch((e) => {
203203
expect(e).toBeInstanceOf(Error)
204204
expect(e.message).toBe('Did not receive a Precognition response. Ensure you have the Precognition middleware in place for the route.')
205205
})
206206
})
207207

208+
it('does not consider 204 response to be success without "Precognition-Success" header', async () => {
209+
expect.assertions(2)
210+
211+
axios.request.mockResolvedValueOnce({ headers: { precognition: 'true' }, status: 204 })
212+
let precognitionSucess = false
213+
let responseSuccess = false
214+
215+
await client.get('https://laravel.com', {}, {
216+
onPrecognitionSuccess() {
217+
precognitionSucess = true
218+
},
219+
onSuccess() {
220+
responseSuccess = true
221+
}
222+
})
223+
224+
expect(precognitionSucess).toBe(false)
225+
expect(responseSuccess).toBe(true)
226+
})
227+
208228
it('throws an error if the precognition header is not present on an error response', async () => {
209229
expect.assertions(2)
210230

@@ -289,7 +309,7 @@ it('can customize how it determines a successful precognition response', async (
289309
},
290310
}).then(value => expect(value).toBe('expected value'))
291311

292-
response = { headers: { precognition: 'true' }, status: 204, data: 'data' }
312+
response = { headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' }
293313
axios.request.mockResolvedValueOnce(response)
294314

295315
await client.get('https://laravel.com', {}, {
@@ -460,7 +480,7 @@ it('overrides request method url with config url', async () => {
460480
let config
461481
axios.request.mockImplementation((c) => {
462482
config = c
463-
return Promise.resolve({ headers: { precognition: 'true' }, status: 204, data: 'data' })
483+
return Promise.resolve({ headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' })
464484
})
465485

466486
await client.get('https://laravel.com', {}, {
@@ -495,7 +515,7 @@ it('overrides the request data with the config data', async () => {
495515
let config
496516
axios.request.mockImplementation((c) => {
497517
config = c
498-
return Promise.resolve({ headers: { precognition: 'true' }, status: 204, data: 'data' })
518+
return Promise.resolve({ headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' })
499519
})
500520

501521
await client.get('https://laravel.com', { expected: false }, {
@@ -530,7 +550,7 @@ it('merges request data with config data', async () => {
530550
let config
531551
axios.request.mockImplementation((c) => {
532552
config = c
533-
return Promise.resolve({ headers: { precognition: 'true' }, status: 204, data: 'data' })
553+
return Promise.resolve({ headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' })
534554
})
535555

536556
await client.get('https://laravel.com', { request: true }, {
@@ -567,7 +587,7 @@ it('merges request data with config params for get and delete requests', async (
567587
let config
568588
axios.request.mockImplementation((c) => {
569589
config = c
570-
return Promise.resolve({ headers: { precognition: 'true' }, status: 204, data: 'data' })
590+
return Promise.resolve({ headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: 'data' })
571591
})
572592

573593
await client.get('https://laravel.com', { data: true }, {

0 commit comments

Comments
 (0)