(fn, suite, hookName)
| 112 | * Injects arguments to function from controller |
| 113 | */ |
| 114 | export function injected(fn, suite, hookName) { |
| 115 | return function (done) { |
| 116 | const doneFn = makeDoneCallableOnce(done) |
| 117 | const errHandler = err => { |
| 118 | recorder.session.start('teardown') |
| 119 | recorder.cleanAsyncErr() |
| 120 | if (['before', 'beforeSuite'].includes(hookName)) { |
| 121 | suiteTestFailedHookError(suite, err, hookName) |
| 122 | } |
| 123 | if (hookName === 'after') { |
| 124 | suiteTestFailedHookError(suite, err, hookName) |
| 125 | suite.eachTest(test => { |
| 126 | event.emit(event.test.after, test) |
| 127 | }) |
| 128 | } |
| 129 | if (hookName === 'afterSuite') { |
| 130 | suiteTestFailedHookError(suite, err, hookName) |
| 131 | event.emit(event.suite.after, suite) |
| 132 | } |
| 133 | recorder.add(() => doneFn(err)) |
| 134 | } |
| 135 | |
| 136 | recorder.errHandler(err => { |
| 137 | errHandler(err) |
| 138 | }) |
| 139 | |
| 140 | if (!fn) throw new Error('fn is not defined') |
| 141 | |
| 142 | fireHook(event.hook.started, suite) |
| 143 | |
| 144 | this.test.body = fn.toString() |
| 145 | |
| 146 | if (!recorder.isRunning()) { |
| 147 | recorder.errHandler(err => { |
| 148 | errHandler(err) |
| 149 | }) |
| 150 | } |
| 151 | |
| 152 | const opts = suite.opts || {} |
| 153 | const retries = opts[`retry${ucfirst(hookName)}`] || 0 |
| 154 | |
| 155 | const currentTest = hookName === 'before' || hookName === 'after' ? suite?.ctx?.currentTest : null |
| 156 | |
| 157 | promiseRetry( |
| 158 | async (retry, number) => { |
| 159 | try { |
| 160 | recorder.startUnlessRunning() |
| 161 | const injectedArgs = await getInjectedArguments(fn, null, suite) |
| 162 | await fn.call(this, { ...injectedArgs, suite, test: currentTest }) |
| 163 | await recorder.promise().catch(err => retry(err)) |
| 164 | } catch (err) { |
| 165 | retry(err) |
| 166 | } finally { |
| 167 | if (number < retries) { |
| 168 | recorder.stop() |
| 169 | recorder.start() |
| 170 | } |
| 171 | } |
no test coverage detected