Skip to content

Commit 479d42f

Browse files
author
DavertMik
committed
refactored tests
1 parent 0462958 commit 479d42f

File tree

11 files changed

+302
-265
lines changed

11 files changed

+302
-265
lines changed

docs/basics.md

Lines changed: 218 additions & 208 deletions
Large diffs are not rendered by default.

lib/mocha/scenario.js renamed to lib/mocha/asyncWrapper.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ function makeDoneCallableOnce(done) {
2929
return done(err)
3030
}
3131
}
32+
3233
/**
3334
* Wraps test function, injects support objects from container,
3435
* starts promise chain with recorder, performs before/after hooks

lib/mocha/gherkin.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const { enhanceMochaSuite } = require('./suite')
77
const { createTest } = require('./test')
88
const { matchStep } = require('./bdd')
99
const event = require('../event')
10-
const scenario = require('./scenario')
10+
const { injected, setup, teardown, suiteSetup, suiteTeardown } = require('./asyncWrapper')
1111
const Step = require('../step')
1212
const DataTableArgument = require('../data/dataTableArgument')
1313
const transform = require('../transform')
@@ -39,10 +39,10 @@ module.exports = (text, file) => {
3939
suite.file = file
4040
suite.timeout(0)
4141

42-
suite.beforeEach('codeceptjs.before', () => scenario.setup(suite))
43-
suite.afterEach('codeceptjs.after', () => scenario.teardown(suite))
44-
suite.beforeAll('codeceptjs.beforeSuite', () => scenario.suiteSetup(suite))
45-
suite.afterAll('codeceptjs.afterSuite', () => scenario.suiteTeardown(suite))
42+
suite.beforeEach('codeceptjs.before', () => setup(suite))
43+
suite.afterEach('codeceptjs.after', () => teardown(suite))
44+
suite.beforeAll('codeceptjs.beforeSuite', () => suiteSetup(suite))
45+
suite.afterAll('codeceptjs.afterSuite', () => suiteTeardown(suite))
4646

4747
const runSteps = async steps => {
4848
for (const step of steps) {
@@ -103,7 +103,7 @@ module.exports = (text, file) => {
103103
if (child.background) {
104104
suite.beforeEach(
105105
'Before',
106-
scenario.injected(async () => runSteps(child.background.steps), suite, 'before'),
106+
injected(async () => runSteps(child.background.steps), suite, 'before'),
107107
)
108108
continue
109109
}

lib/mocha/hooks.js

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@ class Hook {
1010
this.error = error
1111
}
1212

13-
toString() {
13+
get hookName() {
1414
return this.constructor.name.replace('Hook', '')
1515
}
1616

17+
toString() {
18+
return this.hookName
19+
}
20+
1721
toCode() {
1822
return this.toString() + '()'
1923
}
2024

2125
retry(n) {
22-
// must be implemented for each hook
26+
this.suite.opts[`retry${this.hookName}`] = n
2327
}
2428

2529
get title() {
@@ -31,29 +35,13 @@ class Hook {
3135
}
3236
}
3337

34-
class BeforeHook extends Hook {
35-
retry(n) {
36-
this.suite.opts['retryBefore'] = n
37-
}
38-
}
38+
class BeforeHook extends Hook {}
3939

40-
class AfterHook extends Hook {
41-
retry(n) {
42-
this.suite.opts['retryAfter'] = n
43-
}
44-
}
40+
class AfterHook extends Hook {}
4541

46-
class BeforeSuiteHook extends Hook {
47-
retry(n) {
48-
this.suite.opts['retryBeforeSuite'] = n
49-
}
50-
}
42+
class BeforeSuiteHook extends Hook {}
5143

52-
class AfterSuiteHook extends Hook {
53-
retry(n) {
54-
this.suite.opts['retryAfterSuite'] = n
55-
}
56-
}
44+
class AfterSuiteHook extends Hook {}
5745

5846
function fireHook(eventType, suite, error) {
5947
const hook = suite.ctx?.test?.title?.match(/"([^"]*)"/)[1]

lib/mocha/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const Test = require('mocha/lib/test')
2-
const scenario = require('./scenario')
2+
const { test: testWrapper } = require('./asyncWrapper')
33
const { enhanceMochaSuite } = require('./suite')
44

55
/**
@@ -37,7 +37,7 @@ function enhanceMochaTest(test) {
3737
*/
3838
test.addToSuite = function (suite) {
3939
enhanceMochaSuite(suite)
40-
suite.addTest(scenario.test(this))
40+
suite.addTest(testWrapper(this))
4141
test.tags = [...(test.tags || []), ...(suite.tags || [])]
4242
test.fullTitle = () => `${suite.title}: ${test.title}`
4343
}

lib/mocha/ui.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const escapeRe = require('escape-string-regexp')
2-
const scenario = require('./scenario')
2+
const { test, setup, teardown, suiteSetup, suiteTeardown, injected } = require('./asyncWrapper')
33
const ScenarioConfig = require('./scenarioConfig')
44
const FeatureConfig = require('./featureConfig')
55
const addDataContext = require('../data/context')
@@ -94,11 +94,11 @@ module.exports = function (suite) {
9494

9595
suite.file = file
9696
suites.unshift(suite)
97-
suite.beforeEach('codeceptjs.before', () => scenario.setup(suite))
98-
afterEachHooks.push(['finalize codeceptjs', () => scenario.teardown(suite)])
97+
suite.beforeEach('codeceptjs.before', () => setup(suite))
98+
afterEachHooks.push(['finalize codeceptjs', () => teardown(suite)])
9999

100-
suite.beforeAll('codeceptjs.beforeSuite', () => scenario.suiteSetup(suite))
101-
afterAllHooks.push(['codeceptjs.afterSuite', () => scenario.suiteTeardown(suite)])
100+
suite.beforeAll('codeceptjs.beforeSuite', () => suiteSetup(suite))
101+
afterAllHooks.push(['codeceptjs.afterSuite', () => suiteTeardown(suite)])
102102

103103
return new FeatureConfig(suite)
104104
}
@@ -118,22 +118,22 @@ module.exports = function (suite) {
118118
}
119119

120120
context.BeforeSuite = function (fn) {
121-
suites[0].beforeAll('BeforeSuite', scenario.injected(fn, suites[0], 'beforeSuite'))
121+
suites[0].beforeAll('BeforeSuite', injected(fn, suites[0], 'beforeSuite'))
122122
return new HookConfig(new BeforeSuiteHook({ suite: suites[0] }))
123123
}
124124

125125
context.AfterSuite = function (fn) {
126-
afterAllHooks.unshift(['AfterSuite', scenario.injected(fn, suites[0], 'afterSuite')])
126+
afterAllHooks.unshift(['AfterSuite', injected(fn, suites[0], 'afterSuite')])
127127
return new HookConfig(new AfterSuiteHook({ suite: suites[0] }))
128128
}
129129

130130
context.Background = context.Before = function (fn) {
131-
suites[0].beforeEach('Before', scenario.injected(fn, suites[0], 'before'))
131+
suites[0].beforeEach('Before', injected(fn, suites[0], 'before'))
132132
return new HookConfig(new BeforeHook({ suite: suites[0] }))
133133
}
134134

135135
context.After = function (fn) {
136-
afterEachHooks.unshift(['After', scenario.injected(fn, suites[0], 'after')])
136+
afterEachHooks.unshift(['After', injected(fn, suites[0], 'after')])
137137
return new HookConfig(new AfterHook({ suite: suites[0] }))
138138
}
139139

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
exports.config = {
2+
tests: './*_test2.js',
3+
output: './output',
4+
helpers: {
5+
CustomHelper: {
6+
require: './helper.js',
7+
},
8+
},
9+
bootstrap: null,
10+
mocha: {},
11+
name: 'retryHooks',
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Feature('Retry #Async hooks')
2+
3+
let i = 0
4+
5+
Before(async ({ I }) => {
6+
return new Promise((resolve, reject) => {
7+
setTimeout(() => {
8+
console.log('ok', i, new Date())
9+
i++
10+
if (i < 3) reject(new Error('not works'))
11+
resolve()
12+
}, 0)
13+
})
14+
}).retry(2)
15+
16+
Scenario('async hook works', () => {
17+
console.log('works')
18+
})

test/runner/retry_hooks_test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ describe('CodeceptJS Retry Hooks', function () {
1717
})
1818
})
1919
})
20+
21+
it('run should load hook config from Before().retry()', done => {
22+
exec(config_run_config('codecept.retry.hookconfig.conf.js', '#Async '), (err, stdout) => {
23+
debug_this_test && console.log(stdout)
24+
expect(stdout).toContain('1 passed')
25+
done()
26+
})
27+
})
2028
;['#Before ', '#BeforeSuite '].forEach(retryHook => {
2129
it(`should ${retryHook} set hook retries from global config`, done => {
2230
exec(config_run_config('codecept.retry.obj.conf.js', retryHook), (err, stdout) => {

test/unit/scenario_test.js renamed to test/unit/mocha/asyncWrapper_test.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import('chai').then(chai => {
44
})
55
const sinon = require('sinon')
66

7-
const scenario = require('../../lib/mocha/scenario')
8-
const recorder = require('../../lib/recorder')
9-
const event = require('../../lib/event')
7+
const { test: testWrapper, setup, teardown, suiteSetup, suiteTeardown } = require('../../../lib/mocha/asyncWrapper')
8+
const recorder = require('../../../lib/recorder')
9+
const event = require('../../../lib/event')
1010

1111
let test
1212
let fn
@@ -17,7 +17,7 @@ let afterSuite
1717
let failed
1818
let started
1919

20-
describe('Scenario', () => {
20+
describe('AsyncWrapper', () => {
2121
beforeEach(() => {
2222
test = { timeout: () => {} }
2323
fn = sinon.spy()
@@ -27,7 +27,7 @@ describe('Scenario', () => {
2727
afterEach(() => event.cleanDispatcher())
2828

2929
it('should wrap test function', () => {
30-
scenario.test(test).fn(() => {})
30+
testWrapper(test).fn(() => {})
3131
expect(fn.called).is.ok
3232
})
3333

@@ -42,8 +42,8 @@ describe('Scenario', () => {
4242
})
4343
}
4444

45-
scenario.setup()
46-
scenario.test(test).fn(() => null)
45+
setup()
46+
testWrapper(test).fn(() => null)
4747
recorder.add('validation', () => expect(counter).to.eq(4))
4848
return recorder.promise()
4949
})
@@ -55,15 +55,15 @@ describe('Scenario', () => {
5555
event.dispatcher.on(event.test.started, (started = sinon.spy()))
5656
event.dispatcher.on(event.suite.before, (beforeSuite = sinon.spy()))
5757
event.dispatcher.on(event.suite.after, (afterSuite = sinon.spy()))
58-
scenario.suiteSetup()
59-
scenario.setup()
58+
suiteSetup()
59+
setup()
6060
})
6161

6262
it('should fire events', () => {
63-
scenario.test(test).fn(() => null)
63+
testWrapper(test).fn(() => null)
6464
expect(started.called).is.ok
65-
scenario.teardown()
66-
scenario.suiteTeardown()
65+
teardown()
66+
suiteTeardown()
6767
return recorder
6868
.promise()
6969
.then(() => expect(beforeSuite.called).is.ok)
@@ -74,11 +74,11 @@ describe('Scenario', () => {
7474

7575
it('should fire failed event on error', () => {
7676
event.dispatcher.on(event.test.failed, (failed = sinon.spy()))
77-
scenario.setup()
77+
setup()
7878
test.fn = () => {
7979
throw new Error('ups')
8080
}
81-
scenario.test(test).fn(() => {})
81+
testWrapper(test).fn(() => {})
8282
return recorder
8383
.promise()
8484
.then(() => expect(failed.called).is.ok)
@@ -89,7 +89,7 @@ describe('Scenario', () => {
8989
test.fn = () => {
9090
recorder.throw(new Error('ups'))
9191
}
92-
scenario.test(test).fn(() => {})
92+
testWrapper(test).fn(() => {})
9393
return recorder
9494
.promise()
9595
.then(() => expect(failed.called).is.ok)

0 commit comments

Comments
 (0)