* @param {CodeceptJS.LocatorOrString} context * @param {Function} fn * @return {Promise<*> | undefined}
(context, fn)
| 13 | * @return {Promise<*> | undefined} |
| 14 | */ |
| 15 | function within(context, fn) { |
| 16 | const helpers = store.dryRun ? {} : container.helpers() |
| 17 | const locator = typeof context === 'object' ? JSON.stringify(context) : context |
| 18 | |
| 19 | return recorder.add( |
| 20 | 'register within wrapper', |
| 21 | () => { |
| 22 | const metaStep = new WithinStep(locator, fn) |
| 23 | const defineMetaStep = step => (step.metaStep = metaStep) |
| 24 | recorder.session.start('within') |
| 25 | |
| 26 | event.dispatcher.prependListener(event.step.before, defineMetaStep) |
| 27 | |
| 28 | Object.keys(helpers).forEach(helper => { |
| 29 | if (helpers[helper]._withinBegin) recorder.add(`[${helper}] start within`, () => helpers[helper]._withinBegin(context)) |
| 30 | }) |
| 31 | |
| 32 | const finalize = () => { |
| 33 | event.dispatcher.removeListener(event.step.before, defineMetaStep) |
| 34 | recorder.add('Finalize session within session', () => { |
| 35 | output.stepShift = 1 |
| 36 | recorder.session.restore('within') |
| 37 | }) |
| 38 | } |
| 39 | const finishHelpers = () => { |
| 40 | Object.keys(helpers).forEach(helper => { |
| 41 | if (helpers[helper]._withinEnd) recorder.add(`[${helper}] finish within`, () => helpers[helper]._withinEnd()) |
| 42 | }) |
| 43 | } |
| 44 | |
| 45 | if (isAsyncFunction(fn)) { |
| 46 | return fn() |
| 47 | .then(res => { |
| 48 | finishHelpers() |
| 49 | finalize() |
| 50 | return recorder.promise().then(() => res) |
| 51 | }) |
| 52 | .catch(e => { |
| 53 | finishHelpers() |
| 54 | finalize() |
| 55 | recorder.throw(e) |
| 56 | return recorder.promise() |
| 57 | }) |
| 58 | } |
| 59 | |
| 60 | let res |
| 61 | try { |
| 62 | res = fn() |
| 63 | } catch (err) { |
| 64 | recorder.throw(err) |
| 65 | } finally { |
| 66 | finishHelpers() |
| 67 | recorder.catch(err => { |
| 68 | output.stepShift = 1 |
| 69 | throw err |
| 70 | }) |
| 71 | } |
| 72 | finalize() |
no test coverage detected