@dev-blinq/cucumber-js 1.0.10 → 1.0.12-stage

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.
Files changed (257) hide show
  1. package/bin/cucumber-js +0 -0
  2. package/bin/cucumber.js +0 -0
  3. package/bin/download-install.js +126 -0
  4. package/lib/api/console_logger.d.ts +12 -12
  5. package/lib/api/console_logger.js +23 -23
  6. package/lib/api/convert_configuration.d.ts +4 -4
  7. package/lib/api/convert_configuration.js +65 -64
  8. package/lib/api/convert_configuration.js.map +1 -1
  9. package/lib/api/environment.d.ts +2 -2
  10. package/lib/api/environment.js +13 -13
  11. package/lib/api/formatters.d.ts +20 -20
  12. package/lib/api/formatters.js +60 -60
  13. package/lib/api/gherkin.d.ts +21 -21
  14. package/lib/api/gherkin.js +140 -99
  15. package/lib/api/gherkin.js.map +1 -1
  16. package/lib/api/index.d.ts +12 -12
  17. package/lib/api/index.js +27 -27
  18. package/lib/api/load_configuration.d.ts +9 -9
  19. package/lib/api/load_configuration.js +40 -40
  20. package/lib/api/load_sources.d.ts +9 -9
  21. package/lib/api/load_sources.js +52 -52
  22. package/lib/api/load_support.d.ts +10 -10
  23. package/lib/api/load_support.js +29 -29
  24. package/lib/api/paths.d.ts +8 -8
  25. package/lib/api/paths.js +101 -101
  26. package/lib/api/plugins.d.ts +4 -4
  27. package/lib/api/plugins.js +18 -18
  28. package/lib/api/run_cucumber.d.ts +11 -11
  29. package/lib/api/run_cucumber.js +114 -114
  30. package/lib/api/run_cucumber.js.map +1 -1
  31. package/lib/api/runtime.d.ts +21 -21
  32. package/lib/api/runtime.js +35 -35
  33. package/lib/api/support.d.ts +9 -9
  34. package/lib/api/support.js +25 -25
  35. package/lib/api/test_helpers.d.ts +3 -3
  36. package/lib/api/test_helpers.js +30 -30
  37. package/lib/api/types.d.ts +177 -175
  38. package/lib/api/types.js +2 -2
  39. package/lib/api/types.js.map +1 -1
  40. package/lib/cli/helpers.d.ts +39 -37
  41. package/lib/cli/helpers.js +223 -202
  42. package/lib/cli/helpers.js.map +1 -1
  43. package/lib/cli/i18n.d.ts +2 -2
  44. package/lib/cli/i18n.js +69 -69
  45. package/lib/cli/index.d.ts +21 -21
  46. package/lib/cli/index.js +63 -58
  47. package/lib/cli/index.js.map +1 -1
  48. package/lib/cli/install_validator.d.ts +1 -1
  49. package/lib/cli/install_validator.js +13 -13
  50. package/lib/cli/run.d.ts +1 -1
  51. package/lib/cli/run.js +43 -43
  52. package/lib/cli/validate_node_engine_version.d.ts +10 -10
  53. package/lib/cli/validate_node_engine_version.js +23 -23
  54. package/lib/configuration/argv_parser.d.ts +20 -20
  55. package/lib/configuration/argv_parser.js +102 -100
  56. package/lib/configuration/argv_parser.js.map +1 -1
  57. package/lib/configuration/check_schema.d.ts +2 -2
  58. package/lib/configuration/check_schema.js +59 -59
  59. package/lib/configuration/default_configuration.d.ts +2 -2
  60. package/lib/configuration/default_configuration.js +28 -26
  61. package/lib/configuration/default_configuration.js.map +1 -1
  62. package/lib/configuration/from_file.d.ts +3 -3
  63. package/lib/configuration/from_file.js +84 -84
  64. package/lib/configuration/helpers.d.ts +1 -1
  65. package/lib/configuration/helpers.js +10 -10
  66. package/lib/configuration/index.d.ts +7 -7
  67. package/lib/configuration/index.js +28 -28
  68. package/lib/configuration/locate_file.d.ts +1 -1
  69. package/lib/configuration/locate_file.js +20 -20
  70. package/lib/configuration/merge_configurations.d.ts +2 -2
  71. package/lib/configuration/merge_configurations.js +47 -47
  72. package/lib/configuration/option_splitter.d.ts +3 -3
  73. package/lib/configuration/option_splitter.js +22 -22
  74. package/lib/configuration/types.d.ts +30 -28
  75. package/lib/configuration/types.js +2 -2
  76. package/lib/configuration/types.js.map +1 -1
  77. package/lib/configuration/validate_configuration.d.ts +3 -3
  78. package/lib/configuration/validate_configuration.js +12 -12
  79. package/lib/filter_stack_trace.d.ts +3 -3
  80. package/lib/filter_stack_trace.js +37 -37
  81. package/lib/formatter/builder.d.ts +37 -37
  82. package/lib/formatter/builder.js +100 -100
  83. package/lib/formatter/bvt_analysis_formatter.d.ts +18 -0
  84. package/lib/formatter/bvt_analysis_formatter.js +193 -0
  85. package/lib/formatter/bvt_analysis_formatter.js.map +1 -0
  86. package/lib/formatter/feature_data_format.d.ts +23 -14
  87. package/lib/formatter/feature_data_format.js +136 -80
  88. package/lib/formatter/feature_data_format.js.map +1 -1
  89. package/lib/formatter/fixtures/typescript.d.ts +2 -2
  90. package/lib/formatter/fixtures/typescript.js +5 -5
  91. package/lib/formatter/get_color_fns.d.ts +15 -15
  92. package/lib/formatter/get_color_fns.js +55 -55
  93. package/lib/formatter/helpers/duration_helpers.d.ts +2 -2
  94. package/lib/formatter/helpers/duration_helpers.js +8 -8
  95. package/lib/formatter/helpers/event_data_collector.d.ts +30 -30
  96. package/lib/formatter/helpers/event_data_collector.js +125 -125
  97. package/lib/formatter/helpers/formatters.d.ts +6 -6
  98. package/lib/formatter/helpers/formatters.js +44 -44
  99. package/lib/formatter/helpers/formatters.js.map +1 -1
  100. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
  101. package/lib/formatter/helpers/gherkin_document_parser.js +65 -65
  102. package/lib/formatter/helpers/index.d.ts +10 -10
  103. package/lib/formatter/helpers/index.js +51 -51
  104. package/lib/formatter/helpers/issue_helpers.d.ts +19 -19
  105. package/lib/formatter/helpers/issue_helpers.js +58 -58
  106. package/lib/formatter/helpers/keyword_type.d.ts +11 -11
  107. package/lib/formatter/helpers/keyword_type.js +31 -31
  108. package/lib/formatter/helpers/location_helpers.d.ts +2 -2
  109. package/lib/formatter/helpers/location_helpers.js +16 -16
  110. package/lib/formatter/helpers/pickle_parser.d.ts +17 -17
  111. package/lib/formatter/helpers/pickle_parser.js +27 -27
  112. package/lib/formatter/helpers/report_generator.d.ts +110 -91
  113. package/lib/formatter/helpers/report_generator.js +348 -250
  114. package/lib/formatter/helpers/report_generator.js.map +1 -1
  115. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  116. package/lib/formatter/helpers/step_argument_formatter.js +47 -47
  117. package/lib/formatter/helpers/summary_helpers.d.ts +9 -9
  118. package/lib/formatter/helpers/summary_helpers.js +95 -95
  119. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +12 -12
  120. package/lib/formatter/helpers/test_case_attempt_formatter.js +113 -113
  121. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +32 -32
  122. package/lib/formatter/helpers/test_case_attempt_parser.js +134 -134
  123. package/lib/formatter/helpers/upload_serivce.d.ts +13 -9
  124. package/lib/formatter/helpers/upload_serivce.js +103 -46
  125. package/lib/formatter/helpers/upload_serivce.js.map +1 -1
  126. package/lib/formatter/helpers/uploader.d.ts +11 -0
  127. package/lib/formatter/helpers/uploader.js +78 -0
  128. package/lib/formatter/helpers/uploader.js.map +1 -0
  129. package/lib/formatter/helpers/usage_helpers/index.d.ts +23 -23
  130. package/lib/formatter/helpers/usage_helpers/index.js +110 -110
  131. package/lib/formatter/html_formatter.d.ts +7 -7
  132. package/lib/formatter/html_formatter.js +29 -29
  133. package/lib/formatter/index.d.ts +53 -53
  134. package/lib/formatter/index.js +20 -20
  135. package/lib/formatter/json_formatter.d.ts +78 -78
  136. package/lib/formatter/json_formatter.js +229 -229
  137. package/lib/formatter/junit_formatter.d.ts +17 -17
  138. package/lib/formatter/junit_formatter.js +180 -180
  139. package/lib/formatter/message_formatter.d.ts +5 -5
  140. package/lib/formatter/message_formatter.js +14 -14
  141. package/lib/formatter/progress_bar_formatter.d.ts +18 -18
  142. package/lib/formatter/progress_bar_formatter.js +98 -98
  143. package/lib/formatter/progress_formatter.d.ts +9 -9
  144. package/lib/formatter/progress_formatter.js +58 -58
  145. package/lib/formatter/rerun_formatter.d.ts +13 -13
  146. package/lib/formatter/rerun_formatter.js +79 -79
  147. package/lib/formatter/snippets_formatter.d.ts +6 -6
  148. package/lib/formatter/snippets_formatter.js +60 -60
  149. package/lib/formatter/step_definition_snippet_builder/index.d.ts +20 -20
  150. package/lib/formatter/step_definition_snippet_builder/index.js +45 -45
  151. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +7 -7
  152. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +45 -45
  153. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +16 -16
  154. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +10 -10
  155. package/lib/formatter/summary_formatter.d.ts +14 -14
  156. package/lib/formatter/summary_formatter.js +67 -67
  157. package/lib/formatter/usage_formatter.d.ts +6 -6
  158. package/lib/formatter/usage_formatter.js +97 -97
  159. package/lib/formatter/usage_json_formatter.d.ts +7 -7
  160. package/lib/formatter/usage_json_formatter.js +33 -33
  161. package/lib/index.d.ts +58 -58
  162. package/lib/index.js +108 -108
  163. package/lib/logger.d.ts +5 -5
  164. package/lib/logger.js +2 -2
  165. package/lib/models/data_table.d.ts +10 -10
  166. package/lib/models/data_table.js +45 -45
  167. package/lib/models/definition.d.ts +55 -55
  168. package/lib/models/definition.js +21 -21
  169. package/lib/models/gherkin_step_keyword.d.ts +1 -1
  170. package/lib/models/gherkin_step_keyword.js +2 -2
  171. package/lib/models/pickle_order.d.ts +1 -1
  172. package/lib/models/pickle_order.js +2 -2
  173. package/lib/models/step_definition.d.ts +11 -11
  174. package/lib/models/step_definition.js +36 -36
  175. package/lib/models/test_case_hook_definition.d.ts +10 -10
  176. package/lib/models/test_case_hook_definition.js +26 -26
  177. package/lib/models/test_run_hook_definition.d.ts +3 -3
  178. package/lib/models/test_run_hook_definition.js +9 -9
  179. package/lib/models/test_step_hook_definition.d.ts +9 -9
  180. package/lib/models/test_step_hook_definition.js +25 -25
  181. package/lib/pickle_filter.d.ts +42 -42
  182. package/lib/pickle_filter.js +98 -98
  183. package/lib/plugin/index.d.ts +2 -2
  184. package/lib/plugin/index.js +18 -18
  185. package/lib/plugin/plugin_manager.d.ts +13 -13
  186. package/lib/plugin/plugin_manager.js +35 -35
  187. package/lib/plugin/types.d.ts +14 -14
  188. package/lib/plugin/types.js +2 -2
  189. package/lib/publish/http_stream.d.ts +30 -30
  190. package/lib/publish/http_stream.js +111 -111
  191. package/lib/publish/index.d.ts +2 -2
  192. package/lib/publish/index.js +4 -4
  193. package/lib/publish/publish_plugin.d.ts +2 -2
  194. package/lib/publish/publish_plugin.js +47 -47
  195. package/lib/runtime/assemble_test_cases.d.ts +13 -13
  196. package/lib/runtime/assemble_test_cases.js +87 -87
  197. package/lib/runtime/attachment_manager/index.d.ts +33 -33
  198. package/lib/runtime/attachment_manager/index.js +118 -118
  199. package/lib/runtime/format_error.d.ts +2 -2
  200. package/lib/runtime/format_error.js +35 -35
  201. package/lib/runtime/helpers.d.ts +6 -6
  202. package/lib/runtime/helpers.js +100 -100
  203. package/lib/runtime/index.d.ts +40 -40
  204. package/lib/runtime/index.js +75 -75
  205. package/lib/runtime/parallel/command_types.d.ts +32 -32
  206. package/lib/runtime/parallel/command_types.js +2 -2
  207. package/lib/runtime/parallel/coordinator.d.ts +72 -72
  208. package/lib/runtime/parallel/coordinator.js +221 -221
  209. package/lib/runtime/parallel/run_worker.d.ts +1 -1
  210. package/lib/runtime/parallel/run_worker.js +28 -28
  211. package/lib/runtime/parallel/worker.d.ts +26 -26
  212. package/lib/runtime/parallel/worker.js +86 -86
  213. package/lib/runtime/run_test_run_hooks.d.ts +3 -3
  214. package/lib/runtime/run_test_run_hooks.js +27 -27
  215. package/lib/runtime/step_runner.d.ts +16 -16
  216. package/lib/runtime/step_runner.js +87 -87
  217. package/lib/runtime/stopwatch.d.ts +12 -12
  218. package/lib/runtime/stopwatch.js +33 -33
  219. package/lib/runtime/test_case_runner.d.ts +54 -54
  220. package/lib/runtime/test_case_runner.js +267 -267
  221. package/lib/step_arguments.d.ts +6 -6
  222. package/lib/step_arguments.js +18 -18
  223. package/lib/support_code_library_builder/build_parameter_type.d.ts +3 -3
  224. package/lib/support_code_library_builder/build_parameter_type.js +12 -12
  225. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -3
  226. package/lib/support_code_library_builder/get_definition_line_and_uri.js +28 -28
  227. package/lib/support_code_library_builder/index.d.ts +74 -74
  228. package/lib/support_code_library_builder/index.js +296 -296
  229. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -2
  230. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +15 -15
  231. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +7 -7
  232. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +18 -18
  233. package/lib/support_code_library_builder/types.d.ts +88 -88
  234. package/lib/support_code_library_builder/types.js +2 -2
  235. package/lib/support_code_library_builder/validate_arguments.d.ts +12 -12
  236. package/lib/support_code_library_builder/validate_arguments.js +72 -72
  237. package/lib/support_code_library_builder/world.d.ts +18 -18
  238. package/lib/support_code_library_builder/world.js +10 -10
  239. package/lib/time.d.ts +18 -18
  240. package/lib/time.js +60 -60
  241. package/lib/try_require.d.ts +7 -7
  242. package/lib/try_require.js +22 -22
  243. package/lib/types/index.d.ts +4 -4
  244. package/lib/types/index.js +2 -2
  245. package/lib/uncaught_exception_manager.d.ts +7 -7
  246. package/lib/uncaught_exception_manager.js +11 -11
  247. package/lib/user_code_runner.d.ts +14 -14
  248. package/lib/user_code_runner.js +81 -81
  249. package/lib/value_checker.d.ts +3 -3
  250. package/lib/value_checker.js +18 -18
  251. package/lib/version.d.ts +1 -1
  252. package/lib/version.js +5 -5
  253. package/lib/version.js.map +1 -1
  254. package/package.json +4 -2
  255. package/lib/formatter/bvt_formatter.d.ts +0 -9
  256. package/lib/formatter/bvt_formatter.js +0 -63
  257. package/lib/formatter/bvt_formatter.js.map +0 -1
@@ -1,251 +1,349 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class ReportGenerator {
4
- constructor() {
5
- this.report = {
6
- result: {
7
- status: 'UNKNOWN',
8
- },
9
- testCases: [],
10
- };
11
- this.gherkinDocumentMap = new Map();
12
- this.pickleMap = new Map();
13
- this.testCaseMap = new Map();
14
- this.testStepMap = new Map();
15
- this.stepProgressMap = new Map();
16
- this.testProgressMap = new Map();
17
- this.reportFolder = null;
18
- }
19
- handleMessage(envelope) {
20
- const type = Object.keys(envelope)[0];
21
- switch (type) {
22
- // case "meta": { break}
23
- // case "source": { break}
24
- case 'parseError': {
25
- const parseError = envelope[type];
26
- this.handleParseError(parseError);
27
- break;
28
- }
29
- case 'gherkinDocument': {
30
- const doc = envelope[type];
31
- this.onGherkinDocument(doc);
32
- break;
33
- }
34
- case 'pickle': {
35
- const pickle = envelope[type];
36
- this.onPickle(pickle);
37
- break;
38
- }
39
- // case "stepDefinition": { break}
40
- // case "hook": { break} // Before Hook
41
- case 'testRunStarted': {
42
- const testRunStarted = envelope[type];
43
- this.onTestRunStarted(testRunStarted);
44
- break;
45
- }
46
- case 'testCase': {
47
- const testCase = envelope[type];
48
- this.onTestCase(testCase);
49
- break;
50
- }
51
- case 'testCaseStarted': {
52
- const testCaseStarted = envelope[type];
53
- this.onTestCaseStarted(testCaseStarted);
54
- break;
55
- }
56
- case 'testStepStarted': {
57
- const testStepStarted = envelope[type];
58
- this.onTestStepStarted(testStepStarted);
59
- break;
60
- }
61
- case 'attachment': {
62
- const attachment = envelope[type];
63
- this.onAttachment(attachment);
64
- break;
65
- }
66
- case 'testStepFinished': {
67
- const testStepFinished = envelope[type];
68
- this.onTestStepFinished(testStepFinished);
69
- break;
70
- }
71
- case 'testCaseFinished': {
72
- const testCaseFinished = envelope[type];
73
- this.onTestCaseFinished(testCaseFinished);
74
- break;
75
- }
76
- // case "hook": { break} // After Hook
77
- case 'testRunFinished': {
78
- const testRunFinished = envelope[type];
79
- this.onTestRunFinished(testRunFinished);
80
- break;
81
- }
82
- // case "parameterType" : { break}
83
- // case "undefinedParameterType": { break}
84
- }
85
- }
86
- getReport() {
87
- return this.report;
88
- }
89
- handleParseError(parseError) {
90
- const { message, source } = parseError;
91
- const timestamp = new Date().getTime();
92
- this.report.result = {
93
- status: 'FAILED',
94
- startTime: timestamp,
95
- endTime: timestamp,
96
- message: message,
97
- };
98
- }
99
- onGherkinDocument(doc) {
100
- this.gherkinDocumentMap.set(doc.uri, doc);
101
- }
102
- onPickle(pickle) {
103
- this.pickleMap.set(pickle.id, pickle);
104
- }
105
- getTimeStamp(timestamp) {
106
- return timestamp.seconds * 1000 + timestamp.nanos / 1000000;
107
- }
108
- onTestRunStarted(testRunStarted) {
109
- this.report.result = {
110
- status: 'STARTED',
111
- startTime: this.getTimeStamp(testRunStarted.timestamp),
112
- };
113
- }
114
- onTestCase(testCase) {
115
- this.testCaseMap.set(testCase.id, testCase);
116
- testCase.testSteps.forEach((testStep) => {
117
- this.testStepMap.set(testStep.id, testStep);
118
- });
119
- }
120
- onTestCaseStarted(testCaseStarted) {
121
- const { testCaseId, id, timestamp } = testCaseStarted;
122
- const testCase = this.testCaseMap.get(testCaseId);
123
- if (testCase === undefined)
124
- throw new Error(`testCase with id ${testCaseId} not found`);
125
- const pickle = this.pickleMap.get(testCase.pickleId);
126
- if (pickle === undefined)
127
- throw new Error(`pickle with id ${testCase.pickleId} not found`);
128
- const doc = this.gherkinDocumentMap.get(pickle.uri);
129
- if (doc === undefined)
130
- throw new Error(`gherkinDocument with uri ${pickle.uri} not found`);
131
- const featureName = doc.feature.name;
132
- const scenarioName = pickle.name;
133
- const steps = pickle.steps.map((step) => {
134
- this.stepProgressMap.set(step.id, {
135
- type: step.type,
136
- text: step.text,
137
- commands: [],
138
- result: {
139
- status: 'UNKNOWN',
140
- },
141
- });
142
- return this.stepProgressMap.get(step.id);
143
- });
144
- this.testProgressMap.set(id, {
145
- id,
146
- uri: pickle.uri,
147
- featureName,
148
- scenarioName,
149
- // TODO: compute parameters
150
- parameters: {},
151
- steps,
152
- result: {
153
- status: 'STARTED',
154
- startTime: this.getTimeStamp(timestamp),
155
- },
156
- });
157
- this.report.testCases.push(this.testProgressMap.get(id));
158
- }
159
- onTestStepStarted(testStepStarted) {
160
- const { testStepId, timestamp, testCaseStartedId } = testStepStarted;
161
- const testStep = this.testStepMap.get(testStepId);
162
- if (testStep === undefined)
163
- throw new Error(`testStep with id ${testStepId} not found`);
164
- if (testStep.pickleStepId === undefined)
165
- return;
166
- const stepProgess = this.stepProgressMap.get(testStep.pickleStepId);
167
- stepProgess.result = {
168
- status: 'STARTED',
169
- startTime: this.getTimeStamp(timestamp),
170
- };
171
- }
172
- onAttachment(attachment) {
173
- const { testCaseStartedId, testStepId, body, mediaType, contentEncoding, fileName, source, url, } = attachment;
174
- if (mediaType === 'text/plain') {
175
- this.reportFolder = body.replaceAll('\\', '/');
176
- }
177
- const testStep = this.testStepMap.get(testStepId);
178
- if (testStep.pickleStepId === undefined)
179
- return;
180
- const stepProgess = this.stepProgressMap.get(testStep.pickleStepId);
181
- if (mediaType === 'application/json') {
182
- const command = JSON.parse(body);
183
- command.screenshotPath = command.screenshotPath
184
- .replaceAll('\\', '/')
185
- .replace(this.reportFolder, '');
186
- stepProgess.commands.push(command);
187
- }
188
- }
189
- onTestStepFinished(testStepFinished) {
190
- const { testStepId, testCaseStartedId, testStepResult, timestamp } = testStepFinished;
191
- const testStep = this.testStepMap.get(testStepId);
192
- if (testStep.pickleStepId === undefined)
193
- return;
194
- const stepProgess = this.stepProgressMap.get(testStep.pickleStepId);
195
- const prevStepResult = stepProgess.result;
196
- stepProgess.result = {
197
- status: testStepResult.status,
198
- startTime: prevStepResult.startTime,
199
- endTime: this.getTimeStamp(timestamp),
200
- message: testStepResult.message,
201
- // exception: testStepResult.exception,
202
- };
203
- }
204
- getTestCaseResult(steps) {
205
- for (const step of steps) {
206
- switch (step.result.status) {
207
- case 'FAILED':
208
- return {
209
- status: step.result.status,
210
- message: step.result.message,
211
- // exception: step.result.exception,
212
- };
213
- case 'AMBIGUOUS':
214
- case 'UNDEFINED':
215
- case 'PENDING':
216
- return {
217
- status: 'FAILED',
218
- message: `step "${step.text}" is ${step.result.status}`,
219
- };
220
- }
221
- }
222
- return {
223
- status: 'PASSED',
224
- };
225
- }
226
- onTestCaseFinished(testCaseFinished) {
227
- const { testCaseStartedId, timestamp } = testCaseFinished;
228
- const testProgress = this.testProgressMap.get(testCaseStartedId);
229
- const prevResult = testProgress.result;
230
- const steps = Object.values(testProgress.steps);
231
- const result = this.getTestCaseResult(steps);
232
- testProgress.result = {
233
- ...result,
234
- startTime: prevResult.startTime,
235
- endTime: this.getTimeStamp(timestamp),
236
- };
237
- }
238
- onTestRunFinished(testRunFinished) {
239
- const { timestamp, success, exception, message } = testRunFinished;
240
- const prevResult = this.report.result;
241
- this.report.result = {
242
- status: success ? 'PASSED' : 'FAILED',
243
- startTime: prevResult.startTime,
244
- endTime: this.getTimeStamp(timestamp),
245
- message,
246
- // exception,
247
- };
248
- }
249
- }
250
- exports.default = ReportGenerator;
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 fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ class ReportGenerator {
9
+ constructor() {
10
+ this.report = {
11
+ result: {
12
+ status: 'UNKNOWN',
13
+ },
14
+ testCases: [],
15
+ };
16
+ this.gherkinDocumentMap = new Map();
17
+ this.stepMap = new Map();
18
+ this.pickleMap = new Map();
19
+ this.testCaseMap = new Map();
20
+ this.testStepMap = new Map();
21
+ this.stepReportMap = new Map();
22
+ this.testCaseReportMap = new Map();
23
+ this.scenarioIterationCountMap = new Map();
24
+ this.reportFolder = null;
25
+ }
26
+ handleMessage(envelope) {
27
+ const type = Object.keys(envelope)[0];
28
+ switch (type) {
29
+ // case "meta": { break}
30
+ // case "source": { break}
31
+ case 'parseError': {
32
+ const parseError = envelope[type];
33
+ this.handleParseError(parseError);
34
+ break;
35
+ }
36
+ case 'gherkinDocument': {
37
+ const doc = envelope[type];
38
+ this.onGherkinDocument(doc);
39
+ break;
40
+ }
41
+ case 'pickle': {
42
+ const pickle = envelope[type];
43
+ this.onPickle(pickle);
44
+ break;
45
+ }
46
+ // case "stepDefinition": { break}
47
+ // case "hook": { break} // Before Hook
48
+ case 'testRunStarted': {
49
+ const testRunStarted = envelope[type];
50
+ this.onTestRunStarted(testRunStarted);
51
+ break;
52
+ }
53
+ case 'testCase': {
54
+ const testCase = envelope[type];
55
+ this.onTestCase(testCase);
56
+ break;
57
+ }
58
+ case 'testCaseStarted': {
59
+ const testCaseStarted = envelope[type];
60
+ this.onTestCaseStarted(testCaseStarted);
61
+ break;
62
+ }
63
+ case 'testStepStarted': {
64
+ const testStepStarted = envelope[type];
65
+ this.onTestStepStarted(testStepStarted);
66
+ break;
67
+ }
68
+ case 'attachment': {
69
+ const attachment = envelope[type];
70
+ this.onAttachment(attachment);
71
+ break;
72
+ }
73
+ case 'testStepFinished': {
74
+ const testStepFinished = envelope[type];
75
+ this.onTestStepFinished(testStepFinished);
76
+ break;
77
+ }
78
+ case 'testCaseFinished': {
79
+ const testCaseFinished = envelope[type];
80
+ this.onTestCaseFinished(testCaseFinished);
81
+ break;
82
+ }
83
+ // case "hook": { break} // After Hook
84
+ case 'testRunFinished': {
85
+ const testRunFinished = envelope[type];
86
+ this.onTestRunFinished(testRunFinished);
87
+ break;
88
+ }
89
+ // case "parameterType" : { break}
90
+ // case "undefinedParameterType": { break}
91
+ }
92
+ }
93
+ getReport() {
94
+ return this.report;
95
+ }
96
+ handleParseError(parseError) {
97
+ const { message } = parseError;
98
+ const timestamp = new Date().getTime();
99
+ this.report.result = {
100
+ status: 'FAILED',
101
+ startTime: timestamp,
102
+ endTime: timestamp,
103
+ message: message,
104
+ };
105
+ }
106
+ onGherkinDocument(doc) {
107
+ this.gherkinDocumentMap.set(doc.uri, doc);
108
+ doc.feature.children.forEach((child) => {
109
+ if (child.scenario) {
110
+ child.scenario.steps.forEach((step) => {
111
+ this.stepMap.set(step.id, step);
112
+ });
113
+ }
114
+ else if (child.background) {
115
+ child.background.steps.forEach((step) => {
116
+ this.stepMap.set(step.id, step);
117
+ });
118
+ }
119
+ else if (child.rule) {
120
+ child.rule.children.forEach((child) => {
121
+ if (child.scenario) {
122
+ child.scenario.steps.forEach((step) => {
123
+ this.stepMap.set(step.id, step);
124
+ });
125
+ }
126
+ else if (child.background) {
127
+ child.background.steps.forEach((step) => {
128
+ this.stepMap.set(step.id, step);
129
+ });
130
+ }
131
+ });
132
+ }
133
+ });
134
+ }
135
+ onPickle(pickle) {
136
+ this.pickleMap.set(pickle.id, pickle);
137
+ }
138
+ getTimeStamp(timestamp) {
139
+ return timestamp.seconds * 1000 + timestamp.nanos / 1000000;
140
+ }
141
+ onTestRunStarted(testRunStarted) {
142
+ this.report.result = {
143
+ status: 'STARTED',
144
+ startTime: this.getTimeStamp(testRunStarted.timestamp),
145
+ };
146
+ }
147
+ onTestCase(testCase) {
148
+ this.testCaseMap.set(testCase.id, testCase);
149
+ testCase.testSteps.forEach((testStep) => {
150
+ this.testStepMap.set(testStep.id, testStep);
151
+ });
152
+ }
153
+ _findScenario(doc, scenarioId) {
154
+ for (const child of doc.feature.children) {
155
+ if (child.scenario && child.scenario.id === scenarioId) {
156
+ return child.scenario;
157
+ }
158
+ if (child.rule) {
159
+ for (const scenario of child.rule.children) {
160
+ if (scenario.scenario && scenario.scenario.id === scenarioId) {
161
+ return scenario.scenario;
162
+ }
163
+ }
164
+ }
165
+ }
166
+ throw new Error(`scenario "${scenarioId}" not found`);
167
+ }
168
+ _getParameters(scenario, exampleId) {
169
+ const parameters = {};
170
+ if (scenario.examples.length === 0)
171
+ return parameters;
172
+ for (const examples of scenario.examples) {
173
+ for (const tableRow of examples.tableBody) {
174
+ if (tableRow.id === exampleId) {
175
+ for (let i = 0; i < examples.tableHeader.cells.length; i++) {
176
+ parameters[examples.tableHeader.cells[i].value] =
177
+ tableRow.cells[i].value;
178
+ }
179
+ }
180
+ }
181
+ }
182
+ return parameters;
183
+ }
184
+ onTestCaseStarted(testCaseStarted) {
185
+ const { testCaseId, id, timestamp } = testCaseStarted;
186
+ const testCase = this.testCaseMap.get(testCaseId);
187
+ if (testCase === undefined)
188
+ throw new Error(`testCase with id ${testCaseId} not found`);
189
+ const pickle = this.pickleMap.get(testCase.pickleId);
190
+ if (pickle === undefined)
191
+ throw new Error(`pickle with id ${testCase.pickleId} not found`);
192
+ const doc = this.gherkinDocumentMap.get(pickle.uri);
193
+ if (doc === undefined)
194
+ throw new Error(`gherkinDocument with uri ${pickle.uri} not found`);
195
+ const featureName = doc.feature.name;
196
+ const scenarioId = pickle.astNodeIds[0];
197
+ const scenario = this._findScenario(doc, scenarioId);
198
+ const scenarioName = scenario.name;
199
+ if (!this.scenarioIterationCountMap.has(scenarioId)) {
200
+ this.scenarioIterationCountMap.set(scenarioId, 1);
201
+ }
202
+ const parameters = this._getParameters(scenario, pickle.astNodeIds[1]);
203
+ console.log(`Running scenario ${scenarioName} iteration ${this.scenarioIterationCountMap.get(scenarioId)} with parameters:\n${JSON.stringify(parameters, null, 4)}\n
204
+ `);
205
+ this.scenarioIterationCountMap.set(scenarioId, this.scenarioIterationCountMap.get(scenarioId) + 1);
206
+ const steps = pickle.steps.map((pickleStep) => {
207
+ const stepId = pickleStep.astNodeIds[0];
208
+ const step = this.stepMap.get(stepId);
209
+ this.stepReportMap.set(pickleStep.id, {
210
+ type: step.keywordType,
211
+ keyword: step.keyword,
212
+ text: step.text,
213
+ commands: [],
214
+ result: {
215
+ status: 'UNKNOWN',
216
+ },
217
+ });
218
+ return this.stepReportMap.get(pickleStep.id);
219
+ });
220
+ this.testCaseReportMap.set(id, {
221
+ id,
222
+ uri: pickle.uri,
223
+ featureName,
224
+ scenarioName,
225
+ parameters,
226
+ steps,
227
+ result: {
228
+ status: 'STARTED',
229
+ startTime: this.getTimeStamp(timestamp),
230
+ },
231
+ webLog: [],
232
+ });
233
+ this.report.testCases.push(this.testCaseReportMap.get(id));
234
+ }
235
+ onTestStepStarted(testStepStarted) {
236
+ const { testStepId, timestamp } = testStepStarted;
237
+ const testStep = this.testStepMap.get(testStepId);
238
+ if (testStep === undefined)
239
+ throw new Error(`testStep with id ${testStepId} not found`);
240
+ if (testStep.pickleStepId === undefined)
241
+ return;
242
+ const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
243
+ stepProgess.result = {
244
+ status: 'STARTED',
245
+ startTime: this.getTimeStamp(timestamp),
246
+ };
247
+ }
248
+ onAttachment(attachment) {
249
+ const { testStepId, body, mediaType } = attachment;
250
+ if (mediaType === 'text/plain') {
251
+ this.reportFolder = body.replaceAll('\\', '/');
252
+ }
253
+ const testStep = this.testStepMap.get(testStepId);
254
+ if (testStep.pickleStepId === undefined)
255
+ return;
256
+ const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
257
+ if (mediaType === 'application/json') {
258
+ const command = JSON.parse(body);
259
+ stepProgess.commands.push(command);
260
+ }
261
+ }
262
+ onTestStepFinished(testStepFinished) {
263
+ const { testStepId, testStepResult, timestamp } = testStepFinished;
264
+ const testStep = this.testStepMap.get(testStepId);
265
+ if (testStep.pickleStepId === undefined)
266
+ return;
267
+ const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
268
+ const prevStepResult = stepProgess.result;
269
+ stepProgess.result = {
270
+ status: testStepResult.status,
271
+ startTime: prevStepResult.startTime,
272
+ endTime: this.getTimeStamp(timestamp),
273
+ message: testStepResult.message,
274
+ // exception: testStepResult.exception,
275
+ };
276
+ }
277
+ getLogFileContent() {
278
+ let projectPath = process.cwd();
279
+ if (process.env.PROJECT_PATH) {
280
+ projectPath = process.env.PROJECT_PATH;
281
+ }
282
+ const logFolder = path_1.default.join(projectPath, 'logs', 'web');
283
+ if (!fs_1.default.existsSync(logFolder)) {
284
+ return [];
285
+ }
286
+ let nextId = 1;
287
+ while (fs_1.default.existsSync(path_1.default.join(logFolder, `${nextId}.json`))) {
288
+ nextId++;
289
+ }
290
+ if (nextId === 1) {
291
+ return [];
292
+ }
293
+ try {
294
+ const logFileContent = fs_1.default.readFileSync(path_1.default.join(logFolder, `${nextId - 1}.json`), 'utf8');
295
+ return JSON.parse(logFileContent);
296
+ }
297
+ catch (error) {
298
+ return [];
299
+ }
300
+ }
301
+ getTestCaseResult(steps) {
302
+ for (const step of steps) {
303
+ switch (step.result.status) {
304
+ case 'FAILED':
305
+ return {
306
+ status: step.result.status,
307
+ message: step.result.message,
308
+ // exception: step.result.exception,
309
+ };
310
+ case 'AMBIGUOUS':
311
+ case 'UNDEFINED':
312
+ case 'PENDING':
313
+ return {
314
+ status: 'FAILED',
315
+ message: `step "${step.text}" is ${step.result.status}`,
316
+ };
317
+ }
318
+ }
319
+ return {
320
+ status: 'PASSED',
321
+ };
322
+ }
323
+ onTestCaseFinished(testCaseFinished) {
324
+ const { testCaseStartedId, timestamp } = testCaseFinished;
325
+ const testProgress = this.testCaseReportMap.get(testCaseStartedId);
326
+ const prevResult = testProgress.result;
327
+ const steps = Object.values(testProgress.steps);
328
+ const result = this.getTestCaseResult(steps);
329
+ testProgress.result = {
330
+ ...result,
331
+ startTime: prevResult.startTime,
332
+ endTime: this.getTimeStamp(timestamp),
333
+ };
334
+ testProgress.webLog = this.getLogFileContent();
335
+ }
336
+ onTestRunFinished(testRunFinished) {
337
+ const { timestamp, success, message } = testRunFinished;
338
+ const prevResult = this.report.result;
339
+ this.report.result = {
340
+ status: success ? 'PASSED' : 'FAILED',
341
+ startTime: prevResult.startTime,
342
+ endTime: this.getTimeStamp(timestamp),
343
+ message,
344
+ // exception,
345
+ };
346
+ }
347
+ }
348
+ exports.default = ReportGenerator;
251
349
  //# sourceMappingURL=report_generator.js.map