@dev-blinq/cucumber-js 1.0.36 → 1.0.37

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 (254) hide show
  1. package/bin/cucumber-js +0 -0
  2. package/bin/cucumber.js +0 -0
  3. package/lib/api/console_logger.d.ts +12 -12
  4. package/lib/api/console_logger.js +23 -23
  5. package/lib/api/convert_configuration.d.ts +4 -4
  6. package/lib/api/convert_configuration.js +64 -65
  7. package/lib/api/convert_configuration.js.map +1 -1
  8. package/lib/api/environment.d.ts +2 -2
  9. package/lib/api/environment.js +13 -13
  10. package/lib/api/formatters.d.ts +20 -20
  11. package/lib/api/formatters.js +60 -60
  12. package/lib/api/gherkin.d.ts +21 -21
  13. package/lib/api/gherkin.js +99 -99
  14. package/lib/api/index.d.ts +12 -12
  15. package/lib/api/index.js +27 -27
  16. package/lib/api/load_configuration.d.ts +9 -9
  17. package/lib/api/load_configuration.js +40 -40
  18. package/lib/api/load_sources.d.ts +9 -9
  19. package/lib/api/load_sources.js +52 -52
  20. package/lib/api/load_support.d.ts +10 -10
  21. package/lib/api/load_support.js +29 -29
  22. package/lib/api/paths.d.ts +8 -8
  23. package/lib/api/paths.js +101 -101
  24. package/lib/api/plugins.d.ts +4 -4
  25. package/lib/api/plugins.js +18 -18
  26. package/lib/api/run_cucumber.d.ts +11 -11
  27. package/lib/api/run_cucumber.js +114 -114
  28. package/lib/api/run_cucumber.js.map +1 -1
  29. package/lib/api/runtime.d.ts +21 -21
  30. package/lib/api/runtime.js +35 -35
  31. package/lib/api/support.d.ts +9 -9
  32. package/lib/api/support.js +25 -25
  33. package/lib/api/test_helpers.d.ts +3 -3
  34. package/lib/api/test_helpers.js +30 -30
  35. package/lib/api/types.d.ts +175 -177
  36. package/lib/api/types.js +2 -2
  37. package/lib/api/types.js.map +1 -1
  38. package/lib/cli/helpers.d.ts +37 -39
  39. package/lib/cli/helpers.js +202 -223
  40. package/lib/cli/helpers.js.map +1 -1
  41. package/lib/cli/i18n.d.ts +2 -2
  42. package/lib/cli/i18n.js +69 -69
  43. package/lib/cli/index.d.ts +21 -21
  44. package/lib/cli/index.js +58 -63
  45. package/lib/cli/index.js.map +1 -1
  46. package/lib/cli/install_validator.d.ts +1 -1
  47. package/lib/cli/install_validator.js +13 -13
  48. package/lib/cli/run.d.ts +1 -1
  49. package/lib/cli/run.js +43 -43
  50. package/lib/cli/validate_node_engine_version.d.ts +10 -10
  51. package/lib/cli/validate_node_engine_version.js +23 -23
  52. package/lib/configuration/argv_parser.d.ts +20 -20
  53. package/lib/configuration/argv_parser.js +100 -102
  54. package/lib/configuration/argv_parser.js.map +1 -1
  55. package/lib/configuration/check_schema.d.ts +2 -2
  56. package/lib/configuration/check_schema.js +59 -59
  57. package/lib/configuration/default_configuration.d.ts +2 -2
  58. package/lib/configuration/default_configuration.js +26 -28
  59. package/lib/configuration/default_configuration.js.map +1 -1
  60. package/lib/configuration/from_file.d.ts +3 -3
  61. package/lib/configuration/from_file.js +84 -84
  62. package/lib/configuration/helpers.d.ts +1 -1
  63. package/lib/configuration/helpers.js +10 -10
  64. package/lib/configuration/index.d.ts +7 -7
  65. package/lib/configuration/index.js +28 -28
  66. package/lib/configuration/locate_file.d.ts +1 -1
  67. package/lib/configuration/locate_file.js +20 -20
  68. package/lib/configuration/merge_configurations.d.ts +2 -2
  69. package/lib/configuration/merge_configurations.js +47 -47
  70. package/lib/configuration/option_splitter.d.ts +3 -3
  71. package/lib/configuration/option_splitter.js +22 -22
  72. package/lib/configuration/types.d.ts +28 -30
  73. package/lib/configuration/types.js +2 -2
  74. package/lib/configuration/types.js.map +1 -1
  75. package/lib/configuration/validate_configuration.d.ts +3 -3
  76. package/lib/configuration/validate_configuration.js +12 -12
  77. package/lib/filter_stack_trace.d.ts +3 -3
  78. package/lib/filter_stack_trace.js +37 -37
  79. package/lib/formatter/builder.d.ts +37 -37
  80. package/lib/formatter/builder.js +100 -100
  81. package/lib/formatter/bvt_formatter.d.ts +9 -0
  82. package/lib/formatter/{helpers/uploader.js → bvt_formatter.js} +62 -57
  83. package/lib/formatter/bvt_formatter.js.map +1 -0
  84. package/lib/formatter/feature_data_format.d.ts +14 -14
  85. package/lib/formatter/feature_data_format.js +80 -80
  86. package/lib/formatter/fixtures/typescript.d.ts +2 -2
  87. package/lib/formatter/fixtures/typescript.js +5 -5
  88. package/lib/formatter/get_color_fns.d.ts +15 -15
  89. package/lib/formatter/get_color_fns.js +55 -55
  90. package/lib/formatter/helpers/duration_helpers.d.ts +2 -2
  91. package/lib/formatter/helpers/duration_helpers.js +8 -8
  92. package/lib/formatter/helpers/event_data_collector.d.ts +30 -30
  93. package/lib/formatter/helpers/event_data_collector.js +125 -125
  94. package/lib/formatter/helpers/formatters.d.ts +6 -6
  95. package/lib/formatter/helpers/formatters.js +44 -44
  96. package/lib/formatter/helpers/formatters.js.map +1 -1
  97. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
  98. package/lib/formatter/helpers/gherkin_document_parser.js +65 -65
  99. package/lib/formatter/helpers/index.d.ts +10 -10
  100. package/lib/formatter/helpers/index.js +51 -51
  101. package/lib/formatter/helpers/issue_helpers.d.ts +19 -19
  102. package/lib/formatter/helpers/issue_helpers.js +58 -58
  103. package/lib/formatter/helpers/keyword_type.d.ts +11 -11
  104. package/lib/formatter/helpers/keyword_type.js +31 -31
  105. package/lib/formatter/helpers/location_helpers.d.ts +2 -2
  106. package/lib/formatter/helpers/location_helpers.js +16 -16
  107. package/lib/formatter/helpers/pickle_parser.d.ts +17 -17
  108. package/lib/formatter/helpers/pickle_parser.js +27 -27
  109. package/lib/formatter/helpers/report_generator.d.ts +95 -103
  110. package/lib/formatter/helpers/report_generator.js +310 -247
  111. package/lib/formatter/helpers/report_generator.js.map +1 -1
  112. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  113. package/lib/formatter/helpers/step_argument_formatter.js +47 -47
  114. package/lib/formatter/helpers/summary_helpers.d.ts +9 -9
  115. package/lib/formatter/helpers/summary_helpers.js +95 -95
  116. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +12 -12
  117. package/lib/formatter/helpers/test_case_attempt_formatter.js +113 -113
  118. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +32 -32
  119. package/lib/formatter/helpers/test_case_attempt_parser.js +134 -134
  120. package/lib/formatter/helpers/upload_serivce.d.ts +9 -9
  121. package/lib/formatter/helpers/upload_serivce.js +46 -46
  122. package/lib/formatter/helpers/upload_serivce.js.map +1 -1
  123. package/lib/formatter/helpers/usage_helpers/index.d.ts +23 -23
  124. package/lib/formatter/helpers/usage_helpers/index.js +110 -110
  125. package/lib/formatter/html_formatter.d.ts +7 -7
  126. package/lib/formatter/html_formatter.js +29 -29
  127. package/lib/formatter/index.d.ts +53 -53
  128. package/lib/formatter/index.js +20 -20
  129. package/lib/formatter/json_formatter.d.ts +78 -78
  130. package/lib/formatter/json_formatter.js +229 -229
  131. package/lib/formatter/junit_formatter.d.ts +17 -17
  132. package/lib/formatter/junit_formatter.js +180 -180
  133. package/lib/formatter/message_formatter.d.ts +5 -5
  134. package/lib/formatter/message_formatter.js +14 -14
  135. package/lib/formatter/progress_bar_formatter.d.ts +18 -18
  136. package/lib/formatter/progress_bar_formatter.js +98 -98
  137. package/lib/formatter/progress_formatter.d.ts +9 -9
  138. package/lib/formatter/progress_formatter.js +58 -58
  139. package/lib/formatter/rerun_formatter.d.ts +13 -13
  140. package/lib/formatter/rerun_formatter.js +79 -79
  141. package/lib/formatter/snippets_formatter.d.ts +6 -6
  142. package/lib/formatter/snippets_formatter.js +60 -60
  143. package/lib/formatter/step_definition_snippet_builder/index.d.ts +20 -20
  144. package/lib/formatter/step_definition_snippet_builder/index.js +45 -45
  145. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +7 -7
  146. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +45 -45
  147. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +16 -16
  148. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +10 -10
  149. package/lib/formatter/summary_formatter.d.ts +14 -14
  150. package/lib/formatter/summary_formatter.js +67 -67
  151. package/lib/formatter/usage_formatter.d.ts +6 -6
  152. package/lib/formatter/usage_formatter.js +97 -97
  153. package/lib/formatter/usage_json_formatter.d.ts +7 -7
  154. package/lib/formatter/usage_json_formatter.js +33 -33
  155. package/lib/index.d.ts +58 -58
  156. package/lib/index.js +108 -108
  157. package/lib/logger.d.ts +5 -5
  158. package/lib/logger.js +2 -2
  159. package/lib/models/data_table.d.ts +10 -10
  160. package/lib/models/data_table.js +45 -45
  161. package/lib/models/definition.d.ts +55 -55
  162. package/lib/models/definition.js +21 -21
  163. package/lib/models/gherkin_step_keyword.d.ts +1 -1
  164. package/lib/models/gherkin_step_keyword.js +2 -2
  165. package/lib/models/pickle_order.d.ts +1 -1
  166. package/lib/models/pickle_order.js +2 -2
  167. package/lib/models/step_definition.d.ts +11 -11
  168. package/lib/models/step_definition.js +36 -36
  169. package/lib/models/test_case_hook_definition.d.ts +10 -10
  170. package/lib/models/test_case_hook_definition.js +26 -26
  171. package/lib/models/test_run_hook_definition.d.ts +3 -3
  172. package/lib/models/test_run_hook_definition.js +9 -9
  173. package/lib/models/test_step_hook_definition.d.ts +9 -9
  174. package/lib/models/test_step_hook_definition.js +25 -25
  175. package/lib/pickle_filter.d.ts +42 -42
  176. package/lib/pickle_filter.js +98 -98
  177. package/lib/plugin/index.d.ts +2 -2
  178. package/lib/plugin/index.js +18 -18
  179. package/lib/plugin/plugin_manager.d.ts +13 -13
  180. package/lib/plugin/plugin_manager.js +35 -35
  181. package/lib/plugin/types.d.ts +14 -14
  182. package/lib/plugin/types.js +2 -2
  183. package/lib/publish/http_stream.d.ts +30 -30
  184. package/lib/publish/http_stream.js +111 -111
  185. package/lib/publish/index.d.ts +2 -2
  186. package/lib/publish/index.js +4 -4
  187. package/lib/publish/publish_plugin.d.ts +2 -2
  188. package/lib/publish/publish_plugin.js +47 -47
  189. package/lib/runtime/assemble_test_cases.d.ts +13 -13
  190. package/lib/runtime/assemble_test_cases.js +87 -87
  191. package/lib/runtime/attachment_manager/index.d.ts +33 -33
  192. package/lib/runtime/attachment_manager/index.js +118 -118
  193. package/lib/runtime/format_error.d.ts +2 -2
  194. package/lib/runtime/format_error.js +35 -35
  195. package/lib/runtime/helpers.d.ts +6 -6
  196. package/lib/runtime/helpers.js +100 -100
  197. package/lib/runtime/index.d.ts +40 -40
  198. package/lib/runtime/index.js +75 -75
  199. package/lib/runtime/parallel/command_types.d.ts +32 -32
  200. package/lib/runtime/parallel/command_types.js +2 -2
  201. package/lib/runtime/parallel/coordinator.d.ts +72 -72
  202. package/lib/runtime/parallel/coordinator.js +221 -221
  203. package/lib/runtime/parallel/run_worker.d.ts +1 -1
  204. package/lib/runtime/parallel/run_worker.js +28 -28
  205. package/lib/runtime/parallel/worker.d.ts +26 -26
  206. package/lib/runtime/parallel/worker.js +86 -86
  207. package/lib/runtime/run_test_run_hooks.d.ts +3 -3
  208. package/lib/runtime/run_test_run_hooks.js +27 -27
  209. package/lib/runtime/step_runner.d.ts +16 -16
  210. package/lib/runtime/step_runner.js +87 -87
  211. package/lib/runtime/stopwatch.d.ts +12 -12
  212. package/lib/runtime/stopwatch.js +33 -33
  213. package/lib/runtime/test_case_runner.d.ts +54 -54
  214. package/lib/runtime/test_case_runner.js +267 -267
  215. package/lib/step_arguments.d.ts +6 -6
  216. package/lib/step_arguments.js +18 -18
  217. package/lib/support_code_library_builder/build_parameter_type.d.ts +3 -3
  218. package/lib/support_code_library_builder/build_parameter_type.js +12 -12
  219. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -3
  220. package/lib/support_code_library_builder/get_definition_line_and_uri.js +28 -28
  221. package/lib/support_code_library_builder/index.d.ts +74 -74
  222. package/lib/support_code_library_builder/index.js +296 -296
  223. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -2
  224. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +15 -15
  225. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +7 -7
  226. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +18 -18
  227. package/lib/support_code_library_builder/types.d.ts +88 -88
  228. package/lib/support_code_library_builder/types.js +2 -2
  229. package/lib/support_code_library_builder/validate_arguments.d.ts +12 -12
  230. package/lib/support_code_library_builder/validate_arguments.js +72 -72
  231. package/lib/support_code_library_builder/world.d.ts +18 -18
  232. package/lib/support_code_library_builder/world.js +10 -10
  233. package/lib/time.d.ts +18 -18
  234. package/lib/time.js +60 -60
  235. package/lib/try_require.d.ts +7 -7
  236. package/lib/try_require.js +22 -22
  237. package/lib/types/index.d.ts +4 -4
  238. package/lib/types/index.js +2 -2
  239. package/lib/uncaught_exception_manager.d.ts +7 -7
  240. package/lib/uncaught_exception_manager.js +11 -11
  241. package/lib/user_code_runner.d.ts +14 -14
  242. package/lib/user_code_runner.js +81 -81
  243. package/lib/value_checker.d.ts +3 -3
  244. package/lib/value_checker.js +18 -18
  245. package/lib/version.d.ts +1 -1
  246. package/lib/version.js +5 -5
  247. package/lib/version.js.map +1 -1
  248. package/package.json +2 -4
  249. package/bin/download-install.js +0 -126
  250. package/lib/formatter/bvt_analysis_formatter.d.ts +0 -18
  251. package/lib/formatter/bvt_analysis_formatter.js +0 -193
  252. package/lib/formatter/bvt_analysis_formatter.js.map +0 -1
  253. package/lib/formatter/helpers/uploader.d.ts +0 -11
  254. package/lib/formatter/helpers/uploader.js.map +0 -1
@@ -1,193 +0,0 @@
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 child_process_1 = require("child_process");
7
- const path_1 = __importDefault(require("path"));
8
- const _1 = __importDefault(require("."));
9
- const value_checker_1 = require("../value_checker");
10
- const report_generator_1 = __importDefault(require("./helpers/report_generator"));
11
- const uploader_1 = __importDefault(require("./helpers/uploader"));
12
- const fs_1 = require("fs");
13
- const tmp_promise_1 = require("tmp-promise");
14
- //User token
15
- const TOKEN = process.env.TOKEN;
16
- class BVTAnalysisFormatter extends _1.default {
17
- constructor(options) {
18
- super(options);
19
- this.reportGenerator = new report_generator_1.default();
20
- this.uploader = new uploader_1.default(this.reportGenerator);
21
- this.exit = false;
22
- if (!TOKEN && process.env.BVT_FORMATTER === 'ANALYSIS') {
23
- throw new Error('TOKEN must be set');
24
- }
25
- options.eventBroadcaster.on('envelope', async (envelope) => {
26
- this.reportGenerator.handleMessage(envelope);
27
- if ((0, value_checker_1.doesHaveValue)(envelope.meta) &&
28
- (0, value_checker_1.doesHaveValue)(envelope.meta.runName)) {
29
- this.runName = envelope.meta.runName;
30
- }
31
- if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
32
- const report = this.reportGenerator.getReport();
33
- this.START = Date.now();
34
- if (process.env.BVT_FORMATTER === 'ANALYSIS') {
35
- await this.analyzeReport(report);
36
- }
37
- else {
38
- await this.uploadReport(report);
39
- }
40
- this.exit = true;
41
- }
42
- });
43
- }
44
- async uploadReport(report) {
45
- const uploadSuccessful = await this.uploadFinalReport(report);
46
- if (uploadSuccessful && report.result.status !== 'FAILED') {
47
- process.exit(0);
48
- }
49
- process.exit(1);
50
- }
51
- async finished() {
52
- await new Promise((resolve) => {
53
- const checkInterval = setInterval(() => {
54
- if (this.exit) {
55
- clearInterval(checkInterval);
56
- resolve(null);
57
- }
58
- }, 100); // check every 100ms
59
- });
60
- }
61
- async analyzeReport(report) {
62
- if (report.result.status === 'PASSED') {
63
- this.log('All tests passed. No need to retrain\n');
64
- const uploadSuccessful = await this.uploadFinalReport(report);
65
- if (uploadSuccessful) {
66
- process.exit(0);
67
- }
68
- process.exit(1);
69
- }
70
- //checking if the type of report.result is JsonResultFailed or not
71
- this.log('Some tests failed, starting the retraining...\n');
72
- if (!('startTime' in report.result) || !('endTime' in report.result)) {
73
- this.log('Unknown error occured,not retraining\n');
74
- await this.uploadFinalReport(report);
75
- return;
76
- }
77
- const finalReport = await this.processTestCases(report);
78
- const uploadSuccessful = await this.uploadFinalReport(finalReport);
79
- if (finalReport.result.status !== 'FAILED' && uploadSuccessful) {
80
- process.exit(0);
81
- }
82
- else {
83
- process.exit(1);
84
- }
85
- }
86
- async processTestCases(report) {
87
- const finalTestCases = [];
88
- for (const testCase of report.testCases) {
89
- const modifiedTestCase = await this.processTestCase(testCase, report);
90
- finalTestCases.push(modifiedTestCase);
91
- }
92
- const finalResult = finalTestCases.some((tc) => tc.result.status !== 'PASSED')
93
- ? report.result
94
- : {
95
- ...report.result,
96
- status: 'PASSED',
97
- };
98
- return {
99
- result: finalResult,
100
- testCases: finalTestCases,
101
- };
102
- }
103
- async processTestCase(testCase, report) {
104
- if (testCase.result.status === 'PASSED') {
105
- return testCase;
106
- }
107
- const failedTestSteps = testCase.steps
108
- .map((step, i) => (step.result.status !== 'PASSED' ? i : null))
109
- .filter((i) => i !== null);
110
- const retrainStats = await this.retrain(failedTestSteps, testCase);
111
- if (!retrainStats) {
112
- return testCase;
113
- }
114
- return {
115
- ...testCase,
116
- retrainStats,
117
- };
118
- }
119
- async uploadFinalReport(finalReport) {
120
- let success = true;
121
- try {
122
- const { projectId, runId } = await this.uploader.uploadRun(finalReport, this.runName);
123
- this.logReportLink(runId, projectId);
124
- }
125
- catch (err) {
126
- this.log('Error uploading report\n');
127
- if ('stack' in err) {
128
- this.log(err.stack);
129
- }
130
- success = false;
131
- }
132
- //this.log(JSON.stringify(finalReport, null, 2))
133
- return success;
134
- }
135
- async retrain(failedTestCases, testCase) {
136
- const stepsToRetrain = testCase.steps.map((_, i) => i);
137
- return await this.call_cucumber_client(stepsToRetrain, testCase);
138
- }
139
- async call_cucumber_client(stepsToRetrain, testCase) {
140
- return new Promise((resolve, reject) => {
141
- const cucumber_client_path = path_1.default.resolve(process.cwd(), 'node_modules', '@dev-blinq', 'cucumber_client', 'bin', 'client', 'cucumber.js');
142
- const args = [
143
- process.cwd(),
144
- path_1.default.join(process.cwd(), testCase.uri),
145
- `${testCase.scenarioName}`,
146
- `${stepsToRetrain.join(',')}`,
147
- ];
148
- if (process.env.BLINQ_ENV) {
149
- args.push(`--env=${process.env.BLINQ_ENV}`);
150
- }
151
- // const temporaryFileTask = await import('tempy')
152
- (0, tmp_promise_1.withFile)(async ({ path: tempFile, fd }) => {
153
- // when this function returns or throws - release the file
154
- args.push(`--temp-file=${tempFile}`);
155
- const cucumberClient = (0, child_process_1.spawn)('node', [cucumber_client_path, ...args], {
156
- env: {
157
- ...process.env,
158
- },
159
- });
160
- cucumberClient.stdout.on('data', (data) => {
161
- console.log(data.toString());
162
- });
163
- cucumberClient.stderr.on('data', (data) => {
164
- console.error(data.toString());
165
- });
166
- cucumberClient.on('close', (code) => {
167
- if (code === 0) {
168
- const reportData = (0, fs_1.readFileSync)(tempFile, 'utf-8');
169
- const retrainStats = JSON.parse(reportData);
170
- resolve(retrainStats);
171
- }
172
- else {
173
- this.log('Error retraining\n');
174
- resolve(null);
175
- }
176
- });
177
- });
178
- });
179
- }
180
- logReportLink(runId, projectId) {
181
- let reportLinkBaseUrl = 'https://app.blinq.io';
182
- if (process.env.NODE_ENV_BLINQ === 'local') {
183
- reportLinkBaseUrl = 'http://localhost:3000';
184
- }
185
- else if (process.env.NODE_ENV_BLINQ === 'dev') {
186
- reportLinkBaseUrl = 'https://dev.app.blinq.io';
187
- }
188
- const reportLink = `${reportLinkBaseUrl}/${projectId}/run-report/${runId}`;
189
- this.log(`Report link: ${reportLink}\n`);
190
- }
191
- }
192
- exports.default = BVTAnalysisFormatter;
193
- //# sourceMappingURL=bvt_analysis_formatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bvt_analysis_formatter.js","sourceRoot":"","sources":["../../src/formatter/bvt_analysis_formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Envelope, Meta } from '@cucumber/messages'\nimport { spawn } from 'child_process'\nimport path from 'path'\nimport Formatter, { IFormatterOptions } from '.'\nimport { doesHaveValue } from '../value_checker'\nimport ReportGenerator, {\n JsonFixedByAi,\n JsonReport,\n JsonResultFailed,\n JsonResultPassed,\n JsonStep,\n JsonTestProgress,\n JsonTestResult,\n RetrainStats,\n} from './helpers/report_generator'\nimport ReportUploader from './helpers/uploader'\nimport { readFileSync } from 'fs'\nimport { withFile } from 'tmp-promise'\n//User token\nconst TOKEN = process.env.TOKEN\ninterface MetaMessage extends Meta {\n runName: string\n}\n\ninterface EnvelopeWithMetaMessage extends Envelope {\n meta: MetaMessage\n}\nexport default class BVTAnalysisFormatter extends Formatter {\n private reportGenerator = new ReportGenerator()\n private uploader = new ReportUploader(this.reportGenerator)\n private exit = false\n private START: number\n private runName: string\n constructor(options: IFormatterOptions) {\n super(options)\n if (!TOKEN && process.env.BVT_FORMATTER === 'ANALYSIS') {\n throw new Error('TOKEN must be set')\n }\n options.eventBroadcaster.on(\n 'envelope',\n async (envelope: EnvelopeWithMetaMessage) => {\n this.reportGenerator.handleMessage(envelope)\n if (\n doesHaveValue(envelope.meta) &&\n doesHaveValue(envelope.meta.runName)\n ) {\n this.runName = envelope.meta.runName\n }\n if (doesHaveValue(envelope.testRunFinished)) {\n const report = this.reportGenerator.getReport()\n this.START = Date.now()\n if (process.env.BVT_FORMATTER === 'ANALYSIS') {\n await this.analyzeReport(report)\n } else {\n await this.uploadReport(report)\n }\n this.exit = true\n }\n }\n )\n }\n\n private async uploadReport(report: JsonReport) {\n const uploadSuccessful = await this.uploadFinalReport(report)\n if (uploadSuccessful && report.result.status !== 'FAILED') {\n process.exit(0)\n }\n process.exit(1)\n }\n\n async finished(): Promise<any> {\n await new Promise((resolve) => {\n const checkInterval = setInterval(() => {\n if (this.exit) {\n clearInterval(checkInterval)\n resolve(null)\n }\n }, 100) // check every 100ms\n })\n }\n private async analyzeReport(report: JsonReport) {\n if (report.result.status === 'PASSED') {\n this.log('All tests passed. No need to retrain\\n')\n const uploadSuccessful = await this.uploadFinalReport(report)\n if (uploadSuccessful) {\n process.exit(0)\n }\n\n process.exit(1)\n }\n //checking if the type of report.result is JsonResultFailed or not\n this.log('Some tests failed, starting the retraining...\\n')\n if (!('startTime' in report.result) || !('endTime' in report.result)) {\n this.log('Unknown error occured,not retraining\\n')\n await this.uploadFinalReport(report)\n return\n }\n const finalReport = await this.processTestCases(report)\n const uploadSuccessful = await this.uploadFinalReport(finalReport)\n if (finalReport.result.status !== 'FAILED' && uploadSuccessful) {\n process.exit(0)\n } else {\n process.exit(1)\n }\n }\n private async processTestCases(report: JsonReport): Promise<JsonReport> {\n const finalTestCases = []\n for (const testCase of report.testCases) {\n const modifiedTestCase = await this.processTestCase(testCase, report)\n\n finalTestCases.push(modifiedTestCase)\n }\n const finalResult = finalTestCases.some(\n (tc) => tc.result.status !== 'PASSED'\n )\n ? report.result\n : ({\n ...report.result,\n status: 'PASSED',\n } as JsonTestResult)\n return {\n result: finalResult,\n testCases: finalTestCases,\n }\n }\n private async processTestCase(\n testCase: JsonTestProgress,\n report: JsonReport\n ): Promise<JsonTestProgress> {\n if (testCase.result.status === 'PASSED') {\n return testCase\n }\n const failedTestSteps = testCase.steps\n .map((step, i) => (step.result.status !== 'PASSED' ? i : null))\n .filter((i) => i !== null)\n const retrainStats = await this.retrain(failedTestSteps, testCase)\n\n if (!retrainStats) {\n return testCase\n }\n\n return {\n ...testCase,\n retrainStats,\n }\n }\n\n private async uploadFinalReport(finalReport: JsonReport) {\n let success = true\n try {\n const { projectId, runId } = await this.uploader.uploadRun(\n finalReport,\n this.runName\n )\n this.logReportLink(runId, projectId)\n } catch (err) {\n this.log('Error uploading report\\n')\n if ('stack' in err) {\n this.log(err.stack)\n }\n success = false\n }\n\n //this.log(JSON.stringify(finalReport, null, 2))\n return success\n }\n private async retrain(\n failedTestCases: number[],\n testCase: JsonTestProgress\n ): Promise<RetrainStats | null> {\n const stepsToRetrain = testCase.steps.map((_, i) => i)\n return await this.call_cucumber_client(stepsToRetrain, testCase)\n }\n\n private async call_cucumber_client(\n stepsToRetrain: number[],\n testCase: JsonTestProgress\n ): Promise<RetrainStats | null> {\n return new Promise((resolve, reject) => {\n const cucumber_client_path = path.resolve(\n process.cwd(),\n 'node_modules',\n '@dev-blinq',\n 'cucumber_client',\n 'bin',\n 'client',\n 'cucumber.js'\n )\n\n const args: string[] = [\n process.cwd(),\n path.join(process.cwd(), testCase.uri),\n `${testCase.scenarioName}`,\n `${stepsToRetrain.join(',')}`,\n ]\n\n if (process.env.BLINQ_ENV) {\n args.push(`--env=${process.env.BLINQ_ENV}`)\n }\n // const temporaryFileTask = await import('tempy')\n withFile(async ({ path: tempFile, fd }) => {\n // when this function returns or throws - release the file\n args.push(`--temp-file=${tempFile}`)\n const cucumberClient = spawn('node', [cucumber_client_path, ...args], {\n env: {\n ...process.env,\n },\n })\n\n cucumberClient.stdout.on('data', (data) => {\n console.log(data.toString())\n })\n\n cucumberClient.stderr.on('data', (data) => {\n console.error(data.toString())\n })\n\n cucumberClient.on('close', (code) => {\n if (code === 0) {\n const reportData = readFileSync(tempFile, 'utf-8')\n const retrainStats = JSON.parse(reportData) as RetrainStats\n resolve(retrainStats)\n } else {\n this.log('Error retraining\\n')\n resolve(null)\n }\n })\n })\n })\n }\n private logReportLink(runId: string, projectId: string) {\n let reportLinkBaseUrl = 'https://app.blinq.io'\n if (process.env.NODE_ENV_BLINQ === 'local') {\n reportLinkBaseUrl = 'http://localhost:3000'\n } else if (process.env.NODE_ENV_BLINQ === 'dev') {\n reportLinkBaseUrl = 'https://dev.app.blinq.io'\n }\n const reportLink = `${reportLinkBaseUrl}/${projectId}/run-report/${runId}`\n this.log(`Report link: ${reportLink}\\n`)\n }\n}\n"]}
@@ -1,11 +0,0 @@
1
- import ReportGenerator, { JsonReport } from './report_generator';
2
- export default class ReportUploader {
3
- private uploadService;
4
- private reportGenerator;
5
- constructor(reportGenerator: ReportGenerator);
6
- uploadRun(report: JsonReport, runName: string): Promise<{
7
- runId: any;
8
- projectId: any;
9
- }>;
10
- createZip(reportFolder: string | null, report: JsonReport): Promise<string>;
11
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../../src/formatter/helpers/uploader.ts"],"names":[],"mappings":"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","sourcesContent":["import ReportGenerator, { JsonReport } from './report_generator'\nimport { RunUploadService } from './upload_serivce'\n\nimport FormData from 'form-data'\nimport fs from 'fs'\nimport JSZip from 'jszip'\nimport path from 'path'\nconst URL =\n process.env.NODE_ENV_BLINQ === 'dev'\n ? 'https://dev.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'local'\n ? 'http://localhost:5001/api/runs'\n : 'https://api.blinq.io/api/runs'\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL\nconst REPORT_SERVICE_TOKEN =\n process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN\n\nexport default class ReportUploader {\n private uploadService = new RunUploadService(\n REPORT_SERVICE_URL,\n REPORT_SERVICE_TOKEN\n )\n private reportGenerator: ReportGenerator\n constructor(reportGenerator: ReportGenerator) {\n if (!REPORT_SERVICE_URL || !REPORT_SERVICE_TOKEN) {\n throw new Error('REPORT_SERVICE_URL and REPORT_SERVICE_TOKEN must be set')\n }\n this.reportGenerator = reportGenerator\n }\n\n async uploadRun(report: JsonReport, runName: string) {\n const runDoc = await this.uploadService.createRunDocument(runName)\n const runDocId = runDoc._id\n const formData = new FormData()\n const reportFolder = this.reportGenerator.reportFolder\n if (!fs.existsSync(reportFolder)) {\n fs.mkdirSync(reportFolder)\n }\n const zipPath = await this.createZip(reportFolder, report)\n formData.append(runDocId, fs.readFileSync(zipPath), 'report.zip')\n await this.uploadService.upload(formData)\n return { runId: runDoc._id, projectId: runDoc.project_id }\n }\n async createZip(reportFolder: string | null, report: JsonReport) {\n const zip = new JSZip()\n zip.file('report.json', JSON.stringify(report, null, 2))\n const folder = zip.folder('screenshots')\n const files = fs.readdirSync(path.join(reportFolder, 'screenshots'))\n files.forEach((file) => {\n folder.file(\n file,\n fs.readFileSync(path.join(reportFolder, 'screenshots', file))\n )\n })\n const zipBuffer = await zip.generateAsync({ type: 'nodebuffer' })\n // save zip file\n const zipPath = path.join(reportFolder, 'report.zip')\n fs.writeFileSync(zipPath, zipBuffer)\n fs.writeFileSync(\n path.join(reportFolder, 'report.json'),\n JSON.stringify(report, null, 2)\n )\n return zipPath\n }\n}\n"]}