Skip to content

Commit ef3b735

Browse files
authored
Ensures precog requests do not interfere with non-precog requests (#78)
1 parent 8453671 commit ef3b735

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

packages/core/src/client.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ const refreshAbortController = (config: Config): Config => {
170170
typeof config.fingerprint !== 'string'
171171
|| config.signal
172172
|| config.cancelToken
173+
|| ! config.precognitive
173174
) {
174175
return config
175176
}

packages/core/tests/validator.test.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,3 +462,53 @@ it('marks fields as valid on precognition success', async () => {
462462
expect(validator.valid()).toStrictEqual(['name'])
463463
expect(valid).toStrictEqual(['name'])
464464
})
465+
466+
it('does not cancel submit requests', async () => {
467+
let data = {}
468+
let submitConfig
469+
let validateConfig
470+
axios.request.mockImplementation((config) => {
471+
if (config.precognitive) {
472+
validateConfig = config
473+
} else {
474+
submitConfig = config
475+
}
476+
477+
return Promise.resolve({ headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: '' })
478+
})
479+
const validator = createValidator((client) => client.post('/foo', data))
480+
481+
data.name = 'Tim'
482+
client.post('/foo', data, { precognitive: false })
483+
validator.validate('name', 'Tim')
484+
485+
expect(submitConfig.signal).toBeUndefined()
486+
expect(validateConfig.signal).toBeInstanceOf(AbortSignal)
487+
expect(validateConfig.signal.aborted).toBe(false)
488+
});
489+
490+
it('does not cancel submit requests with custom abort signal', async () => {
491+
let data = {}
492+
let submitConfig
493+
let validateConfig
494+
let abortController = new AbortController
495+
axios.request.mockImplementation((config) => {
496+
if (config.precognitive) {
497+
validateConfig = config
498+
} else {
499+
submitConfig = config
500+
}
501+
502+
return Promise.resolve({ headers: { precognition: 'true', 'precognition-success': 'true' }, status: 204, data: '' })
503+
})
504+
const validator = createValidator((client) => client.post('/foo', data))
505+
506+
data.name = 'Tim'
507+
client.post('/foo', data, { precognitive: false, signal: abortController.signal })
508+
validator.validate('name', 'Tim')
509+
510+
expect(submitConfig.signal).toBe(abortController.signal)
511+
expect(submitConfig.signal.aborted).toBe(false)
512+
expect(validateConfig.signal).toBeInstanceOf(AbortSignal)
513+
expect(validateConfig.signal.aborted).toBe(false)
514+
});

0 commit comments

Comments
 (0)