Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: test config overrides #5346

Merged
merged 118 commits into from
Jun 4, 2020
Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
12e363e
decaffeinate: Rename browser.coffee from .coffee to .js
kuceb Feb 13, 2020
f2f06be
decaffeinate: Convert browser.coffee to JS
kuceb Feb 13, 2020
b81af00
decaffeinate: Run post-processing cleanups on browser.coffee
kuceb Feb 13, 2020
bf8bc35
temp 02/14/20 [skip ci]
kuceb Feb 14, 2020
599d978
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Feb 14, 2020
55f33c0
add beforeEachRestoreRunner to select specs, remove support file hook
kuceb Feb 14, 2020
14b43e4
temp 03/03/20 [skip ci]
kuceb Mar 3, 2020
dc82406
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Mar 3, 2020
2e4057c
fix more specs due to support file change
kuceb Mar 5, 2020
b18f616
fix errored spec
kuceb Mar 6, 2020
f183c53
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Mar 6, 2020
06fab91
add isInteractive config to many specs
kuceb Mar 6, 2020
21ae7d7
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Mar 6, 2020
9640993
update yarn.lock
kuceb Mar 6, 2020
43ce710
use yarn.lock from develop
kuceb Mar 6, 2020
517f78e
fix nested suite configurations
kuceb Mar 9, 2020
b53ece7
fix nested suite configurations 2
kuceb Mar 10, 2020
725840c
force isInteractive in driver/support file
kuceb Mar 10, 2020
1f0ba14
update more specs to use test config format
kuceb Mar 10, 2020
1bc586f
update more specs to use test config format 2
kuceb Mar 10, 2020
9d6665f
update more specs to use test config format 3
kuceb Mar 10, 2020
691f2b2
update more specs to use test config format 4
kuceb Mar 11, 2020
0bf0a32
update more specs to use test config format 5
kuceb Mar 11, 2020
742f786
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Mar 11, 2020
818d67b
fix cli/types tests, unit tests
kuceb Mar 11, 2020
2888e04
cleanup
kuceb Mar 11, 2020
0cfc60a
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Apr 7, 2020
bd55fdc
allow .isBrowser to support array, use .isBrowser for per-test-config
kuceb Apr 8, 2020
fa3d8d1
allow null browser test/suite config value
kuceb Apr 8, 2020
75860b4
temp 04/10/20 [skip ci]
kuceb Apr 10, 2020
d2a4b9d
restore test originalTitle when skip due to browser
kuceb Apr 15, 2020
d02ffec
add tests for per-test-config baseUrl
kuceb Apr 15, 2020
10c97af
update .isBrowser error message
kuceb Apr 15, 2020
c09f90b
fix rerunning hooks on top navigation
kuceb Apr 16, 2020
b0500bf
rename duplicate issue number
kuceb Apr 16, 2020
4c520b7
up timeout for server/integration test
kuceb Apr 16, 2020
1bc41ff
change test to be more specific
kuceb Apr 16, 2020
742ed86
Merge branch 'fix-rerun-hooks-on-navigation' into declarative-test-co…
kuceb Apr 16, 2020
0834715
rename TestOptions, add baseUrl test, override xit xdescribe methods
kuceb Apr 17, 2020
e4fd561
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Apr 17, 2020
fc62315
add tests for xit/xdescribe
kuceb Apr 17, 2020
53ece8a
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Apr 22, 2020
368e5ac
Merge branch 'fix-rerun-hooks-on-navigation' into declarative-test-co…
kuceb Apr 22, 2020
71f7658
disable video for flaky e2e test
kuceb Apr 22, 2020
9efee15
fix lint-types, e2e snapshot
kuceb Apr 22, 2020
2dd7b41
try 2: fix rerun before/after hooks
kuceb Apr 27, 2020
82d8203
Merge branch 'develop' into declarative-test-configs
brian-mann Apr 27, 2020
2c6d1f9
temp 04/29/20 [skip ci]
kuceb Apr 29, 2020
85503d3
change logic to rerun before hooks after top navigation
kuceb Apr 30, 2020
46c116d
fix windowSize for browser e2e test
kuceb May 4, 2020
590a573
fix windowSize for xvfb chrome in e2e test
kuceb May 4, 2020
22d2780
ok fine, just disable screenshots
kuceb May 4, 2020
6d1451d
Merge remote-tracking branch 'origin/develop' into 2-fix-rerun-hooks-…
kuceb May 7, 2020
ec77ac3
perf: faster lookup for hooks without runnables
kuceb May 7, 2020
751e752
Merge remote-tracking branch 'origin/develop' into 2-fix-rerun-hooks-…
kuceb May 8, 2020
6790888
fix afterAll hook switch logic
kuceb May 8, 2020
2f06046
backport to before/after fix
kuceb May 20, 2020
75bf3bf
Merge remote-tracking branch 'origin/develop' into 2-fix-rerun-hooks-…
kuceb May 20, 2020
d230c17
backport to before/after fix 2
kuceb May 20, 2020
f2977b7
fix noExit passed to e2e test inline options
kuceb May 22, 2020
836fc0a
Merge remote-tracking branch 'origin/develop' into 2-fix-rerun-hooks-…
kuceb May 22, 2020
d15fc1f
remove extra root afterhook check
kuceb May 22, 2020
ba5c388
add issue link..twice
kuceb May 22, 2020
9061197
cleanup function to arrows
kuceb May 22, 2020
bc27e9c
remove Cypress object proxying related code for certain utils
kuceb May 26, 2020
e653294
use getTest() as we did previously
kuceb May 26, 2020
b5fc7a0
remove Cypress object proxying related code for certain utils
kuceb May 26, 2020
512ccd0
fix Cypress._RESUMED_AT_TEST access
kuceb May 26, 2020
2802664
fix Cypress._RESUMED_AT_TEST access 2
kuceb May 26, 2020
fd3e7b1
fix runner.getResumedAtTestIndex, state accesses
kuceb May 26, 2020
2538d7b
Merge remote-tracking branch 'origin/develop' into 2-fix-rerun-hooks-…
kuceb May 26, 2020
ffc1c3d
fix firefoxgcinterval access
kuceb May 26, 2020
dd41468
fix arrow function
kuceb May 26, 2020
e5a1040
fix firefoxgcinterval access
kuceb May 26, 2020
7070f4f
try a simpler way to fix afterAll hook issue
kuceb May 26, 2020
f2d4663
Merge remote-tracking branch 'origin/develop' into 2-fix-rerun-hooks-…
kuceb May 27, 2020
e8eeabf
Merge remote-tracking branch 'origin/develop' into chore-remove-obj-p…
kuceb May 27, 2020
e3ad51a
fix decaf after merge
kuceb May 27, 2020
a2c39f6
cleanup internal-types.d.ts
kuceb May 27, 2020
929fa48
Merge branch 'chore-remove-obj-proxying-logic' into 2-fix-rerun-hooks…
kuceb May 27, 2020
366578e
fix internal-types
kuceb May 27, 2020
9643cb1
Merge branch 'chore-remove-obj-proxying-logic' into 2-fix-rerun-hooks…
kuceb May 27, 2020
f239874
Merge remote-tracking branch 'origin/develop' into 2-fix-rerun-hooks-…
kuceb May 27, 2020
02f12f7
fix comment, getTestFromRunnable signature
kuceb May 27, 2020
0172ad7
Merge branch '2-fix-rerun-hooks-on-navigation' into declarative-test-…
kuceb May 27, 2020
ea8142c
remove unneeded lastTestInSuiteLogic
kuceb May 27, 2020
cb044eb
fix after merge: many decaffed specs, typedefs
kuceb May 28, 2020
00e02e9
Merge remote-tracking branch 'origin/2-fix-rerun-hooks-on-navigation'…
kuceb May 28, 2020
8b02cff
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb May 28, 2020
8951420
minor cleanup
kuceb May 28, 2020
9f850cd
Merge remote-tracking branch 'origin/declarative-test-configs' into d…
kuceb May 28, 2020
455c3e9
fix typedefs: add taskTimeout
kuceb May 28, 2020
e776f7d
Merge branch 'fix-typedefs-config-taskTimeout' into declarative-test-…
kuceb May 28, 2020
a141f06
minor typedef fix, fix more specs modifying config()
kuceb May 28, 2020
5ae0298
fix e2e snapshot
kuceb May 29, 2020
5893eef
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb May 29, 2020
bf59979
fix flake: waiting_spec cancel outstanding XHR between tests
kuceb Jun 1, 2020
cff307f
fix flake
kuceb Jun 2, 2020
03ec65d
change config mutation logic, add tests, update typedefs
kuceb Jun 2, 2020
7521bda
add env support to testConfigOverride
kuceb Jun 2, 2020
1d6cbb9
fix specs: remove isInteractive override, add to beforeEach
kuceb Jun 2, 2020
2b62849
move testConfigOverride to file
kuceb Jun 2, 2020
f20c4bb
finish moving local config logic to cy.js
kuceb Jun 3, 2020
022c30a
Merge remote-tracking branch 'origin/develop' into declarative-test-c…
kuceb Jun 3, 2020
95de111
fix typedefs cypress.d.ts
kuceb Jun 3, 2020
b58c039
fix minor minor dtslint
kuceb Jun 3, 2020
3c21868
minor spec cleanup
kuceb Jun 3, 2020
ce5ed51
chunk: typescript spec fixes, bind Cypress.$
kuceb Jun 3, 2020
36c2d40
apply chunk: typescript spec fixes, bind Cypress.$
kuceb Jun 3, 2020
b9f97c9
fix stop-only
kuceb Jun 3, 2020
645315d
fix stop-only 2
kuceb Jun 3, 2020
f1c4722
extend the jqueryProxyFn in the constructor
brian-mann Jun 3, 2020
20ba034
remove experimental code
brian-mann Jun 3, 2020
bbaa98a
Merge remote-tracking branch 'origin/chore-fix-typescript-spec-global…
kuceb Jun 3, 2020
bef013b
rename spec files for overrides, cleanup
kuceb Jun 3, 2020
f4cdfb6
Merge branch 'develop' into declarative-test-configs
brian-mann Jun 3, 2020
a8b3271
rename snapshots + tests to match updated test config overrides
brian-mann Jun 4, 2020
bd4e943
fix firefox flake: navigation_spec
kuceb Jun 4, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
78 changes: 76 additions & 2 deletions cli/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ declare namespace Cypress {
clear: (keys?: string[]) => void
}

type IsBrowserMatcher = BrowserName | Partial<Browser> | Array<BrowserName | Partial<Browser>>

interface ViewportPosition extends WindowPosition {
right: number
bottom: number
Expand Down Expand Up @@ -379,12 +381,15 @@ declare namespace Cypress {
isCy(obj: any): obj is Chainable

/**
* Returns true if currently running the supplied browser name or matcher object.
* Returns true if currently running the supplied browser name or matcher object. Also accepts an array of matchers.
* @example isBrowser('chrome') will be true for the browser 'chrome:canary' and 'chrome:stable'
* @example isBrowser({ name: 'firefox', channel: 'dev' }) will be true only for the browser 'firefox:dev' (Firefox Developer Edition)
* @example isBrowser(['firefox', 'edge']) will be true only for the browsers 'firefox' and 'edge'
* @example isBrowser('!firefox') will be true for every browser other than 'firefox'
kuceb marked this conversation as resolved.
Show resolved Hide resolved
* @example isBrowser({ family: '!chromium'}) will be true for every browser not matching { family: 'chromium' }
* @param matcher browser name or matcher object to check.
*/
isBrowser(name: BrowserName | Partial<Browser>): boolean
isBrowser(name: IsBrowserMatcher): boolean

/**
* Internal options for "cy.log" used in custom commands.
Expand Down Expand Up @@ -2458,6 +2463,11 @@ declare namespace Cypress {
experimentalGetCookiesSameSite: boolean
}

interface TestConfigOptions extends Partial<Pick<ConfigOptions, 'baseUrl' | 'defaultCommandTimeout' | 'animationDistanceThreshold' | 'waitForAnimations' | 'viewportHeight' | 'viewportWidth' | 'requestTimeout' | 'execTimeout' | 'env' | 'responseTimeout'>> {
kuceb marked this conversation as resolved.
Show resolved Hide resolved
// retries?: number
browser?: IsBrowserMatcher | IsBrowserMatcher[]
}

interface PluginConfigOptions extends ConfigOptions {
/**
* Absolute path to the config file (default: <projectRoot>/cypress.json) or false
Expand Down Expand Up @@ -4854,3 +4864,67 @@ Cypress._ // => Lodash _
```
*/
declare const Cypress: Cypress.Cypress & EventEmitter

declare namespace Mocha {
interface TestFunction {
/**
* Describe a specification or test-case with the given `title` and callback `fn` acting
* as a thunk.
*
* - _Only available when invoked via the mocha CLI._
*/
(title: string, config: Cypress.TestConfigOptions, fn?: Func): Test

/**
* Describe a specification or test-case with the given `title` and callback `fn` acting
* as a thunk.
*
* - _Only available when invoked via the mocha CLI._
*/
(title: string, config: Cypress.TestConfigOptions, fn?: AsyncFunc): Test
}
interface ExclusiveTestFunction {
/**
* Describe a specification or test-case with the given `title` and callback `fn` acting
* as a thunk.
*
* - _Only available when invoked via the mocha CLI._
*/
(title: string, config: Cypress.TestConfigOptions, fn?: Func): Test

/**
* Describe a specification or test-case with the given `title` and callback `fn` acting
* as a thunk.
*
* - _Only available when invoked via the mocha CLI._
*/
(title: string, config: Cypress.TestConfigOptions, fn?: AsyncFunc): Test
}
interface PendingTestFunction {
/**
* Describe a specification or test-case with the given `title` and callback `fn` acting
* as a thunk.
*
* - _Only available when invoked via the mocha CLI._
*/
(title: string, config: Cypress.TestConfigOptions, fn?: Func): Test

/**
* Describe a specification or test-case with the given `title` and callback `fn` acting
* as a thunk.
*
* - _Only available when invoked via the mocha CLI._
*/
(title: string, config: Cypress.TestConfigOptions, fn?: AsyncFunc): Test
}

interface SuiteFunction {
/**
* [bdd, tdd] Describe a "suite" with the given `title` and callback `fn` containing
* nested suites.
*
* - _Only available when invoked via the mocha CLI._
*/
(title: string, config: Cypress.TestConfigOptions, fn: (this: Suite) => void): Suite
}
}
29 changes: 29 additions & 0 deletions cli/types/tests/cypress-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -455,3 +455,32 @@ namespace CypressDomTests {
Cypress.dom.getElementCoordinatesByPosition(doc, 'top') // $ExpectError
Cypress.dom.getElementCoordinatesByPositionRelativeToXY(doc, 1, 2) // $ExpectError
}

namespace CypressTestConfigTests {
// set config on a per-test basis
it('test', {
browser: {name: 'firefox'}
}, () => {})
it('test', {
browser: [{name: 'firefox'}, {name: 'chrome'}]
}, () => {})
it('test', {
baseUrl: 'www.foobar.com',
browser: 'firefox'
}, () => {})
it('test', {
browser: {foo: 'bar'} // $ExpectError
}, () => {})

// set config on a per-suite basis
describe('suite', {
browser: {family: 'firefox'},
baseUrl: 'www.example.com'
}, () => {})

describe('suite', {
browser: {family: 'firefox'},
baseUrl: 'www.example.com'
foo: 'foo' // $ExpectError
}, () => {})
}
8 changes: 6 additions & 2 deletions packages/driver/src/cypress.js
Original file line number Diff line number Diff line change
Expand Up @@ -264,17 +264,21 @@ class $Cypress {
case 'runner:suite:start':
// mocha runner started processing a suite
if (this.config('isTextTerminal')) {
return this.emit('mocha', 'suite', ...args)
this.emit('mocha', 'suite', ...args)
}

this.emit('suite:start', ...args)

break

case 'runner:suite:end':
// mocha runner finished processing a suite
if (this.config('isTextTerminal')) {
return this.emit('mocha', 'suite end', ...args)
this.emit('mocha', 'suite end', ...args)
}

this.emit('suite:end', ...args)

break

case 'runner:hook:start':
Expand Down
59 changes: 49 additions & 10 deletions packages/driver/src/cypress/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,60 @@ const _ = require('lodash')
const $utils = require('./utils')
const $errUtils = require('./error_utils')

const isBrowser = function (config, obj = '') {
if (_.isString(obj)) {
const name = obj.toLowerCase()
const currentName = config.browser.name.toLowerCase()
const _isBrowser = function (browser, matcher, errPrefix) {
let isMatch
let exclusive = false

return name === currentName
const matchWithExclusion = (objValue, srcValue) => {
if (srcValue.startsWith('!')) {
exclusive = true

return objValue !== srcValue.slice(1)
}

return objValue === srcValue
}

if (_.isString(matcher)) {
const name = matcher.toLowerCase()
const currentName = browser.name.toLowerCase()

isMatch = matchWithExclusion(currentName, name)
} else if (_.isObject(matcher)) {
isMatch = _.isMatchWith(browser, matcher, matchWithExclusion)
} else {
$errUtils.throwErrByPath('browser.invalid_arg', {
args: { prefix: errPrefix, obj: $utils.stringify(matcher) },
})
}

if (_.isObject(obj)) {
return _.isMatch(config.browser, obj)
return {
isMatch,
exclusive,
}
}

const isBrowser = function (config, obj = '', errPrefix = '`Cypress.isBrowser()`') {
if (!_.isArray(obj)) obj = [obj]

const result = obj.map((matcher) => _isBrowser(config.browser, matcher, errPrefix))
.reduce((a, b) => {
kuceb marked this conversation as resolved.
Show resolved Hide resolved
if (a === null) return b

if (a.exclusive && b.exclusive) {
return {
isMatch: a.isMatch && b.isMatch,
exclusive: true,
}
}

return {
isMatch: a.isMatch || b.isMatch,
exclusive: b.exclusive,
}
}, null)

$errUtils.throwErrByPath('browser.invalid_arg', {
args: { method: 'isBrowser', obj: $utils.stringify(obj) },
})
return !!result && result.isMatch
}

module.exports = (config) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/driver/src/cypress/error_messages.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ module.exports = {
}

browser:
invalid_arg: "`Cypress.{{method}}()` must be passed the name of a browser or an object to filter with. You passed: `{{obj}}`"
invalid_arg: "{{prefix}} must be passed the name of a browser or an object to filter with. You passed: `{{obj}}`"
kuceb marked this conversation as resolved.
Show resolved Hide resolved

chai:
length_invalid_argument: "You must provide a valid number to a `length` assertion. You passed: `{{length}}`"
Expand Down
65 changes: 63 additions & 2 deletions packages/driver/src/cypress/mocha.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,61 @@ const runnableResetTimeout = Runnable.prototype.resetTimeout
delete window.mocha
delete window.Mocha

function overloadMochaFnForConfig (fnName, specWindow) {
const _fn = specWindow[fnName]

const fnType = fnName === 'it' ? 'Test' : 'Suite'
kuceb marked this conversation as resolved.
Show resolved Hide resolved

function overrideFn (fn) {
specWindow[fnName] = fn()
specWindow[fnName]['only'] = fn('only')
specWindow[fnName]['skip'] = fn('skip')
}

overrideFn(function (subFn) {
return function (...args) {
/**
* @type {Cypress.Cypress}
*/
const Cypress = specWindow.Cypress

const origFn = subFn ? _fn[subFn] : _fn

if (args.length > 2 && _.isObject(args[1])) {
const opts = _.defaults({}, args[1], {
browser: null,
})

const mochaArgs = [args[0], args[2]]

const configMatchesBrowser = opts.browser == null || Cypress.isBrowser(opts.browser, `${fnType} config value \`{ browser }\``)

if (!configMatchesBrowser) {
mochaArgs[0] = `[browser skip (${opts.browser})]${mochaArgs[0]}`

if (subFn === 'only') {
mochaArgs[1] = function () {
this.skip()
}

return origFn.apply(this, mochaArgs)
}

return _fn['skip'].apply(this, mochaArgs)
}

const ret = origFn.apply(this, mochaArgs)

ret.cfg = opts

return ret
}

return origFn.apply(this, args)
}
})
}

const ui = (specWindow, _mocha) => {
// Override mocha.ui so that the pre-require event is emitted
// with the iframe's `window` reference, rather than the parent's.
Expand All @@ -34,13 +89,19 @@ const ui = (specWindow, _mocha) => {
// such as describe, it, before, beforeEach, etc
this.suite.emit('pre-require', specWindow, null, this)

// allow per-test-config/per-suite-config
// by accepting 3 arguments to it/describe/context
overloadMochaFnForConfig('it', specWindow)
overloadMochaFnForConfig('describe', specWindow)
overloadMochaFnForConfig('context', specWindow)

return this
}

return _mocha.ui('bdd')
}

const set = (specWindow, _mocha) => {
const setMochaProps = (specWindow, _mocha) => {
// Mocha is usually defined in the spec when used normally
// in the browser or node, so we add it as a global
// for our users too
Expand All @@ -67,7 +128,7 @@ const globals = (specWindow, reporter) => {
})

// set mocha props on the specWindow
set(specWindow, _mocha)
setMochaProps(specWindow, _mocha)

// return the newly created mocha instance
return _mocha
Expand Down
2 changes: 1 addition & 1 deletion packages/driver/src/cypress/runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const TEST_BEFORE_RUN_EVENT = 'runner:test:before:run'
const TEST_AFTER_RUN_EVENT = 'runner:test:after:run'

const RUNNABLE_LOGS = 'routes agents commands'.split(' ')
const RUNNABLE_PROPS = 'id order title root hookName hookId err state failedFromHookId body speed type duration wallClockStartedAt wallClockDuration timings file'.split(' ')
const RUNNABLE_PROPS = 'id order title root hookName hookId err state failedFromHookId body speed type duration wallClockStartedAt wallClockDuration timings file cfg'.split(' ')

const debug = require('debug')('cypress:driver:runner')
// ## initial payload
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ $ = Cypress.$.bind(Cypress)
_ = Cypress._
Promise = Cypress.Promise

describe "src/cy/commands/actions/check", ->
describe "src/cy/commands/actions/check", {
isInteractive: true
numTestsKeptInMemory: 1
}, ->
before ->
cy
.visit("/fixtures/dom.html")
Expand Down Expand Up @@ -207,10 +210,10 @@ describe "src/cy/commands/actions/check", ->
.check("blue")
.then -> expect(focus).to.eq true

describe "errors", ->
describe "errors", {
defaultCommandTimeout: 100
}, ->
beforeEach ->
Cypress.config("defaultCommandTimeout", 100)

@logs = []

cy.on "log:added", (attrs, log) =>
Expand Down Expand Up @@ -638,10 +641,10 @@ describe "src/cy/commands/actions/check", ->
$("[name=colors][value=blue]").prop("checked", true).change -> done()
cy.get("[name=colors]").uncheck("blue")

describe "errors", ->
describe "errors", {
defaultCommandTimeout: 100
}, ->
beforeEach ->
Cypress.config("defaultCommandTimeout", 100)

@logs = []

cy.on "log:added", (attrs, log) =>
Expand Down