diff options
Diffstat (limited to 'spec/frontend/__helpers__/mocks/axios_utils.js')
-rw-r--r-- | spec/frontend/__helpers__/mocks/axios_utils.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/spec/frontend/__helpers__/mocks/axios_utils.js b/spec/frontend/__helpers__/mocks/axios_utils.js new file mode 100644 index 00000000000..674563b9f28 --- /dev/null +++ b/spec/frontend/__helpers__/mocks/axios_utils.js @@ -0,0 +1,78 @@ +import EventEmitter from 'events'; + +const axios = jest.requireActual('~/lib/utils/axios_utils').default; + +axios.isMock = true; + +// Fail tests for unmocked requests +axios.defaults.adapter = (config) => { + const message = + `Unexpected unmocked request: ${JSON.stringify(config, null, 2)}\n` + + 'Consider using the `axios-mock-adapter` module in tests.'; + const error = new Error(message); + error.config = config; + global.fail(error); + throw error; +}; + +// Count active requests and provide a way to wait for them +let activeRequests = 0; +const events = new EventEmitter(); +const onRequest = () => { + activeRequests += 1; +}; + +// Use setImmediate to alloow the response interceptor to finish +const onResponse = (config) => { + activeRequests -= 1; + setImmediate(() => { + events.emit('response', config); + }); +}; + +const subscribeToResponse = (predicate = () => true) => + new Promise((resolve) => { + const listener = (config = {}) => { + if (predicate(config)) { + events.off('response', listener); + resolve(config); + } + }; + + events.on('response', listener); + + // If a request has been made synchronously, setImmediate waits for it to be + // processed and the counter incremented. + setImmediate(listener); + }); + +/** + * Registers a callback function to be run after a request to the given URL finishes. + */ +axios.waitFor = (url) => subscribeToResponse(({ url: configUrl }) => configUrl === url); + +/** + * Registers a callback function to be run after all requests have finished. If there are no requests waiting, the callback is executed immediately. + */ +axios.waitForAll = () => subscribeToResponse(() => activeRequests === 0); + +axios.countActiveRequests = () => activeRequests; + +axios.interceptors.request.use((config) => { + onRequest(); + return config; +}); + +// Remove the global counter +axios.interceptors.response.use( + (response) => { + onResponse(response.config); + return response; + }, + (err) => { + onResponse(err.config); + return Promise.reject(err); + }, +); + +export default axios; |