@cucumber/cucumber 7.2.0 → 7.3.2
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/lib/cli/argv_parser.d.ts +0 -1
- package/lib/cli/argv_parser.js +0 -1
- package/lib/cli/argv_parser.js.map +1 -1
- package/lib/cli/configuration_builder.d.ts +0 -1
- package/lib/cli/configuration_builder.js +5 -5
- package/lib/cli/configuration_builder.js.map +1 -1
- package/lib/cli/helpers.js +41 -22
- package/lib/cli/helpers.js.map +1 -1
- package/lib/cli/index.d.ts +1 -3
- package/lib/cli/index.js +27 -30
- package/lib/cli/index.js.map +1 -1
- package/lib/cli/profile_loader.d.ts +2 -5
- package/lib/cli/profile_loader.js +2 -3
- package/lib/cli/profile_loader.js.map +1 -1
- package/lib/cli/publish_banner.js +1 -1
- package/lib/cli/publish_banner.js.map +1 -1
- package/lib/formatter/builder.d.ts +4 -8
- package/lib/formatter/builder.js +17 -32
- package/lib/formatter/builder.js.map +1 -1
- package/lib/formatter/get_color_fns.d.ts +6 -2
- package/lib/formatter/get_color_fns.js +18 -12
- package/lib/formatter/get_color_fns.js.map +1 -1
- package/lib/formatter/helpers/event_data_collector.d.ts +14 -17
- package/lib/formatter/helpers/event_data_collector.js +14 -8
- package/lib/formatter/helpers/event_data_collector.js.map +1 -1
- package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -6
- package/lib/formatter/helpers/gherkin_document_parser.js +1 -4
- package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
- package/lib/formatter/helpers/issue_helpers.d.ts +6 -6
- package/lib/formatter/helpers/issue_helpers.js +5 -6
- package/lib/formatter/helpers/issue_helpers.js.map +1 -1
- package/lib/formatter/helpers/pickle_parser.d.ts +9 -10
- package/lib/formatter/helpers/pickle_parser.js.map +1 -1
- package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
- package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
- package/lib/formatter/helpers/summary_helpers.d.ts +2 -2
- package/lib/formatter/helpers/summary_helpers.js +32 -14
- package/lib/formatter/helpers/summary_helpers.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_formatter.js +33 -14
- package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_parser.d.ts +5 -5
- package/lib/formatter/helpers/test_case_attempt_parser.js +27 -9
- package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
- package/lib/formatter/helpers/usage_helpers/index.d.ts +3 -3
- package/lib/formatter/helpers/usage_helpers/index.js +44 -15
- package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
- package/lib/formatter/html_formatter.js +1 -1
- package/lib/formatter/html_formatter.js.map +1 -1
- package/lib/formatter/http_stream.js +1 -1
- package/lib/formatter/http_stream.js.map +1 -1
- package/lib/formatter/json_formatter.d.ts +21 -27
- package/lib/formatter/json_formatter.js +50 -23
- package/lib/formatter/json_formatter.js.map +1 -1
- package/lib/formatter/message_formatter.js +1 -1
- package/lib/formatter/message_formatter.js.map +1 -1
- package/lib/formatter/progress_bar_formatter.d.ts +6 -6
- package/lib/formatter/progress_bar_formatter.js +3 -3
- package/lib/formatter/progress_bar_formatter.js.map +1 -1
- package/lib/formatter/progress_formatter.d.ts +2 -2
- package/lib/formatter/progress_formatter.js +29 -10
- package/lib/formatter/progress_formatter.js.map +1 -1
- package/lib/formatter/rerun_formatter.js +22 -4
- package/lib/formatter/rerun_formatter.js.map +1 -1
- package/lib/formatter/snippets_formatter.js +21 -2
- package/lib/formatter/snippets_formatter.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/index.d.ts +3 -3
- package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
- package/lib/formatter/summary_formatter.d.ts +2 -2
- package/lib/formatter/summary_formatter.js.map +1 -1
- package/lib/formatter/usage_formatter.js +22 -3
- package/lib/formatter/usage_formatter.js.map +1 -1
- package/lib/formatter/usage_json_formatter.js.map +1 -1
- package/lib/index.d.ts +14 -12
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/models/data_table.d.ts +3 -4
- package/lib/models/data_table.js.map +1 -1
- package/lib/models/definition.d.ts +2 -2
- package/lib/models/definition.js.map +1 -1
- package/lib/models/test_case_hook_definition.d.ts +2 -2
- package/lib/models/test_case_hook_definition.js.map +1 -1
- package/lib/models/test_step_hook_definition.d.ts +2 -2
- package/lib/models/test_step_hook_definition.js.map +1 -1
- package/lib/pickle_filter.d.ts +9 -11
- package/lib/pickle_filter.js +4 -4
- package/lib/pickle_filter.js.map +1 -1
- package/lib/runtime/assemble_test_cases.d.ts +13 -0
- package/lib/runtime/assemble_test_cases.js +88 -0
- package/lib/runtime/assemble_test_cases.js.map +1 -0
- package/lib/runtime/attachment_manager/index.d.ts +2 -2
- package/lib/runtime/attachment_manager/index.js +23 -4
- package/lib/runtime/attachment_manager/index.js.map +1 -1
- package/lib/runtime/helpers.d.ts +2 -2
- package/lib/runtime/helpers.js.map +1 -1
- package/lib/runtime/index.d.ts +4 -3
- package/lib/runtime/index.js +31 -13
- package/lib/runtime/index.js.map +1 -1
- package/lib/runtime/parallel/command_types.d.ts +10 -9
- package/lib/runtime/parallel/command_types.js.map +1 -1
- package/lib/runtime/parallel/coordinator.d.ts +10 -9
- package/lib/runtime/parallel/coordinator.js +54 -43
- package/lib/runtime/parallel/coordinator.js.map +1 -1
- package/lib/runtime/parallel/worker.d.ts +2 -2
- package/lib/runtime/parallel/worker.js +8 -14
- package/lib/runtime/parallel/worker.js.map +1 -1
- package/lib/runtime/step_runner.d.ts +3 -3
- package/lib/runtime/step_runner.js +16 -12
- package/lib/runtime/step_runner.js.map +1 -1
- package/lib/runtime/stopwatch.d.ts +4 -4
- package/lib/runtime/stopwatch.js +21 -2
- package/lib/runtime/stopwatch.js.map +1 -1
- package/lib/runtime/{pickle_runner.d.ts → test_case_runner.d.ts} +16 -32
- package/lib/runtime/{pickle_runner.js → test_case_runner.js} +104 -147
- package/lib/runtime/test_case_runner.js.map +1 -0
- package/lib/step_arguments.d.ts +4 -4
- package/lib/step_arguments.js.map +1 -1
- package/lib/support_code_library_builder/index.d.ts +9 -7
- package/lib/support_code_library_builder/index.js +11 -10
- package/lib/support_code_library_builder/index.js.map +1 -1
- package/lib/support_code_library_builder/types.d.ts +21 -23
- package/lib/support_code_library_builder/types.js.map +1 -1
- package/lib/support_code_library_builder/validate_arguments.js +8 -8
- package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
- package/lib/support_code_library_builder/world.d.ts +7 -1
- package/lib/support_code_library_builder/world.js.map +1 -1
- package/lib/time.d.ts +2 -10
- package/lib/time.js +24 -48
- package/lib/time.js.map +1 -1
- package/package.json +38 -40
- package/CHANGELOG.md +0 -1874
- package/lib/importers.js +0 -17
- package/lib/runtime/pickle_runner.js.map +0 -1
- package/lib/status.d.ts +0 -3
- package/lib/status.js +0 -5
- package/lib/status.js.map +0 -1
- package/lib/wrapper.mjs +0 -38
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as messages from '@cucumber/messages';
|
|
2
2
|
import { Duration } from 'durations';
|
|
3
3
|
export interface ITestRunStopwatch {
|
|
4
4
|
from: (duration: Duration) => ITestRunStopwatch;
|
|
5
5
|
start: () => ITestRunStopwatch;
|
|
6
6
|
stop: () => ITestRunStopwatch;
|
|
7
7
|
duration: () => Duration;
|
|
8
|
-
timestamp: () => messages.
|
|
8
|
+
timestamp: () => messages.Timestamp;
|
|
9
9
|
}
|
|
10
10
|
export declare class RealTestRunStopwatch implements ITestRunStopwatch {
|
|
11
11
|
private readonly stopwatch;
|
|
@@ -14,7 +14,7 @@ export declare class RealTestRunStopwatch implements ITestRunStopwatch {
|
|
|
14
14
|
start(): ITestRunStopwatch;
|
|
15
15
|
stop(): ITestRunStopwatch;
|
|
16
16
|
duration(): Duration;
|
|
17
|
-
timestamp(): messages.
|
|
17
|
+
timestamp(): messages.Timestamp;
|
|
18
18
|
}
|
|
19
19
|
export declare class PredictableTestRunStopwatch implements ITestRunStopwatch {
|
|
20
20
|
private count;
|
|
@@ -23,6 +23,6 @@ export declare class PredictableTestRunStopwatch implements ITestRunStopwatch {
|
|
|
23
23
|
start(): ITestRunStopwatch;
|
|
24
24
|
stop(): ITestRunStopwatch;
|
|
25
25
|
duration(): Duration;
|
|
26
|
-
timestamp(): messages.
|
|
26
|
+
timestamp(): messages.Timestamp;
|
|
27
27
|
private convertToTimestamp;
|
|
28
28
|
}
|
package/lib/runtime/stopwatch.js
CHANGED
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
22
|
exports.PredictableTestRunStopwatch = exports.RealTestRunStopwatch = void 0;
|
|
4
|
-
const
|
|
23
|
+
const messages = __importStar(require("@cucumber/messages"));
|
|
5
24
|
const durations_1 = require("durations");
|
|
6
25
|
class RealTestRunStopwatch {
|
|
7
26
|
constructor() {
|
|
@@ -28,7 +47,7 @@ class RealTestRunStopwatch {
|
|
|
28
47
|
return current;
|
|
29
48
|
}
|
|
30
49
|
timestamp() {
|
|
31
|
-
return
|
|
50
|
+
return messages.TimeConversion.millisecondsSinceEpochToTimestamp(Date.now());
|
|
32
51
|
}
|
|
33
52
|
}
|
|
34
53
|
exports.RealTestRunStopwatch = RealTestRunStopwatch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../src/runtime/stopwatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../src/runtime/stopwatch.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAC9C,yCAAoE;AAUpE,MAAa,oBAAoB;IAAjC;QACmB,cAAS,GAAc,qBAAS,EAAE,CAAA;QAC3C,SAAI,GAAa,IAAI,CAAA;IA4B/B,CAAC;IA1BC,IAAI,CAAC,QAAkB;QACrB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAA;QACzC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;YACtB,OAAO,oBAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;SACrD;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,SAAS;QACP,OAAO,QAAQ,CAAC,cAAc,CAAC,iCAAiC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC9E,CAAC;CACF;AA9BD,oDA8BC;AAED,MAAa,2BAA2B;IAAxC;QACU,UAAK,GAAG,CAAC,CAAA;QACT,SAAI,GAAa,IAAI,CAAA;IAsC/B,CAAC;IApCC,IAAI,CAAC,QAAkB;QACrB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ;QACN,MAAM,OAAO,GAAG,oBAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAA;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;YACtB,OAAO,oBAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;SACrD;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,SAAS;QACP,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,kFAAkF;IAC1E,kBAAkB,CAAC,QAAkB;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC,CAAA;QACrE,OAAO;YACL,OAAO;YACP,KAAK;SACN,CAAA;IACH,CAAC;CACF;AAxCD,kEAwCC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { stopwatch, Stopwatch, duration, Duration } from 'durations'\n\nexport interface ITestRunStopwatch {\n from: (duration: Duration) => ITestRunStopwatch\n start: () => ITestRunStopwatch\n stop: () => ITestRunStopwatch\n duration: () => Duration\n timestamp: () => messages.Timestamp\n}\n\nexport class RealTestRunStopwatch implements ITestRunStopwatch {\n private readonly stopwatch: Stopwatch = stopwatch()\n private base: Duration = null\n\n from(duration: Duration): ITestRunStopwatch {\n this.base = duration\n return this\n }\n\n start(): ITestRunStopwatch {\n this.stopwatch.start()\n return this\n }\n\n stop(): ITestRunStopwatch {\n this.stopwatch.stop()\n return this\n }\n\n duration(): Duration {\n const current = this.stopwatch.duration()\n if (this.base !== null) {\n return duration(this.base.nanos() + current.nanos())\n }\n return current\n }\n\n timestamp(): messages.Timestamp {\n return messages.TimeConversion.millisecondsSinceEpochToTimestamp(Date.now())\n }\n}\n\nexport class PredictableTestRunStopwatch implements ITestRunStopwatch {\n private count = 0\n private base: Duration = null\n\n from(duration: Duration): ITestRunStopwatch {\n this.base = duration\n return this\n }\n\n start(): ITestRunStopwatch {\n return this\n }\n\n stop(): ITestRunStopwatch {\n return this\n }\n\n duration(): Duration {\n const current = duration(this.count * 1000000)\n if (this.base !== null) {\n return duration(this.base.nanos() + current.nanos())\n }\n return current\n }\n\n timestamp(): messages.Timestamp {\n const fakeTimestamp = this.convertToTimestamp(this.duration())\n this.count++\n return fakeTimestamp\n }\n\n // TODO: Remove. It's impossible to convert timestamps to durations and vice-versa\n private convertToTimestamp(duration: Duration): messages.Timestamp {\n const seconds = Math.floor(duration.seconds())\n const nanos = Math.floor((duration.seconds() - seconds) * 1000000000)\n return {\n seconds,\n nanos,\n }\n }\n}\n"]}
|
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { IdGenerator
|
|
2
|
+
import { IdGenerator } from '@cucumber/messages';
|
|
3
|
+
import * as messages from '@cucumber/messages';
|
|
3
4
|
import { EventEmitter } from 'events';
|
|
4
5
|
import { ISupportCodeLibrary, ITestCaseHookParameter } from '../support_code_library_builder/types';
|
|
5
6
|
import TestCaseHookDefinition from '../models/test_case_hook_definition';
|
|
6
7
|
import TestStepHookDefinition from '../models/test_step_hook_definition';
|
|
7
|
-
import StepDefinition from '../models/step_definition';
|
|
8
8
|
import { IDefinition } from '../models/definition';
|
|
9
9
|
import { ITestRunStopwatch } from './stopwatch';
|
|
10
|
-
interface
|
|
11
|
-
id: string;
|
|
12
|
-
isBeforeHook?: boolean;
|
|
13
|
-
isHook: boolean;
|
|
14
|
-
hookDefinition?: TestCaseHookDefinition;
|
|
15
|
-
stepHookDefinition?: TestStepHookDefinition;
|
|
16
|
-
pickleStep?: messages.Pickle.IPickleStep;
|
|
17
|
-
stepDefinitions?: StepDefinition[];
|
|
18
|
-
}
|
|
19
|
-
export interface INewPickleRunnerOptions {
|
|
10
|
+
export interface INewTestCaseRunnerOptions {
|
|
20
11
|
eventBroadcaster: EventEmitter;
|
|
21
12
|
stopwatch: ITestRunStopwatch;
|
|
22
|
-
gherkinDocument: messages.
|
|
13
|
+
gherkinDocument: messages.GherkinDocument;
|
|
23
14
|
newId: IdGenerator.NewId;
|
|
24
|
-
pickle: messages.
|
|
15
|
+
pickle: messages.Pickle;
|
|
16
|
+
testCase: messages.TestCase;
|
|
25
17
|
retries: number;
|
|
26
18
|
skip: boolean;
|
|
27
19
|
supportCodeLibrary: ISupportCodeLibrary;
|
|
28
20
|
worldParameters: any;
|
|
29
21
|
}
|
|
30
|
-
export default class
|
|
22
|
+
export default class TestCaseRunner {
|
|
31
23
|
private readonly attachmentManager;
|
|
32
24
|
private currentTestCaseStartedId;
|
|
33
25
|
private currentTestStepId;
|
|
@@ -36,32 +28,24 @@ export default class PickleRunner {
|
|
|
36
28
|
private readonly gherkinDocument;
|
|
37
29
|
private readonly newId;
|
|
38
30
|
private readonly pickle;
|
|
31
|
+
private readonly testCase;
|
|
39
32
|
private readonly maxAttempts;
|
|
40
33
|
private readonly skip;
|
|
41
34
|
private readonly supportCodeLibrary;
|
|
42
|
-
private readonly testCaseId;
|
|
43
|
-
private readonly testSteps;
|
|
44
35
|
private testStepResults;
|
|
45
36
|
private world;
|
|
46
37
|
private readonly worldParameters;
|
|
47
|
-
constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, retries, skip, supportCodeLibrary, worldParameters, }:
|
|
38
|
+
constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, testCase, retries, skip, supportCodeLibrary, worldParameters, }: INewTestCaseRunnerOptions);
|
|
48
39
|
resetTestProgressData(): void;
|
|
49
|
-
buildTestSteps(): ITestStep[];
|
|
50
|
-
emitTestCase(): void;
|
|
51
|
-
private mapArgumentGroup;
|
|
52
|
-
getAfterHookDefinitions(): TestCaseHookDefinition[];
|
|
53
|
-
getBeforeHookDefinitions(): TestCaseHookDefinition[];
|
|
54
40
|
getBeforeStepHookDefinitions(): TestStepHookDefinition[];
|
|
55
41
|
getAfterStepHookDefinitions(): TestStepHookDefinition[];
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
invokeStep(step: messages.Pickle.IPickleStep, stepDefinition: IDefinition, hookParameter?: any): Promise<messages.TestStepFinished.ITestStepResult>;
|
|
42
|
+
getWorstStepResult(): messages.TestStepResult;
|
|
43
|
+
invokeStep(step: messages.PickleStep, stepDefinition: IDefinition, hookParameter?: any): Promise<messages.TestStepResult>;
|
|
59
44
|
isSkippingSteps(): boolean;
|
|
60
45
|
shouldSkipHook(isBeforeHook: boolean): boolean;
|
|
61
|
-
aroundTestStep(testStepId: string, attempt: number, runStepFn: () => Promise<messages.
|
|
62
|
-
run(): Promise<messages.
|
|
63
|
-
runHook(hookDefinition: TestCaseHookDefinition, hookParameter: ITestCaseHookParameter, isBeforeHook: boolean): Promise<messages.
|
|
64
|
-
runStepHooks(stepHooks: TestStepHookDefinition[], stepResult?: messages.
|
|
65
|
-
runStep(testStep:
|
|
46
|
+
aroundTestStep(testStepId: string, attempt: number, runStepFn: () => Promise<messages.TestStepResult>): Promise<void>;
|
|
47
|
+
run(): Promise<messages.TestStepResultStatus>;
|
|
48
|
+
runHook(hookDefinition: TestCaseHookDefinition, hookParameter: ITestCaseHookParameter, isBeforeHook: boolean): Promise<messages.TestStepResult>;
|
|
49
|
+
runStepHooks(stepHooks: TestStepHookDefinition[], stepResult?: messages.TestStepResult): Promise<messages.TestStepResult[]>;
|
|
50
|
+
runStep(pickleStep: messages.PickleStep, testStep: messages.TestStep): Promise<messages.TestStepResult>;
|
|
66
51
|
}
|
|
67
|
-
export {};
|
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
23
|
};
|
|
@@ -8,17 +27,15 @@ const helpers_1 = require("./helpers");
|
|
|
8
27
|
const attachment_manager_1 = __importDefault(require("./attachment_manager"));
|
|
9
28
|
const step_runner_1 = __importDefault(require("./step_runner"));
|
|
10
29
|
const messages_1 = require("@cucumber/messages");
|
|
11
|
-
const
|
|
30
|
+
const messages = __importStar(require("@cucumber/messages"));
|
|
12
31
|
const value_checker_1 = require("../value_checker");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class PickleRunner {
|
|
16
|
-
constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, retries = 0, skip, supportCodeLibrary, worldParameters, }) {
|
|
32
|
+
class TestCaseRunner {
|
|
33
|
+
constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, testCase, retries = 0, skip, supportCodeLibrary, worldParameters, }) {
|
|
17
34
|
this.attachmentManager = new attachment_manager_1.default(({ data, media }) => {
|
|
18
35
|
if (value_checker_1.doesNotHaveValue(this.currentTestStepId)) {
|
|
19
36
|
throw new Error('Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.');
|
|
20
37
|
}
|
|
21
|
-
|
|
38
|
+
const attachment = {
|
|
22
39
|
attachment: {
|
|
23
40
|
body: data,
|
|
24
41
|
contentEncoding: media.encoding,
|
|
@@ -26,7 +43,8 @@ class PickleRunner {
|
|
|
26
43
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
27
44
|
testStepId: this.currentTestStepId,
|
|
28
45
|
},
|
|
29
|
-
}
|
|
46
|
+
};
|
|
47
|
+
this.eventBroadcaster.emit('envelope', attachment);
|
|
30
48
|
});
|
|
31
49
|
this.eventBroadcaster = eventBroadcaster;
|
|
32
50
|
this.stopwatch = stopwatch;
|
|
@@ -34,11 +52,10 @@ class PickleRunner {
|
|
|
34
52
|
this.maxAttempts = 1 + (skip ? 0 : retries);
|
|
35
53
|
this.newId = newId;
|
|
36
54
|
this.pickle = pickle;
|
|
55
|
+
this.testCase = testCase;
|
|
37
56
|
this.skip = skip;
|
|
38
57
|
this.supportCodeLibrary = supportCodeLibrary;
|
|
39
58
|
this.worldParameters = worldParameters;
|
|
40
|
-
this.testCaseId = this.newId();
|
|
41
|
-
this.testSteps = this.buildTestSteps();
|
|
42
59
|
this.resetTestProgressData();
|
|
43
60
|
}
|
|
44
61
|
resetTestProgressData() {
|
|
@@ -49,84 +66,6 @@ class PickleRunner {
|
|
|
49
66
|
});
|
|
50
67
|
this.testStepResults = [];
|
|
51
68
|
}
|
|
52
|
-
buildTestSteps() {
|
|
53
|
-
const testSteps = [];
|
|
54
|
-
this.getBeforeHookDefinitions().forEach((hookDefinition) => {
|
|
55
|
-
testSteps.push({
|
|
56
|
-
id: this.newId(),
|
|
57
|
-
hookDefinition,
|
|
58
|
-
isHook: true,
|
|
59
|
-
isBeforeHook: true,
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
this.pickle.steps.forEach((pickleStep) => {
|
|
63
|
-
const stepDefinitions = this.getStepDefinitions(pickleStep);
|
|
64
|
-
testSteps.push({
|
|
65
|
-
id: this.newId(),
|
|
66
|
-
pickleStep,
|
|
67
|
-
stepDefinitions,
|
|
68
|
-
isHook: false,
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
this.getAfterHookDefinitions().forEach((hookDefinition) => {
|
|
72
|
-
testSteps.push({
|
|
73
|
-
id: this.newId(),
|
|
74
|
-
hookDefinition,
|
|
75
|
-
isHook: true,
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
return testSteps;
|
|
79
|
-
}
|
|
80
|
-
emitTestCase() {
|
|
81
|
-
const testCase = {
|
|
82
|
-
pickleId: this.pickle.id,
|
|
83
|
-
id: this.testCaseId,
|
|
84
|
-
testSteps: this.testSteps.map((testStep) => {
|
|
85
|
-
if (testStep.isHook) {
|
|
86
|
-
return {
|
|
87
|
-
id: testStep.id,
|
|
88
|
-
hookId: testStep.hookDefinition.id,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
return {
|
|
93
|
-
id: testStep.id,
|
|
94
|
-
pickleStepId: testStep.pickleStep.id,
|
|
95
|
-
stepDefinitionIds: testStep.stepDefinitions.map((x) => x.id),
|
|
96
|
-
stepMatchArgumentsLists: testStep.stepDefinitions.map((x) => {
|
|
97
|
-
const result = x.expression.match(testStep.pickleStep.text);
|
|
98
|
-
return {
|
|
99
|
-
stepMatchArguments: result.map((arg) => {
|
|
100
|
-
return {
|
|
101
|
-
group: this.mapArgumentGroup(arg.group),
|
|
102
|
-
parameterTypeName: arg.parameterType.name,
|
|
103
|
-
};
|
|
104
|
-
}),
|
|
105
|
-
};
|
|
106
|
-
}),
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}),
|
|
110
|
-
};
|
|
111
|
-
this.eventBroadcaster.emit('envelope', messages_1.messages.Envelope.fromObject({ testCase }));
|
|
112
|
-
}
|
|
113
|
-
mapArgumentGroup(group) {
|
|
114
|
-
return {
|
|
115
|
-
start: group.start,
|
|
116
|
-
value: group.value,
|
|
117
|
-
children: value_checker_1.doesHaveValue(group.children)
|
|
118
|
-
? group.children.map((child) => this.mapArgumentGroup(child))
|
|
119
|
-
: undefined,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
getAfterHookDefinitions() {
|
|
123
|
-
return lodash_1.clone(this.supportCodeLibrary.afterTestCaseHookDefinitions)
|
|
124
|
-
.reverse()
|
|
125
|
-
.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
126
|
-
}
|
|
127
|
-
getBeforeHookDefinitions() {
|
|
128
|
-
return this.supportCodeLibrary.beforeTestCaseHookDefinitions.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
129
|
-
}
|
|
130
69
|
getBeforeStepHookDefinitions() {
|
|
131
70
|
return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
132
71
|
}
|
|
@@ -135,16 +74,17 @@ class PickleRunner {
|
|
|
135
74
|
.reverse()
|
|
136
75
|
.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
137
76
|
}
|
|
138
|
-
getStepDefinitions(pickleStep) {
|
|
139
|
-
return this.supportCodeLibrary.stepDefinitions.filter((stepDefinition) => stepDefinition.matchesStepName(pickleStep.text));
|
|
140
|
-
}
|
|
141
77
|
getWorstStepResult() {
|
|
142
78
|
if (this.testStepResults.length === 0) {
|
|
143
|
-
return
|
|
144
|
-
status: this.skip
|
|
145
|
-
|
|
79
|
+
return {
|
|
80
|
+
status: this.skip
|
|
81
|
+
? messages.TestStepResultStatus.SKIPPED
|
|
82
|
+
: messages.TestStepResultStatus.PASSED,
|
|
83
|
+
willBeRetried: false,
|
|
84
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
85
|
+
};
|
|
146
86
|
}
|
|
147
|
-
return
|
|
87
|
+
return messages_1.getWorstTestStepResult(this.testStepResults);
|
|
148
88
|
}
|
|
149
89
|
async invokeStep(step, stepDefinition, hookParameter) {
|
|
150
90
|
return await step_runner_1.default.run({
|
|
@@ -156,24 +96,25 @@ class PickleRunner {
|
|
|
156
96
|
});
|
|
157
97
|
}
|
|
158
98
|
isSkippingSteps() {
|
|
159
|
-
return this.getWorstStepResult().status !==
|
|
99
|
+
return (this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED);
|
|
160
100
|
}
|
|
161
101
|
shouldSkipHook(isBeforeHook) {
|
|
162
102
|
return this.skip || (this.isSkippingSteps() && isBeforeHook);
|
|
163
103
|
}
|
|
164
104
|
async aroundTestStep(testStepId, attempt, runStepFn) {
|
|
165
|
-
|
|
105
|
+
const testStepStarted = {
|
|
166
106
|
testStepStarted: {
|
|
167
107
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
168
108
|
testStepId,
|
|
169
109
|
timestamp: this.stopwatch.timestamp(),
|
|
170
110
|
},
|
|
171
|
-
}
|
|
111
|
+
};
|
|
112
|
+
this.eventBroadcaster.emit('envelope', testStepStarted);
|
|
172
113
|
this.currentTestStepId = testStepId;
|
|
173
114
|
const testStepResult = await runStepFn();
|
|
174
115
|
this.currentTestStepId = null;
|
|
175
116
|
this.testStepResults.push(testStepResult);
|
|
176
|
-
if (testStepResult.status ===
|
|
117
|
+
if (testStepResult.status === messages.TestStepResultStatus.FAILED &&
|
|
177
118
|
attempt + 1 < this.maxAttempts) {
|
|
178
119
|
/*
|
|
179
120
|
TODO dont rely on `testStepResult.willBeRetried`, it will be moved or removed
|
|
@@ -181,51 +122,58 @@ class PickleRunner {
|
|
|
181
122
|
*/
|
|
182
123
|
testStepResult.willBeRetried = true;
|
|
183
124
|
}
|
|
184
|
-
|
|
125
|
+
const testStepFinished = {
|
|
185
126
|
testStepFinished: {
|
|
186
127
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
187
128
|
testStepId,
|
|
188
129
|
testStepResult,
|
|
189
130
|
timestamp: this.stopwatch.timestamp(),
|
|
190
131
|
},
|
|
191
|
-
}
|
|
132
|
+
};
|
|
133
|
+
this.eventBroadcaster.emit('envelope', testStepFinished);
|
|
192
134
|
}
|
|
193
135
|
async run() {
|
|
194
|
-
this.emitTestCase();
|
|
195
136
|
for (let attempt = 0; attempt < this.maxAttempts; attempt++) {
|
|
196
137
|
this.currentTestCaseStartedId = this.newId();
|
|
197
|
-
|
|
138
|
+
const testCaseStarted = {
|
|
198
139
|
testCaseStarted: {
|
|
199
140
|
attempt,
|
|
200
|
-
testCaseId: this.
|
|
141
|
+
testCaseId: this.testCase.id,
|
|
201
142
|
id: this.currentTestCaseStartedId,
|
|
202
143
|
timestamp: this.stopwatch.timestamp(),
|
|
203
144
|
},
|
|
204
|
-
}
|
|
205
|
-
|
|
145
|
+
};
|
|
146
|
+
this.eventBroadcaster.emit('envelope', testCaseStarted);
|
|
147
|
+
// used to determine whether a hook is a Before or After
|
|
148
|
+
let didWeRunStepsYet = false;
|
|
149
|
+
for (const testStep of this.testCase.testSteps) {
|
|
206
150
|
await this.aroundTestStep(testStep.id, attempt, async () => {
|
|
207
|
-
if (testStep.
|
|
151
|
+
if (value_checker_1.doesHaveValue(testStep.hookId)) {
|
|
208
152
|
const hookParameter = {
|
|
209
153
|
gherkinDocument: this.gherkinDocument,
|
|
210
154
|
pickle: this.pickle,
|
|
211
155
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
212
156
|
};
|
|
213
|
-
if (
|
|
157
|
+
if (didWeRunStepsYet) {
|
|
214
158
|
hookParameter.result = this.getWorstStepResult();
|
|
215
159
|
}
|
|
216
|
-
return await this.runHook(testStep.
|
|
160
|
+
return await this.runHook(findHookDefinition(testStep.hookId, this.supportCodeLibrary), hookParameter, !didWeRunStepsYet);
|
|
217
161
|
}
|
|
218
162
|
else {
|
|
219
|
-
|
|
163
|
+
const pickleStep = this.pickle.steps.find((pickleStep) => pickleStep.id === testStep.pickleStepId);
|
|
164
|
+
const testStepResult = await this.runStep(pickleStep, testStep);
|
|
165
|
+
didWeRunStepsYet = true;
|
|
166
|
+
return testStepResult;
|
|
220
167
|
}
|
|
221
168
|
});
|
|
222
169
|
}
|
|
223
|
-
|
|
170
|
+
const testCaseFinished = {
|
|
224
171
|
testCaseFinished: {
|
|
225
172
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
226
173
|
timestamp: this.stopwatch.timestamp(),
|
|
227
174
|
},
|
|
228
|
-
}
|
|
175
|
+
};
|
|
176
|
+
this.eventBroadcaster.emit('envelope', testCaseFinished);
|
|
229
177
|
if (!this.getWorstStepResult().willBeRetried) {
|
|
230
178
|
break;
|
|
231
179
|
}
|
|
@@ -235,9 +183,11 @@ class PickleRunner {
|
|
|
235
183
|
}
|
|
236
184
|
async runHook(hookDefinition, hookParameter, isBeforeHook) {
|
|
237
185
|
if (this.shouldSkipHook(isBeforeHook)) {
|
|
238
|
-
return
|
|
239
|
-
status:
|
|
240
|
-
|
|
186
|
+
return {
|
|
187
|
+
status: messages.TestStepResultStatus.SKIPPED,
|
|
188
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
189
|
+
willBeRetried: false,
|
|
190
|
+
};
|
|
241
191
|
}
|
|
242
192
|
return await this.invokeStep(null, hookDefinition, hookParameter);
|
|
243
193
|
}
|
|
@@ -255,51 +205,58 @@ class PickleRunner {
|
|
|
255
205
|
}
|
|
256
206
|
return stepHooksResult;
|
|
257
207
|
}
|
|
258
|
-
async runStep(testStep) {
|
|
259
|
-
|
|
260
|
-
return
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
208
|
+
async runStep(pickleStep, testStep) {
|
|
209
|
+
const stepDefinitions = testStep.stepDefinitionIds.map((stepDefinitionId) => {
|
|
210
|
+
return findStepDefinition(stepDefinitionId, this.supportCodeLibrary);
|
|
211
|
+
});
|
|
212
|
+
if (stepDefinitions.length === 0) {
|
|
213
|
+
return {
|
|
214
|
+
status: messages.TestStepResultStatus.UNDEFINED,
|
|
215
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
216
|
+
willBeRetried: false,
|
|
217
|
+
};
|
|
267
218
|
}
|
|
268
|
-
else if (
|
|
269
|
-
return
|
|
270
|
-
message: helpers_1.getAmbiguousStepException(
|
|
271
|
-
status:
|
|
272
|
-
duration:
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
},
|
|
276
|
-
});
|
|
219
|
+
else if (stepDefinitions.length > 1) {
|
|
220
|
+
return {
|
|
221
|
+
message: helpers_1.getAmbiguousStepException(stepDefinitions),
|
|
222
|
+
status: messages.TestStepResultStatus.AMBIGUOUS,
|
|
223
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
224
|
+
willBeRetried: false,
|
|
225
|
+
};
|
|
277
226
|
}
|
|
278
227
|
else if (this.isSkippingSteps()) {
|
|
279
|
-
return
|
|
280
|
-
status:
|
|
281
|
-
duration:
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
},
|
|
285
|
-
});
|
|
228
|
+
return {
|
|
229
|
+
status: messages.TestStepResultStatus.SKIPPED,
|
|
230
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
231
|
+
willBeRetried: false,
|
|
232
|
+
};
|
|
286
233
|
}
|
|
287
234
|
let stepResult;
|
|
288
|
-
let stepResults = await this.runStepHooks(this.getBeforeStepHookDefinitions()
|
|
289
|
-
if (
|
|
290
|
-
|
|
235
|
+
let stepResults = await this.runStepHooks(this.getBeforeStepHookDefinitions());
|
|
236
|
+
if (messages_1.getWorstTestStepResult(stepResults).status !==
|
|
237
|
+
messages.TestStepResultStatus.FAILED) {
|
|
238
|
+
stepResult = await this.invokeStep(pickleStep, stepDefinitions[0]);
|
|
291
239
|
stepResults.push(stepResult);
|
|
292
240
|
}
|
|
293
241
|
const afterStepHookResults = await this.runStepHooks(this.getAfterStepHookDefinitions(), stepResult);
|
|
294
242
|
stepResults = stepResults.concat(afterStepHookResults);
|
|
295
|
-
const finalStepResult =
|
|
296
|
-
let finalDuration =
|
|
243
|
+
const finalStepResult = messages_1.getWorstTestStepResult(stepResults);
|
|
244
|
+
let finalDuration = messages.TimeConversion.millisecondsToDuration(0);
|
|
297
245
|
for (const result of stepResults) {
|
|
298
|
-
finalDuration =
|
|
246
|
+
finalDuration = messages.TimeConversion.addDurations(finalDuration, result.duration);
|
|
299
247
|
}
|
|
300
248
|
finalStepResult.duration = finalDuration;
|
|
301
249
|
return finalStepResult;
|
|
302
250
|
}
|
|
303
251
|
}
|
|
304
|
-
exports.default =
|
|
305
|
-
|
|
252
|
+
exports.default = TestCaseRunner;
|
|
253
|
+
function findHookDefinition(id, supportCodeLibrary) {
|
|
254
|
+
return [
|
|
255
|
+
...supportCodeLibrary.beforeTestCaseHookDefinitions,
|
|
256
|
+
...supportCodeLibrary.afterTestCaseHookDefinitions,
|
|
257
|
+
].find((definition) => definition.id === id);
|
|
258
|
+
}
|
|
259
|
+
function findStepDefinition(id, supportCodeLibrary) {
|
|
260
|
+
return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id);
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=test_case_runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_case_runner.js","sourceRoot":"","sources":["../../src/runtime/test_case_runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { clone } from 'lodash'\nimport { getAmbiguousStepException } from './helpers'\nimport AttachmentManager from './attachment_manager'\nimport StepRunner from './step_runner'\nimport { IdGenerator, getWorstTestStepResult } from '@cucumber/messages'\nimport * as messages from '@cucumber/messages'\nimport { EventEmitter } from 'events'\nimport {\n ISupportCodeLibrary,\n ITestCaseHookParameter,\n ITestStepHookParameter,\n} from '../support_code_library_builder/types'\nimport TestCaseHookDefinition from '../models/test_case_hook_definition'\nimport TestStepHookDefinition from '../models/test_step_hook_definition'\nimport { IDefinition } from '../models/definition'\nimport { doesHaveValue, doesNotHaveValue } from '../value_checker'\nimport { ITestRunStopwatch } from './stopwatch'\nimport StepDefinition from '../models/step_definition'\n\nexport interface INewTestCaseRunnerOptions {\n eventBroadcaster: EventEmitter\n stopwatch: ITestRunStopwatch\n gherkinDocument: messages.GherkinDocument\n newId: IdGenerator.NewId\n pickle: messages.Pickle\n testCase: messages.TestCase\n retries: number\n skip: boolean\n supportCodeLibrary: ISupportCodeLibrary\n worldParameters: any\n}\n\nexport default class TestCaseRunner {\n private readonly attachmentManager: AttachmentManager\n private currentTestCaseStartedId: string\n private currentTestStepId: string\n private readonly eventBroadcaster: EventEmitter\n private readonly stopwatch: ITestRunStopwatch\n private readonly gherkinDocument: messages.GherkinDocument\n private readonly newId: IdGenerator.NewId\n private readonly pickle: messages.Pickle\n private readonly testCase: messages.TestCase\n private readonly maxAttempts: number\n private readonly skip: boolean\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private testStepResults: messages.TestStepResult[]\n private world: any\n private readonly worldParameters: any\n\n constructor({\n eventBroadcaster,\n stopwatch,\n gherkinDocument,\n newId,\n pickle,\n testCase,\n retries = 0,\n skip,\n supportCodeLibrary,\n worldParameters,\n }: INewTestCaseRunnerOptions) {\n this.attachmentManager = new AttachmentManager(({ data, media }) => {\n if (doesNotHaveValue(this.currentTestStepId)) {\n throw new Error(\n 'Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.'\n )\n }\n const attachment: messages.Envelope = {\n attachment: {\n body: data,\n contentEncoding: media.encoding,\n mediaType: media.contentType,\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId: this.currentTestStepId,\n },\n }\n this.eventBroadcaster.emit('envelope', attachment)\n })\n this.eventBroadcaster = eventBroadcaster\n this.stopwatch = stopwatch\n this.gherkinDocument = gherkinDocument\n this.maxAttempts = 1 + (skip ? 0 : retries)\n this.newId = newId\n this.pickle = pickle\n this.testCase = testCase\n this.skip = skip\n this.supportCodeLibrary = supportCodeLibrary\n this.worldParameters = worldParameters\n this.resetTestProgressData()\n }\n\n resetTestProgressData(): void {\n this.world = new this.supportCodeLibrary.World({\n attach: this.attachmentManager.create.bind(this.attachmentManager),\n log: this.attachmentManager.log.bind(this.attachmentManager),\n parameters: this.worldParameters,\n })\n this.testStepResults = []\n }\n\n getBeforeStepHookDefinitions(): TestStepHookDefinition[] {\n return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter(\n (hookDefinition) => hookDefinition.appliesToTestCase(this.pickle)\n )\n }\n\n getAfterStepHookDefinitions(): TestStepHookDefinition[] {\n return clone(this.supportCodeLibrary.afterTestStepHookDefinitions)\n .reverse()\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle))\n }\n\n getWorstStepResult(): messages.TestStepResult {\n if (this.testStepResults.length === 0) {\n return {\n status: this.skip\n ? messages.TestStepResultStatus.SKIPPED\n : messages.TestStepResultStatus.PASSED,\n willBeRetried: false,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n }\n }\n return getWorstTestStepResult(this.testStepResults)\n }\n\n async invokeStep(\n step: messages.PickleStep,\n stepDefinition: IDefinition,\n hookParameter?: any\n ): Promise<messages.TestStepResult> {\n return await StepRunner.run({\n defaultTimeout: this.supportCodeLibrary.defaultTimeout,\n hookParameter,\n step,\n stepDefinition,\n world: this.world,\n })\n }\n\n isSkippingSteps(): boolean {\n return (\n this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED\n )\n }\n\n shouldSkipHook(isBeforeHook: boolean): boolean {\n return this.skip || (this.isSkippingSteps() && isBeforeHook)\n }\n\n async aroundTestStep(\n testStepId: string,\n attempt: number,\n runStepFn: () => Promise<messages.TestStepResult>\n ): Promise<void> {\n const testStepStarted: messages.Envelope = {\n testStepStarted: {\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testStepStarted)\n this.currentTestStepId = testStepId\n const testStepResult = await runStepFn()\n this.currentTestStepId = null\n this.testStepResults.push(testStepResult)\n if (\n testStepResult.status === messages.TestStepResultStatus.FAILED &&\n attempt + 1 < this.maxAttempts\n ) {\n /*\n TODO dont rely on `testStepResult.willBeRetried`, it will be moved or removed\n see https://github.com/cucumber/cucumber/issues/902\n */\n testStepResult.willBeRetried = true\n }\n const testStepFinished: messages.Envelope = {\n testStepFinished: {\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId,\n testStepResult,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testStepFinished)\n }\n\n async run(): Promise<messages.TestStepResultStatus> {\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n this.currentTestCaseStartedId = this.newId()\n const testCaseStarted: messages.Envelope = {\n testCaseStarted: {\n attempt,\n testCaseId: this.testCase.id,\n id: this.currentTestCaseStartedId,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testCaseStarted)\n // used to determine whether a hook is a Before or After\n let didWeRunStepsYet = false\n for (const testStep of this.testCase.testSteps) {\n await this.aroundTestStep(testStep.id, attempt, async () => {\n if (doesHaveValue(testStep.hookId)) {\n const hookParameter: ITestCaseHookParameter = {\n gherkinDocument: this.gherkinDocument,\n pickle: this.pickle,\n testCaseStartedId: this.currentTestCaseStartedId,\n }\n if (didWeRunStepsYet) {\n hookParameter.result = this.getWorstStepResult()\n }\n return await this.runHook(\n findHookDefinition(testStep.hookId, this.supportCodeLibrary),\n hookParameter,\n !didWeRunStepsYet\n )\n } else {\n const pickleStep = this.pickle.steps.find(\n (pickleStep) => pickleStep.id === testStep.pickleStepId\n )\n const testStepResult = await this.runStep(pickleStep, testStep)\n didWeRunStepsYet = true\n return testStepResult\n }\n })\n }\n const testCaseFinished: messages.Envelope = {\n testCaseFinished: {\n testCaseStartedId: this.currentTestCaseStartedId,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testCaseFinished)\n if (!this.getWorstStepResult().willBeRetried) {\n break\n }\n this.resetTestProgressData()\n }\n return this.getWorstStepResult().status\n }\n\n async runHook(\n hookDefinition: TestCaseHookDefinition,\n hookParameter: ITestCaseHookParameter,\n isBeforeHook: boolean\n ): Promise<messages.TestStepResult> {\n if (this.shouldSkipHook(isBeforeHook)) {\n return {\n status: messages.TestStepResultStatus.SKIPPED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n }\n return await this.invokeStep(null, hookDefinition, hookParameter)\n }\n\n async runStepHooks(\n stepHooks: TestStepHookDefinition[],\n stepResult?: messages.TestStepResult\n ): Promise<messages.TestStepResult[]> {\n const stepHooksResult = []\n const hookParameter: ITestStepHookParameter = {\n gherkinDocument: this.gherkinDocument,\n pickle: this.pickle,\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId: this.currentTestStepId,\n result: stepResult,\n }\n for (const stepHookDefinition of stepHooks) {\n stepHooksResult.push(\n await this.invokeStep(null, stepHookDefinition, hookParameter)\n )\n }\n return stepHooksResult\n }\n\n async runStep(\n pickleStep: messages.PickleStep,\n testStep: messages.TestStep\n ): Promise<messages.TestStepResult> {\n const stepDefinitions = testStep.stepDefinitionIds.map(\n (stepDefinitionId) => {\n return findStepDefinition(stepDefinitionId, this.supportCodeLibrary)\n }\n )\n if (stepDefinitions.length === 0) {\n return {\n status: messages.TestStepResultStatus.UNDEFINED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n } else if (stepDefinitions.length > 1) {\n return {\n message: getAmbiguousStepException(stepDefinitions),\n status: messages.TestStepResultStatus.AMBIGUOUS,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n } else if (this.isSkippingSteps()) {\n return {\n status: messages.TestStepResultStatus.SKIPPED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n }\n\n let stepResult\n let stepResults = await this.runStepHooks(\n this.getBeforeStepHookDefinitions()\n )\n if (\n getWorstTestStepResult(stepResults).status !==\n messages.TestStepResultStatus.FAILED\n ) {\n stepResult = await this.invokeStep(pickleStep, stepDefinitions[0])\n stepResults.push(stepResult)\n }\n const afterStepHookResults = await this.runStepHooks(\n this.getAfterStepHookDefinitions(),\n stepResult\n )\n stepResults = stepResults.concat(afterStepHookResults)\n\n const finalStepResult = getWorstTestStepResult(stepResults)\n let finalDuration = messages.TimeConversion.millisecondsToDuration(0)\n for (const result of stepResults) {\n finalDuration = messages.TimeConversion.addDurations(\n finalDuration,\n result.duration\n )\n }\n finalStepResult.duration = finalDuration\n return finalStepResult\n }\n}\n\nfunction findHookDefinition(\n id: string,\n supportCodeLibrary: ISupportCodeLibrary\n): TestCaseHookDefinition {\n return [\n ...supportCodeLibrary.beforeTestCaseHookDefinitions,\n ...supportCodeLibrary.afterTestCaseHookDefinitions,\n ].find((definition) => definition.id === id)\n}\n\nfunction findStepDefinition(\n id: string,\n supportCodeLibrary: ISupportCodeLibrary\n): StepDefinition {\n return supportCodeLibrary.stepDefinitions.find(\n (definition) => definition.id === id\n )\n}\n"]}
|
package/lib/step_arguments.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as messages from '@cucumber/messages';
|
|
2
2
|
export interface IPickleStepArgumentFunctionMap<T> {
|
|
3
|
-
dataTable: (arg: messages.
|
|
4
|
-
docString: (arg: messages.
|
|
3
|
+
dataTable: (arg: messages.PickleTable) => T;
|
|
4
|
+
docString: (arg: messages.PickleDocString) => T;
|
|
5
5
|
}
|
|
6
|
-
export declare function parseStepArgument<T>(arg: messages.
|
|
6
|
+
export declare function parseStepArgument<T>(arg: messages.PickleStepArgument, mapping: IPickleStepArgumentFunctionMap<T>): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step_arguments.js","sourceRoot":"","sources":["../src/step_arguments.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAEvB,mDAA+C;AAO/C,SAAgB,iBAAiB,CAC/B,
|
|
1
|
+
{"version":3,"file":"step_arguments.js","sourceRoot":"","sources":["../src/step_arguments.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAEvB,mDAA+C;AAO/C,SAAgB,iBAAiB,CAC/B,GAAgC,EAChC,OAA0C;IAE1C,IAAI,6BAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QAChC,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;KACxC;SAAM,IAAI,6BAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QACvC,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;KACxC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAChE,CAAC;AAVD,8CAUC","sourcesContent":["import util from 'util'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue } from './value_checker'\n\nexport interface IPickleStepArgumentFunctionMap<T> {\n dataTable: (arg: messages.PickleTable) => T\n docString: (arg: messages.PickleDocString) => T\n}\n\nexport function parseStepArgument<T>(\n arg: messages.PickleStepArgument,\n mapping: IPickleStepArgumentFunctionMap<T>\n): T {\n if (doesHaveValue(arg.dataTable)) {\n return mapping.dataTable(arg.dataTable)\n } else if (doesHaveValue(arg.docString)) {\n return mapping.docString(arg.docString)\n }\n throw new Error(`Unknown step argument: ${util.inspect(arg)}`)\n}\n"]}
|