@dev-blinq/cucumber-js 1.0.6 → 1.0.8
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/bin/cucumber-js +0 -0
- package/bin/cucumber.js +0 -0
- package/lib/api/console_logger.d.ts +12 -12
- package/lib/api/console_logger.js +23 -23
- package/lib/api/convert_configuration.d.ts +4 -4
- package/lib/api/convert_configuration.js +64 -64
- package/lib/api/environment.d.ts +2 -2
- package/lib/api/environment.js +13 -13
- package/lib/api/formatters.d.ts +20 -20
- package/lib/api/formatters.js +60 -60
- package/lib/api/gherkin.d.ts +21 -21
- package/lib/api/gherkin.js +99 -99
- package/lib/api/index.d.ts +12 -12
- package/lib/api/index.js +27 -27
- package/lib/api/load_configuration.d.ts +9 -9
- package/lib/api/load_configuration.js +40 -40
- package/lib/api/load_sources.d.ts +9 -9
- package/lib/api/load_sources.js +52 -52
- package/lib/api/load_support.d.ts +10 -10
- package/lib/api/load_support.js +29 -29
- package/lib/api/paths.d.ts +8 -8
- package/lib/api/paths.js +101 -101
- package/lib/api/plugins.d.ts +4 -4
- package/lib/api/plugins.js +18 -18
- package/lib/api/run_cucumber.d.ts +11 -11
- package/lib/api/run_cucumber.js +114 -114
- package/lib/api/runtime.d.ts +21 -21
- package/lib/api/runtime.js +35 -35
- package/lib/api/support.d.ts +9 -9
- package/lib/api/support.js +25 -25
- package/lib/api/test_helpers.d.ts +3 -3
- package/lib/api/test_helpers.js +30 -30
- package/lib/api/types.d.ts +175 -175
- package/lib/api/types.js +2 -2
- package/lib/cli/helpers.d.ts +37 -37
- package/lib/cli/helpers.js +202 -202
- package/lib/cli/i18n.d.ts +2 -2
- package/lib/cli/i18n.js +69 -69
- package/lib/cli/index.d.ts +21 -21
- package/lib/cli/index.js +58 -58
- package/lib/cli/install_validator.d.ts +1 -1
- package/lib/cli/install_validator.js +13 -13
- package/lib/cli/run.d.ts +1 -1
- package/lib/cli/run.js +43 -43
- package/lib/cli/validate_node_engine_version.d.ts +10 -10
- package/lib/cli/validate_node_engine_version.js +23 -23
- package/lib/configuration/argv_parser.d.ts +20 -20
- package/lib/configuration/argv_parser.js +100 -100
- package/lib/configuration/check_schema.d.ts +2 -2
- package/lib/configuration/check_schema.js +59 -59
- package/lib/configuration/default_configuration.d.ts +2 -2
- package/lib/configuration/default_configuration.js +26 -26
- package/lib/configuration/from_file.d.ts +3 -3
- package/lib/configuration/from_file.js +84 -84
- package/lib/configuration/helpers.d.ts +1 -1
- package/lib/configuration/helpers.js +10 -10
- package/lib/configuration/index.d.ts +7 -7
- package/lib/configuration/index.js +28 -28
- package/lib/configuration/locate_file.d.ts +1 -1
- package/lib/configuration/locate_file.js +20 -20
- package/lib/configuration/merge_configurations.d.ts +2 -2
- package/lib/configuration/merge_configurations.js +47 -47
- package/lib/configuration/option_splitter.d.ts +3 -3
- package/lib/configuration/option_splitter.js +22 -22
- package/lib/configuration/types.d.ts +28 -28
- package/lib/configuration/types.js +2 -2
- package/lib/configuration/validate_configuration.d.ts +3 -3
- package/lib/configuration/validate_configuration.js +12 -12
- package/lib/filter_stack_trace.d.ts +3 -3
- package/lib/filter_stack_trace.js +37 -37
- package/lib/formatter/builder.d.ts +37 -37
- package/lib/formatter/builder.js +100 -100
- package/lib/formatter/bvt_formatter.d.ts +5 -0
- package/lib/formatter/bvt_formatter.js +21 -0
- package/lib/formatter/bvt_formatter.js.map +1 -0
- package/lib/formatter/feature_data_format.d.ts +14 -14
- package/lib/formatter/feature_data_format.js +80 -80
- package/lib/formatter/feature_data_format.js.map +1 -1
- package/lib/formatter/fixtures/typescript.d.ts +2 -2
- package/lib/formatter/fixtures/typescript.js +5 -5
- package/lib/formatter/get_color_fns.d.ts +15 -15
- package/lib/formatter/get_color_fns.js +55 -55
- package/lib/formatter/helpers/duration_helpers.d.ts +2 -2
- package/lib/formatter/helpers/duration_helpers.js +8 -8
- package/lib/formatter/helpers/event_data_collector.d.ts +30 -30
- package/lib/formatter/helpers/event_data_collector.js +125 -125
- package/lib/formatter/helpers/formatters.d.ts +6 -6
- package/lib/formatter/helpers/formatters.js +44 -42
- package/lib/formatter/helpers/formatters.js.map +1 -1
- package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
- package/lib/formatter/helpers/gherkin_document_parser.js +65 -65
- package/lib/formatter/helpers/index.d.ts +10 -10
- package/lib/formatter/helpers/index.js +51 -51
- package/lib/formatter/helpers/issue_helpers.d.ts +19 -19
- package/lib/formatter/helpers/issue_helpers.js +58 -58
- package/lib/formatter/helpers/keyword_type.d.ts +11 -11
- package/lib/formatter/helpers/keyword_type.js +31 -31
- package/lib/formatter/helpers/location_helpers.d.ts +2 -2
- package/lib/formatter/helpers/location_helpers.js +16 -16
- package/lib/formatter/helpers/pickle_parser.d.ts +17 -17
- package/lib/formatter/helpers/pickle_parser.js +27 -27
- package/lib/formatter/helpers/report_generator.d.ts +91 -0
- package/lib/formatter/helpers/report_generator.js +235 -0
- package/lib/formatter/helpers/report_generator.js.map +1 -0
- package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
- package/lib/formatter/helpers/step_argument_formatter.js +47 -47
- package/lib/formatter/helpers/summary_helpers.d.ts +9 -9
- package/lib/formatter/helpers/summary_helpers.js +95 -95
- package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +12 -12
- package/lib/formatter/helpers/test_case_attempt_formatter.js +113 -113
- package/lib/formatter/helpers/test_case_attempt_parser.d.ts +32 -32
- package/lib/formatter/helpers/test_case_attempt_parser.js +134 -134
- package/lib/formatter/helpers/usage_helpers/index.d.ts +23 -23
- package/lib/formatter/helpers/usage_helpers/index.js +110 -110
- package/lib/formatter/html_formatter.d.ts +7 -7
- package/lib/formatter/html_formatter.js +29 -29
- package/lib/formatter/index.d.ts +53 -53
- package/lib/formatter/index.js +20 -20
- package/lib/formatter/json_formatter.d.ts +78 -78
- package/lib/formatter/json_formatter.js +229 -229
- package/lib/formatter/junit_formatter.d.ts +17 -17
- package/lib/formatter/junit_formatter.js +180 -180
- package/lib/formatter/message_formatter.d.ts +5 -5
- package/lib/formatter/message_formatter.js +14 -14
- package/lib/formatter/progress_bar_formatter.d.ts +18 -18
- package/lib/formatter/progress_bar_formatter.js +98 -98
- package/lib/formatter/progress_formatter.d.ts +9 -9
- package/lib/formatter/progress_formatter.js +58 -58
- package/lib/formatter/rerun_formatter.d.ts +13 -13
- package/lib/formatter/rerun_formatter.js +79 -79
- package/lib/formatter/snippets_formatter.d.ts +6 -6
- package/lib/formatter/snippets_formatter.js +60 -60
- package/lib/formatter/step_definition_snippet_builder/index.d.ts +20 -20
- package/lib/formatter/step_definition_snippet_builder/index.js +45 -45
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +7 -7
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +45 -45
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +16 -16
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +10 -10
- package/lib/formatter/summary_formatter.d.ts +14 -14
- package/lib/formatter/summary_formatter.js +67 -67
- package/lib/formatter/usage_formatter.d.ts +6 -6
- package/lib/formatter/usage_formatter.js +97 -97
- package/lib/formatter/usage_json_formatter.d.ts +7 -7
- package/lib/formatter/usage_json_formatter.js +33 -33
- package/lib/index.d.ts +58 -58
- package/lib/index.js +108 -108
- package/lib/logger.d.ts +5 -5
- package/lib/logger.js +2 -2
- package/lib/models/data_table.d.ts +10 -10
- package/lib/models/data_table.js +45 -45
- package/lib/models/definition.d.ts +55 -55
- package/lib/models/definition.js +21 -21
- package/lib/models/gherkin_step_keyword.d.ts +1 -1
- package/lib/models/gherkin_step_keyword.js +2 -2
- package/lib/models/pickle_order.d.ts +1 -1
- package/lib/models/pickle_order.js +2 -2
- package/lib/models/step_definition.d.ts +11 -11
- package/lib/models/step_definition.js +36 -36
- package/lib/models/test_case_hook_definition.d.ts +10 -10
- package/lib/models/test_case_hook_definition.js +26 -26
- package/lib/models/test_run_hook_definition.d.ts +3 -3
- package/lib/models/test_run_hook_definition.js +9 -9
- package/lib/models/test_step_hook_definition.d.ts +9 -9
- package/lib/models/test_step_hook_definition.js +25 -25
- package/lib/pickle_filter.d.ts +42 -42
- package/lib/pickle_filter.js +98 -98
- package/lib/plugin/index.d.ts +2 -2
- package/lib/plugin/index.js +18 -18
- package/lib/plugin/plugin_manager.d.ts +13 -13
- package/lib/plugin/plugin_manager.js +35 -35
- package/lib/plugin/types.d.ts +14 -14
- package/lib/plugin/types.js +2 -2
- package/lib/publish/http_stream.d.ts +30 -30
- package/lib/publish/http_stream.js +111 -111
- package/lib/publish/index.d.ts +2 -2
- package/lib/publish/index.js +4 -4
- package/lib/publish/publish_plugin.d.ts +2 -2
- package/lib/publish/publish_plugin.js +47 -47
- package/lib/runtime/assemble_test_cases.d.ts +13 -13
- package/lib/runtime/assemble_test_cases.js +87 -87
- package/lib/runtime/attachment_manager/index.d.ts +33 -33
- package/lib/runtime/attachment_manager/index.js +118 -118
- package/lib/runtime/format_error.d.ts +2 -2
- package/lib/runtime/format_error.js +35 -35
- package/lib/runtime/helpers.d.ts +6 -6
- package/lib/runtime/helpers.js +100 -100
- package/lib/runtime/index.d.ts +40 -40
- package/lib/runtime/index.js +75 -75
- package/lib/runtime/parallel/command_types.d.ts +32 -32
- package/lib/runtime/parallel/command_types.js +2 -2
- package/lib/runtime/parallel/coordinator.d.ts +72 -72
- package/lib/runtime/parallel/coordinator.js +221 -221
- package/lib/runtime/parallel/run_worker.d.ts +1 -1
- package/lib/runtime/parallel/run_worker.js +28 -28
- package/lib/runtime/parallel/worker.d.ts +26 -26
- package/lib/runtime/parallel/worker.js +86 -86
- package/lib/runtime/run_test_run_hooks.d.ts +3 -3
- package/lib/runtime/run_test_run_hooks.js +27 -27
- package/lib/runtime/step_runner.d.ts +16 -16
- package/lib/runtime/step_runner.js +87 -87
- package/lib/runtime/stopwatch.d.ts +12 -12
- package/lib/runtime/stopwatch.js +33 -33
- package/lib/runtime/test_case_runner.d.ts +54 -54
- package/lib/runtime/test_case_runner.js +267 -267
- package/lib/step_arguments.d.ts +6 -6
- package/lib/step_arguments.js +18 -18
- package/lib/support_code_library_builder/build_parameter_type.d.ts +3 -3
- package/lib/support_code_library_builder/build_parameter_type.js +12 -12
- package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -3
- package/lib/support_code_library_builder/get_definition_line_and_uri.js +28 -28
- package/lib/support_code_library_builder/index.d.ts +74 -74
- package/lib/support_code_library_builder/index.js +296 -296
- package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -2
- package/lib/support_code_library_builder/parallel_can_assign_helpers.js +15 -15
- package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +7 -7
- package/lib/support_code_library_builder/sourced_parameter_type_registry.js +18 -18
- package/lib/support_code_library_builder/types.d.ts +88 -88
- package/lib/support_code_library_builder/types.js +2 -2
- package/lib/support_code_library_builder/validate_arguments.d.ts +12 -12
- package/lib/support_code_library_builder/validate_arguments.js +72 -72
- package/lib/support_code_library_builder/world.d.ts +18 -18
- package/lib/support_code_library_builder/world.js +10 -10
- package/lib/time.d.ts +18 -18
- package/lib/time.js +60 -60
- package/lib/try_require.d.ts +7 -7
- package/lib/try_require.js +22 -22
- package/lib/types/index.d.ts +4 -4
- package/lib/types/index.js +2 -2
- package/lib/uncaught_exception_manager.d.ts +7 -7
- package/lib/uncaught_exception_manager.js +11 -11
- package/lib/user_code_runner.d.ts +14 -14
- package/lib/user_code_runner.js +81 -81
- package/lib/value_checker.d.ts +3 -3
- package/lib/value_checker.js +18 -18
- package/lib/version.d.ts +1 -1
- package/lib/version.js +5 -5
- package/lib/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,181 +1,181 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const xmlbuilder_1 = __importDefault(require("xmlbuilder"));
|
|
7
|
-
const _1 = __importDefault(require("./"));
|
|
8
|
-
const messages_1 = require("@cucumber/messages");
|
|
9
|
-
const value_checker_1 = require("../value_checker");
|
|
10
|
-
const gherkin_document_parser_1 = require("./helpers/gherkin_document_parser");
|
|
11
|
-
const pickle_parser_1 = require("./helpers/pickle_parser");
|
|
12
|
-
const value_checker_2 = require("../value_checker");
|
|
13
|
-
class JunitFormatter extends _1.default {
|
|
14
|
-
constructor(options) {
|
|
15
|
-
var _a;
|
|
16
|
-
super(options);
|
|
17
|
-
this.names = {};
|
|
18
|
-
this.suiteName = (0, value_checker_2.valueOrDefault)((_a = options.parsedArgvOptions.junit) === null || _a === void 0 ? void 0 : _a.suiteName, 'cucumber-js');
|
|
19
|
-
options.eventBroadcaster.on('envelope', (envelope) => {
|
|
20
|
-
if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
|
|
21
|
-
this.onTestRunFinished();
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
getTestCases() {
|
|
26
|
-
return this.eventDataCollector
|
|
27
|
-
.getTestCaseAttempts()
|
|
28
|
-
.filter((attempt) => !attempt.willBeRetried);
|
|
29
|
-
}
|
|
30
|
-
getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap) {
|
|
31
|
-
return testCaseAttempt.testCase.testSteps.map((testStep) => {
|
|
32
|
-
const isBeforeHook = !(0, value_checker_1.doesHaveValue)(testStep.pickleStepId);
|
|
33
|
-
return this.getTestStep({
|
|
34
|
-
isBeforeHook,
|
|
35
|
-
gherkinStepMap,
|
|
36
|
-
pickleStepMap,
|
|
37
|
-
testStep,
|
|
38
|
-
testStepAttachments: testCaseAttempt.stepAttachments[testStep.id],
|
|
39
|
-
testStepResult: testCaseAttempt.stepResults[testStep.id],
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
getTestStep({ isBeforeHook, gherkinStepMap, pickleStepMap, testStep, testStepAttachments, testStepResult, }) {
|
|
44
|
-
const data = {};
|
|
45
|
-
if (testStep.pickleStepId) {
|
|
46
|
-
const pickleStep = pickleStepMap[testStep.pickleStepId];
|
|
47
|
-
data.keyword = (0, pickle_parser_1.getStepKeyword)({ pickleStep, gherkinStepMap });
|
|
48
|
-
data.line = gherkinStepMap[pickleStep.astNodeIds[0]].location.line;
|
|
49
|
-
data.name = pickleStep.text;
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
data.keyword = isBeforeHook ? 'Before' : 'After';
|
|
53
|
-
data.hidden = true;
|
|
54
|
-
}
|
|
55
|
-
data.result = testStepResult;
|
|
56
|
-
data.time = testStepResult.duration
|
|
57
|
-
? this.durationToSeconds(testStepResult.duration)
|
|
58
|
-
: 0;
|
|
59
|
-
data.attachments = testStepAttachments;
|
|
60
|
-
return data;
|
|
61
|
-
}
|
|
62
|
-
getTestCaseResult(steps) {
|
|
63
|
-
const { status, message, exception } = (0, messages_1.getWorstTestStepResult)(steps.map((step) => step.result));
|
|
64
|
-
return {
|
|
65
|
-
status,
|
|
66
|
-
failure: message || exception
|
|
67
|
-
? {
|
|
68
|
-
type: exception === null || exception === void 0 ? void 0 : exception.type,
|
|
69
|
-
message: exception === null || exception === void 0 ? void 0 : exception.message,
|
|
70
|
-
detail: message,
|
|
71
|
-
}
|
|
72
|
-
: undefined,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
durationToSeconds(duration) {
|
|
76
|
-
const NANOS_IN_SECOND = 1000000000;
|
|
77
|
-
return ((duration.seconds * NANOS_IN_SECOND + duration.nanos) / NANOS_IN_SECOND);
|
|
78
|
-
}
|
|
79
|
-
nameOrDefault(name, fallbackSuffix) {
|
|
80
|
-
if (!name) {
|
|
81
|
-
return `(unnamed ${fallbackSuffix})`;
|
|
82
|
-
}
|
|
83
|
-
return name;
|
|
84
|
-
}
|
|
85
|
-
getTestCaseName(feature, rule, pickle) {
|
|
86
|
-
const featureName = this.nameOrDefault(feature.name, 'feature');
|
|
87
|
-
const pickleName = this.nameOrDefault(pickle.name, 'scenario');
|
|
88
|
-
const testCaseName = rule
|
|
89
|
-
? this.nameOrDefault(rule.name, 'rule') + ': ' + pickleName
|
|
90
|
-
: pickleName;
|
|
91
|
-
if (!this.names[featureName]) {
|
|
92
|
-
this.names[featureName] = [];
|
|
93
|
-
}
|
|
94
|
-
let index = 0;
|
|
95
|
-
while (this.names[featureName].includes(index > 0 ? `${testCaseName} [${index}]` : testCaseName)) {
|
|
96
|
-
index++;
|
|
97
|
-
}
|
|
98
|
-
const name = index > 0 ? `${testCaseName} [${index}]` : testCaseName;
|
|
99
|
-
this.names[featureName].push(name);
|
|
100
|
-
return name;
|
|
101
|
-
}
|
|
102
|
-
formatTestSteps(steps) {
|
|
103
|
-
return steps
|
|
104
|
-
.filter((step) => !step.hidden)
|
|
105
|
-
.map((step) => {
|
|
106
|
-
const statusText = step.result.status.toLowerCase();
|
|
107
|
-
const maxLength = 80 - statusText.length - 3;
|
|
108
|
-
const stepText = `${step.keyword}${step.name}`
|
|
109
|
-
.padEnd(maxLength, '.')
|
|
110
|
-
.substring(0, maxLength);
|
|
111
|
-
return `${stepText}...${statusText}`;
|
|
112
|
-
})
|
|
113
|
-
.join('\n');
|
|
114
|
-
}
|
|
115
|
-
onTestRunFinished() {
|
|
116
|
-
const testCases = this.getTestCases();
|
|
117
|
-
const tests = testCases.map((testCaseAttempt) => {
|
|
118
|
-
const { gherkinDocument, pickle } = testCaseAttempt;
|
|
119
|
-
const { feature } = gherkinDocument;
|
|
120
|
-
const gherkinExampleRuleMap = (0, gherkin_document_parser_1.getGherkinExampleRuleMap)(gherkinDocument);
|
|
121
|
-
const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]];
|
|
122
|
-
const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(gherkinDocument);
|
|
123
|
-
const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(pickle);
|
|
124
|
-
const steps = this.getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap);
|
|
125
|
-
const stepDuration = steps.reduce((total, step) => total + (step.time || 0), 0);
|
|
126
|
-
return {
|
|
127
|
-
classname: this.nameOrDefault(feature.name, 'feature'),
|
|
128
|
-
name: this.getTestCaseName(feature, rule, pickle),
|
|
129
|
-
time: stepDuration,
|
|
130
|
-
result: this.getTestCaseResult(steps),
|
|
131
|
-
systemOutput: this.formatTestSteps(steps),
|
|
132
|
-
steps,
|
|
133
|
-
};
|
|
134
|
-
});
|
|
135
|
-
const passed = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.PASSED).length;
|
|
136
|
-
const skipped = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.SKIPPED).length;
|
|
137
|
-
const failures = tests.length - passed - skipped;
|
|
138
|
-
const testSuite = {
|
|
139
|
-
name: this.suiteName,
|
|
140
|
-
tests,
|
|
141
|
-
failures,
|
|
142
|
-
skipped,
|
|
143
|
-
time: tests.reduce((total, test) => total + test.time, 0),
|
|
144
|
-
};
|
|
145
|
-
this.log(this.buildXmlReport(testSuite));
|
|
146
|
-
}
|
|
147
|
-
buildXmlReport(testSuite) {
|
|
148
|
-
const xmlReport = xmlbuilder_1.default
|
|
149
|
-
.create('testsuite', { invalidCharReplacement: '' })
|
|
150
|
-
.att('failures', testSuite.failures)
|
|
151
|
-
.att('skipped', testSuite.skipped)
|
|
152
|
-
.att('name', testSuite.name)
|
|
153
|
-
.att('time', testSuite.time)
|
|
154
|
-
.att('tests', testSuite.tests.length);
|
|
155
|
-
testSuite.tests.forEach((test) => {
|
|
156
|
-
var _a, _b, _c;
|
|
157
|
-
const xmlTestCase = xmlReport.ele('testcase', {
|
|
158
|
-
classname: test.classname,
|
|
159
|
-
name: test.name,
|
|
160
|
-
time: test.time,
|
|
161
|
-
});
|
|
162
|
-
if (test.result.status === messages_1.TestStepResultStatus.SKIPPED) {
|
|
163
|
-
xmlTestCase.ele('skipped');
|
|
164
|
-
}
|
|
165
|
-
else if (test.result.status !== messages_1.TestStepResultStatus.PASSED) {
|
|
166
|
-
const xmlFailure = xmlTestCase.ele('failure', {
|
|
167
|
-
type: (_a = test.result.failure) === null || _a === void 0 ? void 0 : _a.type,
|
|
168
|
-
message: (_b = test.result.failure) === null || _b === void 0 ? void 0 : _b.message,
|
|
169
|
-
});
|
|
170
|
-
if ((_c = test.result) === null || _c === void 0 ? void 0 : _c.failure) {
|
|
171
|
-
xmlFailure.cdata(test.result.failure.detail);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
xmlTestCase.ele('system-out', {}).cdata(test.systemOutput);
|
|
175
|
-
});
|
|
176
|
-
return xmlReport.end({ pretty: true });
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
exports.default = JunitFormatter;
|
|
180
|
-
JunitFormatter.documentation = 'Outputs JUnit report';
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const xmlbuilder_1 = __importDefault(require("xmlbuilder"));
|
|
7
|
+
const _1 = __importDefault(require("./"));
|
|
8
|
+
const messages_1 = require("@cucumber/messages");
|
|
9
|
+
const value_checker_1 = require("../value_checker");
|
|
10
|
+
const gherkin_document_parser_1 = require("./helpers/gherkin_document_parser");
|
|
11
|
+
const pickle_parser_1 = require("./helpers/pickle_parser");
|
|
12
|
+
const value_checker_2 = require("../value_checker");
|
|
13
|
+
class JunitFormatter extends _1.default {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
var _a;
|
|
16
|
+
super(options);
|
|
17
|
+
this.names = {};
|
|
18
|
+
this.suiteName = (0, value_checker_2.valueOrDefault)((_a = options.parsedArgvOptions.junit) === null || _a === void 0 ? void 0 : _a.suiteName, 'cucumber-js');
|
|
19
|
+
options.eventBroadcaster.on('envelope', (envelope) => {
|
|
20
|
+
if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
|
|
21
|
+
this.onTestRunFinished();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
getTestCases() {
|
|
26
|
+
return this.eventDataCollector
|
|
27
|
+
.getTestCaseAttempts()
|
|
28
|
+
.filter((attempt) => !attempt.willBeRetried);
|
|
29
|
+
}
|
|
30
|
+
getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap) {
|
|
31
|
+
return testCaseAttempt.testCase.testSteps.map((testStep) => {
|
|
32
|
+
const isBeforeHook = !(0, value_checker_1.doesHaveValue)(testStep.pickleStepId);
|
|
33
|
+
return this.getTestStep({
|
|
34
|
+
isBeforeHook,
|
|
35
|
+
gherkinStepMap,
|
|
36
|
+
pickleStepMap,
|
|
37
|
+
testStep,
|
|
38
|
+
testStepAttachments: testCaseAttempt.stepAttachments[testStep.id],
|
|
39
|
+
testStepResult: testCaseAttempt.stepResults[testStep.id],
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
getTestStep({ isBeforeHook, gherkinStepMap, pickleStepMap, testStep, testStepAttachments, testStepResult, }) {
|
|
44
|
+
const data = {};
|
|
45
|
+
if (testStep.pickleStepId) {
|
|
46
|
+
const pickleStep = pickleStepMap[testStep.pickleStepId];
|
|
47
|
+
data.keyword = (0, pickle_parser_1.getStepKeyword)({ pickleStep, gherkinStepMap });
|
|
48
|
+
data.line = gherkinStepMap[pickleStep.astNodeIds[0]].location.line;
|
|
49
|
+
data.name = pickleStep.text;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
data.keyword = isBeforeHook ? 'Before' : 'After';
|
|
53
|
+
data.hidden = true;
|
|
54
|
+
}
|
|
55
|
+
data.result = testStepResult;
|
|
56
|
+
data.time = testStepResult.duration
|
|
57
|
+
? this.durationToSeconds(testStepResult.duration)
|
|
58
|
+
: 0;
|
|
59
|
+
data.attachments = testStepAttachments;
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
62
|
+
getTestCaseResult(steps) {
|
|
63
|
+
const { status, message, exception } = (0, messages_1.getWorstTestStepResult)(steps.map((step) => step.result));
|
|
64
|
+
return {
|
|
65
|
+
status,
|
|
66
|
+
failure: message || exception
|
|
67
|
+
? {
|
|
68
|
+
type: exception === null || exception === void 0 ? void 0 : exception.type,
|
|
69
|
+
message: exception === null || exception === void 0 ? void 0 : exception.message,
|
|
70
|
+
detail: message,
|
|
71
|
+
}
|
|
72
|
+
: undefined,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
durationToSeconds(duration) {
|
|
76
|
+
const NANOS_IN_SECOND = 1000000000;
|
|
77
|
+
return ((duration.seconds * NANOS_IN_SECOND + duration.nanos) / NANOS_IN_SECOND);
|
|
78
|
+
}
|
|
79
|
+
nameOrDefault(name, fallbackSuffix) {
|
|
80
|
+
if (!name) {
|
|
81
|
+
return `(unnamed ${fallbackSuffix})`;
|
|
82
|
+
}
|
|
83
|
+
return name;
|
|
84
|
+
}
|
|
85
|
+
getTestCaseName(feature, rule, pickle) {
|
|
86
|
+
const featureName = this.nameOrDefault(feature.name, 'feature');
|
|
87
|
+
const pickleName = this.nameOrDefault(pickle.name, 'scenario');
|
|
88
|
+
const testCaseName = rule
|
|
89
|
+
? this.nameOrDefault(rule.name, 'rule') + ': ' + pickleName
|
|
90
|
+
: pickleName;
|
|
91
|
+
if (!this.names[featureName]) {
|
|
92
|
+
this.names[featureName] = [];
|
|
93
|
+
}
|
|
94
|
+
let index = 0;
|
|
95
|
+
while (this.names[featureName].includes(index > 0 ? `${testCaseName} [${index}]` : testCaseName)) {
|
|
96
|
+
index++;
|
|
97
|
+
}
|
|
98
|
+
const name = index > 0 ? `${testCaseName} [${index}]` : testCaseName;
|
|
99
|
+
this.names[featureName].push(name);
|
|
100
|
+
return name;
|
|
101
|
+
}
|
|
102
|
+
formatTestSteps(steps) {
|
|
103
|
+
return steps
|
|
104
|
+
.filter((step) => !step.hidden)
|
|
105
|
+
.map((step) => {
|
|
106
|
+
const statusText = step.result.status.toLowerCase();
|
|
107
|
+
const maxLength = 80 - statusText.length - 3;
|
|
108
|
+
const stepText = `${step.keyword}${step.name}`
|
|
109
|
+
.padEnd(maxLength, '.')
|
|
110
|
+
.substring(0, maxLength);
|
|
111
|
+
return `${stepText}...${statusText}`;
|
|
112
|
+
})
|
|
113
|
+
.join('\n');
|
|
114
|
+
}
|
|
115
|
+
onTestRunFinished() {
|
|
116
|
+
const testCases = this.getTestCases();
|
|
117
|
+
const tests = testCases.map((testCaseAttempt) => {
|
|
118
|
+
const { gherkinDocument, pickle } = testCaseAttempt;
|
|
119
|
+
const { feature } = gherkinDocument;
|
|
120
|
+
const gherkinExampleRuleMap = (0, gherkin_document_parser_1.getGherkinExampleRuleMap)(gherkinDocument);
|
|
121
|
+
const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]];
|
|
122
|
+
const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(gherkinDocument);
|
|
123
|
+
const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(pickle);
|
|
124
|
+
const steps = this.getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap);
|
|
125
|
+
const stepDuration = steps.reduce((total, step) => total + (step.time || 0), 0);
|
|
126
|
+
return {
|
|
127
|
+
classname: this.nameOrDefault(feature.name, 'feature'),
|
|
128
|
+
name: this.getTestCaseName(feature, rule, pickle),
|
|
129
|
+
time: stepDuration,
|
|
130
|
+
result: this.getTestCaseResult(steps),
|
|
131
|
+
systemOutput: this.formatTestSteps(steps),
|
|
132
|
+
steps,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
const passed = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.PASSED).length;
|
|
136
|
+
const skipped = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.SKIPPED).length;
|
|
137
|
+
const failures = tests.length - passed - skipped;
|
|
138
|
+
const testSuite = {
|
|
139
|
+
name: this.suiteName,
|
|
140
|
+
tests,
|
|
141
|
+
failures,
|
|
142
|
+
skipped,
|
|
143
|
+
time: tests.reduce((total, test) => total + test.time, 0),
|
|
144
|
+
};
|
|
145
|
+
this.log(this.buildXmlReport(testSuite));
|
|
146
|
+
}
|
|
147
|
+
buildXmlReport(testSuite) {
|
|
148
|
+
const xmlReport = xmlbuilder_1.default
|
|
149
|
+
.create('testsuite', { invalidCharReplacement: '' })
|
|
150
|
+
.att('failures', testSuite.failures)
|
|
151
|
+
.att('skipped', testSuite.skipped)
|
|
152
|
+
.att('name', testSuite.name)
|
|
153
|
+
.att('time', testSuite.time)
|
|
154
|
+
.att('tests', testSuite.tests.length);
|
|
155
|
+
testSuite.tests.forEach((test) => {
|
|
156
|
+
var _a, _b, _c;
|
|
157
|
+
const xmlTestCase = xmlReport.ele('testcase', {
|
|
158
|
+
classname: test.classname,
|
|
159
|
+
name: test.name,
|
|
160
|
+
time: test.time,
|
|
161
|
+
});
|
|
162
|
+
if (test.result.status === messages_1.TestStepResultStatus.SKIPPED) {
|
|
163
|
+
xmlTestCase.ele('skipped');
|
|
164
|
+
}
|
|
165
|
+
else if (test.result.status !== messages_1.TestStepResultStatus.PASSED) {
|
|
166
|
+
const xmlFailure = xmlTestCase.ele('failure', {
|
|
167
|
+
type: (_a = test.result.failure) === null || _a === void 0 ? void 0 : _a.type,
|
|
168
|
+
message: (_b = test.result.failure) === null || _b === void 0 ? void 0 : _b.message,
|
|
169
|
+
});
|
|
170
|
+
if ((_c = test.result) === null || _c === void 0 ? void 0 : _c.failure) {
|
|
171
|
+
xmlFailure.cdata(test.result.failure.detail);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
xmlTestCase.ele('system-out', {}).cdata(test.systemOutput);
|
|
175
|
+
});
|
|
176
|
+
return xmlReport.end({ pretty: true });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.default = JunitFormatter;
|
|
180
|
+
JunitFormatter.documentation = 'Outputs JUnit report';
|
|
181
181
|
//# sourceMappingURL=junit_formatter.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import Formatter, { IFormatterOptions } from '.';
|
|
2
|
-
export default class MessageFormatter extends Formatter {
|
|
3
|
-
static readonly documentation: string;
|
|
4
|
-
constructor(options: IFormatterOptions);
|
|
5
|
-
}
|
|
1
|
+
import Formatter, { IFormatterOptions } from '.';
|
|
2
|
+
export default class MessageFormatter extends Formatter {
|
|
3
|
+
static readonly documentation: string;
|
|
4
|
+
constructor(options: IFormatterOptions);
|
|
5
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const _1 = __importDefault(require("."));
|
|
7
|
-
class MessageFormatter extends _1.default {
|
|
8
|
-
constructor(options) {
|
|
9
|
-
super(options);
|
|
10
|
-
options.eventBroadcaster.on('envelope', (envelope) => this.log(JSON.stringify(envelope) + '\n'));
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
exports.default = MessageFormatter;
|
|
14
|
-
MessageFormatter.documentation = 'Outputs protobuf messages';
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const _1 = __importDefault(require("."));
|
|
7
|
+
class MessageFormatter extends _1.default {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
super(options);
|
|
10
|
+
options.eventBroadcaster.on('envelope', (envelope) => this.log(JSON.stringify(envelope) + '\n'));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = MessageFormatter;
|
|
14
|
+
MessageFormatter.documentation = 'Outputs protobuf messages';
|
|
15
15
|
//# sourceMappingURL=message_formatter.js.map
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import Formatter, { IFormatterOptions } from './';
|
|
2
|
-
import ProgressBar from 'progress';
|
|
3
|
-
import * as messages from '@cucumber/messages';
|
|
4
|
-
export default class ProgressBarFormatter extends Formatter {
|
|
5
|
-
private numberOfSteps;
|
|
6
|
-
private testRunStarted;
|
|
7
|
-
private issueCount;
|
|
8
|
-
progressBar: ProgressBar;
|
|
9
|
-
static readonly documentation: string;
|
|
10
|
-
constructor(options: IFormatterOptions);
|
|
11
|
-
incrementStepCount(pickleId: string): void;
|
|
12
|
-
initializeProgressBar(): void;
|
|
13
|
-
logProgress({ testStepId, testCaseStartedId, }: messages.TestStepFinished): void;
|
|
14
|
-
logUndefinedParametertype(parameterType: messages.UndefinedParameterType): void;
|
|
15
|
-
logErrorIfNeeded(testCaseFinished: messages.TestCaseFinished): void;
|
|
16
|
-
logSummary(testRunFinished: messages.TestRunFinished): void;
|
|
17
|
-
parseEnvelope(envelope: messages.Envelope): void;
|
|
18
|
-
}
|
|
1
|
+
import Formatter, { IFormatterOptions } from './';
|
|
2
|
+
import ProgressBar from 'progress';
|
|
3
|
+
import * as messages from '@cucumber/messages';
|
|
4
|
+
export default class ProgressBarFormatter extends Formatter {
|
|
5
|
+
private numberOfSteps;
|
|
6
|
+
private testRunStarted;
|
|
7
|
+
private issueCount;
|
|
8
|
+
progressBar: ProgressBar;
|
|
9
|
+
static readonly documentation: string;
|
|
10
|
+
constructor(options: IFormatterOptions);
|
|
11
|
+
incrementStepCount(pickleId: string): void;
|
|
12
|
+
initializeProgressBar(): void;
|
|
13
|
+
logProgress({ testStepId, testCaseStartedId, }: messages.TestStepFinished): void;
|
|
14
|
+
logUndefinedParametertype(parameterType: messages.UndefinedParameterType): void;
|
|
15
|
+
logErrorIfNeeded(testCaseFinished: messages.TestCaseFinished): void;
|
|
16
|
+
logSummary(testRunFinished: messages.TestRunFinished): void;
|
|
17
|
+
parseEnvelope(envelope: messages.Envelope): void;
|
|
18
|
+
}
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const helpers_1 = require("./helpers");
|
|
7
|
-
const _1 = __importDefault(require("./"));
|
|
8
|
-
const progress_1 = __importDefault(require("progress"));
|
|
9
|
-
const value_checker_1 = require("../value_checker");
|
|
10
|
-
const issue_helpers_1 = require("./helpers/issue_helpers");
|
|
11
|
-
const time_1 = require("../time");
|
|
12
|
-
// Inspired by https://github.com/thekompanee/fuubar and https://github.com/martinciu/fuubar-cucumber
|
|
13
|
-
class ProgressBarFormatter extends _1.default {
|
|
14
|
-
constructor(options) {
|
|
15
|
-
super(options);
|
|
16
|
-
options.eventBroadcaster.on('envelope', this.parseEnvelope.bind(this));
|
|
17
|
-
this.numberOfSteps = 0;
|
|
18
|
-
this.issueCount = 0;
|
|
19
|
-
}
|
|
20
|
-
incrementStepCount(pickleId) {
|
|
21
|
-
const pickle = this.eventDataCollector.getPickle(pickleId);
|
|
22
|
-
this.numberOfSteps += pickle.steps.length;
|
|
23
|
-
}
|
|
24
|
-
initializeProgressBar() {
|
|
25
|
-
if ((0, value_checker_1.doesHaveValue)(this.progressBar)) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
this.progressBar = new progress_1.default(':current/:total steps [:bar] ', {
|
|
29
|
-
clear: true,
|
|
30
|
-
incomplete: ' ',
|
|
31
|
-
stream: this.stream,
|
|
32
|
-
total: this.numberOfSteps,
|
|
33
|
-
width: (0, value_checker_1.valueOrDefault)(this.stream.columns, 80),
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
logProgress({ testStepId, testCaseStartedId, }) {
|
|
37
|
-
const { testCase } = this.eventDataCollector.getTestCaseAttempt(testCaseStartedId);
|
|
38
|
-
const testStep = testCase.testSteps.find((s) => s.id === testStepId);
|
|
39
|
-
if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) {
|
|
40
|
-
this.progressBar.tick();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
logUndefinedParametertype(parameterType) {
|
|
44
|
-
this.log(`Undefined parameter type: ${(0, issue_helpers_1.formatUndefinedParameterType)(parameterType)}\n`);
|
|
45
|
-
}
|
|
46
|
-
logErrorIfNeeded(testCaseFinished) {
|
|
47
|
-
const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
|
|
48
|
-
if ((0, helpers_1.isIssue)(worstTestStepResult)) {
|
|
49
|
-
this.issueCount += 1;
|
|
50
|
-
const testCaseAttempt = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
|
|
51
|
-
this.progressBar.interrupt((0, helpers_1.formatIssue)({
|
|
52
|
-
colorFns: this.colorFns,
|
|
53
|
-
number: this.issueCount,
|
|
54
|
-
snippetBuilder: this.snippetBuilder,
|
|
55
|
-
supportCodeLibrary: this.supportCodeLibrary,
|
|
56
|
-
testCaseAttempt,
|
|
57
|
-
printAttachments: this.printAttachments,
|
|
58
|
-
}));
|
|
59
|
-
if (testCaseFinished.willBeRetried) {
|
|
60
|
-
const stepsToRetry = testCaseAttempt.pickle.steps.length;
|
|
61
|
-
this.progressBar.tick(-stepsToRetry);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
logSummary(testRunFinished) {
|
|
66
|
-
const testRunDuration = (0, time_1.durationBetweenTimestamps)(this.testRunStarted.timestamp, testRunFinished.timestamp);
|
|
67
|
-
this.log((0, helpers_1.formatSummary)({
|
|
68
|
-
colorFns: this.colorFns,
|
|
69
|
-
testCaseAttempts: this.eventDataCollector.getTestCaseAttempts(),
|
|
70
|
-
testRunDuration,
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
73
|
-
parseEnvelope(envelope) {
|
|
74
|
-
if ((0, value_checker_1.doesHaveValue)(envelope.undefinedParameterType)) {
|
|
75
|
-
this.logUndefinedParametertype(envelope.undefinedParameterType);
|
|
76
|
-
}
|
|
77
|
-
else if ((0, value_checker_1.doesHaveValue)(envelope.testCase)) {
|
|
78
|
-
this.incrementStepCount(envelope.testCase.pickleId);
|
|
79
|
-
}
|
|
80
|
-
else if ((0, value_checker_1.doesHaveValue)(envelope.testStepStarted)) {
|
|
81
|
-
this.initializeProgressBar();
|
|
82
|
-
}
|
|
83
|
-
else if ((0, value_checker_1.doesHaveValue)(envelope.testStepFinished)) {
|
|
84
|
-
this.logProgress(envelope.testStepFinished);
|
|
85
|
-
}
|
|
86
|
-
else if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) {
|
|
87
|
-
this.logErrorIfNeeded(envelope.testCaseFinished);
|
|
88
|
-
}
|
|
89
|
-
else if ((0, value_checker_1.doesHaveValue)(envelope.testRunStarted)) {
|
|
90
|
-
this.testRunStarted = envelope.testRunStarted;
|
|
91
|
-
}
|
|
92
|
-
else if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
|
|
93
|
-
this.logSummary(envelope.testRunFinished);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
exports.default = ProgressBarFormatter;
|
|
98
|
-
ProgressBarFormatter.documentation = 'Similar to the Progress Formatter, but provides a real-time updating progress bar based on the total number of steps to be executed in the test run';
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const _1 = __importDefault(require("./"));
|
|
8
|
+
const progress_1 = __importDefault(require("progress"));
|
|
9
|
+
const value_checker_1 = require("../value_checker");
|
|
10
|
+
const issue_helpers_1 = require("./helpers/issue_helpers");
|
|
11
|
+
const time_1 = require("../time");
|
|
12
|
+
// Inspired by https://github.com/thekompanee/fuubar and https://github.com/martinciu/fuubar-cucumber
|
|
13
|
+
class ProgressBarFormatter extends _1.default {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super(options);
|
|
16
|
+
options.eventBroadcaster.on('envelope', this.parseEnvelope.bind(this));
|
|
17
|
+
this.numberOfSteps = 0;
|
|
18
|
+
this.issueCount = 0;
|
|
19
|
+
}
|
|
20
|
+
incrementStepCount(pickleId) {
|
|
21
|
+
const pickle = this.eventDataCollector.getPickle(pickleId);
|
|
22
|
+
this.numberOfSteps += pickle.steps.length;
|
|
23
|
+
}
|
|
24
|
+
initializeProgressBar() {
|
|
25
|
+
if ((0, value_checker_1.doesHaveValue)(this.progressBar)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.progressBar = new progress_1.default(':current/:total steps [:bar] ', {
|
|
29
|
+
clear: true,
|
|
30
|
+
incomplete: ' ',
|
|
31
|
+
stream: this.stream,
|
|
32
|
+
total: this.numberOfSteps,
|
|
33
|
+
width: (0, value_checker_1.valueOrDefault)(this.stream.columns, 80),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
logProgress({ testStepId, testCaseStartedId, }) {
|
|
37
|
+
const { testCase } = this.eventDataCollector.getTestCaseAttempt(testCaseStartedId);
|
|
38
|
+
const testStep = testCase.testSteps.find((s) => s.id === testStepId);
|
|
39
|
+
if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) {
|
|
40
|
+
this.progressBar.tick();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
logUndefinedParametertype(parameterType) {
|
|
44
|
+
this.log(`Undefined parameter type: ${(0, issue_helpers_1.formatUndefinedParameterType)(parameterType)}\n`);
|
|
45
|
+
}
|
|
46
|
+
logErrorIfNeeded(testCaseFinished) {
|
|
47
|
+
const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
|
|
48
|
+
if ((0, helpers_1.isIssue)(worstTestStepResult)) {
|
|
49
|
+
this.issueCount += 1;
|
|
50
|
+
const testCaseAttempt = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
|
|
51
|
+
this.progressBar.interrupt((0, helpers_1.formatIssue)({
|
|
52
|
+
colorFns: this.colorFns,
|
|
53
|
+
number: this.issueCount,
|
|
54
|
+
snippetBuilder: this.snippetBuilder,
|
|
55
|
+
supportCodeLibrary: this.supportCodeLibrary,
|
|
56
|
+
testCaseAttempt,
|
|
57
|
+
printAttachments: this.printAttachments,
|
|
58
|
+
}));
|
|
59
|
+
if (testCaseFinished.willBeRetried) {
|
|
60
|
+
const stepsToRetry = testCaseAttempt.pickle.steps.length;
|
|
61
|
+
this.progressBar.tick(-stepsToRetry);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
logSummary(testRunFinished) {
|
|
66
|
+
const testRunDuration = (0, time_1.durationBetweenTimestamps)(this.testRunStarted.timestamp, testRunFinished.timestamp);
|
|
67
|
+
this.log((0, helpers_1.formatSummary)({
|
|
68
|
+
colorFns: this.colorFns,
|
|
69
|
+
testCaseAttempts: this.eventDataCollector.getTestCaseAttempts(),
|
|
70
|
+
testRunDuration,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
parseEnvelope(envelope) {
|
|
74
|
+
if ((0, value_checker_1.doesHaveValue)(envelope.undefinedParameterType)) {
|
|
75
|
+
this.logUndefinedParametertype(envelope.undefinedParameterType);
|
|
76
|
+
}
|
|
77
|
+
else if ((0, value_checker_1.doesHaveValue)(envelope.testCase)) {
|
|
78
|
+
this.incrementStepCount(envelope.testCase.pickleId);
|
|
79
|
+
}
|
|
80
|
+
else if ((0, value_checker_1.doesHaveValue)(envelope.testStepStarted)) {
|
|
81
|
+
this.initializeProgressBar();
|
|
82
|
+
}
|
|
83
|
+
else if ((0, value_checker_1.doesHaveValue)(envelope.testStepFinished)) {
|
|
84
|
+
this.logProgress(envelope.testStepFinished);
|
|
85
|
+
}
|
|
86
|
+
else if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) {
|
|
87
|
+
this.logErrorIfNeeded(envelope.testCaseFinished);
|
|
88
|
+
}
|
|
89
|
+
else if ((0, value_checker_1.doesHaveValue)(envelope.testRunStarted)) {
|
|
90
|
+
this.testRunStarted = envelope.testRunStarted;
|
|
91
|
+
}
|
|
92
|
+
else if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
|
|
93
|
+
this.logSummary(envelope.testRunFinished);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.default = ProgressBarFormatter;
|
|
98
|
+
ProgressBarFormatter.documentation = 'Similar to the Progress Formatter, but provides a real-time updating progress bar based on the total number of steps to be executed in the test run';
|
|
99
99
|
//# sourceMappingURL=progress_bar_formatter.js.map
|