diff options
Diffstat (limited to 'spec/frontend/__helpers__/shared_test_setup.js')
-rw-r--r-- | spec/frontend/__helpers__/shared_test_setup.js | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/spec/frontend/__helpers__/shared_test_setup.js b/spec/frontend/__helpers__/shared_test_setup.js new file mode 100644 index 00000000000..03389e16b65 --- /dev/null +++ b/spec/frontend/__helpers__/shared_test_setup.js @@ -0,0 +1,90 @@ +/* Common setup for both unit and integration test environments */ +import { config as testUtilsConfig } from '@vue/test-utils'; +import * as jqueryMatchers from 'custom-jquery-matchers'; +import Vue from 'vue'; +import 'jquery'; +import Translate from '~/vue_shared/translate'; +import setWindowLocation from './set_window_location_helper'; +import { setGlobalDateToFakeDate } from './fake_date'; +import { loadHTMLFixture, setHTMLFixture } from './fixtures'; +import { TEST_HOST } from './test_constants'; +import customMatchers from './matchers'; + +import './dom_shims'; +import './jquery'; +import '~/commons/bootstrap'; + +// This module has some fairly decent visual test coverage in it's own repository. +jest.mock('@gitlab/favicon-overlay'); + +process.on('unhandledRejection', global.promiseRejectionHandler); + +// Fake the `Date` for the rest of the jest spec runtime environment. +// https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39496#note_503084332 +setGlobalDateToFakeDate(); + +Vue.config.devtools = false; +Vue.config.productionTip = false; + +Vue.use(Translate); + +// convenience wrapper for migration from Karma +Object.assign(global, { + loadFixtures: loadHTMLFixture, + setFixtures: setHTMLFixture, +}); + +const JQUERY_MATCHERS_TO_EXCLUDE = ['toHaveLength', 'toExist']; + +// custom-jquery-matchers was written for an old Jest version, we need to make it compatible +Object.entries(jqueryMatchers).forEach(([matcherName, matcherFactory]) => { + // Exclude these jQuery matchers + if (JQUERY_MATCHERS_TO_EXCLUDE.includes(matcherName)) { + return; + } + + expect.extend({ + [matcherName]: matcherFactory().compare, + }); +}); + +expect.extend(customMatchers); + +testUtilsConfig.deprecationWarningHandler = (method, message) => { + const ALLOWED_DEPRECATED_METHODS = [ + // https://gitlab.com/gitlab-org/gitlab/-/issues/295679 + 'finding components with `find` or `get`', + + // https://gitlab.com/gitlab-org/gitlab/-/issues/295680 + 'finding components with `findAll`', + ]; + if (!ALLOWED_DEPRECATED_METHODS.includes(method)) { + global.console.error(message); + } +}; + +Object.assign(global, { + requestIdleCallback(cb) { + const start = Date.now(); + return setTimeout(() => { + cb({ + didTimeout: false, + timeRemaining: () => Math.max(0, 50 - (Date.now() - start)), + }); + }); + }, + cancelIdleCallback(id) { + clearTimeout(id); + }, +}); + +beforeEach(() => { + // make sure that each test actually tests something + // see https://jestjs.io/docs/en/expect#expecthasassertions + expect.hasAssertions(); + + // Reset the mocked window.location. This ensures tests don't interfere with + // each other, and removes the need to tidy up if it was changed for a given + // test. + setWindowLocation(TEST_HOST); +}); |