Files
cypress/packages/web-config/node-jsdom-setup.ts
T
Lachlan Miller 929cac807a chore(runner,runner-ct): reduce duplication with packages/runner-shared (#16866)
* move snapshot-controls to shared package

* share visit-failure component

* share blank-contents

* share message component

* move message styling to shared

* stub scss in unit tests

* remove whitespace

* make dup files match

* share selector playground

* share script error

* share automation-disconnected

* remove old file

* share no-automation

* share error messages

* share errors

* make iframe model files similar

* share iframe-model

* share selector playground

* share style

* share highlight in selector playground

* share dom file

* update import

* share aut-iframe

* wip: shared event manager

* remove CT event manager

* move studio to shared runner package

* fix tests

* use shared event manager in CT runner

* comment back in code

* rename viewporth width/height to width/height

* fix ts errors

* share viewport info

* share header

* revert changed test

* remove old code

* fix tests and move test to shared package

* move tests to shared package

* make container files similar

* share container in runner

* share container

* move test

* move spec

* update tsconfig]

* update headeR

* fix styling

* style

* refactor

* refactor

* reduce public modules

* Update packages/runner-shared/src/event-manager.js

Co-authored-by: Zach Bloomquist <github@chary.us>

* fix percy regression

* fix regression in style

* improve types, try reverting style

* add runner-shared tests to pipeline

Co-authored-by: Zach Bloomquist <github@chary.us>
Co-authored-by: Barthélémy Ledoux <bart@cypress.io>
2021-06-16 10:22:09 +10:00

137 lines
3.2 KiB
TypeScript

import mockRequire from 'mock-require'
import { JSDOM } from 'jsdom'
import * as ansiEscapes from 'ansi-escapes'
import enzyme from 'enzyme'
import EnzymeAdapter from 'enzyme-adapter-react-16'
import ChaiEnzyme from 'chai-enzyme'
declare global {
module NodeJS {
interface Global {
[key: string]: any
}
}
}
interface RegisterDeps {
enzyme: typeof enzyme
EnzymeAdapter: typeof EnzymeAdapter
chaiEnzyme: typeof ChaiEnzyme
requireOverride: (...args: any[]) => any
}
type TimeoutID = number
export const register = ({
enzyme,
EnzymeAdapter,
chaiEnzyme,
requireOverride,
}: RegisterDeps) => {
const jsdom = new JSDOM('<!doctype html><html><body></body></html>')
const { window } = jsdom
const chai = require('chai')
const sinonChai = require('sinon-chai')
// const chaiEnzyme = require('chai-enzyme')
// @ts-ignore
global.window = window
global.document = window.document;
// DOMWindow doesn't have Selection yet.
(window as any).Selection = { prototype: { isCollapsed: {} } }
// @ts-ignore
global.navigator = {
userAgent: 'node.js',
}
// @ts-ignore
global.requestAnimationFrame = window.requestAnimationFrame = function (callback: FrameRequestCallback) {
return setTimeout(callback, 0)
}
global.cancelAnimationFrame = window.cancelAnimationFrame = function (id: TimeoutID) {
clearTimeout(id)
}
Object.keys(window.document.defaultView as Record<string, any>).forEach((property) => {
if (
property === 'localStorage' ||
property === 'sessionStorage' ||
typeof global[property] !== 'undefined'
) return
global[property] = (window.document.defaultView as Record<string, any>)[property]
})
// enzyme, and therefore chai-enzyme, needs to be required after
// global.navigator is set up (https://github.com/airbnb/enzyme/issues/395)
enzyme.configure({ adapter: new EnzymeAdapter() })
chai.use(chaiEnzyme())
chai.use(sinonChai)
global.expect = chai.expect
const bresolve = require('browser-resolve')
const Module = require('module')
const overrideRequire = () => {
const _load = Module._load
Module._load = function (...args: any[]) {
let browserPkg = args
if (requireOverride) {
const mockedDependency = requireOverride(...args)
if (mockedDependency != null) {
return mockedDependency
}
}
// Follow browser-field spec for importing modules
// except chalk so we dont mess up mocha coloring
if (!['path'].includes(args[0]) && !(args[1] && args[1].id.includes('chalk'))) {
try {
browserPkg = [bresolve.sync.apply(this, args)]
} catch (e) {
null
}
}
// Stub out all webpack-specific imports
if (args[0].includes('!')) {
return {}
}
if (args[0].endsWith('.png')) {
return args[0]
}
if (args[0].endsWith('.scss')) {
return args[0]
}
const ret = _load.apply(this, browserPkg)
return ret
}
}
overrideRequire()
}
// eslint-disable-next-line
after(() => {
process.stdout.write(ansiEscapes.cursorShow)
})
export const returnMockRequire = (name: string, modExport: object = {}) => {
mockRequire(name, modExport)
return require(name)
}