35 lines
1.2 KiB
JavaScript
35 lines
1.2 KiB
JavaScript
// `lodash/debounce` has a non-trivial implementation which can lead to
|
|
// [flaky spec errors][1]. This mock simply makes `debounce` calls synchronous.
|
|
//
|
|
// In the future we could enhance this by injecting some test values in
|
|
// the function passed to it. See [this issue][2] for more information.
|
|
//
|
|
// [1]: https://gitlab.com/gitlab-org/gitlab/-/issues/212532
|
|
// [2]: https://gitlab.com/gitlab-org/gitlab/-/issues/213378
|
|
// Further reference: https://github.com/facebook/jest/issues/3465
|
|
|
|
export default (fn) => {
|
|
let id;
|
|
const debouncedFn = jest.fn(function run(...args) {
|
|
// this is calculated in runtime so beforeAll hook works in tests
|
|
const timeout = global.JEST_DEBOUNCE_THROTTLE_TIMEOUT;
|
|
if (timeout) {
|
|
id = setTimeout(() => {
|
|
fn.apply(this, args);
|
|
}, timeout);
|
|
} else {
|
|
fn.apply(this, args);
|
|
}
|
|
});
|
|
debouncedFn.cancel = jest.fn(() => {
|
|
clearTimeout(id);
|
|
});
|
|
debouncedFn.flush = jest.fn(() => {
|
|
const errorMessage =
|
|
"The .flush() method returned by lodash.debounce is not yet implemented/mocked by the mock in 'spec/frontend/__mocks__/lodash/debounce.js'.";
|
|
|
|
throw new Error(errorMessage);
|
|
});
|
|
|
|
return debouncedFn;
|
|
};
|