@autometa/jest-executor 0.0.0 → 0.1.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/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # @autometa/jest-executor
2
+
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 554b77e: Releasing packages
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [554b77e]
12
+ - @autometa/app@0.1.0
13
+ - @autometa/asserters@0.1.0
14
+ - @autometa/config@0.1.0
15
+ - @autometa/errors@0.1.0
16
+ - @autometa/events@0.1.0
17
+ - @autometa/gherkin@0.4.0
18
+ - @autometa/scopes@0.2.0
19
+ - @autometa/test-builder@0.1.0
20
+ - @autometa/types@0.4.0
package/dist/esm/index.js CHANGED
@@ -15,9 +15,41 @@ import {
15
15
  import { getApp } from "@autometa/app";
16
16
  import { AutomationError } from "@autometa/errors";
17
17
  import { Query } from "@autometa/test-builder";
18
- function execute({ app, world }, bridge, events) {
18
+
19
+ // src/timeout-selector.ts
20
+ import { NullTimeout, Timeout } from "@autometa/scopes";
21
+ function getTimeout(target, config) {
22
+ if (target && !(target instanceof NullTimeout)) {
23
+ return target;
24
+ }
25
+ return Timeout.from(config?.current?.test?.timeout);
26
+ }
27
+ function chooseTimeout(timeout1, timeout2) {
28
+ if (timeout2 instanceof Timeout && !(timeout2 instanceof NullTimeout)) {
29
+ return {
30
+ getTimeout: getTimeout.bind(null, timeout2)
31
+ };
32
+ }
33
+ if (timeout1 instanceof Timeout && !(timeout1 instanceof NullTimeout)) {
34
+ return {
35
+ getTimeout: getTimeout.bind(null, timeout1)
36
+ };
37
+ }
38
+ return {
39
+ getTimeout: getTimeout.bind(null, Timeout.from(0))
40
+ };
41
+ }
42
+
43
+ // src/executor.ts
44
+ import { NullTimeout as NullTimeout2, Timeout as Timeout2 } from "@autometa/scopes";
45
+ function execute({ app, world }, bridge, events, config) {
46
+ config.current;
19
47
  const featureTitle = bridge.data.scope.title(bridge.data.gherkin);
20
48
  const [group, modifier] = getGroupOrModifier(bridge);
49
+ const chosenTimeout = chooseTimeout(
50
+ new NullTimeout2(),
51
+ bridge.data.scope.timeout
52
+ ).getTimeout(config);
21
53
  beforeAll(() => {
22
54
  events.feature.emitStart({
23
55
  title: featureTitle,
@@ -25,20 +57,35 @@ function execute({ app, world }, bridge, events) {
25
57
  modifier,
26
58
  tags: [...bridge.data.gherkin.tags]
27
59
  });
28
- });
60
+ }, chosenTimeout.milliseconds);
29
61
  group(featureTitle, () => {
30
62
  let localApp;
31
63
  const staticApp = getApp(app, world);
32
64
  beforeEach(() => {
33
65
  localApp = getApp(app, world);
34
66
  });
35
- bootstrapSetupHooks(bridge, staticApp, events);
36
- bootstrapBeforeHooks(bridge, () => localApp, events);
37
- bootstrapBackground(bridge, () => localApp, events);
38
- bootstrapScenarios(bridge, () => localApp, staticApp, events);
39
- bootstrapRules(bridge, () => localApp, staticApp, events);
40
- bootstrapAfterHooks(bridge, () => localApp, events);
41
- bootstrapTeardownHooks(bridge, staticApp, events);
67
+ bootstrapSetupHooks(bridge, staticApp, events, [config, chosenTimeout]);
68
+ bootstrapBeforeHooks(bridge, bridge, () => localApp, events, [
69
+ config,
70
+ chosenTimeout
71
+ ]);
72
+ bootstrapBackground(bridge, bridge, () => localApp, events, [
73
+ config,
74
+ chosenTimeout
75
+ ]);
76
+ bootstrapScenarios(bridge, bridge, () => localApp, staticApp, events, [
77
+ config,
78
+ chosenTimeout
79
+ ]);
80
+ bootstrapRules(bridge, () => localApp, staticApp, events, [
81
+ config,
82
+ chosenTimeout
83
+ ]);
84
+ bootstrapAfterHooks(bridge, bridge, () => localApp, events, [
85
+ config,
86
+ chosenTimeout
87
+ ]);
88
+ bootstrapTeardownHooks(bridge, staticApp, events, [config, chosenTimeout]);
42
89
  });
43
90
  afterAll(() => {
44
91
  const failures = Query.find.failed(bridge);
@@ -51,23 +98,27 @@ function execute({ app, world }, bridge, events) {
51
98
  });
52
99
  });
53
100
  }
54
- function bootstrapBackground(bridge, localApp, events) {
101
+ function bootstrapBackground(root, bridge, localApp, events, [config, timeout]) {
55
102
  const background = bridge.background;
56
103
  if (!background)
57
104
  return;
58
- const testName = expect.getState().currentTestName;
59
- if (!testName)
60
- throw new AutomationError("A Scenario must have a title");
61
- const scenarioBridge = find(bridge, testName);
62
- if (!scenarioBridge) {
63
- throw new AutomationError(
64
- `No matching scenario bridge was found matching the test name: ${testName}`
65
- );
66
- }
105
+ const chosenTimeout = chooseTimeout(
106
+ timeout,
107
+ bridge.data.scope.timeout
108
+ ).getTimeout(config).milliseconds;
67
109
  const tags = bridge?.data?.gherkin?.tags ?? [];
68
110
  if (tags.has("@skip") || tags.has("@skipped"))
69
111
  return;
70
112
  beforeEach(async () => {
113
+ const testName = expect.getState().currentTestName;
114
+ if (!testName)
115
+ throw new AutomationError("A Scenario must have a title");
116
+ const scenarioBridge = find(root, testName);
117
+ if (!scenarioBridge) {
118
+ throw new AutomationError(
119
+ `No matching scenario bridge was found matching the test name: ${testName}`
120
+ );
121
+ }
71
122
  const title = background.data.scope.title(background.data.gherkin);
72
123
  events.before.emitStart({
73
124
  title,
@@ -76,11 +127,20 @@ function bootstrapBackground(bridge, localApp, events) {
76
127
  const steps = background.steps;
77
128
  try {
78
129
  for (const step of steps) {
79
- await step.data.scope.execute(step.data.gherkin, localApp());
130
+ await step.data.scope.execute(
131
+ background.data.gherkin,
132
+ step.data.gherkin,
133
+ localApp()
134
+ );
80
135
  }
136
+ events.before.emitEnd({
137
+ title,
138
+ tags: [...tags],
139
+ status: "PASSED"
140
+ });
81
141
  } catch (e) {
82
142
  events.before.emitEnd({
83
- title: background.data.scope.title(background.data.gherkin),
143
+ title,
84
144
  tags: [...tags],
85
145
  status: "FAILED",
86
146
  error: e
@@ -89,53 +149,83 @@ function bootstrapBackground(bridge, localApp, events) {
89
149
  Test: ${testName}`;
90
150
  throw new AutomationError(message, { cause: e });
91
151
  }
92
- });
152
+ }, chosenTimeout);
93
153
  }
94
- function bootstrapScenarios(bridge, localApp, staticApp, events) {
154
+ function bootstrapScenarios(root, bridge, localApp, staticApp, events, [config, timeout]) {
95
155
  const { scenarios } = bridge;
156
+ const chosenTimeout = chooseTimeout(
157
+ timeout,
158
+ bridge.data.scope.timeout
159
+ ).getTimeout(config);
96
160
  scenarios.forEach((scenario) => {
97
161
  if (isOutline(scenario)) {
98
- bootstrapScenarioOutline(scenario, localApp, staticApp, events);
162
+ bootstrapScenarioOutline(root, scenario, localApp, staticApp, events, [
163
+ config,
164
+ chosenTimeout
165
+ ]);
99
166
  return;
100
167
  }
101
- bootstrapScenario(scenario, localApp, events);
168
+ bootstrapScenario(scenario, localApp, events, [config, chosenTimeout]);
102
169
  });
103
170
  }
104
- function bootstrapScenario(bridge, localApp, events) {
171
+ function bootstrapScenario(bridge, localApp, events, [config, timeout]) {
105
172
  const { data } = bridge;
173
+ const chosenTimeout = chooseTimeout(
174
+ timeout,
175
+ bridge.data.scope.timeout
176
+ ).getTimeout(config);
106
177
  const scenarioName = data.scope.title(data.gherkin);
107
178
  const test = getTestOrModifier(bridge);
108
- test(scenarioName, async () => {
109
- events.scenario.emitStart({
110
- title: scenarioName,
111
- tags: [...data.gherkin.tags]
112
- });
113
- try {
114
- for (const step of bridge.steps) {
115
- await step.data.scope.execute(step.data.gherkin, localApp());
116
- }
117
- } catch (e) {
118
- events.scenario.emitEnd({
179
+ test(
180
+ scenarioName,
181
+ async () => {
182
+ events.scenario.emitStart({
119
183
  title: scenarioName,
120
- tags: [...data.gherkin.tags],
121
- status: "FAILED",
122
- error: e
184
+ tags: [...data.gherkin.tags]
123
185
  });
124
- const message = `${scenarioName} failed to execute.`;
125
- throw new AutomationError(message, { cause: e });
126
- }
127
- });
186
+ try {
187
+ for (const step of bridge.steps) {
188
+ await step.data.scope.execute(
189
+ bridge.data.gherkin,
190
+ step.data.gherkin,
191
+ localApp()
192
+ );
193
+ }
194
+ bridge.report = { passed: true };
195
+ events.scenario.emitEnd({
196
+ title: scenarioName,
197
+ tags: [...data.gherkin.tags],
198
+ status: "PASSED"
199
+ });
200
+ } catch (e) {
201
+ events.scenario.emitEnd({
202
+ title: scenarioName,
203
+ tags: [...data.gherkin.tags],
204
+ status: "FAILED",
205
+ error: e
206
+ });
207
+ bridge.report = { passed: false, error: e };
208
+ const message = `${scenarioName} failed to execute.`;
209
+ throw new AutomationError(message, { cause: e });
210
+ }
211
+ },
212
+ chosenTimeout.milliseconds
213
+ );
128
214
  }
129
215
  function isOutline(data) {
130
216
  return data instanceof ScenarioOutlineBridge;
131
217
  }
132
- function bootstrapScenarioOutline(bridge, localApp, staticApp, events) {
218
+ function bootstrapScenarioOutline(root, bridge, localApp, staticApp, events, [config, timeout]) {
133
219
  const {
134
220
  data: { scope, gherkin },
135
221
  examples
136
222
  } = bridge;
137
223
  const title = scope.title(gherkin);
138
224
  const [group, modifier] = getGroupOrModifier(bridge);
225
+ const chosenTimeout = chooseTimeout(
226
+ timeout,
227
+ bridge.data.scope.timeout
228
+ ).getTimeout(config).milliseconds;
139
229
  group(title, () => {
140
230
  beforeAll(() => {
141
231
  events.scenarioOutline.emitStart({
@@ -144,13 +234,16 @@ function bootstrapScenarioOutline(bridge, localApp, staticApp, events) {
144
234
  tags: [...gherkin.tags]
145
235
  });
146
236
  });
147
- bootstrapSetupHooks(bridge, staticApp, events);
148
- bootstrapBeforeHooks(bridge, localApp, events);
237
+ bootstrapSetupHooks(bridge, staticApp, events, [config, timeout]);
238
+ bootstrapBeforeHooks(root, bridge, localApp, events, [config, timeout]);
149
239
  examples.forEach((example) => {
150
- bootstrapExamples(example, localApp, staticApp, events);
240
+ bootstrapExamples(root, example, localApp, staticApp, events, [
241
+ config,
242
+ timeout
243
+ ]);
151
244
  });
152
- bootstrapAfterHooks(bridge, localApp, events);
153
- bootstrapTeardownHooks(bridge, staticApp, events);
245
+ bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout]);
246
+ bootstrapTeardownHooks(bridge, staticApp, events, [config, timeout]);
154
247
  afterAll(() => {
155
248
  const failures = Query.find.failed(bridge);
156
249
  const status = modifier === "skip" ? "SKIPPED" : failures.length === 0 ? "PASSED" : "FAILED";
@@ -160,18 +253,28 @@ function bootstrapScenarioOutline(bridge, localApp, staticApp, events) {
160
253
  tags: [...gherkin.tags],
161
254
  status
162
255
  });
163
- });
256
+ }, chosenTimeout);
164
257
  });
165
258
  }
166
- function bootstrapExamples(example, localApp, staticApp, events) {
259
+ function bootstrapExamples(root, example, localApp, staticApp, events, timeout) {
167
260
  const title = example.data.scope.title(example.data.gherkin);
168
261
  const [group] = getGroupOrModifier(example);
169
262
  group(title, () => {
170
- bootstrapScenarios(example, localApp, staticApp, events);
263
+ bootstrapScenarios(root, example, localApp, staticApp, events, timeout);
171
264
  });
172
265
  }
173
- function bootstrapRules(bridge, localApp, staticApp, events) {
174
- bridge.rules.forEach(({ data }) => {
266
+ function bootstrapRules(bridge, localApp, staticApp, events, [config, timeout]) {
267
+ const chosenTimeout = chooseTimeout(
268
+ timeout,
269
+ bridge.data.scope.timeout
270
+ ).getTimeout(config);
271
+ bridge.rules.forEach((rule) => {
272
+ const ruleTimeout = chooseTimeout(
273
+ chosenTimeout,
274
+ rule.data.scope.timeout
275
+ ).getTimeout(config);
276
+ const transferTimeout = [config, ruleTimeout];
277
+ const { data } = rule;
175
278
  const ruleName = data.scope.title(data.gherkin);
176
279
  const [group, modifier] = getGroupOrModifier(bridge);
177
280
  group(ruleName, () => {
@@ -182,14 +285,21 @@ function bootstrapRules(bridge, localApp, staticApp, events) {
182
285
  tags: [...data.gherkin.tags]
183
286
  });
184
287
  });
185
- bootstrapSetupHooks(bridge, staticApp, events);
186
- bootstrapBeforeHooks(bridge, localApp, events);
187
- bootstrapBackground(bridge, localApp, events);
188
- bootstrapScenarios(bridge, localApp, staticApp, events);
189
- bootstrapAfterHooks(bridge, localApp, events);
190
- bootstrapTeardownHooks(bridge, staticApp, events);
288
+ bootstrapSetupHooks(rule, staticApp, events, transferTimeout);
289
+ bootstrapBeforeHooks(bridge, rule, localApp, events, transferTimeout);
290
+ bootstrapBackground(bridge, rule, localApp, events, transferTimeout);
291
+ bootstrapScenarios(
292
+ bridge,
293
+ rule,
294
+ localApp,
295
+ staticApp,
296
+ events,
297
+ transferTimeout
298
+ );
299
+ bootstrapAfterHooks(bridge, rule, localApp, events, transferTimeout);
300
+ bootstrapTeardownHooks(rule, staticApp, events, transferTimeout);
191
301
  afterAll(() => {
192
- const failures = Query.find.failed(bridge);
302
+ const failures = Query.find.failed(rule);
193
303
  const status = modifier === "skip" ? "SKIPPED" : failures.length === 0 ? "PASSED" : "FAILED";
194
304
  events.rule.emitEnd({
195
305
  title: ruleName,
@@ -197,7 +307,7 @@ function bootstrapRules(bridge, localApp, staticApp, events) {
197
307
  tags: [...data.gherkin.tags],
198
308
  status
199
309
  });
200
- });
310
+ }, ruleTimeout.milliseconds);
201
311
  });
202
312
  });
203
313
  }
@@ -221,19 +331,29 @@ function getTestOrModifier({ data }) {
221
331
  }
222
332
  return it;
223
333
  }
224
- function bootstrapBeforeHooks(bridge, localApp, events) {
334
+ function bootstrapBeforeHooks(root, bridge, localApp, events, [config, timeout]) {
335
+ const chosenTimeout = chooseTimeout(
336
+ timeout,
337
+ bridge.data.scope.timeout
338
+ ).getTimeout(config);
225
339
  bridge.data.scope.hooks.before.forEach((hook) => {
226
- const testName = expect.getState().currentTestName;
227
- if (!testName)
228
- throw new AutomationError("A Scenario must have a title");
229
- const scenarioBridge = find(bridge, testName);
230
- if (!scenarioBridge) {
231
- throw new AutomationError(
232
- `No matching scenario was found matching the test name: ${testName}`
233
- );
234
- }
235
- const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
340
+ const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(
341
+ config
342
+ ).milliseconds;
236
343
  beforeEach(async () => {
344
+ const testName = expect.getState().currentTestName;
345
+ if (!testName)
346
+ throw new AutomationError("A Scenario must have a title");
347
+ const scenarioBridge = find(root, testName);
348
+ if (!scenarioBridge) {
349
+ throw new AutomationError(
350
+ `No matching scenario was found matching the test name: ${testName}`
351
+ );
352
+ }
353
+ if (!hook.canExecute(...bridge.data.gherkin.tags)) {
354
+ return;
355
+ }
356
+ const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
237
357
  events.before.emitStart({
238
358
  title: hook.name,
239
359
  tags: [...tags]
@@ -249,13 +369,24 @@ function bootstrapBeforeHooks(bridge, localApp, events) {
249
369
  const message = `${hook.name}: ${hook.description} failed to execute.`;
250
370
  throw new AutomationError(message, { cause: report.error });
251
371
  }
252
- });
372
+ }, hookTimeout);
253
373
  });
254
374
  }
255
- function bootstrapSetupHooks(bridge, staticApp, events) {
375
+ function bootstrapSetupHooks(bridge, staticApp, events, [config, timeout]) {
376
+ const chosenTimeout = chooseTimeout(
377
+ timeout,
378
+ bridge.data.scope.timeout
379
+ ).getTimeout(config).milliseconds;
256
380
  bridge.data.scope.hooks.setup.forEach((hook) => {
381
+ const hookTimeout = chooseTimeout(
382
+ Timeout2.from(chosenTimeout),
383
+ hook.timeout
384
+ ).getTimeout(config).milliseconds;
257
385
  const tags = bridge.data.gherkin.tags ?? [];
258
386
  beforeAll(async () => {
387
+ if (!hook.canExecute(...tags)) {
388
+ return;
389
+ }
259
390
  events.setup.emitStart({
260
391
  title: hook.name
261
392
  });
@@ -269,22 +400,33 @@ function bootstrapSetupHooks(bridge, staticApp, events) {
269
400
  const message = `${hook.name}: ${hook.description} failed to execute.`;
270
401
  throw new AutomationError(message, { cause: report.error });
271
402
  }
272
- });
403
+ }, hookTimeout);
273
404
  });
274
405
  }
275
- function bootstrapAfterHooks(bridge, localApp, events) {
406
+ function bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout]) {
407
+ const chosenTimeout = chooseTimeout(
408
+ timeout,
409
+ bridge.data.scope.timeout
410
+ ).getTimeout(config).milliseconds;
276
411
  bridge.data.scope.hooks.after.forEach((hook) => {
277
- const testName = expect.getState().currentTestName;
278
- if (!testName)
279
- throw new AutomationError("A Scenario must have a title");
280
- const scenarioBridge = find(bridge, testName);
281
- if (!scenarioBridge) {
282
- throw new AutomationError(
283
- `No matching scenario bridge was found matching the test name: ${testName}`
284
- );
285
- }
286
- const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
412
+ const hookTimeout = chooseTimeout(
413
+ Timeout2.from(chosenTimeout),
414
+ hook.timeout
415
+ ).getTimeout(config).milliseconds;
287
416
  afterEach(async () => {
417
+ const testName = expect.getState().currentTestName;
418
+ if (!testName)
419
+ throw new AutomationError("A Scenario must have a title");
420
+ const scenarioBridge = find(root, testName);
421
+ if (!scenarioBridge) {
422
+ throw new AutomationError(
423
+ `No matching scenario bridge was found matching the test name: ${testName}`
424
+ );
425
+ }
426
+ if (!hook.canExecute(...bridge.data.gherkin.tags)) {
427
+ return;
428
+ }
429
+ const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
288
430
  events.after.emitStart({
289
431
  title: hook.name,
290
432
  tags: [...tags]
@@ -300,12 +442,19 @@ function bootstrapAfterHooks(bridge, localApp, events) {
300
442
  const message = `${hook.name}: ${hook.description} failed to execute.`;
301
443
  throw new AutomationError(message, { cause: report.error });
302
444
  }
303
- });
445
+ }, hookTimeout);
304
446
  });
305
447
  }
306
- function bootstrapTeardownHooks(bridge, staticApp, event) {
448
+ function bootstrapTeardownHooks(bridge, staticApp, event, [config, timeout]) {
307
449
  const tags = bridge.data.gherkin.tags ?? [];
450
+ const chosenTimeout = chooseTimeout(
451
+ timeout,
452
+ bridge.data.scope.timeout
453
+ ).getTimeout(config);
308
454
  bridge.data.scope.hooks.teardown.forEach((hook) => {
455
+ const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(
456
+ config
457
+ ).milliseconds;
309
458
  afterAll(async () => {
310
459
  event.teardown.emitStart({
311
460
  title: hook.name,
@@ -322,12 +471,15 @@ function bootstrapTeardownHooks(bridge, staticApp, event) {
322
471
  const message = `${hook.name}: ${hook.description} failed to execute.`;
323
472
  throw new AutomationError(message, { cause: report.error });
324
473
  }
325
- });
474
+ }, hookTimeout);
326
475
  });
327
476
  }
328
477
 
329
478
  // src/index.ts
330
479
  var src_default = execute;
331
480
  export {
332
- src_default as default
481
+ src_default as default,
482
+ execute,
483
+ getTimeout
333
484
  };
485
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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} from \"@autometa/test-builder\";\nimport {\n describe,\n it,\n expect,\n beforeEach,\n afterEach,\n afterAll,\n beforeAll\n} from \"@jest/globals\";\nimport { type App, AutometaApp, AutometaWorld, getApp } from \"@autometa/app\";\nimport { Class } from \"@autometa/types\";\nimport { AutomationError } 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 { NullTimeout, Timeout } from \"@autometa/scopes\";\nexport function execute(\n { app, world }: { app: Class<AutometaApp>; world: Class<AutometaWorld> },\n bridge: FeatureBridge,\n events: TestEventEmitter,\n config: Config\n) {\n config.current;\n const featureTitle = bridge.data.scope.title(bridge.data.gherkin);\n const [group, modifier] = getGroupOrModifier(bridge);\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 let localApp: App;\n const staticApp: App = getApp(app, world);\n beforeEach(() => {\n localApp = getApp(app, world);\n });\n\n bootstrapSetupHooks(bridge, staticApp, events, [config, chosenTimeout]);\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 bootstrapTeardownHooks(bridge, staticApp, events, [config, chosenTimeout]);\n });\n afterAll(() => {\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 });\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 await step.data.scope.execute(\n background.data.gherkin,\n step.data.gherkin,\n localApp()\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);\n test(\n scenarioName,\n async () => {\n events.scenario.emitStart({\n title: scenarioName,\n tags: [...data.gherkin.tags]\n });\n try {\n for (const step of bridge.steps) {\n await step.data.scope.execute(\n bridge.data.gherkin,\n step.data.gherkin,\n localApp()\n );\n }\n bridge.report = { passed: true };\n events.scenario.emitEnd({\n title: scenarioName,\n tags: [...data.gherkin.tags],\n status: \"PASSED\"\n });\n } catch (e) {\n events.scenario.emitEnd({\n title: scenarioName,\n tags: [...data.gherkin.tags],\n status: \"FAILED\",\n error: e as Error\n });\n bridge.report = { passed: false, error: e as Error };\n const message = `${scenarioName} failed to execute.`;\n throw new AutomationError(message, { cause: e as Error });\n }\n },\n chosenTimeout.milliseconds\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 [group, modifier] = getGroupOrModifier(bridge);\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n group(title, () => {\n beforeAll(() => {\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 =\n modifier === \"skip\"\n ? \"SKIPPED\"\n : failures.length === 0\n ? \"PASSED\"\n : \"FAILED\";\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 title = example.data.scope.title(example.data.gherkin);\n const [group] = getGroupOrModifier(example);\n group(title, () => {\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 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(bridge);\n\n group(ruleName, () => {\n beforeAll(() => {\n events.rule.emitStart({\n title: ruleName,\n modifier,\n tags: [...data.gherkin.tags]\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 =\n modifier === \"skip\"\n ? \"SKIPPED\"\n : failures.length === 0\n ? \"PASSED\"\n : \"FAILED\";\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 getGroupOrModifier({\n data\n}: RuleBridge | FeatureBridge | ScenarioOutlineBridge | ExamplesBridge) {\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 return [describe, undefined] as const;\n}\n\nfunction getTestOrModifier({ data }: ScenarioBridge) {\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 return it;\n}\n\nexport function bootstrapBeforeHooks(\n root: FeatureBridge,\n bridge: 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(...bridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.before.emitStart({\n title: hook.name,\n tags: [...tags]\n });\n const report = await hook.execute(localApp(), ...tags);\n events.before.emitEnd({\n title: hook.name,\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}\nexport function bootstrapSetupHooks(\n bridge: FeatureBridge | RuleBridge | ScenarioOutlineBridge,\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).milliseconds;\n bridge.data.scope.hooks.setup.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n Timeout.from(chosenTimeout),\n hook.timeout\n ).getTimeout(config).milliseconds;\n const tags = bridge.data.gherkin.tags ?? [];\n\n beforeAll(async () => {\n if (!hook.canExecute(...tags)) {\n return;\n }\n events.setup.emitStart({\n title: hook.name\n });\n const report = await hook.execute(staticApp, ...tags);\n\n events.setup.emitEnd({\n title: hook.name,\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: 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).milliseconds;\n bridge.data.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 matching scenario bridge was found matching the test name: ${testName}`\n );\n }\n if (!hook.canExecute(...bridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.after.emitStart({\n title: hook.name,\n tags: [...tags]\n });\n\n const report = await hook.execute(localApp(), ...tags);\n events.after.emitEnd({\n title: hook.name,\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: FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n staticApp: App,\n event: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const tags = bridge.data.gherkin.tags ?? [];\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n bridge.data.scope.hooks.teardown.forEach((hook) => {\n const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(\n config\n ).milliseconds;\n afterAll(async () => {\n event.teardown.emitStart({\n title: hook.name,\n tags: [...tags]\n });\n const report = await hook.execute(staticApp, ...tags);\n event.teardown.emitEnd({\n title: hook.name,\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"]}
@@ -0,0 +1,15 @@
1
+ import { FeatureBridge } from '@autometa/test-builder';
2
+ import { AutometaApp, AutometaWorld } from '@autometa/app';
3
+ import { Class } from '@autometa/types';
4
+ import { TestEventEmitter } from '@autometa/events';
5
+ import { Config } from '@autometa/config';
6
+ import { Timeout } from '@autometa/scopes';
7
+
8
+ declare function execute({ app, world }: {
9
+ app: Class<AutometaApp>;
10
+ world: Class<AutometaWorld>;
11
+ }, bridge: FeatureBridge, events: TestEventEmitter, config: Config): void;
12
+
13
+ declare function getTimeout(target: Timeout | undefined, config: Config): Timeout;
14
+
15
+ export { execute as default, execute, getTimeout };
package/dist/index.d.ts CHANGED
@@ -2,10 +2,14 @@ import { FeatureBridge } from '@autometa/test-builder';
2
2
  import { AutometaApp, AutometaWorld } from '@autometa/app';
3
3
  import { Class } from '@autometa/types';
4
4
  import { TestEventEmitter } from '@autometa/events';
5
+ import { Config } from '@autometa/config';
6
+ import { Timeout } from '@autometa/scopes';
5
7
 
6
8
  declare function execute({ app, world }: {
7
9
  app: Class<AutometaApp>;
8
10
  world: Class<AutometaWorld>;
9
- }, bridge: FeatureBridge, events: TestEventEmitter): void;
11
+ }, bridge: FeatureBridge, events: TestEventEmitter, config: Config): void;
10
12
 
11
- export { execute as default };
13
+ declare function getTimeout(target: Timeout | undefined, config: Config): Timeout;
14
+
15
+ export { execute as default, execute, getTimeout };
package/dist/index.js CHANGED
@@ -20,7 +20,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
- default: () => src_default
23
+ default: () => src_default,
24
+ execute: () => execute,
25
+ getTimeout: () => getTimeout
24
26
  });
25
27
  module.exports = __toCommonJS(src_exports);
26
28
 
@@ -30,9 +32,41 @@ var import_globals = require("@jest/globals");
30
32
  var import_app = require("@autometa/app");
31
33
  var import_errors = require("@autometa/errors");
32
34
  var import_test_builder2 = require("@autometa/test-builder");
33
- function execute({ app, world }, bridge, events) {
35
+
36
+ // src/timeout-selector.ts
37
+ var import_scopes = require("@autometa/scopes");
38
+ function getTimeout(target, config) {
39
+ if (target && !(target instanceof import_scopes.NullTimeout)) {
40
+ return target;
41
+ }
42
+ return import_scopes.Timeout.from(config?.current?.test?.timeout);
43
+ }
44
+ function chooseTimeout(timeout1, timeout2) {
45
+ if (timeout2 instanceof import_scopes.Timeout && !(timeout2 instanceof import_scopes.NullTimeout)) {
46
+ return {
47
+ getTimeout: getTimeout.bind(null, timeout2)
48
+ };
49
+ }
50
+ if (timeout1 instanceof import_scopes.Timeout && !(timeout1 instanceof import_scopes.NullTimeout)) {
51
+ return {
52
+ getTimeout: getTimeout.bind(null, timeout1)
53
+ };
54
+ }
55
+ return {
56
+ getTimeout: getTimeout.bind(null, import_scopes.Timeout.from(0))
57
+ };
58
+ }
59
+
60
+ // src/executor.ts
61
+ var import_scopes2 = require("@autometa/scopes");
62
+ function execute({ app, world }, bridge, events, config) {
63
+ config.current;
34
64
  const featureTitle = bridge.data.scope.title(bridge.data.gherkin);
35
65
  const [group, modifier] = getGroupOrModifier(bridge);
66
+ const chosenTimeout = chooseTimeout(
67
+ new import_scopes2.NullTimeout(),
68
+ bridge.data.scope.timeout
69
+ ).getTimeout(config);
36
70
  (0, import_globals.beforeAll)(() => {
37
71
  events.feature.emitStart({
38
72
  title: featureTitle,
@@ -40,20 +74,35 @@ function execute({ app, world }, bridge, events) {
40
74
  modifier,
41
75
  tags: [...bridge.data.gherkin.tags]
42
76
  });
43
- });
77
+ }, chosenTimeout.milliseconds);
44
78
  group(featureTitle, () => {
45
79
  let localApp;
46
80
  const staticApp = (0, import_app.getApp)(app, world);
47
81
  (0, import_globals.beforeEach)(() => {
48
82
  localApp = (0, import_app.getApp)(app, world);
49
83
  });
50
- bootstrapSetupHooks(bridge, staticApp, events);
51
- bootstrapBeforeHooks(bridge, () => localApp, events);
52
- bootstrapBackground(bridge, () => localApp, events);
53
- bootstrapScenarios(bridge, () => localApp, staticApp, events);
54
- bootstrapRules(bridge, () => localApp, staticApp, events);
55
- bootstrapAfterHooks(bridge, () => localApp, events);
56
- bootstrapTeardownHooks(bridge, staticApp, events);
84
+ bootstrapSetupHooks(bridge, staticApp, events, [config, chosenTimeout]);
85
+ bootstrapBeforeHooks(bridge, bridge, () => localApp, events, [
86
+ config,
87
+ chosenTimeout
88
+ ]);
89
+ bootstrapBackground(bridge, bridge, () => localApp, events, [
90
+ config,
91
+ chosenTimeout
92
+ ]);
93
+ bootstrapScenarios(bridge, bridge, () => localApp, staticApp, events, [
94
+ config,
95
+ chosenTimeout
96
+ ]);
97
+ bootstrapRules(bridge, () => localApp, staticApp, events, [
98
+ config,
99
+ chosenTimeout
100
+ ]);
101
+ bootstrapAfterHooks(bridge, bridge, () => localApp, events, [
102
+ config,
103
+ chosenTimeout
104
+ ]);
105
+ bootstrapTeardownHooks(bridge, staticApp, events, [config, chosenTimeout]);
57
106
  });
58
107
  (0, import_globals.afterAll)(() => {
59
108
  const failures = import_test_builder2.Query.find.failed(bridge);
@@ -66,23 +115,27 @@ function execute({ app, world }, bridge, events) {
66
115
  });
67
116
  });
68
117
  }
69
- function bootstrapBackground(bridge, localApp, events) {
118
+ function bootstrapBackground(root, bridge, localApp, events, [config, timeout]) {
70
119
  const background = bridge.background;
71
120
  if (!background)
72
121
  return;
73
- const testName = import_globals.expect.getState().currentTestName;
74
- if (!testName)
75
- throw new import_errors.AutomationError("A Scenario must have a title");
76
- const scenarioBridge = (0, import_test_builder.find)(bridge, testName);
77
- if (!scenarioBridge) {
78
- throw new import_errors.AutomationError(
79
- `No matching scenario bridge was found matching the test name: ${testName}`
80
- );
81
- }
122
+ const chosenTimeout = chooseTimeout(
123
+ timeout,
124
+ bridge.data.scope.timeout
125
+ ).getTimeout(config).milliseconds;
82
126
  const tags = bridge?.data?.gherkin?.tags ?? [];
83
127
  if (tags.has("@skip") || tags.has("@skipped"))
84
128
  return;
85
129
  (0, import_globals.beforeEach)(async () => {
130
+ const testName = import_globals.expect.getState().currentTestName;
131
+ if (!testName)
132
+ throw new import_errors.AutomationError("A Scenario must have a title");
133
+ const scenarioBridge = (0, import_test_builder.find)(root, testName);
134
+ if (!scenarioBridge) {
135
+ throw new import_errors.AutomationError(
136
+ `No matching scenario bridge was found matching the test name: ${testName}`
137
+ );
138
+ }
86
139
  const title = background.data.scope.title(background.data.gherkin);
87
140
  events.before.emitStart({
88
141
  title,
@@ -91,11 +144,20 @@ function bootstrapBackground(bridge, localApp, events) {
91
144
  const steps = background.steps;
92
145
  try {
93
146
  for (const step of steps) {
94
- await step.data.scope.execute(step.data.gherkin, localApp());
147
+ await step.data.scope.execute(
148
+ background.data.gherkin,
149
+ step.data.gherkin,
150
+ localApp()
151
+ );
95
152
  }
153
+ events.before.emitEnd({
154
+ title,
155
+ tags: [...tags],
156
+ status: "PASSED"
157
+ });
96
158
  } catch (e) {
97
159
  events.before.emitEnd({
98
- title: background.data.scope.title(background.data.gherkin),
160
+ title,
99
161
  tags: [...tags],
100
162
  status: "FAILED",
101
163
  error: e
@@ -104,53 +166,83 @@ function bootstrapBackground(bridge, localApp, events) {
104
166
  Test: ${testName}`;
105
167
  throw new import_errors.AutomationError(message, { cause: e });
106
168
  }
107
- });
169
+ }, chosenTimeout);
108
170
  }
109
- function bootstrapScenarios(bridge, localApp, staticApp, events) {
171
+ function bootstrapScenarios(root, bridge, localApp, staticApp, events, [config, timeout]) {
110
172
  const { scenarios } = bridge;
173
+ const chosenTimeout = chooseTimeout(
174
+ timeout,
175
+ bridge.data.scope.timeout
176
+ ).getTimeout(config);
111
177
  scenarios.forEach((scenario) => {
112
178
  if (isOutline(scenario)) {
113
- bootstrapScenarioOutline(scenario, localApp, staticApp, events);
179
+ bootstrapScenarioOutline(root, scenario, localApp, staticApp, events, [
180
+ config,
181
+ chosenTimeout
182
+ ]);
114
183
  return;
115
184
  }
116
- bootstrapScenario(scenario, localApp, events);
185
+ bootstrapScenario(scenario, localApp, events, [config, chosenTimeout]);
117
186
  });
118
187
  }
119
- function bootstrapScenario(bridge, localApp, events) {
188
+ function bootstrapScenario(bridge, localApp, events, [config, timeout]) {
120
189
  const { data } = bridge;
190
+ const chosenTimeout = chooseTimeout(
191
+ timeout,
192
+ bridge.data.scope.timeout
193
+ ).getTimeout(config);
121
194
  const scenarioName = data.scope.title(data.gherkin);
122
195
  const test = getTestOrModifier(bridge);
123
- test(scenarioName, async () => {
124
- events.scenario.emitStart({
125
- title: scenarioName,
126
- tags: [...data.gherkin.tags]
127
- });
128
- try {
129
- for (const step of bridge.steps) {
130
- await step.data.scope.execute(step.data.gherkin, localApp());
131
- }
132
- } catch (e) {
133
- events.scenario.emitEnd({
196
+ test(
197
+ scenarioName,
198
+ async () => {
199
+ events.scenario.emitStart({
134
200
  title: scenarioName,
135
- tags: [...data.gherkin.tags],
136
- status: "FAILED",
137
- error: e
201
+ tags: [...data.gherkin.tags]
138
202
  });
139
- const message = `${scenarioName} failed to execute.`;
140
- throw new import_errors.AutomationError(message, { cause: e });
141
- }
142
- });
203
+ try {
204
+ for (const step of bridge.steps) {
205
+ await step.data.scope.execute(
206
+ bridge.data.gherkin,
207
+ step.data.gherkin,
208
+ localApp()
209
+ );
210
+ }
211
+ bridge.report = { passed: true };
212
+ events.scenario.emitEnd({
213
+ title: scenarioName,
214
+ tags: [...data.gherkin.tags],
215
+ status: "PASSED"
216
+ });
217
+ } catch (e) {
218
+ events.scenario.emitEnd({
219
+ title: scenarioName,
220
+ tags: [...data.gherkin.tags],
221
+ status: "FAILED",
222
+ error: e
223
+ });
224
+ bridge.report = { passed: false, error: e };
225
+ const message = `${scenarioName} failed to execute.`;
226
+ throw new import_errors.AutomationError(message, { cause: e });
227
+ }
228
+ },
229
+ chosenTimeout.milliseconds
230
+ );
143
231
  }
144
232
  function isOutline(data) {
145
233
  return data instanceof import_test_builder.ScenarioOutlineBridge;
146
234
  }
147
- function bootstrapScenarioOutline(bridge, localApp, staticApp, events) {
235
+ function bootstrapScenarioOutline(root, bridge, localApp, staticApp, events, [config, timeout]) {
148
236
  const {
149
237
  data: { scope, gherkin },
150
238
  examples
151
239
  } = bridge;
152
240
  const title = scope.title(gherkin);
153
241
  const [group, modifier] = getGroupOrModifier(bridge);
242
+ const chosenTimeout = chooseTimeout(
243
+ timeout,
244
+ bridge.data.scope.timeout
245
+ ).getTimeout(config).milliseconds;
154
246
  group(title, () => {
155
247
  (0, import_globals.beforeAll)(() => {
156
248
  events.scenarioOutline.emitStart({
@@ -159,13 +251,16 @@ function bootstrapScenarioOutline(bridge, localApp, staticApp, events) {
159
251
  tags: [...gherkin.tags]
160
252
  });
161
253
  });
162
- bootstrapSetupHooks(bridge, staticApp, events);
163
- bootstrapBeforeHooks(bridge, localApp, events);
254
+ bootstrapSetupHooks(bridge, staticApp, events, [config, timeout]);
255
+ bootstrapBeforeHooks(root, bridge, localApp, events, [config, timeout]);
164
256
  examples.forEach((example) => {
165
- bootstrapExamples(example, localApp, staticApp, events);
257
+ bootstrapExamples(root, example, localApp, staticApp, events, [
258
+ config,
259
+ timeout
260
+ ]);
166
261
  });
167
- bootstrapAfterHooks(bridge, localApp, events);
168
- bootstrapTeardownHooks(bridge, staticApp, events);
262
+ bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout]);
263
+ bootstrapTeardownHooks(bridge, staticApp, events, [config, timeout]);
169
264
  (0, import_globals.afterAll)(() => {
170
265
  const failures = import_test_builder2.Query.find.failed(bridge);
171
266
  const status = modifier === "skip" ? "SKIPPED" : failures.length === 0 ? "PASSED" : "FAILED";
@@ -175,18 +270,28 @@ function bootstrapScenarioOutline(bridge, localApp, staticApp, events) {
175
270
  tags: [...gherkin.tags],
176
271
  status
177
272
  });
178
- });
273
+ }, chosenTimeout);
179
274
  });
180
275
  }
181
- function bootstrapExamples(example, localApp, staticApp, events) {
276
+ function bootstrapExamples(root, example, localApp, staticApp, events, timeout) {
182
277
  const title = example.data.scope.title(example.data.gherkin);
183
278
  const [group] = getGroupOrModifier(example);
184
279
  group(title, () => {
185
- bootstrapScenarios(example, localApp, staticApp, events);
280
+ bootstrapScenarios(root, example, localApp, staticApp, events, timeout);
186
281
  });
187
282
  }
188
- function bootstrapRules(bridge, localApp, staticApp, events) {
189
- bridge.rules.forEach(({ data }) => {
283
+ function bootstrapRules(bridge, localApp, staticApp, events, [config, timeout]) {
284
+ const chosenTimeout = chooseTimeout(
285
+ timeout,
286
+ bridge.data.scope.timeout
287
+ ).getTimeout(config);
288
+ bridge.rules.forEach((rule) => {
289
+ const ruleTimeout = chooseTimeout(
290
+ chosenTimeout,
291
+ rule.data.scope.timeout
292
+ ).getTimeout(config);
293
+ const transferTimeout = [config, ruleTimeout];
294
+ const { data } = rule;
190
295
  const ruleName = data.scope.title(data.gherkin);
191
296
  const [group, modifier] = getGroupOrModifier(bridge);
192
297
  group(ruleName, () => {
@@ -197,14 +302,21 @@ function bootstrapRules(bridge, localApp, staticApp, events) {
197
302
  tags: [...data.gherkin.tags]
198
303
  });
199
304
  });
200
- bootstrapSetupHooks(bridge, staticApp, events);
201
- bootstrapBeforeHooks(bridge, localApp, events);
202
- bootstrapBackground(bridge, localApp, events);
203
- bootstrapScenarios(bridge, localApp, staticApp, events);
204
- bootstrapAfterHooks(bridge, localApp, events);
205
- bootstrapTeardownHooks(bridge, staticApp, events);
305
+ bootstrapSetupHooks(rule, staticApp, events, transferTimeout);
306
+ bootstrapBeforeHooks(bridge, rule, localApp, events, transferTimeout);
307
+ bootstrapBackground(bridge, rule, localApp, events, transferTimeout);
308
+ bootstrapScenarios(
309
+ bridge,
310
+ rule,
311
+ localApp,
312
+ staticApp,
313
+ events,
314
+ transferTimeout
315
+ );
316
+ bootstrapAfterHooks(bridge, rule, localApp, events, transferTimeout);
317
+ bootstrapTeardownHooks(rule, staticApp, events, transferTimeout);
206
318
  (0, import_globals.afterAll)(() => {
207
- const failures = import_test_builder2.Query.find.failed(bridge);
319
+ const failures = import_test_builder2.Query.find.failed(rule);
208
320
  const status = modifier === "skip" ? "SKIPPED" : failures.length === 0 ? "PASSED" : "FAILED";
209
321
  events.rule.emitEnd({
210
322
  title: ruleName,
@@ -212,7 +324,7 @@ function bootstrapRules(bridge, localApp, staticApp, events) {
212
324
  tags: [...data.gherkin.tags],
213
325
  status
214
326
  });
215
- });
327
+ }, ruleTimeout.milliseconds);
216
328
  });
217
329
  });
218
330
  }
@@ -236,19 +348,29 @@ function getTestOrModifier({ data }) {
236
348
  }
237
349
  return import_globals.it;
238
350
  }
239
- function bootstrapBeforeHooks(bridge, localApp, events) {
351
+ function bootstrapBeforeHooks(root, bridge, localApp, events, [config, timeout]) {
352
+ const chosenTimeout = chooseTimeout(
353
+ timeout,
354
+ bridge.data.scope.timeout
355
+ ).getTimeout(config);
240
356
  bridge.data.scope.hooks.before.forEach((hook) => {
241
- const testName = import_globals.expect.getState().currentTestName;
242
- if (!testName)
243
- throw new import_errors.AutomationError("A Scenario must have a title");
244
- const scenarioBridge = (0, import_test_builder.find)(bridge, testName);
245
- if (!scenarioBridge) {
246
- throw new import_errors.AutomationError(
247
- `No matching scenario was found matching the test name: ${testName}`
248
- );
249
- }
250
- const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
357
+ const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(
358
+ config
359
+ ).milliseconds;
251
360
  (0, import_globals.beforeEach)(async () => {
361
+ const testName = import_globals.expect.getState().currentTestName;
362
+ if (!testName)
363
+ throw new import_errors.AutomationError("A Scenario must have a title");
364
+ const scenarioBridge = (0, import_test_builder.find)(root, testName);
365
+ if (!scenarioBridge) {
366
+ throw new import_errors.AutomationError(
367
+ `No matching scenario was found matching the test name: ${testName}`
368
+ );
369
+ }
370
+ if (!hook.canExecute(...bridge.data.gherkin.tags)) {
371
+ return;
372
+ }
373
+ const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
252
374
  events.before.emitStart({
253
375
  title: hook.name,
254
376
  tags: [...tags]
@@ -264,13 +386,24 @@ function bootstrapBeforeHooks(bridge, localApp, events) {
264
386
  const message = `${hook.name}: ${hook.description} failed to execute.`;
265
387
  throw new import_errors.AutomationError(message, { cause: report.error });
266
388
  }
267
- });
389
+ }, hookTimeout);
268
390
  });
269
391
  }
270
- function bootstrapSetupHooks(bridge, staticApp, events) {
392
+ function bootstrapSetupHooks(bridge, staticApp, events, [config, timeout]) {
393
+ const chosenTimeout = chooseTimeout(
394
+ timeout,
395
+ bridge.data.scope.timeout
396
+ ).getTimeout(config).milliseconds;
271
397
  bridge.data.scope.hooks.setup.forEach((hook) => {
398
+ const hookTimeout = chooseTimeout(
399
+ import_scopes2.Timeout.from(chosenTimeout),
400
+ hook.timeout
401
+ ).getTimeout(config).milliseconds;
272
402
  const tags = bridge.data.gherkin.tags ?? [];
273
403
  (0, import_globals.beforeAll)(async () => {
404
+ if (!hook.canExecute(...tags)) {
405
+ return;
406
+ }
274
407
  events.setup.emitStart({
275
408
  title: hook.name
276
409
  });
@@ -284,22 +417,33 @@ function bootstrapSetupHooks(bridge, staticApp, events) {
284
417
  const message = `${hook.name}: ${hook.description} failed to execute.`;
285
418
  throw new import_errors.AutomationError(message, { cause: report.error });
286
419
  }
287
- });
420
+ }, hookTimeout);
288
421
  });
289
422
  }
290
- function bootstrapAfterHooks(bridge, localApp, events) {
423
+ function bootstrapAfterHooks(root, bridge, localApp, events, [config, timeout]) {
424
+ const chosenTimeout = chooseTimeout(
425
+ timeout,
426
+ bridge.data.scope.timeout
427
+ ).getTimeout(config).milliseconds;
291
428
  bridge.data.scope.hooks.after.forEach((hook) => {
292
- const testName = import_globals.expect.getState().currentTestName;
293
- if (!testName)
294
- throw new import_errors.AutomationError("A Scenario must have a title");
295
- const scenarioBridge = (0, import_test_builder.find)(bridge, testName);
296
- if (!scenarioBridge) {
297
- throw new import_errors.AutomationError(
298
- `No matching scenario bridge was found matching the test name: ${testName}`
299
- );
300
- }
301
- const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
429
+ const hookTimeout = chooseTimeout(
430
+ import_scopes2.Timeout.from(chosenTimeout),
431
+ hook.timeout
432
+ ).getTimeout(config).milliseconds;
302
433
  (0, import_globals.afterEach)(async () => {
434
+ const testName = import_globals.expect.getState().currentTestName;
435
+ if (!testName)
436
+ throw new import_errors.AutomationError("A Scenario must have a title");
437
+ const scenarioBridge = (0, import_test_builder.find)(root, testName);
438
+ if (!scenarioBridge) {
439
+ throw new import_errors.AutomationError(
440
+ `No matching scenario bridge was found matching the test name: ${testName}`
441
+ );
442
+ }
443
+ if (!hook.canExecute(...bridge.data.gherkin.tags)) {
444
+ return;
445
+ }
446
+ const tags = scenarioBridge?.data?.gherkin?.tags ?? [];
303
447
  events.after.emitStart({
304
448
  title: hook.name,
305
449
  tags: [...tags]
@@ -315,12 +459,19 @@ function bootstrapAfterHooks(bridge, localApp, events) {
315
459
  const message = `${hook.name}: ${hook.description} failed to execute.`;
316
460
  throw new import_errors.AutomationError(message, { cause: report.error });
317
461
  }
318
- });
462
+ }, hookTimeout);
319
463
  });
320
464
  }
321
- function bootstrapTeardownHooks(bridge, staticApp, event) {
465
+ function bootstrapTeardownHooks(bridge, staticApp, event, [config, timeout]) {
322
466
  const tags = bridge.data.gherkin.tags ?? [];
467
+ const chosenTimeout = chooseTimeout(
468
+ timeout,
469
+ bridge.data.scope.timeout
470
+ ).getTimeout(config);
323
471
  bridge.data.scope.hooks.teardown.forEach((hook) => {
472
+ const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(
473
+ config
474
+ ).milliseconds;
324
475
  (0, import_globals.afterAll)(async () => {
325
476
  event.teardown.emitStart({
326
477
  title: hook.name,
@@ -337,9 +488,15 @@ function bootstrapTeardownHooks(bridge, staticApp, event) {
337
488
  const message = `${hook.name}: ${hook.description} failed to execute.`;
338
489
  throw new import_errors.AutomationError(message, { cause: report.error });
339
490
  }
340
- });
491
+ }, hookTimeout);
341
492
  });
342
493
  }
343
494
 
344
495
  // src/index.ts
345
496
  var src_default = execute;
497
+ // Annotate the CommonJS export names for ESM import in node:
498
+ 0 && (module.exports = {
499
+ execute,
500
+ getTimeout
501
+ });
502
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/timeout-selector.ts"],"sourcesContent":["import { execute } from \"./executor\";\nexport { execute } from \"./executor\";\nexport { getTimeout } from \"./timeout-selector\";\nexport default execute;\n","import {\n ExamplesBridge,\n FeatureBridge,\n RuleBridge,\n ScenarioBridge,\n ScenarioOutlineBridge,\n find\n} from \"@autometa/test-builder\";\nimport {\n describe,\n it,\n expect,\n beforeEach,\n afterEach,\n afterAll,\n beforeAll\n} from \"@jest/globals\";\nimport { type App, AutometaApp, AutometaWorld, getApp } from \"@autometa/app\";\nimport { Class } from \"@autometa/types\";\nimport { AutomationError } 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 { NullTimeout, Timeout } from \"@autometa/scopes\";\nexport function execute(\n { app, world }: { app: Class<AutometaApp>; world: Class<AutometaWorld> },\n bridge: FeatureBridge,\n events: TestEventEmitter,\n config: Config\n) {\n config.current;\n const featureTitle = bridge.data.scope.title(bridge.data.gherkin);\n const [group, modifier] = getGroupOrModifier(bridge);\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 let localApp: App;\n const staticApp: App = getApp(app, world);\n beforeEach(() => {\n localApp = getApp(app, world);\n });\n\n bootstrapSetupHooks(bridge, staticApp, events, [config, chosenTimeout]);\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 bootstrapTeardownHooks(bridge, staticApp, events, [config, chosenTimeout]);\n });\n afterAll(() => {\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 });\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 await step.data.scope.execute(\n background.data.gherkin,\n step.data.gherkin,\n localApp()\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);\n test(\n scenarioName,\n async () => {\n events.scenario.emitStart({\n title: scenarioName,\n tags: [...data.gherkin.tags]\n });\n try {\n for (const step of bridge.steps) {\n await step.data.scope.execute(\n bridge.data.gherkin,\n step.data.gherkin,\n localApp()\n );\n }\n bridge.report = { passed: true };\n events.scenario.emitEnd({\n title: scenarioName,\n tags: [...data.gherkin.tags],\n status: \"PASSED\"\n });\n } catch (e) {\n events.scenario.emitEnd({\n title: scenarioName,\n tags: [...data.gherkin.tags],\n status: \"FAILED\",\n error: e as Error\n });\n bridge.report = { passed: false, error: e as Error };\n const message = `${scenarioName} failed to execute.`;\n throw new AutomationError(message, { cause: e as Error });\n }\n },\n chosenTimeout.milliseconds\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 [group, modifier] = getGroupOrModifier(bridge);\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config).milliseconds;\n group(title, () => {\n beforeAll(() => {\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 =\n modifier === \"skip\"\n ? \"SKIPPED\"\n : failures.length === 0\n ? \"PASSED\"\n : \"FAILED\";\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 title = example.data.scope.title(example.data.gherkin);\n const [group] = getGroupOrModifier(example);\n group(title, () => {\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 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(bridge);\n\n group(ruleName, () => {\n beforeAll(() => {\n events.rule.emitStart({\n title: ruleName,\n modifier,\n tags: [...data.gherkin.tags]\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 =\n modifier === \"skip\"\n ? \"SKIPPED\"\n : failures.length === 0\n ? \"PASSED\"\n : \"FAILED\";\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 getGroupOrModifier({\n data\n}: RuleBridge | FeatureBridge | ScenarioOutlineBridge | ExamplesBridge) {\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 return [describe, undefined] as const;\n}\n\nfunction getTestOrModifier({ data }: ScenarioBridge) {\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 return it;\n}\n\nexport function bootstrapBeforeHooks(\n root: FeatureBridge,\n bridge: 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(...bridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.before.emitStart({\n title: hook.name,\n tags: [...tags]\n });\n const report = await hook.execute(localApp(), ...tags);\n events.before.emitEnd({\n title: hook.name,\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}\nexport function bootstrapSetupHooks(\n bridge: FeatureBridge | RuleBridge | ScenarioOutlineBridge,\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).milliseconds;\n bridge.data.scope.hooks.setup.forEach((hook) => {\n const hookTimeout = chooseTimeout(\n Timeout.from(chosenTimeout),\n hook.timeout\n ).getTimeout(config).milliseconds;\n const tags = bridge.data.gherkin.tags ?? [];\n\n beforeAll(async () => {\n if (!hook.canExecute(...tags)) {\n return;\n }\n events.setup.emitStart({\n title: hook.name\n });\n const report = await hook.execute(staticApp, ...tags);\n\n events.setup.emitEnd({\n title: hook.name,\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: 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).milliseconds;\n bridge.data.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 matching scenario bridge was found matching the test name: ${testName}`\n );\n }\n if (!hook.canExecute(...bridge.data.gherkin.tags)) {\n return;\n }\n const tags = scenarioBridge?.data?.gherkin?.tags ?? [];\n events.after.emitStart({\n title: hook.name,\n tags: [...tags]\n });\n\n const report = await hook.execute(localApp(), ...tags);\n events.after.emitEnd({\n title: hook.name,\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: FeatureBridge | RuleBridge | ScenarioOutlineBridge,\n staticApp: App,\n event: TestEventEmitter,\n [config, timeout]: [Config, Timeout]\n) {\n const tags = bridge.data.gherkin.tags ?? [];\n const chosenTimeout = chooseTimeout(\n timeout,\n bridge.data.scope.timeout\n ).getTimeout(config);\n bridge.data.scope.hooks.teardown.forEach((hook) => {\n const hookTimeout = chooseTimeout(chosenTimeout, hook.timeout).getTimeout(\n config\n ).milliseconds;\n afterAll(async () => {\n event.teardown.emitStart({\n title: hook.name,\n tags: [...tags]\n });\n const report = await hook.execute(staticApp, ...tags);\n event.teardown.emitEnd({\n title: hook.name,\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"],"mappings":"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","names":["import_test_builder","import_scopes"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autometa/jest-executor",
3
- "version": "0.0.0",
3
+ "version": "0.1.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,14 +21,14 @@
21
21
  "@typescript-eslint/eslint-plugin": "^5.54.1",
22
22
  "@typescript-eslint/parser": "^5.54.1",
23
23
  "eslint": "^8.37.0",
24
- "eslint-config-custom": "0.5.1",
24
+ "eslint-config-custom": "0.6.0",
25
25
  "eslint-config-prettier": "^8.3.0",
26
26
  "jest": "^29.5.0",
27
27
  "rimraf": "^4.1.2",
28
28
  "ts-jest": "^29.1.1",
29
29
  "ts-node": "^10.9.1",
30
30
  "tsconfig": " *",
31
- "tsup": "^6.7.0",
31
+ "tsup": "^7.2.0",
32
32
  "typescript": "^4.9.5",
33
33
  "vitest": "^0.29.8"
34
34
  },
@@ -37,15 +37,15 @@
37
37
  "jest": "^29.5.0"
38
38
  },
39
39
  "dependencies": {
40
- "@autometa/app": "^0.0.0",
41
- "@autometa/asserters": "^0.0.0",
42
- "@autometa/config": "^0.0.0",
43
- "@autometa/errors": "^0.0.0",
44
- "@autometa/events": "^0.0.10",
45
- "@autometa/gherkin": "^0.3.3",
46
- "@autometa/scopes": "^0.1.10",
47
- "@autometa/test-builder": "^0.0.0",
48
- "@autometa/types": "^0.3.1"
40
+ "@autometa/app": "^0.1.0",
41
+ "@autometa/asserters": "^0.1.0",
42
+ "@autometa/config": "^0.1.0",
43
+ "@autometa/errors": "^0.1.0",
44
+ "@autometa/events": "^0.1.0",
45
+ "@autometa/gherkin": "^0.4.0",
46
+ "@autometa/scopes": "^0.2.0",
47
+ "@autometa/test-builder": "^0.1.0",
48
+ "@autometa/types": "^0.4.0"
49
49
  },
50
50
  "scripts": {
51
51
  "test": "vitest run --passWithNoTests",
package/tsup.config.ts CHANGED
@@ -4,7 +4,7 @@ export default defineConfig({
4
4
  clean: true, // clean up the dist folder
5
5
  format: ["cjs", "esm"], // generate cjs and esm files
6
6
  dts: true,
7
- sourcemap: false, // generate sourcemaps
7
+ sourcemap:true, // generate sourcemaps
8
8
  skipNodeModulesBundle: true,
9
9
  entryPoints: ["src/index.ts"],
10
10
  target: "es2020",