mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-26 12:29:06 +01:00
5ee1291662
Previously all browser globals were allowed to be used anywhere by ESLint because we had set the `env` property to `browser` in the ESLint config. This has made it easy to accidentally use browser globals (e.g. #8338), so it has been removed. Instead we now have a short list of allowed globals. All browser globals are now accessed as properties on `window`. Unfortunately this change resulted in a few different confusing unit test errors, as some of our unit tests setup assumed that a particular global would be used via `window` or `global`. In particular, `window.fetch` didn't work correctly because it wasn't patched by the AbortController polyfill (only `global.fetch` was being patched). The `jsdom-global` package we were using complicated matters by setting all of the JSDOM `window` properties directly on `global`, overwriting the `AbortController` for example. The `helpers.js` test setup module has been simplified somewhat by removing `jsdom-global` and constructing the JSDOM instance manually. The JSDOM window is set on `window`, and a few properties are set on `global` as well as needed by various dependencies. `node-fetch` and the AbortController polyfill/patch now work as expected as well, though `fetch` is only available on `window` now.
85 lines
2.1 KiB
JavaScript
85 lines
2.1 KiB
JavaScript
import Ganache from 'ganache-core'
|
|
import nock from 'nock'
|
|
import Enzyme from 'enzyme'
|
|
import Adapter from 'enzyme-adapter-react-16'
|
|
import log from 'loglevel'
|
|
|
|
nock.disableNetConnect()
|
|
nock.enableNetConnect('localhost')
|
|
|
|
// catch rejections that are still unhandled when tests exit
|
|
const unhandledRejections = new Map()
|
|
process.on('unhandledRejection', (reason, promise) => {
|
|
console.log('Unhandled rejection:', reason)
|
|
unhandledRejections.set(promise, reason)
|
|
})
|
|
process.on('rejectionHandled', (promise) => {
|
|
console.log(`handled: ${unhandledRejections.get(promise)}`)
|
|
unhandledRejections.delete(promise)
|
|
})
|
|
|
|
process.on('exit', () => {
|
|
if (unhandledRejections.size > 0) {
|
|
console.error(`Found ${unhandledRejections.size} unhandled rejections:`)
|
|
for (const reason of unhandledRejections.values()) {
|
|
console.error('Unhandled rejection: ', reason)
|
|
}
|
|
process.exit(1)
|
|
}
|
|
})
|
|
|
|
Enzyme.configure({ adapter: new Adapter() })
|
|
|
|
// ganache server
|
|
const server = Ganache.server()
|
|
server.listen(8545)
|
|
|
|
server.on('error', console.error)
|
|
server.on('clientError', console.error)
|
|
|
|
log.setDefaultLevel(5)
|
|
global.log = log
|
|
|
|
//
|
|
// polyfills
|
|
//
|
|
|
|
// dom
|
|
const { JSDOM } = require('jsdom')
|
|
|
|
const jsdom = new JSDOM()
|
|
global.window = jsdom.window
|
|
|
|
// required by `trezor-connect/node_modules/whatwg-fetch`
|
|
global.self = window
|
|
// required by `dom-helpers` and various other libraries
|
|
global.document = window.document
|
|
// required by `react-tippy`
|
|
global.navigator = window.navigator
|
|
global.Element = window.Element
|
|
|
|
// delete AbortController added by jsdom so it can be polyfilled correctly below
|
|
delete window.AbortController
|
|
|
|
// fetch
|
|
const fetch = require('node-fetch')
|
|
|
|
const { Headers, Request, Response } = fetch
|
|
Object.assign(window, { fetch, Headers, Request, Response })
|
|
|
|
require('abortcontroller-polyfill/dist/polyfill-patch-fetch')
|
|
|
|
// localStorage
|
|
window.localStorage = {}
|
|
|
|
// override metamask-logo
|
|
window.requestAnimationFrame = () => {}
|
|
|
|
// crypto.getRandomValues
|
|
if (!window.crypto) {
|
|
window.crypto = {}
|
|
}
|
|
if (!window.crypto.getRandomValues) {
|
|
window.crypto.getRandomValues = require('polyfill-crypto.getrandomvalues')
|
|
}
|