@autometa/jest-executor 0.5.9 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-test.log +5 -5
- package/CHANGELOG.md +26 -0
- package/dist/esm/index.js +296 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +296 -10
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/executor.ts","../../src/timeout-selector.ts","../../src/index.ts"],"sourcesContent":["import {\n ExamplesBridge,\n FeatureBridge,\n RuleBridge,\n ScenarioBridge,\n ScenarioOutlineBridge,\n find,\n GlobalBridge,\n StepBridge,\n} from \"@autometa/test-builder\";\nimport {\n describe,\n it,\n expect,\n beforeEach,\n afterEach,\n afterAll,\n beforeAll,\n jest,\n} from \"@jest/globals\";\nimport { World, type App } from \"@autometa/app\";\nimport { Class } from \"@autometa/types\";\nimport { AutomationError, formatErrorCauses, raise } from \"@autometa/errors\";\nimport { TestEventEmitter } from \"@autometa/events\";\nimport { Query } from \"@autometa/test-builder\";\nimport { Config } from \"@autometa/config\";\nimport { chooseTimeout } from \"./timeout-selector\";\nimport { GlobalScope, NullTimeout, Timeout } from \"@autometa/scopes\";\nimport { Container, defineContainerContext } from \"@autometa/injection\";\nexport function execute(\n { app, world }: { app: Class<App>; world: Class<World> },\n global: GlobalScope,\n bridge: FeatureBridge,\n events: TestEventEmitter,\n config: Config\n) {\n const globalBridge = new GlobalBridge(global);\n const featureTitle = bridge.data.scope.title(bridge.data.gherkin);\n const [group, modifier] = getGroupOrModifier(\n bridge,\n config.current.test?.tagFilter\n );\n const chosenTimeout = chooseTimeout(\n new NullTimeout(),\n bridge.data.scope.timeout\n ).getTimeout(config);\n beforeAll(() => {\n events.feature.emitStart({\n title: featureTitle,\n path: bridge.data.scope.path,\n modifier,\n tags: [...bridge.data.gherkin.tags],\n });\n }, chosenTimeout.milliseconds);\n group(featureTitle, () => {\n const tags = [...bridge.data.gherkin.tags] ?? [];\n const retries = tags.find((tag) => tag.startsWith(\"@retries=\"));\n\n let testContainerContext: symbol;\n let testContainer: Container;\n // = registerContainerContext(app, world);\n let localApp: App;\n const globalContainerContext = defineContainerContext(\"global\");\n const globalContainer = new Container(globalContainerContext);\n globalContainer.registerCached(world);\n const staticApp: App = globalContainer.get(app);\n staticApp.world = globalContainer.get(world);\n staticApp.di = globalContainer;\n beforeAll(() => {\n if (retries) {\n const count = parseInt(retries.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n });\n beforeEach(() => {\n const name =\n expect.getState().currentTestName ?? raise(\"A test must have a name\");\n testContainerContext = defineContainerContext(name);\n testContainer = new Container(testContainerContext);\n testContainer.registerCached(world);\n localApp = testContainer.get(app);\n localApp.world = testContainer.get(world);\n localApp.di = testContainer;\n });\n\n bootstrapSetupHooks(globalBridge, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapSetupHooks(bridge, staticApp, events, [config, chosenTimeout]);\n bootstrapBeforeHooks(bridge, globalBridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapBeforeHooks(bridge, bridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapBackground(bridge, bridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapScenarios(bridge, bridge, () => localApp, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapRules(bridge, () => localApp, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapAfterHooks(bridge, bridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapAfterHooks(bridge, globalBridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapTeardownHooks(globalBridge, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapTeardownHooks(bridge, staticApp, events, [config, chosenTimeout]);\n });\n afterAll(async () => {\n // events.\n const failures = Query.find.failed(bridge);\n const status =\n modifier === \"skip\"\n ? \"SKIPPED\"\n : failures.length === 0\n ? \"PASSED\"\n : \"FAILED\";\n events.feature.emitEnd({\n title: featureTitle,\n modifier,\n tags: [...bridge.data.gherkin.tags],\n status: status,\n });\n const settled = await events.settleAsyncEvents();\n const failedCount = settled.filter((e) => e.status === \"rejected\").length;\n if (failedCount > 0) {\n const count = `${failedCount}/${settled.length}`;\n const message = `${count} asynchronous Test Events were rejected.`;\n console.warn(message);\n }\n });\n}\n\nexport function bootstrapBackground(\n root: FeatureBridge,\n bridge: FeatureBridge | RuleBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const background = bridge.background;\n if (!background) return;\n\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n\n const tags = bridge?.data?.gherkin?.tags ?? [];\n if (tags.has(\"@skip\") || tags.has(\"@skipped\")) return;\n beforeEach(async () => {\n const testName = expect.getState().currentTestName;\n if (!testName) throw new AutomationError(\"A Scenario must have a title\");\n const scenarioBridge = find(root, testName);\n if (!scenarioBridge) {\n throw new AutomationError(\n `No matching scenario bridge was found matching the test name: ${testName}`\n );\n }\n const title = background.data.scope.title(background.data.gherkin);\n events.before.emitStart({\n title: title,\n tags: [...tags],\n });\n const steps = background.steps;\n try {\n for (const step of steps) {\n const app = localApp();\n const args = step.args?.(app) ?? [];\n const title = step.data.scope.stepText(\n step.data.gherkin.keyword,\n step.data.gherkin.text\n );\n\n events.step.emitStart({\n title,\n args: args,\n expression: step.data.scope.expression.source,\n });\n\n await step.data.scope.execute(step.data.gherkin, args, app);\n\n events.step.emitEnd({\n expression: step.data.scope.expression.source,\n title,\n args: args,\n });\n }\n events.before.emitEnd({\n title: title,\n tags: [...tags],\n status: \"PASSED\",\n });\n } catch (e) {\n events.before.emitEnd({\n title: title,\n tags: [...tags],\n status: \"FAILED\",\n error: e as Error,\n });\n const message = `${title} failed to execute.\nTest: ${testName}`;\n throw new AutomationError(message, { cause: e as Error });\n }\n }, chosenTimeout);\n}\nexport function bootstrapScenarios(\n root: FeatureBridge,\n bridge: FeatureBridge | RuleBridge | ExamplesBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { scenarios } = bridge;\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n scenarios.forEach((scenario) => {\n if (isOutline(scenario)) {\n bootstrapScenarioOutline(root, scenario, localApp, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n return;\n }\n bootstrapScenario(scenario, localApp, events, [config, chosenTimeout]);\n });\n}\n\nexport function bootstrapScenario(\n bridge: ScenarioBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { data } = bridge;\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n const scenarioName = data.scope.title(data.gherkin);\n const test = getTestOrModifier(bridge, config.current.test?.tagFilter);\n test(\n scenarioName,\n async () => {\n events.scenario.emitStart({\n title: bridge.title,\n tags: bridge.tags,\n });\n try {\n for (const step of bridge.steps) {\n await tryRunStep(step, events, bridge, localApp);\n }\n bridge.report = { passed: true };\n events.scenario.emitEnd({\n title: bridge.title,\n tags: bridge.tags,\n status: \"PASSED\",\n });\n } catch (e) {\n const error = e as Error;\n bridge.report = { passed: false, error: e as Error };\n events.scenario.emitEnd({\n title: bridge.title,\n tags: bridge.tags,\n status: \"FAILED\",\n error: error,\n });\n const message = `${bridge.title} failed while executing a step`;\n const meta = { cause: error };\n throw new AutomationError(message, meta);\n }\n },\n chosenTimeout.milliseconds\n );\n}\n\nasync function tryRunStep(\n step: StepBridge,\n events: TestEventEmitter,\n bridge: ScenarioBridge,\n localApp: () => App\n) {\n await bootstrapStep(step, events, bridge, localApp);\n}\n\nasync function bootstrapStep(\n step: StepBridge,\n events: TestEventEmitter,\n bridge: ScenarioBridge,\n localApp: () => App\n) {\n const title = step.data.scope.stepText(\n step.data.gherkin.keyword,\n step.data.gherkin.text\n );\n let args: unknown[] = [];\n try {\n const app = localApp();\n args = step.args?.(app) ?? [];\n\n events.step.emitStart({\n title,\n args,\n expression: step.expressionText,\n });\n await step.data.scope.execute(step.data.gherkin, args, app);\n events.step.emitEnd({\n expression: step.expressionText,\n title,\n args,\n status: \"PASSED\",\n });\n } catch (e) {\n const error = e as Error;\n events.step.emitEnd({\n expression: step.expressionText,\n title,\n args,\n status: \"FAILED\",\n error: e as Error,\n });\n const message = `${title} experienced an error`;\n const meta = { cause: error };\n const newError = new AutomationError(message, meta);\n console.error(formatErrorCauses(newError));\n throw newError;\n }\n}\n\nfunction isOutline(\n data: ScenarioBridge | ScenarioOutlineBridge\n): data is ScenarioOutlineBridge {\n return data instanceof ScenarioOutlineBridge;\n}\n\nexport function bootstrapScenarioOutline(\n root: FeatureBridge,\n bridge: ScenarioOutlineBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const {\n data: { scope, gherkin },\n examples,\n } = bridge;\n const title = scope.title(gherkin);\n const retry = [...gherkin.tags].find((tag) => tag.startsWith(\"@retries=\"));\n\n const [group, modifier] = getGroupOrModifier(\n bridge,\n config.current.test?.tagFilter\n );\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n group(title, () => {\n beforeAll(() => {\n if (retry) {\n const count = parseInt(retry.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n events.scenarioOutline.emitStart({\n title,\n modifier,\n tags: [...gherkin.tags],\n });\n });\n bootstrapSetupHooks(bridge, staticApp, events, [config, timeout]);\n bootstrapBeforeHooks(root, bridge, localApp, events, [config, timeout]);\n examples.forEach((example) => {\n bootstrapExamples(root, example, localApp, staticApp, events, [\n config,\n timeout,\n ]);\n });\n bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout]);\n bootstrapTeardownHooks(bridge, staticApp, events, [config, timeout]);\n afterAll(() => {\n const failures = Query.find.failed(bridge);\n const status = getStatus(modifier, failures);\n events.scenarioOutline.emitEnd({\n title,\n modifier,\n tags: [...gherkin.tags],\n status: status,\n });\n }, chosenTimeout);\n });\n}\nexport function bootstrapExamples(\n root: FeatureBridge,\n example: ExamplesBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n timeout: [Config, Timeout]\n) {\n const { gherkin } = example.data;\n const title = `${gherkin.keyword}: ${gherkin.name}`;\n const retry = [...example.data.gherkin.tags].find((tag) =>\n tag.startsWith(\"@retries=\")\n );\n\n const [group] = getGroupOrModifier(\n example,\n timeout[0].current.test?.tagFilter\n );\n group(title, () => {\n beforeAll(() => {\n if (retry) {\n const count = parseInt(retry.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n });\n bootstrapScenarios(root, example, localApp, staticApp, events, timeout);\n });\n}\n\nexport function bootstrapRules(\n bridge: FeatureBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n bridge.rules.forEach((rule) => {\n const tags = [...rule.data.gherkin.tags] ?? [];\n const retry = tags.find((tag) => tag.startsWith(\"@retries=\"));\n const ruleTimeout = chooseTimeout(\n chosenTimeout,\n rule.data.scope.timeout\n ).getTimeout(config);\n const transferTimeout: [Config, Timeout] = [config, ruleTimeout];\n const { data } = rule;\n const ruleName = data.scope.title(data.gherkin);\n const [group, modifier] = getGroupOrModifier(\n bridge,\n config.current.test?.tagFilter\n );\n\n group(ruleName, () => {\n beforeAll(() => {\n events.rule.emitStart({\n title: ruleName,\n modifier,\n tags: [...data.gherkin.tags],\n });\n\n if (retry) {\n const count = parseInt(retry.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n });\n bootstrapSetupHooks(rule, staticApp, events, transferTimeout);\n bootstrapBeforeHooks(bridge, rule, localApp, events, transferTimeout);\n bootstrapBackground(bridge, rule, localApp, events, transferTimeout);\n bootstrapScenarios(\n bridge,\n rule,\n localApp,\n staticApp,\n events,\n transferTimeout\n );\n bootstrapAfterHooks(bridge, rule, localApp, events, transferTimeout);\n bootstrapTeardownHooks(rule, staticApp, events, transferTimeout);\n\n afterAll(() => {\n const failures = Query.find.failed(rule);\n const status = getStatus(modifier, failures);\n events.rule.emitEnd({\n title: ruleName,\n modifier,\n tags: [...data.gherkin.tags],\n status: status,\n });\n }, ruleTimeout.milliseconds);\n });\n });\n}\n\nfunction getStatus(modifier: string | undefined, failures: unknown[]) {\n if (modifier === \"skip\") {\n return \"SKIPPED\";\n }\n if (failures.length === 0) {\n return \"PASSED\";\n }\n return \"FAILED\";\n}\n\nfunction getGroupOrModifier(\n bridge: RuleBridge | FeatureBridge | ScenarioOutlineBridge | ExamplesBridge,\n tagFilter: string | undefined\n) {\n const { data } = bridge;\n if (data.gherkin.tags?.has(\"@skip\") || data.gherkin.tags?.has(\"@skipped\")) {\n return [describe.skip, \"skip\"] as const;\n }\n if (data.gherkin.tags?.has(\"@only\")) {\n return [describe.only, \"only\"] as const;\n }\n if (tagFilter) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const parse = require(\"@cucumber/tag-expressions\").default;\n \n const expression = parse(tagFilter).evaluate(bridge.accumulateTags());\n if (!expression) {\n \n return [describe.skip, \"skip\"] as const;\n }\n }\n return [describe, undefined] as const;\n}\n\nfunction getTestOrModifier({ data }: ScenarioBridge, tagFilter?: string) {\n if (data.gherkin.tags?.has(\"@skip\") || data.gherkin.tags?.has(\"@skipped\")) {\n return it.skip;\n }\n if (data.gherkin.tags?.has(\"@only\")) {\n return it.only;\n }\n if (tagFilter) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const parse = require(\"@cucumber/tag-expressions\").default;\n const expression = parse(tagFilter).evaluate([...data.gherkin.tags]);\n if (!expression) {\n return it.skip;\n }\n }\n return it;\n}\n\nexport function bootstrapBeforeHooks(\n root: FeatureBridge,\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n\n bridge.data.scope.hooks.before.forEach((hook) => {\n const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(\n config\n ).milliseconds;\n\n beforeEach(async () => {\n const testName = expect.getState().currentTestName;\n if (!testName) throw new AutomationError(\"A Scenario must have a title\");\n const scenarioBridge = find(root, testName);\n if (!scenarioBridge) {\n throw new AutomationError(\n `No matching scenario was found matching the test name: ${testName}`\n );\n }\n if (!hook.canExecute(...scenarioBridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.before.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n const report = await hook.execute(localApp(), ...tags);\n events.before.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: report.status,\n error: report.error,\n });\n if (report.error) {\n const message = `${hook.name}: ${hook.description} experienced a failure.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\nexport function bootstrapSetupHooks(\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { scope, gherkin } = bridge.data;\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n const setups = scope.hooks.setup;\n setups.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n Timeout.from(chosenTimeout),\n hook.timeout\n ).getTimeout(config).milliseconds;\n const tags = gherkin.tags ?? [];\n\n beforeAll(async () => {\n if (!hook.canExecute(...tags)) {\n return;\n }\n\n events.setup.emitStart({\n title: `${hook.name}: ${hook.description}`,\n });\n\n const report = await hook.execute(staticApp, ...tags);\n\n events.setup.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n status: report.status,\n error: report.error,\n });\n\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\n\nexport function bootstrapAfterHooks(\n root: FeatureBridge,\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { scope } = bridge.data;\n const chosenTimeout = chooseTimeout(timeout, scope.timeout).getTimeout(\n config\n ).milliseconds;\n scope.hooks.after.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n Timeout.from(chosenTimeout),\n hook.timeout\n ).getTimeout(config).milliseconds;\n afterEach(async () => {\n const testName = expect.getState().currentTestName;\n if (!testName) throw new AutomationError(\"A Scenario must have a title\");\n const scenarioBridge = find(root, testName);\n if (!scenarioBridge) {\n throw new AutomationError(\n `No scenario was found matching the test path: ${testName}`\n );\n }\n if (!hook.canExecute(...scenarioBridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.after.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n\n const report = await hook.execute(localApp(), ...tags);\n events.after.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: report.status,\n error: report.error,\n });\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\n\nexport function bootstrapTeardownHooks(\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n staticApp: App,\n event: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const tags = bridge.data.gherkin.tags ?? [];\n const { scope } = bridge.data;\n const chosenTimeout = chooseTimeout(timeout, scope.timeout).getTimeout(\n config\n );\n scope.hooks.teardown.forEach((hook) => {\n const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(\n config\n ).milliseconds;\n afterAll(async () => {\n if (!hook.canExecute(...tags)) {\n return;\n }\n event.teardown.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n const report = await hook.execute(staticApp, ...tags);\n event.teardown.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: report.status,\n error: report.error,\n });\n\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\n","import { NullTimeout, Timeout } from \"@autometa/scopes\";\nimport { Config } from \"@autometa/config\";\nexport function getTimeout(target: Timeout | undefined, config: Config) {\n if (target && !(target instanceof NullTimeout)) {\n return target;\n }\n return Timeout.from(config?.current?.test?.timeout);\n}\n\nexport function chooseTimeout(\n timeout1: Timeout | undefined,\n timeout2: Timeout | undefined\n) {\n if (timeout2 instanceof Timeout && !(timeout2 instanceof NullTimeout)) {\n return {\n getTimeout: getTimeout.bind(null, timeout2),\n };\n }\n if (timeout1 instanceof Timeout && !(timeout1 instanceof NullTimeout)) {\n return {\n getTimeout: getTimeout.bind(null, timeout1),\n };\n }\n return {\n getTimeout: getTimeout.bind(null, Timeout.from(0)),\n };\n}\n","import { execute } from \"./executor\";\nexport { execute } from \"./executor\";\nexport { getTimeout } from \"./timeout-selector\";\nexport default execute;\n"],"mappings":"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","names":["NullTimeout","Timeout","title"]}
|
|
1
|
+
{"version":3,"sources":["../../src/executor.ts","../../src/timeout-selector.ts","../../src/index.ts"],"sourcesContent":["import {\n ExamplesBridge,\n FeatureBridge,\n RuleBridge,\n ScenarioBridge,\n ScenarioOutlineBridge,\n find,\n GlobalBridge,\n StepBridge,\n} from \"@autometa/test-builder\";\nimport {\n describe,\n it,\n expect,\n beforeEach,\n afterEach,\n afterAll,\n beforeAll,\n jest,\n} from \"@jest/globals\";\nimport { World, type App } from \"@autometa/app\";\nimport { Class } from \"@autometa/types\";\nimport { AutomationError, formatErrorCauses, raise } from \"@autometa/errors\";\nimport { TestEventEmitter } from \"@autometa/events\";\nimport { Query } from \"@autometa/test-builder\";\nimport { Config } from \"@autometa/config\";\nimport { chooseTimeout } from \"./timeout-selector\";\nimport { GlobalScope, NullTimeout, Timeout } from \"@autometa/scopes\";\nimport { Container, defineContainerContext } from \"@autometa/injection\";\n\nconst outlineApps = new Map<string, App[]>();\nconst examplesApps = new Map<string, App[]>();\nconst featureApps = new Map<string, App[]>();\nconst ruleApps = new Map<string, App[]>();\n\nexport function execute(\n { app, world }: { app: Class<App>; world: Class<World> },\n global: GlobalScope,\n bridge: FeatureBridge,\n events: TestEventEmitter,\n config: Config\n) {\n const globalBridge = new GlobalBridge(global);\n const featureTitle = bridge.data.scope.title(bridge.data.gherkin);\n const [group, modifier] = getGroupOrModifier(\n bridge,\n config.current.test?.tagFilter\n );\n const chosenTimeout = chooseTimeout(\n new NullTimeout(),\n bridge.data.scope.timeout\n ).getTimeout(config);\n beforeAll(() => {\n events.feature.emitStart({\n title: featureTitle,\n path: bridge.data.scope.path,\n modifier,\n tags: [...bridge.data.gherkin.tags],\n });\n }, chosenTimeout.milliseconds);\n group(featureTitle, () => {\n const tags = [...bridge.data.gherkin.tags] ?? [];\n const retries = tags.find((tag) => tag.startsWith(\"@retries=\"));\n\n let testContainerContext: symbol;\n let testContainer: Container;\n // = registerContainerContext(app, world);\n let localApp: App;\n const globalContainerContext = defineContainerContext(\"global\");\n const globalContainer = new Container(globalContainerContext);\n globalContainer.registerCached(world);\n const staticApp: App = globalContainer.get(app);\n staticApp.world = globalContainer.get(world);\n staticApp.di = globalContainer;\n beforeAll(() => {\n if (retries) {\n const count = parseInt(retries.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n });\n\n beforeEach(() => {\n const name =\n expect.getState().currentTestName ?? raise(\"A test must have a name\");\n testContainerContext = defineContainerContext(name);\n testContainer = new Container(testContainerContext);\n testContainer.registerCached(world);\n localApp = testContainer.get(app);\n localApp.world = testContainer.get(world);\n localApp.di = testContainer;\n if (!featureApps.has(name)) {\n featureApps.set(name, []);\n }\n featureApps.get(name)?.push(localApp);\n });\n\n bridge.data.scope.hooks.beforeFeatureHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n chosenTimeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n beforeAll(async () => {\n if (!hook.canExecute(...bridge.data.gherkin.tags)) {\n return;\n }\n const tags = bridge?.data?.gherkin?.tags ?? [];\n const report = await hook.execute(staticApp, ...tags);\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n\n bridge.data.scope.hooks.afterFeatureHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n chosenTimeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n afterAll(async () => {\n if (!hook.canExecute(...bridge.data.gherkin.tags)) {\n return;\n }\n const testName = expect.getState().currentTestName as string;\n const tags = bridge?.data?.gherkin?.tags ?? [];\n const apps = featureApps.get(testName) as App[];\n const report = await hook.execute(staticApp, apps, ...tags);\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n\n bootstrapSetupHooks(globalBridge, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapSetupHooks(bridge, staticApp, events, [config, chosenTimeout]);\n bootstrapBeforeHooks(bridge, globalBridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapBeforeHooks(bridge, bridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapBackground(bridge, bridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapScenarios(bridge, bridge, () => localApp, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapRules(bridge, () => localApp, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapAfterHooks(bridge, bridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapAfterHooks(bridge, globalBridge, () => localApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapTeardownHooks(globalBridge, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n bootstrapTeardownHooks(bridge, staticApp, events, [config, chosenTimeout]);\n });\n afterAll(async () => {\n // events.\n const failures = Query.find.failed(bridge);\n const status =\n modifier === \"skip\"\n ? \"SKIPPED\"\n : failures.length === 0\n ? \"PASSED\"\n : \"FAILED\";\n events.feature.emitEnd({\n title: featureTitle,\n modifier,\n tags: [...bridge.data.gherkin.tags],\n status: status,\n });\n const settled = await events.settleAsyncEvents();\n const failedCount = settled.filter((e) => e.status === \"rejected\").length;\n if (failedCount > 0) {\n const count = `${failedCount}/${settled.length}`;\n const message = `${count} asynchronous Test Events were rejected.`;\n console.warn(message);\n }\n featureApps.clear();\n outlineApps.clear();\n examplesApps.clear();\n ruleApps.clear();\n });\n}\n\nexport function bootstrapBackground(\n root: FeatureBridge,\n bridge: FeatureBridge | RuleBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const background = bridge.background;\n if (!background) return;\n\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n\n const tags = bridge?.data?.gherkin?.tags ?? [];\n if (tags.has(\"@skip\") || tags.has(\"@skipped\")) return;\n beforeEach(async () => {\n const testName = expect.getState().currentTestName;\n if (!testName) throw new AutomationError(\"A Scenario must have a title\");\n const scenarioBridge = find(root, testName);\n if (!scenarioBridge) {\n throw new AutomationError(\n `No matching scenario bridge was found matching the test name: ${testName}`\n );\n }\n const title = background.data.scope.title(background.data.gherkin);\n events.before.emitStart({\n title: title,\n tags: [...tags],\n });\n const steps = background.steps;\n try {\n for (const step of steps) {\n const app = localApp();\n const args = step.args?.(app) ?? [];\n const title = step.data.scope.stepText(\n step.data.gherkin.keyword,\n step.data.gherkin.text\n );\n\n events.step.emitStart({\n title,\n args: args,\n expression: step.data.scope.expression.source,\n });\n\n await step.data.scope.execute(step.data.gherkin, args, app);\n\n events.step.emitEnd({\n expression: step.data.scope.expression.source,\n title,\n args: args,\n });\n }\n events.before.emitEnd({\n title: title,\n tags: [...tags],\n status: \"PASSED\",\n });\n } catch (e) {\n events.before.emitEnd({\n title: title,\n tags: [...tags],\n status: \"FAILED\",\n error: e as Error,\n });\n const message = `${title} failed to execute.\nTest: ${testName}`;\n throw new AutomationError(message, { cause: e as Error });\n }\n }, chosenTimeout);\n}\nexport function bootstrapScenarios(\n root: FeatureBridge,\n bridge: FeatureBridge | RuleBridge | ExamplesBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { scenarios } = bridge;\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n scenarios.forEach((scenario) => {\n if (isOutline(scenario)) {\n bootstrapScenarioOutline(root, scenario, localApp, staticApp, events, [\n config,\n chosenTimeout,\n ]);\n return;\n }\n bootstrapScenario(scenario, localApp, events, [config, chosenTimeout]);\n });\n}\n\nexport function bootstrapScenario(\n bridge: ScenarioBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { data } = bridge;\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n const scenarioName = data.scope.title(data.gherkin);\n const test = getTestOrModifier(bridge, config.current.test?.tagFilter);\n test(\n scenarioName,\n async () => {\n events.scenario.emitStart({\n title: bridge.title,\n tags: bridge.tags,\n });\n try {\n for (const step of bridge.steps) {\n await tryRunStep(step, events, bridge, localApp);\n }\n bridge.report = { passed: true };\n events.scenario.emitEnd({\n title: bridge.title,\n tags: bridge.tags,\n status: \"PASSED\",\n });\n } catch (e) {\n const error = e as Error;\n bridge.report = { passed: false, error: e as Error };\n events.scenario.emitEnd({\n title: bridge.title,\n tags: bridge.tags,\n status: \"FAILED\",\n error: error,\n });\n const message = `${bridge.title} failed while executing a step`;\n const meta = { cause: error };\n throw new AutomationError(message, meta);\n }\n },\n chosenTimeout.milliseconds\n );\n}\n\nasync function tryRunStep(\n step: StepBridge,\n events: TestEventEmitter,\n bridge: ScenarioBridge,\n localApp: () => App\n) {\n await bootstrapStep(step, events, bridge, localApp);\n}\n\nasync function bootstrapStep(\n step: StepBridge,\n events: TestEventEmitter,\n bridge: ScenarioBridge,\n localApp: () => App\n) {\n const title = step.data.scope.stepText(\n step.data.gherkin.keyword,\n step.data.gherkin.text\n );\n let args: unknown[] = [];\n try {\n const app = localApp();\n args = step.args?.(app) ?? [];\n\n events.step.emitStart({\n title,\n args,\n expression: step.expressionText,\n });\n await step.data.scope.execute(step.data.gherkin, args, app);\n events.step.emitEnd({\n expression: step.expressionText,\n title,\n args,\n status: \"PASSED\",\n });\n } catch (e) {\n const error = e as Error;\n events.step.emitEnd({\n expression: step.expressionText,\n title,\n args,\n status: \"FAILED\",\n error: e as Error,\n });\n const message = `${title} experienced an error`;\n const meta = { cause: error };\n const newError = new AutomationError(message, meta);\n console.error(formatErrorCauses(newError));\n throw newError;\n }\n}\n\nfunction isOutline(\n data: ScenarioBridge | ScenarioOutlineBridge\n): data is ScenarioOutlineBridge {\n return data instanceof ScenarioOutlineBridge;\n}\n\nexport function bootstrapScenarioOutline(\n root: FeatureBridge,\n bridge: ScenarioOutlineBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const {\n data: { scope, gherkin },\n examples,\n } = bridge;\n const title = scope.title(gherkin);\n const retry = [...gherkin.tags].find((tag) => tag.startsWith(\"@retries=\"));\n const { beforeScenarioOutlineHooks, afterScenarioOutlineHooks } = scope.hooks;\n\n const [group, modifier] = getGroupOrModifier(\n bridge,\n config.current.test?.tagFilter\n );\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n const original = localApp;\n localApp = () => {\n const testName = expect.getState().currentTestName as string;\n if (!outlineApps.has(testName)) {\n outlineApps.set(testName, []);\n }\n const apps = outlineApps.get(testName) as App[];\n const app = original();\n apps.push(app);\n return app;\n };\n\n group(title, () => {\n beforeScenarioOutlineHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n timeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n beforeAll(async () => {\n if (!hook.canExecute(...gherkin.tags)) {\n return;\n }\n events.beforeScenarioOutline.emitStart({\n title,\n modifier,\n tags: [...gherkin.tags],\n });\n const tags = gherkin.tags ?? [];\n events.beforeScenarioOutline.emitStart({\n title,\n modifier,\n tags: [...gherkin.tags],\n });\n const report = await hook.execute(staticApp, ...tags);\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n events.beforeScenarioOutline.emitEnd({\n title,\n modifier,\n error: report.error,\n tags: [...gherkin.tags],\n status: \"FAILED\",\n });\n throw new AutomationError(message, { cause: report.error });\n }\n events.beforeScenarioOutline.emitEnd({\n title,\n modifier,\n tags: [...gherkin.tags],\n status: \"PASSED\",\n });\n }, hookTimeout);\n });\n\n beforeAll(() => {\n if (retry) {\n const count = parseInt(retry.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n events.scenarioOutline.emitStart({\n title,\n modifier,\n tags: [...gherkin.tags],\n });\n });\n bootstrapSetupHooks(bridge, staticApp, events, [config, timeout]);\n bootstrapBeforeHooks(root, bridge, localApp, events, [config, timeout]);\n examples.forEach((example) => {\n bootstrapExamples(root, example, localApp, staticApp, events, [\n config,\n timeout,\n ]);\n });\n bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout]);\n bootstrapTeardownHooks(bridge, staticApp, events, [config, timeout]);\n\n afterScenarioOutlineHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n timeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n afterAll(async () => {\n if (!hook.canExecute(...gherkin.tags)) {\n return;\n }\n const testName = expect.getState().currentTestName as string;\n const tags = gherkin.tags ?? [];\n const apps = outlineApps.get(testName) as App[];\n events.afterScenarioOutline.emitStart({\n title,\n modifier,\n tags: [...gherkin.tags],\n });\n const report = await hook.execute(staticApp, apps, ...tags);\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n events.scenarioOutline.emitEnd({\n title,\n modifier,\n error: report.error,\n tags: [...gherkin.tags],\n status: \"FAILED\",\n });\n throw new AutomationError(message, { cause: report.error });\n }\n events.afterScenarioOutline.emitEnd({\n title,\n modifier,\n tags: [...gherkin.tags],\n status: \"PASSED\",\n });\n }, hookTimeout);\n });\n\n afterAll(() => {\n const failures = Query.find.failed(bridge);\n const status = getStatus(modifier, failures);\n events.scenarioOutline.emitEnd({\n title,\n modifier,\n tags: [...gherkin.tags],\n status: status,\n });\n outlineApps.clear();\n examplesApps.clear();\n }, chosenTimeout);\n });\n}\nexport function bootstrapExamples(\n root: FeatureBridge,\n example: ExamplesBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n timeout: [Config, Timeout]\n) {\n const { gherkin } = example.data;\n const title = `${gherkin.keyword}: ${gherkin.name}`;\n const retry = [...example.data.gherkin.tags].find((tag) =>\n tag.startsWith(\"@retries=\")\n );\n const original = localApp;\n localApp = () => {\n const testName = expect.getState().currentTestName ?? \"unnamed test\";\n if (!examplesApps.has(testName)) {\n examplesApps.set(testName, []);\n }\n const apps = examplesApps.get(testName) as App[];\n const app = original();\n apps.push(app);\n return app;\n };\n\n const [group] = getGroupOrModifier(\n example,\n timeout[0].current.test?.tagFilter\n );\n group(title, () => {\n beforeAll(() => {\n if (retry) {\n const count = parseInt(retry.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n });\n\n example.data.scope.hooks.beforeExamplesHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n timeout[1],\n hook.options.timeout\n ).getTimeout(timeout[0]).milliseconds;\n\n beforeAll(async () => {\n if (!hook.canExecute(...example.data.gherkin.tags)) {\n return;\n }\n\n const tags = example?.data?.gherkin?.tags ?? [];\n\n events.beforeExamples.emitStart({\n title,\n tags: [...tags],\n });\n\n const report = await hook.execute(staticApp, ...tags);\n\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n events.beforeExamples.emitEnd({\n title,\n error: report.error,\n tags: [...tags],\n status: \"FAILED\",\n });\n throw new AutomationError(message, { cause: report.error });\n }\n events.beforeExamples.emitEnd({\n title,\n tags: [...tags],\n status: \"PASSED\",\n });\n }, hookTimeout);\n });\n bootstrapScenarios(root, example, localApp, staticApp, events, timeout);\n\n example.data.scope.hooks.afterExamplesHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n timeout[1],\n hook.options.timeout\n ).getTimeout(timeout[0]).milliseconds;\n\n afterAll(async () => {\n const testName = expect.getState().currentTestName as string;\n if (!hook.canExecute(...example.data.gherkin.tags)) {\n return;\n }\n\n const tags = example?.data?.gherkin?.tags ?? [];\n const apps = examplesApps.get(testName) as App[];\n const report = await hook.execute(staticApp, apps, ...tags);\n\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n\n afterAll(() => {\n const testName = expect.getState().currentTestName;\n examplesApps.delete(testName as string);\n });\n });\n}\n\nexport function bootstrapRules(\n bridge: FeatureBridge,\n localApp: () => App,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n bridge.rules.forEach((rule) => {\n const tags = [...rule.data.gherkin.tags] ?? [];\n const retry = tags.find((tag) => tag.startsWith(\"@retries=\"));\n const ruleTimeout = chooseTimeout(\n chosenTimeout,\n rule.data.scope.timeout\n ).getTimeout(config);\n const transferTimeout: [Config, Timeout] = [config, ruleTimeout];\n const { data } = rule;\n const ruleName = data.scope.title(data.gherkin);\n const [group, modifier] = getGroupOrModifier(\n bridge,\n config.current.test?.tagFilter\n );\n\n group(ruleName, () => {\n beforeAll(() => {\n events.rule.emitStart({\n title: ruleName,\n modifier,\n tags: [...data.gherkin.tags],\n });\n\n if (retry) {\n const count = parseInt(retry.split(\"=\")[1]);\n jest.retryTimes(count);\n }\n const original = localApp;\n localApp = () => {\n const testName = expect.getState().currentTestName as string;\n if (!ruleApps.has(testName)) {\n ruleApps.set(testName, []);\n }\n const apps = ruleApps.get(testName) as App[];\n const app = original();\n apps.push(app);\n return app;\n };\n });\n bridge.data.scope.hooks.beforeRuleHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n ruleTimeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n beforeAll(async () => {\n if (!hook.canExecute(...data.gherkin.tags)) {\n return;\n }\n const tags = data.gherkin.tags ?? [];\n events.beforeRule.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n const report = await hook.execute(staticApp, ...tags);\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n events.beforeRule.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: \"FAILED\",\n error: report.error,\n });\n throw new AutomationError(message, { cause: report.error });\n }\n events.beforeRule.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: \"PASSED\",\n });\n }, hookTimeout);\n });\n\n bridge.data.scope.hooks.afterRuleHooks.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n ruleTimeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n afterAll(async () => {\n const testName = expect.getState().currentTestName as string;\n if (!hook.canExecute(...data.gherkin.tags)) {\n return;\n }\n const tags = data.gherkin.tags ?? [];\n const apps = ruleApps.get(testName) as App[];\n events.afterRule.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n const report = await hook.execute(staticApp, apps, ...tags);\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n events.afterRule.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: \"FAILED\",\n error: report.error,\n });\n throw new AutomationError(message, { cause: report.error });\n }\n events.afterRule.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: \"PASSED\",\n });\n }, hookTimeout);\n });\n bootstrapSetupHooks(rule, staticApp, events, transferTimeout);\n bootstrapBeforeHooks(bridge, rule, localApp, events, transferTimeout);\n bootstrapBackground(bridge, rule, localApp, events, transferTimeout);\n bootstrapScenarios(\n bridge,\n rule,\n localApp,\n staticApp,\n events,\n transferTimeout\n );\n bootstrapAfterHooks(bridge, rule, localApp, events, transferTimeout);\n bootstrapTeardownHooks(rule, staticApp, events, transferTimeout);\n\n afterAll(() => {\n const failures = Query.find.failed(rule);\n const status = getStatus(modifier, failures);\n events.rule.emitEnd({\n title: ruleName,\n modifier,\n tags: [...data.gherkin.tags],\n status: status,\n });\n const testName = expect.getState().currentTestName as string;\n ruleApps.delete(testName);\n }, ruleTimeout.milliseconds);\n });\n });\n}\n\nfunction getStatus(modifier: string | undefined, failures: unknown[]) {\n if (modifier === \"skip\") {\n return \"SKIPPED\";\n }\n if (failures.length === 0) {\n return \"PASSED\";\n }\n return \"FAILED\";\n}\n\nfunction getGroupOrModifier(\n bridge: RuleBridge | FeatureBridge | ScenarioOutlineBridge | ExamplesBridge,\n tagFilter: string | undefined\n) {\n const { data } = bridge;\n if (data.gherkin.tags?.has(\"@skip\") || data.gherkin.tags?.has(\"@skipped\")) {\n return [describe.skip, \"skip\"] as const;\n }\n if (data.gherkin.tags?.has(\"@only\")) {\n return [describe.only, \"only\"] as const;\n }\n if (tagFilter) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const parse = require(\"@cucumber/tag-expressions\").default;\n \n const expression = parse(tagFilter).evaluate(bridge.accumulateTags());\n if (!expression) {\n \n return [describe.skip, \"skip\"] as const;\n }\n }\n return [describe, undefined] as const;\n}\n\nfunction getTestOrModifier({ data }: ScenarioBridge, tagFilter?: string) {\n if (data.gherkin.tags?.has(\"@skip\") || data.gherkin.tags?.has(\"@skipped\")) {\n return it.skip;\n }\n if (data.gherkin.tags?.has(\"@only\")) {\n return it.only;\n }\n if (tagFilter) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const parse = require(\"@cucumber/tag-expressions\").default;\n const expression = parse(tagFilter).evaluate([...data.gherkin.tags]);\n if (!expression) {\n return it.skip;\n }\n }\n return it;\n}\n\nexport function bootstrapBeforeHooks(\n root: FeatureBridge,\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n\n bridge.data.scope.hooks.before.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n chosenTimeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n\n beforeEach(async () => {\n const testName = expect.getState().currentTestName;\n if (!testName) throw new AutomationError(\"A Scenario must have a title\");\n const scenarioBridge = find(root, testName);\n if (!scenarioBridge) {\n throw new AutomationError(\n `No matching scenario was found matching the test name: ${testName}`\n );\n }\n if (!hook.canExecute(...scenarioBridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.before.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n const report = await hook.execute(localApp(), ...tags);\n events.before.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: report.status,\n error: report.error,\n });\n if (report.error) {\n const message = `${hook.name}: ${hook.description} experienced a failure.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\nexport function bootstrapSetupHooks(\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n staticApp: App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { scope, gherkin } = bridge.data;\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n const setups = scope.hooks.setup;\n setups.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n Timeout.from(chosenTimeout),\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n const tags = gherkin.tags ?? [];\n\n beforeAll(async () => {\n if (!hook.canExecute(...tags)) {\n return;\n }\n\n events.setup.emitStart({\n title: `${hook.name}: ${hook.description}`,\n });\n\n const report = await hook.execute(staticApp, ...tags);\n\n events.setup.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n status: report.status,\n error: report.error,\n });\n\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\n\nexport function bootstrapAfterHooks(\n root: FeatureBridge,\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n localApp: () => App,\n events: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const { scope } = bridge.data;\n const chosenTimeout = chooseTimeout(timeout, scope.timeout).getTimeout(\n config\n ).milliseconds;\n scope.hooks.after.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n Timeout.from(chosenTimeout),\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n afterEach(async () => {\n const testName = expect.getState().currentTestName;\n if (!testName) throw new AutomationError(\"A Scenario must have a title\");\n const scenarioBridge = find(root, testName);\n if (!scenarioBridge) {\n throw new AutomationError(\n `No scenario was found matching the test path: ${testName}`\n );\n }\n if (!hook.canExecute(...scenarioBridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.after.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n\n const report = await hook.execute(localApp(), ...tags);\n events.after.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: report.status,\n error: report.error,\n });\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\n\nexport function bootstrapTeardownHooks(\n bridge: GlobalBridge | FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n staticApp: App,\n event: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const tags = [...bridge.data.gherkin.tags] ?? [];\n const { scope } = bridge.data;\n const chosenTimeout = chooseTimeout(timeout, scope.timeout).getTimeout(\n config\n );\n scope.hooks.teardown.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n chosenTimeout,\n hook.options.timeout\n ).getTimeout(config).milliseconds;\n afterAll(async () => {\n if (!hook.canExecute(...tags)) {\n return;\n }\n event.teardown.emitStart({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n });\n const report = await hook.execute(staticApp, tags);\n event.teardown.emitEnd({\n title: `${hook.name}: ${hook.description}`,\n tags: [...tags],\n status: report.status,\n error: report.error,\n });\n\n if (report.error) {\n const message = `${hook.name}: ${hook.description} failed to execute.`;\n throw new AutomationError(message, { cause: report.error });\n }\n }, hookTimeout);\n });\n}\n","import { NullTimeout, Timeout } from \"@autometa/scopes\";\nimport { Config } from \"@autometa/config\";\nexport function getTimeout(target: Timeout | undefined, config: Config) {\n if (target && !(target instanceof NullTimeout)) {\n return target;\n }\n return Timeout.from(config?.current?.test?.timeout);\n}\n\nexport function chooseTimeout(\n timeout1: Timeout | undefined,\n timeout2: Timeout | undefined\n) {\n if (timeout2 instanceof Timeout && !(timeout2 instanceof NullTimeout)) {\n return {\n getTimeout: getTimeout.bind(null, timeout2),\n };\n }\n if (timeout1 instanceof Timeout && !(timeout1 instanceof NullTimeout)) {\n return {\n getTimeout: getTimeout.bind(null, timeout1),\n };\n }\n return {\n getTimeout: getTimeout.bind(null, Timeout.from(0)),\n };\n}\n","import { execute } from \"./executor\";\nexport { execute } from \"./executor\";\nexport { getTimeout } from \"./timeout-selector\";\nexport default execute;\n"],"mappings":"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","names":["NullTimeout","Timeout","tags","title"]}
|
package/dist/index.js
CHANGED
|
@@ -59,6 +59,10 @@ function chooseTimeout(timeout1, timeout2) {
|
|
|
59
59
|
// src/executor.ts
|
|
60
60
|
var import_scopes2 = require("@autometa/scopes");
|
|
61
61
|
var import_injection = require("@autometa/injection");
|
|
62
|
+
var outlineApps = /* @__PURE__ */ new Map();
|
|
63
|
+
var examplesApps = /* @__PURE__ */ new Map();
|
|
64
|
+
var featureApps = /* @__PURE__ */ new Map();
|
|
65
|
+
var ruleApps = /* @__PURE__ */ new Map();
|
|
62
66
|
function execute({ app, world }, global, bridge, events, config) {
|
|
63
67
|
const globalBridge = new import_test_builder.GlobalBridge(global);
|
|
64
68
|
const featureTitle = bridge.data.scope.title(bridge.data.gherkin);
|
|
@@ -104,6 +108,46 @@ function execute({ app, world }, global, bridge, events, config) {
|
|
|
104
108
|
localApp = testContainer.get(app);
|
|
105
109
|
localApp.world = testContainer.get(world);
|
|
106
110
|
localApp.di = testContainer;
|
|
111
|
+
if (!featureApps.has(name)) {
|
|
112
|
+
featureApps.set(name, []);
|
|
113
|
+
}
|
|
114
|
+
featureApps.get(name)?.push(localApp);
|
|
115
|
+
});
|
|
116
|
+
bridge.data.scope.hooks.beforeFeatureHooks.forEach((hook) => {
|
|
117
|
+
const hookTimeout = chooseTimeout(
|
|
118
|
+
chosenTimeout,
|
|
119
|
+
hook.options.timeout
|
|
120
|
+
).getTimeout(config).milliseconds;
|
|
121
|
+
(0, import_globals.beforeAll)(async () => {
|
|
122
|
+
if (!hook.canExecute(...bridge.data.gherkin.tags)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const tags2 = bridge?.data?.gherkin?.tags ?? [];
|
|
126
|
+
const report = await hook.execute(staticApp, ...tags2);
|
|
127
|
+
if (report.error) {
|
|
128
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
129
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
130
|
+
}
|
|
131
|
+
}, hookTimeout);
|
|
132
|
+
});
|
|
133
|
+
bridge.data.scope.hooks.afterFeatureHooks.forEach((hook) => {
|
|
134
|
+
const hookTimeout = chooseTimeout(
|
|
135
|
+
chosenTimeout,
|
|
136
|
+
hook.options.timeout
|
|
137
|
+
).getTimeout(config).milliseconds;
|
|
138
|
+
(0, import_globals.afterAll)(async () => {
|
|
139
|
+
if (!hook.canExecute(...bridge.data.gherkin.tags)) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
143
|
+
const tags2 = bridge?.data?.gherkin?.tags ?? [];
|
|
144
|
+
const apps = featureApps.get(testName);
|
|
145
|
+
const report = await hook.execute(staticApp, apps, ...tags2);
|
|
146
|
+
if (report.error) {
|
|
147
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
148
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
149
|
+
}
|
|
150
|
+
}, hookTimeout);
|
|
107
151
|
});
|
|
108
152
|
bootstrapSetupHooks(globalBridge, staticApp, events, [
|
|
109
153
|
config,
|
|
@@ -160,6 +204,10 @@ function execute({ app, world }, global, bridge, events, config) {
|
|
|
160
204
|
const message = `${count} asynchronous Test Events were rejected.`;
|
|
161
205
|
console.warn(message);
|
|
162
206
|
}
|
|
207
|
+
featureApps.clear();
|
|
208
|
+
outlineApps.clear();
|
|
209
|
+
examplesApps.clear();
|
|
210
|
+
ruleApps.clear();
|
|
163
211
|
});
|
|
164
212
|
}
|
|
165
213
|
function bootstrapBackground(root, bridge, localApp, events, [config, timeout]) {
|
|
@@ -336,6 +384,7 @@ function bootstrapScenarioOutline(root, bridge, localApp, staticApp, events, [co
|
|
|
336
384
|
} = bridge;
|
|
337
385
|
const title = scope.title(gherkin);
|
|
338
386
|
const retry = [...gherkin.tags].find((tag) => tag.startsWith("@retries="));
|
|
387
|
+
const { beforeScenarioOutlineHooks, afterScenarioOutlineHooks } = scope.hooks;
|
|
339
388
|
const [group, modifier] = getGroupOrModifier(
|
|
340
389
|
bridge,
|
|
341
390
|
config.current.test?.tagFilter
|
|
@@ -344,7 +393,58 @@ function bootstrapScenarioOutline(root, bridge, localApp, staticApp, events, [co
|
|
|
344
393
|
timeout,
|
|
345
394
|
bridge.data.scope.timeout
|
|
346
395
|
).getTimeout(config).milliseconds;
|
|
396
|
+
const original = localApp;
|
|
397
|
+
localApp = () => {
|
|
398
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
399
|
+
if (!outlineApps.has(testName)) {
|
|
400
|
+
outlineApps.set(testName, []);
|
|
401
|
+
}
|
|
402
|
+
const apps = outlineApps.get(testName);
|
|
403
|
+
const app = original();
|
|
404
|
+
apps.push(app);
|
|
405
|
+
return app;
|
|
406
|
+
};
|
|
347
407
|
group(title, () => {
|
|
408
|
+
beforeScenarioOutlineHooks.forEach((hook) => {
|
|
409
|
+
const hookTimeout = chooseTimeout(
|
|
410
|
+
timeout,
|
|
411
|
+
hook.options.timeout
|
|
412
|
+
).getTimeout(config).milliseconds;
|
|
413
|
+
(0, import_globals.beforeAll)(async () => {
|
|
414
|
+
if (!hook.canExecute(...gherkin.tags)) {
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
events.beforeScenarioOutline.emitStart({
|
|
418
|
+
title,
|
|
419
|
+
modifier,
|
|
420
|
+
tags: [...gherkin.tags]
|
|
421
|
+
});
|
|
422
|
+
const tags = gherkin.tags ?? [];
|
|
423
|
+
events.beforeScenarioOutline.emitStart({
|
|
424
|
+
title,
|
|
425
|
+
modifier,
|
|
426
|
+
tags: [...gherkin.tags]
|
|
427
|
+
});
|
|
428
|
+
const report = await hook.execute(staticApp, ...tags);
|
|
429
|
+
if (report.error) {
|
|
430
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
431
|
+
events.beforeScenarioOutline.emitEnd({
|
|
432
|
+
title,
|
|
433
|
+
modifier,
|
|
434
|
+
error: report.error,
|
|
435
|
+
tags: [...gherkin.tags],
|
|
436
|
+
status: "FAILED"
|
|
437
|
+
});
|
|
438
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
439
|
+
}
|
|
440
|
+
events.beforeScenarioOutline.emitEnd({
|
|
441
|
+
title,
|
|
442
|
+
modifier,
|
|
443
|
+
tags: [...gherkin.tags],
|
|
444
|
+
status: "PASSED"
|
|
445
|
+
});
|
|
446
|
+
}, hookTimeout);
|
|
447
|
+
});
|
|
348
448
|
(0, import_globals.beforeAll)(() => {
|
|
349
449
|
if (retry) {
|
|
350
450
|
const count = parseInt(retry.split("=")[1]);
|
|
@@ -366,6 +466,43 @@ function bootstrapScenarioOutline(root, bridge, localApp, staticApp, events, [co
|
|
|
366
466
|
});
|
|
367
467
|
bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout]);
|
|
368
468
|
bootstrapTeardownHooks(bridge, staticApp, events, [config, timeout]);
|
|
469
|
+
afterScenarioOutlineHooks.forEach((hook) => {
|
|
470
|
+
const hookTimeout = chooseTimeout(
|
|
471
|
+
timeout,
|
|
472
|
+
hook.options.timeout
|
|
473
|
+
).getTimeout(config).milliseconds;
|
|
474
|
+
(0, import_globals.afterAll)(async () => {
|
|
475
|
+
if (!hook.canExecute(...gherkin.tags)) {
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
479
|
+
const tags = gherkin.tags ?? [];
|
|
480
|
+
const apps = outlineApps.get(testName);
|
|
481
|
+
events.afterScenarioOutline.emitStart({
|
|
482
|
+
title,
|
|
483
|
+
modifier,
|
|
484
|
+
tags: [...gherkin.tags]
|
|
485
|
+
});
|
|
486
|
+
const report = await hook.execute(staticApp, apps, ...tags);
|
|
487
|
+
if (report.error) {
|
|
488
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
489
|
+
events.scenarioOutline.emitEnd({
|
|
490
|
+
title,
|
|
491
|
+
modifier,
|
|
492
|
+
error: report.error,
|
|
493
|
+
tags: [...gherkin.tags],
|
|
494
|
+
status: "FAILED"
|
|
495
|
+
});
|
|
496
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
497
|
+
}
|
|
498
|
+
events.afterScenarioOutline.emitEnd({
|
|
499
|
+
title,
|
|
500
|
+
modifier,
|
|
501
|
+
tags: [...gherkin.tags],
|
|
502
|
+
status: "PASSED"
|
|
503
|
+
});
|
|
504
|
+
}, hookTimeout);
|
|
505
|
+
});
|
|
369
506
|
(0, import_globals.afterAll)(() => {
|
|
370
507
|
const failures = import_test_builder2.Query.find.failed(bridge);
|
|
371
508
|
const status = getStatus(modifier, failures);
|
|
@@ -375,6 +512,8 @@ function bootstrapScenarioOutline(root, bridge, localApp, staticApp, events, [co
|
|
|
375
512
|
tags: [...gherkin.tags],
|
|
376
513
|
status
|
|
377
514
|
});
|
|
515
|
+
outlineApps.clear();
|
|
516
|
+
examplesApps.clear();
|
|
378
517
|
}, chosenTimeout);
|
|
379
518
|
});
|
|
380
519
|
}
|
|
@@ -384,6 +523,17 @@ function bootstrapExamples(root, example, localApp, staticApp, events, timeout)
|
|
|
384
523
|
const retry = [...example.data.gherkin.tags].find(
|
|
385
524
|
(tag) => tag.startsWith("@retries=")
|
|
386
525
|
);
|
|
526
|
+
const original = localApp;
|
|
527
|
+
localApp = () => {
|
|
528
|
+
const testName = import_globals.expect.getState().currentTestName ?? "unnamed test";
|
|
529
|
+
if (!examplesApps.has(testName)) {
|
|
530
|
+
examplesApps.set(testName, []);
|
|
531
|
+
}
|
|
532
|
+
const apps = examplesApps.get(testName);
|
|
533
|
+
const app = original();
|
|
534
|
+
apps.push(app);
|
|
535
|
+
return app;
|
|
536
|
+
};
|
|
387
537
|
const [group] = getGroupOrModifier(
|
|
388
538
|
example,
|
|
389
539
|
timeout[0].current.test?.tagFilter
|
|
@@ -395,7 +545,62 @@ function bootstrapExamples(root, example, localApp, staticApp, events, timeout)
|
|
|
395
545
|
import_globals.jest.retryTimes(count);
|
|
396
546
|
}
|
|
397
547
|
});
|
|
548
|
+
example.data.scope.hooks.beforeExamplesHooks.forEach((hook) => {
|
|
549
|
+
const hookTimeout = chooseTimeout(
|
|
550
|
+
timeout[1],
|
|
551
|
+
hook.options.timeout
|
|
552
|
+
).getTimeout(timeout[0]).milliseconds;
|
|
553
|
+
(0, import_globals.beforeAll)(async () => {
|
|
554
|
+
if (!hook.canExecute(...example.data.gherkin.tags)) {
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
const tags = example?.data?.gherkin?.tags ?? [];
|
|
558
|
+
events.beforeExamples.emitStart({
|
|
559
|
+
title,
|
|
560
|
+
tags: [...tags]
|
|
561
|
+
});
|
|
562
|
+
const report = await hook.execute(staticApp, ...tags);
|
|
563
|
+
if (report.error) {
|
|
564
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
565
|
+
events.beforeExamples.emitEnd({
|
|
566
|
+
title,
|
|
567
|
+
error: report.error,
|
|
568
|
+
tags: [...tags],
|
|
569
|
+
status: "FAILED"
|
|
570
|
+
});
|
|
571
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
572
|
+
}
|
|
573
|
+
events.beforeExamples.emitEnd({
|
|
574
|
+
title,
|
|
575
|
+
tags: [...tags],
|
|
576
|
+
status: "PASSED"
|
|
577
|
+
});
|
|
578
|
+
}, hookTimeout);
|
|
579
|
+
});
|
|
398
580
|
bootstrapScenarios(root, example, localApp, staticApp, events, timeout);
|
|
581
|
+
example.data.scope.hooks.afterExamplesHooks.forEach((hook) => {
|
|
582
|
+
const hookTimeout = chooseTimeout(
|
|
583
|
+
timeout[1],
|
|
584
|
+
hook.options.timeout
|
|
585
|
+
).getTimeout(timeout[0]).milliseconds;
|
|
586
|
+
(0, import_globals.afterAll)(async () => {
|
|
587
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
588
|
+
if (!hook.canExecute(...example.data.gherkin.tags)) {
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
const tags = example?.data?.gherkin?.tags ?? [];
|
|
592
|
+
const apps = examplesApps.get(testName);
|
|
593
|
+
const report = await hook.execute(staticApp, apps, ...tags);
|
|
594
|
+
if (report.error) {
|
|
595
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
596
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
597
|
+
}
|
|
598
|
+
}, hookTimeout);
|
|
599
|
+
});
|
|
600
|
+
(0, import_globals.afterAll)(() => {
|
|
601
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
602
|
+
examplesApps.delete(testName);
|
|
603
|
+
});
|
|
399
604
|
});
|
|
400
605
|
}
|
|
401
606
|
function bootstrapRules(bridge, localApp, staticApp, events, [config, timeout]) {
|
|
@@ -428,6 +633,83 @@ function bootstrapRules(bridge, localApp, staticApp, events, [config, timeout])
|
|
|
428
633
|
const count = parseInt(retry.split("=")[1]);
|
|
429
634
|
import_globals.jest.retryTimes(count);
|
|
430
635
|
}
|
|
636
|
+
const original = localApp;
|
|
637
|
+
localApp = () => {
|
|
638
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
639
|
+
if (!ruleApps.has(testName)) {
|
|
640
|
+
ruleApps.set(testName, []);
|
|
641
|
+
}
|
|
642
|
+
const apps = ruleApps.get(testName);
|
|
643
|
+
const app = original();
|
|
644
|
+
apps.push(app);
|
|
645
|
+
return app;
|
|
646
|
+
};
|
|
647
|
+
});
|
|
648
|
+
bridge.data.scope.hooks.beforeRuleHooks.forEach((hook) => {
|
|
649
|
+
const hookTimeout = chooseTimeout(
|
|
650
|
+
ruleTimeout,
|
|
651
|
+
hook.options.timeout
|
|
652
|
+
).getTimeout(config).milliseconds;
|
|
653
|
+
(0, import_globals.beforeAll)(async () => {
|
|
654
|
+
if (!hook.canExecute(...data.gherkin.tags)) {
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
const tags2 = data.gherkin.tags ?? [];
|
|
658
|
+
events.beforeRule.emitStart({
|
|
659
|
+
title: `${hook.name}: ${hook.description}`,
|
|
660
|
+
tags: [...tags2]
|
|
661
|
+
});
|
|
662
|
+
const report = await hook.execute(staticApp, ...tags2);
|
|
663
|
+
if (report.error) {
|
|
664
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
665
|
+
events.beforeRule.emitEnd({
|
|
666
|
+
title: `${hook.name}: ${hook.description}`,
|
|
667
|
+
tags: [...tags2],
|
|
668
|
+
status: "FAILED",
|
|
669
|
+
error: report.error
|
|
670
|
+
});
|
|
671
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
672
|
+
}
|
|
673
|
+
events.beforeRule.emitEnd({
|
|
674
|
+
title: `${hook.name}: ${hook.description}`,
|
|
675
|
+
tags: [...tags2],
|
|
676
|
+
status: "PASSED"
|
|
677
|
+
});
|
|
678
|
+
}, hookTimeout);
|
|
679
|
+
});
|
|
680
|
+
bridge.data.scope.hooks.afterRuleHooks.forEach((hook) => {
|
|
681
|
+
const hookTimeout = chooseTimeout(
|
|
682
|
+
ruleTimeout,
|
|
683
|
+
hook.options.timeout
|
|
684
|
+
).getTimeout(config).milliseconds;
|
|
685
|
+
(0, import_globals.afterAll)(async () => {
|
|
686
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
687
|
+
if (!hook.canExecute(...data.gherkin.tags)) {
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
690
|
+
const tags2 = data.gherkin.tags ?? [];
|
|
691
|
+
const apps = ruleApps.get(testName);
|
|
692
|
+
events.afterRule.emitStart({
|
|
693
|
+
title: `${hook.name}: ${hook.description}`,
|
|
694
|
+
tags: [...tags2]
|
|
695
|
+
});
|
|
696
|
+
const report = await hook.execute(staticApp, apps, ...tags2);
|
|
697
|
+
if (report.error) {
|
|
698
|
+
const message = `${hook.name}: ${hook.description} failed to execute.`;
|
|
699
|
+
events.afterRule.emitEnd({
|
|
700
|
+
title: `${hook.name}: ${hook.description}`,
|
|
701
|
+
tags: [...tags2],
|
|
702
|
+
status: "FAILED",
|
|
703
|
+
error: report.error
|
|
704
|
+
});
|
|
705
|
+
throw new import_errors.AutomationError(message, { cause: report.error });
|
|
706
|
+
}
|
|
707
|
+
events.afterRule.emitEnd({
|
|
708
|
+
title: `${hook.name}: ${hook.description}`,
|
|
709
|
+
tags: [...tags2],
|
|
710
|
+
status: "PASSED"
|
|
711
|
+
});
|
|
712
|
+
}, hookTimeout);
|
|
431
713
|
});
|
|
432
714
|
bootstrapSetupHooks(rule, staticApp, events, transferTimeout);
|
|
433
715
|
bootstrapBeforeHooks(bridge, rule, localApp, events, transferTimeout);
|
|
@@ -451,6 +733,8 @@ function bootstrapRules(bridge, localApp, staticApp, events, [config, timeout])
|
|
|
451
733
|
tags: [...data.gherkin.tags],
|
|
452
734
|
status
|
|
453
735
|
});
|
|
736
|
+
const testName = import_globals.expect.getState().currentTestName;
|
|
737
|
+
ruleApps.delete(testName);
|
|
454
738
|
}, ruleTimeout.milliseconds);
|
|
455
739
|
});
|
|
456
740
|
});
|
|
@@ -503,9 +787,10 @@ function bootstrapBeforeHooks(root, bridge, localApp, events, [config, timeout])
|
|
|
503
787
|
bridge.data.scope.timeout
|
|
504
788
|
).getTimeout(config);
|
|
505
789
|
bridge.data.scope.hooks.before.forEach((hook) => {
|
|
506
|
-
const hookTimeout = chooseTimeout(
|
|
507
|
-
|
|
508
|
-
|
|
790
|
+
const hookTimeout = chooseTimeout(
|
|
791
|
+
chosenTimeout,
|
|
792
|
+
hook.options.timeout
|
|
793
|
+
).getTimeout(config).milliseconds;
|
|
509
794
|
(0, import_globals.beforeEach)(async () => {
|
|
510
795
|
const testName = import_globals.expect.getState().currentTestName;
|
|
511
796
|
if (!testName)
|
|
@@ -548,7 +833,7 @@ function bootstrapSetupHooks(bridge, staticApp, events, [config, timeout]) {
|
|
|
548
833
|
setups.forEach((hook) => {
|
|
549
834
|
const hookTimeout = chooseTimeout(
|
|
550
835
|
import_scopes2.Timeout.from(chosenTimeout),
|
|
551
|
-
hook.timeout
|
|
836
|
+
hook.options.timeout
|
|
552
837
|
).getTimeout(config).milliseconds;
|
|
553
838
|
const tags = gherkin.tags ?? [];
|
|
554
839
|
(0, import_globals.beforeAll)(async () => {
|
|
@@ -579,7 +864,7 @@ function bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout])
|
|
|
579
864
|
scope.hooks.after.forEach((hook) => {
|
|
580
865
|
const hookTimeout = chooseTimeout(
|
|
581
866
|
import_scopes2.Timeout.from(chosenTimeout),
|
|
582
|
-
hook.timeout
|
|
867
|
+
hook.options.timeout
|
|
583
868
|
).getTimeout(config).milliseconds;
|
|
584
869
|
(0, import_globals.afterEach)(async () => {
|
|
585
870
|
const testName = import_globals.expect.getState().currentTestName;
|
|
@@ -614,15 +899,16 @@ function bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout])
|
|
|
614
899
|
});
|
|
615
900
|
}
|
|
616
901
|
function bootstrapTeardownHooks(bridge, staticApp, event, [config, timeout]) {
|
|
617
|
-
const tags = bridge.data.gherkin.tags
|
|
902
|
+
const tags = [...bridge.data.gherkin.tags];
|
|
618
903
|
const { scope } = bridge.data;
|
|
619
904
|
const chosenTimeout = chooseTimeout(timeout, scope.timeout).getTimeout(
|
|
620
905
|
config
|
|
621
906
|
);
|
|
622
907
|
scope.hooks.teardown.forEach((hook) => {
|
|
623
|
-
const hookTimeout = chooseTimeout(
|
|
624
|
-
|
|
625
|
-
|
|
908
|
+
const hookTimeout = chooseTimeout(
|
|
909
|
+
chosenTimeout,
|
|
910
|
+
hook.options.timeout
|
|
911
|
+
).getTimeout(config).milliseconds;
|
|
626
912
|
(0, import_globals.afterAll)(async () => {
|
|
627
913
|
if (!hook.canExecute(...tags)) {
|
|
628
914
|
return;
|
|
@@ -631,7 +917,7 @@ function bootstrapTeardownHooks(bridge, staticApp, event, [config, timeout]) {
|
|
|
631
917
|
title: `${hook.name}: ${hook.description}`,
|
|
632
918
|
tags: [...tags]
|
|
633
919
|
});
|
|
634
|
-
const report = await hook.execute(staticApp,
|
|
920
|
+
const report = await hook.execute(staticApp, tags);
|
|
635
921
|
event.teardown.emitEnd({
|
|
636
922
|
title: `${hook.name}: ${hook.description}`,
|
|
637
923
|
tags: [...tags],
|