@revoloo/cypress6
Version:
Cypress.io end to end testing tool
79 lines (60 loc) • 2.07 kB
text/typescript
const _ = require('lodash')
function mutateConfiguration (testConfigOverride, config, env) {
const globalConfig = _.clone(config())
const globalEnv = _.clone(env())
delete testConfigOverride.browser
config(testConfigOverride)
const localTestConfig = config()
const localTestConfigBackup = _.clone(localTestConfig)
if (testConfigOverride.env) {
env(testConfigOverride.env)
}
const localTestEnv = env()
const localTestEnvBackup = _.clone(localTestEnv)
// we restore config back to what it was before the test ran
// UNLESS the user mutated config with Cypress.config, in which case
// we apply those changes to the global config
// TODO: (NEXT_BREAKING) always restore configuration
// do not allow global mutations inside test
const restoreConfigFn = function () {
_.each(localTestConfig, (val, key) => {
if (localTestConfigBackup[key] !== val) {
globalConfig[key] = val
}
})
_.each(localTestEnv, (val, key) => {
if (localTestEnvBackup[key] !== val) {
globalEnv[key] = val
}
})
config.reset()
config(globalConfig)
env.reset()
env(globalEnv)
}
return restoreConfigFn
}
// this is called during test onRunnable time
// in order to resolve the test config upfront before test runs
export function getResolvedTestConfigOverride (test) {
let curParent = test.parent
const testConfig = [test._testConfig]
while (curParent) {
if (curParent._testConfig) {
testConfig.push(curParent._testConfig)
}
curParent = curParent.parent
}
return _.reduceRight(testConfig, (acc, opts) => _.extend(acc, opts), {})
}
class TestConfigOverride {
private restoreTestConfigFn: Nullable<() => void> = null
restoreAndSetTestConfigOverrides (test, config, env) {
if (this.restoreTestConfigFn) this.restoreTestConfigFn()
const resolvedTestConfig = test._testConfig || {}
this.restoreTestConfigFn = mutateConfiguration(resolvedTestConfig, config, env)
}
}
export function create () {
return new TestConfigOverride()
}