diff --git a/test/setup/setupConfig.ts b/test/setup/setupConfig.ts new file mode 100644 index 0000000000..e67493412d --- /dev/null +++ b/test/setup/setupConfig.ts @@ -0,0 +1,21 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import SdkConfig, { DEFAULTS } from '../../src/SdkConfig'; + +// uninitialised SdkConfig causes lots of warnings in console +// init with defaults +SdkConfig.put(DEFAULTS); diff --git a/test/setup/setupLanguage.ts b/test/setup/setupLanguage.ts new file mode 100644 index 0000000000..5c6834d012 --- /dev/null +++ b/test/setup/setupLanguage.ts @@ -0,0 +1,20 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import * as languageHandler from "../../src/languageHandler"; + +languageHandler.setLanguage('en'); +languageHandler.setMissingEntryGenerator(key => key.split("|", 2)[1]); diff --git a/test/setup/setupManualMocks.ts b/test/setup/setupManualMocks.ts new file mode 100644 index 0000000000..162529ef64 --- /dev/null +++ b/test/setup/setupManualMocks.ts @@ -0,0 +1,55 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { TextDecoder, TextEncoder } from "util"; + +// jest 27 removes setImmediate from jsdom +// polyfill until setImmediate use in client can be removed +// @ts-ignore - we know the contract is wrong. That's why we're stubbing it. +global.setImmediate = callback => setTimeout(callback, 0); + +// Stub ResizeObserver +// @ts-ignore - we know it's a duplicate (that's why we're stubbing it) +class ResizeObserver { + observe() {} // do nothing + unobserve() {} // do nothing + disconnect() {} // do nothing +} +window.ResizeObserver = ResizeObserver; + +// matchMedia is not included in jsdom +const mockMatchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), // Deprecated + removeListener: jest.fn(), // Deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), +})); +global.matchMedia = mockMatchMedia; + +// maplibre requires a createObjectURL mock +global.URL.createObjectURL = jest.fn(); + +// polyfilling TextEncoder as it is not available on JSDOM +// view https://github.com/facebook/jest/issues/9983 +global.TextEncoder = TextEncoder; +global.TextDecoder = TextDecoder; + +// prevent errors whenever a component tries to manually scroll. +window.HTMLElement.prototype.scrollIntoView = jest.fn(); diff --git a/test/setupTests.js b/test/setupTests.js index 0ff021eaa2..649a914c09 100644 --- a/test/setupTests.js +++ b/test/setupTests.js @@ -1,53 +1,17 @@ -import { TextEncoder, TextDecoder } from 'util'; import Adapter from "@wojtekmaj/enzyme-adapter-react-17"; import { configure } from "enzyme"; import "blob-polyfill"; // https://github.com/jsdom/jsdom/issues/2555 -import * as languageHandler from "../src/languageHandler"; -import SdkConfig, { DEFAULTS } from '../src/SdkConfig'; - -languageHandler.setLanguage('en'); -languageHandler.setMissingEntryGenerator(key => key.split("|", 2)[1]); - -// uninitialised SdkConfig causes lots of warnings in console -// init with defaults -SdkConfig.put(DEFAULTS); - +// Enable the jest & enzyme mocks require('jest-fetch-mock').enableMocks(); - -// jest 27 removes setImmediate from jsdom -// polyfill until setImmediate use in client can be removed -global.setImmediate = callback => setTimeout(callback, 0); - -// Stub ResizeObserver -class ResizeObserver { - observe() {} // do nothing - unobserve() {} // do nothing - disconnect() {} // do nothing -} -window.ResizeObserver = ResizeObserver; - -// polyfilling TextEncoder as it is not available on JSDOM -// view https://github.com/facebook/jest/issues/9983 -global.TextEncoder = TextEncoder; -global.TextDecoder = TextDecoder; - configure({ adapter: new Adapter() }); -// maplibre requires a createObjectURL mock -global.URL.createObjectURL = jest.fn(); - -// matchMedia is not included in jsdom -const mockMatchMedia = jest.fn().mockImplementation(query => ({ - matches: false, - media: query, - onchange: null, - addListener: jest.fn(), // Deprecated - removeListener: jest.fn(), // Deprecated - addEventListener: jest.fn(), - removeEventListener: jest.fn(), - dispatchEvent: jest.fn(), -})); -global.matchMedia = mockMatchMedia; - -window.HTMLElement.prototype.scrollIntoView = jest.fn(); +// Very carefully enable the mocks for everything else in +// a specific order. We use this order to ensure we properly +// establish an application state that actually works. +// +// These are also require() calls to make sure they get called +// synchronously. +require("./setup/setupManualMocks"); // must be first +require("./setup/setupLanguage"); +require("./setup/setupConfig");