@zohodesk/testinglibrary 0.4.6-experimental → 2.9.1

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 (127) hide show
  1. package/README.md +4 -19
  2. package/build/bdd-framework/cli/commands/env.js +42 -0
  3. package/build/bdd-framework/cli/commands/export.js +62 -0
  4. package/build/bdd-framework/cli/commands/test.js +64 -0
  5. package/build/bdd-framework/cli/index.js +11 -0
  6. package/build/bdd-framework/cli/options.js +19 -0
  7. package/build/bdd-framework/cli/worker.js +13 -0
  8. package/build/bdd-framework/config/configDir.js +35 -0
  9. package/build/bdd-framework/config/enrichReporterData.js +23 -0
  10. package/build/bdd-framework/config/env.js +50 -0
  11. package/build/bdd-framework/config/index.js +94 -0
  12. package/build/bdd-framework/config/lang.js +14 -0
  13. package/build/bdd-framework/cucumber/buildStepDefinition.js +43 -0
  14. package/build/bdd-framework/cucumber/createTestStep.js +43 -0
  15. package/build/bdd-framework/cucumber/formatter/EventDataCollector.js +126 -0
  16. package/build/bdd-framework/cucumber/formatter/GherkinDocumentParser.js +72 -0
  17. package/build/bdd-framework/cucumber/formatter/PickleParser.js +25 -0
  18. package/build/bdd-framework/cucumber/formatter/durationHelpers.js +13 -0
  19. package/build/bdd-framework/cucumber/formatter/getColorFns.js +57 -0
  20. package/build/bdd-framework/cucumber/formatter/index.js +16 -0
  21. package/build/bdd-framework/cucumber/formatter/locationHelpers.js +16 -0
  22. package/build/bdd-framework/cucumber/loadConfig.js +17 -0
  23. package/build/bdd-framework/cucumber/loadFeatures.js +70 -0
  24. package/build/bdd-framework/cucumber/loadSnippetBuilder.js +20 -0
  25. package/build/bdd-framework/cucumber/loadSteps.js +47 -0
  26. package/build/bdd-framework/cucumber/resolveFeaturePaths.js +62 -0
  27. package/build/bdd-framework/cucumber/stepArguments.js +21 -0
  28. package/build/bdd-framework/cucumber/types.js +5 -0
  29. package/build/bdd-framework/cucumber/valueChecker.js +23 -0
  30. package/build/bdd-framework/decorators.js +18 -0
  31. package/build/bdd-framework/gen/fixtures.js +48 -0
  32. package/build/bdd-framework/gen/formatter.js +167 -0
  33. package/build/bdd-framework/gen/i18n.js +39 -0
  34. package/build/bdd-framework/gen/index.js +197 -0
  35. package/build/bdd-framework/gen/specialTags.js +70 -0
  36. package/build/bdd-framework/gen/testFile.js +470 -0
  37. package/build/bdd-framework/gen/testMeta.js +60 -0
  38. package/build/bdd-framework/gen/testNode.js +35 -0
  39. package/build/bdd-framework/gen/testPoms.js +133 -0
  40. package/build/bdd-framework/hooks/scenario.js +130 -0
  41. package/build/bdd-framework/hooks/worker.js +89 -0
  42. package/build/bdd-framework/index.js +52 -0
  43. package/build/bdd-framework/playwright/fixtureParameterNames.js +93 -0
  44. package/build/bdd-framework/playwright/getLocationInFile.js +79 -0
  45. package/build/bdd-framework/playwright/loadConfig.js +42 -0
  46. package/build/bdd-framework/playwright/loadUtils.js +33 -0
  47. package/build/bdd-framework/playwright/testTypeImpl.js +79 -0
  48. package/build/bdd-framework/playwright/transform.js +88 -0
  49. package/build/bdd-framework/playwright/types.js +12 -0
  50. package/build/bdd-framework/playwright/utils.js +56 -0
  51. package/build/bdd-framework/reporter/cucumber/base.js +52 -0
  52. package/build/bdd-framework/reporter/cucumber/custom.js +73 -0
  53. package/build/bdd-framework/reporter/cucumber/helper.js +12 -0
  54. package/build/bdd-framework/reporter/cucumber/html.js +40 -0
  55. package/build/bdd-framework/reporter/cucumber/index.js +74 -0
  56. package/build/bdd-framework/reporter/cucumber/json.js +312 -0
  57. package/build/bdd-framework/reporter/cucumber/junit.js +205 -0
  58. package/build/bdd-framework/reporter/cucumber/message.js +20 -0
  59. package/build/bdd-framework/reporter/cucumber/messagesBuilder/AttachmentMapper.js +82 -0
  60. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Builder.js +197 -0
  61. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocument.js +43 -0
  62. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocumentClone.js +52 -0
  63. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocuments.js +105 -0
  64. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Hook.js +70 -0
  65. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Meta.js +45 -0
  66. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Pickles.js +27 -0
  67. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Projects.js +38 -0
  68. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCase.js +128 -0
  69. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRun.js +154 -0
  70. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRunHooks.js +123 -0
  71. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepAttachments.js +67 -0
  72. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepRun.js +114 -0
  73. package/build/bdd-framework/reporter/cucumber/messagesBuilder/index.js +30 -0
  74. package/build/bdd-framework/reporter/cucumber/messagesBuilder/pwStepUtils.js +70 -0
  75. package/build/bdd-framework/reporter/cucumber/messagesBuilder/timing.js +35 -0
  76. package/build/bdd-framework/reporter/cucumber/messagesBuilder/types.js +5 -0
  77. package/build/bdd-framework/run/StepInvoker.js +69 -0
  78. package/build/bdd-framework/run/bddData/index.js +59 -0
  79. package/build/bdd-framework/run/bddData/types.js +5 -0
  80. package/build/bdd-framework/run/bddFixtures.js +192 -0
  81. package/build/bdd-framework/run/bddWorld.js +79 -0
  82. package/build/bdd-framework/run/bddWorldInternal.js +11 -0
  83. package/build/bdd-framework/snippets/index.js +132 -0
  84. package/build/bdd-framework/snippets/snippetSyntax.js +43 -0
  85. package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +26 -0
  86. package/build/bdd-framework/snippets/snippetSyntaxTs.js +18 -0
  87. package/build/bdd-framework/stepDefinitions/createBdd.js +66 -0
  88. package/build/bdd-framework/stepDefinitions/decorators/class.js +68 -0
  89. package/build/bdd-framework/stepDefinitions/decorators/steps.js +99 -0
  90. package/build/bdd-framework/stepDefinitions/defineStep.js +62 -0
  91. package/build/bdd-framework/stepDefinitions/stepConfig.js +24 -0
  92. package/build/bdd-framework/steps/createBdd.js +78 -0
  93. package/build/bdd-framework/steps/decorators/class.js +68 -0
  94. package/build/bdd-framework/steps/decorators/steps.js +98 -0
  95. package/build/bdd-framework/steps/defineStep.js +62 -0
  96. package/build/bdd-framework/steps/stepConfig.js +24 -0
  97. package/build/bdd-framework/utils/AutofillMap.js +20 -0
  98. package/build/bdd-framework/utils/exit.js +62 -0
  99. package/build/bdd-framework/utils/index.js +93 -0
  100. package/build/bdd-framework/utils/jsStringWrap.js +44 -0
  101. package/build/bdd-framework/utils/logger.js +30 -0
  102. package/build/bdd-framework/utils/stripAnsiEscapes.js +20 -0
  103. package/build/core/playwright/helpers/auth/getUsers.js +12 -25
  104. package/build/core/playwright/index.js +23 -10
  105. package/build/core/playwright/setup/config-creator.js +3 -3
  106. package/build/core/playwright/setup/config-utils.js +25 -8
  107. package/build/core/playwright/tagProcessor.js +79 -0
  108. package/build/core/playwright/test-runner.js +4 -3
  109. package/build/core/playwright/validateFeature.js +3 -33
  110. package/build/decorators.d.ts +1 -1
  111. package/build/decorators.js +1 -1
  112. package/build/setup-folder-structure/samples/auth-setup-sample.js +66 -14
  113. package/build/setup-folder-structure/samples/authUsers-sample.json +9 -0
  114. package/build/setup-folder-structure/samples/env-config-sample.json +21 -0
  115. package/build/setup-folder-structure/setupProject.js +5 -18
  116. package/build/test/core/playwright/__tests__/tagProcessor.test.js +94 -0
  117. package/build/test/core/playwright/__tests__/validateFeature.test.js +10 -5
  118. package/build/test/core/playwright/helpers/__tests__/getUsers_ListOfActors.test.js +80 -0
  119. package/nobdd/src/App.js +7 -0
  120. package/npm-shrinkwrap.json +2175 -5825
  121. package/package.json +7 -7
  122. package/build/core/playwright/fixtures.js +0 -24
  123. package/build/core/playwright/tag-processor.js +0 -68
  124. package/build/setup-folder-structure/samples/actors-index.js +0 -3
  125. package/build/setup-folder-structure/samples/editions-index.js +0 -3
  126. package/build/setup-folder-structure/samples/free-sample.json +0 -25
  127. package/build/setup-folder-structure/samples/settings.json +0 -7
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "PlaywrightLocation", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _reporter.Location;
10
+ }
11
+ });
12
+ var _reporter = require("@playwright/test/reporter");
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getPlaywrightModulePath = getPlaywrightModulePath;
8
+ exports.playwrightVersion = void 0;
9
+ exports.requirePlaywrightModule = requirePlaywrightModule;
10
+ exports.updateAnnotation = updateAnnotation;
11
+ var _fs = _interopRequireDefault(require("fs"));
12
+ var _path = _interopRequireDefault(require("path"));
13
+ var _utils = require("../utils");
14
+ // cache playwright root
15
+ let playwrightRoot = '';
16
+ const playwrightVersion = exports.playwrightVersion = (0, _utils.getPackageVersion)('@playwright/test');
17
+ /**
18
+ * Requires Playwright's internal module that is not exported via package.exports.
19
+ */
20
+ function requirePlaywrightModule(modulePath) {
21
+ const absPath = _path.default.isAbsolute(modulePath) ? modulePath : getPlaywrightModulePath(modulePath);
22
+ return require(absPath);
23
+ }
24
+ function getPlaywrightModulePath(relativePath) {
25
+ return _path.default.join(getPlaywrightRoot(), relativePath);
26
+ }
27
+ function getPlaywrightRoot() {
28
+ if (!playwrightRoot) {
29
+ // Since 1.38 all modules moved from @playwright/test to playwright.
30
+ // Here we check existance of 'lib' dir instead of checking version.
31
+ // See: https://github.com/microsoft/playwright/pull/26946
32
+ const playwrightTestRoot = (0, _utils.resolvePackageRoot)('@playwright/test');
33
+ const libDir = _path.default.join(playwrightTestRoot, 'lib');
34
+ playwrightRoot = _fs.default.existsSync(libDir) ? playwrightTestRoot : (0, _utils.resolvePackageRoot)('playwright');
35
+ }
36
+ return playwrightRoot;
37
+ }
38
+ /**
39
+ * Create or update annotation with provided type.
40
+ */
41
+ function updateAnnotation(testInfo, annotation, {
42
+ create = false
43
+ } = {}) {
44
+ const {
45
+ annotations
46
+ } = testInfo;
47
+ const index = annotations.findIndex(a => a.type === annotation.type);
48
+ if (index === -1 && !create) {
49
+ throw new Error(`Annotation "${annotation.type}" is not found.`);
50
+ }
51
+ if (index === -1) {
52
+ annotations.push(annotation);
53
+ } else {
54
+ annotations[index] = annotation;
55
+ }
56
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _fs = _interopRequireDefault(require("fs"));
10
+ var _promises = require("node:stream/promises");
11
+ /**
12
+ * Base reporter for Cucumber reporters.
13
+ * Reference: https://github.com/cucumber/cucumber-js/blob/main/src/formatter/index.ts
14
+ */
15
+
16
+ class BaseReporter {
17
+ internalOptions;
18
+ outputStream = process.stdout;
19
+ constructor(internalOptions) {
20
+ this.internalOptions = internalOptions;
21
+ }
22
+ get eventBroadcaster() {
23
+ return this.internalOptions.eventBroadcaster;
24
+ }
25
+ get eventDataCollector() {
26
+ return this.internalOptions.eventDataCollector;
27
+ }
28
+ printsToStdio() {
29
+ return isStdout(this.outputStream);
30
+ }
31
+ async init() {}
32
+ async finished() {
33
+ if (!isStdout(this.outputStream)) {
34
+ this.outputStream.end();
35
+ await (0, _promises.finished)(this.outputStream);
36
+ }
37
+ }
38
+ setOutputStream(outputFile) {
39
+ if (!outputFile) {
40
+ return;
41
+ }
42
+ const absolutePath = _path.default.resolve(this.internalOptions.cwd, outputFile);
43
+ _fs.default.mkdirSync(_path.default.dirname(absolutePath), {
44
+ recursive: true
45
+ });
46
+ this.outputStream = _fs.default.createWriteStream(absolutePath);
47
+ }
48
+ }
49
+ exports.default = BaseReporter;
50
+ function isStdout(stream) {
51
+ return stream === process.stdout;
52
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _base = _interopRequireDefault(require("./base"));
9
+ var _loadUtils = require("../../playwright/loadUtils");
10
+ var _getColorFns = _interopRequireDefault(require("../../cucumber/formatter/getColorFns"));
11
+ /**
12
+ * Custom Cucumber reporter.
13
+ * See: https://github.com/cucumber/cucumber-js/blob/main/docs/custom_formatters.md
14
+ */
15
+
16
+ class CustomReporter extends _base.default {
17
+ reporterPathOrModule;
18
+ userOptions;
19
+ formatter;
20
+ constructor(internalOptions, reporterPathOrModule, userOptions = {}) {
21
+ super(internalOptions);
22
+ this.reporterPathOrModule = reporterPathOrModule;
23
+ this.userOptions = userOptions;
24
+ this.setOutputStream(this.userOptions.outputFile);
25
+ }
26
+ printsToStdio() {
27
+ // currently always return true, b/c loading of custom reporter is async,
28
+ // but printsToStdio() is called synchronously at the beginning.
29
+ return true;
30
+ }
31
+ async init() {
32
+ const formatterOptions = this.buildFormatterOptions();
33
+ const FormatterConstructor = await this.loadFormatterFromFile();
34
+ this.formatter = new FormatterConstructor(formatterOptions);
35
+ }
36
+ async finished() {
37
+ var _this$formatter;
38
+ await ((_this$formatter = this.formatter) === null || _this$formatter === void 0 ? void 0 : _this$formatter.finished());
39
+ await super.finished();
40
+ }
41
+ async loadFormatterFromFile() {
42
+ // see: https://github.com/microsoft/playwright/blob/main/packages/playwright/src/common/config.ts#L225
43
+ const reporterPath = require.resolve(this.reporterPathOrModule, {
44
+ paths: [this.internalOptions.cwd]
45
+ });
46
+ return (0, _loadUtils.requireOrImportDefaultFunction)(reporterPath, true);
47
+ }
48
+ buildFormatterOptions() {
49
+ const colorFns = (0, _getColorFns.default)(this.outputStream, process.env, this.userOptions.colorsEnabled);
50
+ return {
51
+ cwd: this.internalOptions.cwd,
52
+ eventBroadcaster: this.eventBroadcaster,
53
+ eventDataCollector: this.eventDataCollector,
54
+ parsedArgvOptions: this.userOptions,
55
+ colorFns,
56
+ stream: this.outputStream,
57
+ log: this.outputStream.write.bind(this.outputStream),
58
+ cleanup: async () => {},
59
+ snippetBuilder: null,
60
+ supportCodeLibrary: {
61
+ World: {}
62
+ }
63
+ };
64
+ }
65
+ }
66
+ // const fakeSuportCodeLibrary = {
67
+ // parameterTypeRegistry: ParameterTypeRegistry;
68
+ // stepDefinitions: StepDefinition[];
69
+ // // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ // World: any;
71
+ // originalCoordinates: ISupportCodeCoordinates;
72
+ // }
73
+ exports.default = CustomReporter;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cucumberReporter = cucumberReporter;
7
+ function cucumberReporter(type, userOptions) {
8
+ return ['../../../bdd-framework/reporter/cucumber/index.js', {
9
+ $type: type,
10
+ ...(userOptions || {})
11
+ }];
12
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _promises = require("node:stream/promises");
9
+ var _htmlFormatter = _interopRequireDefault(require("@cucumber/html-formatter"));
10
+ var _utils = require("../../utils");
11
+ var _path = _interopRequireDefault(require("path"));
12
+ var _base = _interopRequireDefault(require("./base"));
13
+ /**
14
+ * Cucumber html reporter.
15
+ * Based on: https://github.com/cucumber/cucumber-js/blob/main/src/formatter/html_formatter.ts
16
+ * See: https://github.com/cucumber/html-formatter
17
+ * See: https://github.com/cucumber/react-components
18
+ */
19
+
20
+ class HtmlReporter extends _base.default {
21
+ userOptions;
22
+ htmlStream;
23
+ constructor(internalOptions, userOptions = {}) {
24
+ super(internalOptions);
25
+ this.userOptions = userOptions;
26
+ this.setOutputStream(this.userOptions.outputFile);
27
+ const packageRoot = (0, _utils.resolvePackageRoot)('@cucumber/html-formatter');
28
+ this.htmlStream = new _htmlFormatter.default(_path.default.join(packageRoot, 'dist/main.css'), _path.default.join(packageRoot, 'dist/main.js'));
29
+ this.eventBroadcaster.on('envelope', envelope => {
30
+ this.htmlStream.write(envelope);
31
+ });
32
+ this.htmlStream.pipe(this.outputStream);
33
+ }
34
+ async finished() {
35
+ this.htmlStream.end();
36
+ await (0, _promises.finished)(this.htmlStream);
37
+ await super.finished();
38
+ }
39
+ }
40
+ exports.default = HtmlReporter;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _events = _interopRequireDefault(require("events"));
9
+ var _messagesBuilder = require("./messagesBuilder");
10
+ var _configDir = require("../../config/configDir");
11
+ var _enrichReporterData = require("../../config/enrichReporterData");
12
+ var _message = _interopRequireDefault(require("./message"));
13
+ var _html = _interopRequireDefault(require("./html"));
14
+ var _junit = _interopRequireDefault(require("./junit"));
15
+ var _json = _interopRequireDefault(require("./json"));
16
+ var _custom = _interopRequireDefault(require("./custom"));
17
+ /**
18
+ * Playwright reporter that generates different Cucumber reports.
19
+ */
20
+
21
+ const builtinReporters = {
22
+ html: _html.default,
23
+ message: _message.default,
24
+ junit: _junit.default,
25
+ json: _json.default
26
+ };
27
+ class CucumberReporterAdapter {
28
+ messagesBuilderRef;
29
+ type;
30
+ userOptions;
31
+ reporter;
32
+ constructor(fullOptions) {
33
+ const {
34
+ $type,
35
+ ...userOptions
36
+ } = fullOptions;
37
+ this.type = $type;
38
+ this.userOptions = userOptions;
39
+ (0, _enrichReporterData.enableEnrichReporterData)();
40
+ this.messagesBuilderRef = (0, _messagesBuilder.getMessagesBuilderRef)();
41
+ this.reporter = this.createCucumberReporter();
42
+ }
43
+ printsToStdio() {
44
+ return this.reporter.printsToStdio();
45
+ }
46
+ onTestEnd(test, result) {
47
+ this.messagesBuilderRef.onTestEnd(test, result);
48
+ }
49
+ async onEnd(result) {
50
+ this.messagesBuilderRef.onEnd(result);
51
+ await this.reporter.init();
52
+ await this.messagesBuilderRef.builder.buildMessages();
53
+ this.messagesBuilderRef.builder.emitMessages(this.reporter.eventBroadcaster);
54
+ await this.reporter.finished();
55
+ }
56
+ createCucumberReporter() {
57
+ const internalOptions = {
58
+ cwd: (0, _configDir.getPlaywrightConfigDir)(),
59
+ eventBroadcaster: new _events.default(),
60
+ eventDataCollector: this.messagesBuilderRef.builder.eventDataCollector
61
+ };
62
+ if (isBuiltInReporter(this.type)) {
63
+ const BuiltInReporter = builtinReporters[this.type];
64
+ return new BuiltInReporter(internalOptions, this.userOptions);
65
+ } else {
66
+ const reporterPath = this.type;
67
+ return new _custom.default(internalOptions, reporterPath, this.userOptions);
68
+ }
69
+ }
70
+ }
71
+ exports.default = CucumberReporterAdapter;
72
+ function isBuiltInReporter(type) {
73
+ return type in builtinReporters;
74
+ }
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var messages = _interopRequireWildcard(require("@cucumber/messages"));
9
+ var _base = _interopRequireDefault(require("./base"));
10
+ var GherkinDocumentParser = _interopRequireWildcard(require("../../cucumber/formatter/GherkinDocumentParser"));
11
+ var PickleParser = _interopRequireWildcard(require("../../cucumber/formatter/PickleParser"));
12
+ var _valueChecker = require("../../cucumber/valueChecker");
13
+ var _stepArguments = require("../../cucumber/stepArguments");
14
+ var _durationHelpers = require("../../cucumber/formatter/durationHelpers");
15
+ var _locationHelpers = require("../../cucumber/formatter/locationHelpers");
16
+ var _GherkinDocument = require("./messagesBuilder/GherkinDocument");
17
+ var _Projects = require("./messagesBuilder/Projects");
18
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
+ /**
21
+ * Cucumber json reporter.
22
+ * Based on: https://github.com/cucumber/cucumber-js/blob/main/src/formatter/json_formatter.ts
23
+ *
24
+ * Although json reporter is marked as deprecated in CucumberJS docs
25
+ * (see https://github.com/cucumber/cucumber-js/blob/main/docs/formatters.md#json),
26
+ * this decision was rolled back:
27
+ * (see https://github.com/cucumber/json-formatter/issues/34).
28
+ *
29
+ * See also: separate tool to convert cucumber messages to cucumber json:
30
+ * https://github.com/vrymar/cucumber-json-report-formatter/tree/master
31
+ */
32
+ /* eslint-disable max-lines, max-statements, max-nested-callbacks, complexity */
33
+
34
+ const {
35
+ getGherkinExampleRuleMap,
36
+ getGherkinScenarioLocationMap,
37
+ getGherkinStepMap,
38
+ getGherkinScenarioMap
39
+ } = GherkinDocumentParser;
40
+ const {
41
+ getScenarioDescription,
42
+ getPickleStepMap,
43
+ getStepKeyword
44
+ } = PickleParser;
45
+ class JsonReporter extends _base.default {
46
+ userOptions;
47
+ // for now omit step definitions
48
+ supportCodeLibrary = {
49
+ stepDefinitions: []
50
+ };
51
+ constructor(internalOptions, userOptions = {}) {
52
+ super(internalOptions);
53
+ this.userOptions = userOptions;
54
+ this.setOutputStream(this.userOptions.outputFile);
55
+ this.eventBroadcaster.on('envelope', envelope => {
56
+ if ((0, _valueChecker.doesHaveValue)(envelope.testRunFinished)) {
57
+ this.onTestRunFinished();
58
+ }
59
+ });
60
+ }
61
+ convertNameToId(obj) {
62
+ return obj.name.replace(/ /g, '-').toLowerCase();
63
+ }
64
+ formatDataTable(dataTable) {
65
+ return {
66
+ rows: dataTable.rows.map(row => ({
67
+ cells: row.cells.map(x => x.value)
68
+ }))
69
+ };
70
+ }
71
+ formatDocString(docString, gherkinStep) {
72
+ var _gherkinStep$docStrin;
73
+ return {
74
+ content: docString.content,
75
+ line: (_gherkinStep$docStrin = gherkinStep.docString) === null || _gherkinStep$docStrin === void 0 ? void 0 : _gherkinStep$docStrin.location.line
76
+ };
77
+ }
78
+ formatStepArgument(stepArgument, gherkinStep) {
79
+ if ((0, _valueChecker.doesNotHaveValue)(stepArgument)) {
80
+ return [];
81
+ }
82
+ return [(0, _stepArguments.parseStepArgument)(stepArgument, {
83
+ dataTable: dataTable => this.formatDataTable(dataTable),
84
+ docString: docString => this.formatDocString(docString, gherkinStep)
85
+ })];
86
+ }
87
+ onTestRunFinished() {
88
+ const groupedTestCaseAttempts = {};
89
+ this.eventDataCollector.getTestCaseAttempts().forEach(testCaseAttempt => {
90
+ if (!testCaseAttempt.willBeRetried) {
91
+ const uri = testCaseAttempt.pickle.uri;
92
+ if ((0, _valueChecker.doesNotHaveValue)(groupedTestCaseAttempts[uri])) {
93
+ groupedTestCaseAttempts[uri] = [];
94
+ }
95
+ groupedTestCaseAttempts[uri].push(testCaseAttempt);
96
+ }
97
+ });
98
+ const features = Object.keys(groupedTestCaseAttempts).map(uri => {
99
+ const group = groupedTestCaseAttempts[uri];
100
+ const {
101
+ gherkinDocument
102
+ } = group[0];
103
+ const gherkinStepMap = getGherkinStepMap(gherkinDocument);
104
+ const gherkinScenarioMap = getGherkinScenarioMap(gherkinDocument);
105
+ const gherkinExampleRuleMap = getGherkinExampleRuleMap(gherkinDocument);
106
+ const gherkinScenarioLocationMap = getGherkinScenarioLocationMap(gherkinDocument);
107
+ const elements = group.map(testCaseAttempt => {
108
+ const {
109
+ pickle
110
+ } = testCaseAttempt;
111
+ const pickleStepMap = getPickleStepMap(pickle);
112
+ let isBeforeHook = true;
113
+ const steps = testCaseAttempt.testCase.testSteps.map(testStep => {
114
+ isBeforeHook = isBeforeHook && !(0, _valueChecker.doesHaveValue)(testStep.pickleStepId);
115
+ return this.getStepData({
116
+ isBeforeHook,
117
+ gherkinStepMap,
118
+ pickleStepMap,
119
+ testStep,
120
+ testStepAttachments: testCaseAttempt.stepAttachments[testStep.id],
121
+ testStepResult: testCaseAttempt.stepResults[testStep.id]
122
+ });
123
+ });
124
+ return this.getScenarioData({
125
+ feature: gherkinDocument.feature,
126
+ gherkinScenarioLocationMap,
127
+ gherkinExampleRuleMap,
128
+ gherkinScenarioMap,
129
+ pickle,
130
+ steps
131
+ });
132
+ });
133
+ return this.getFeatureData({
134
+ gherkinDocument,
135
+ elements
136
+ });
137
+ });
138
+ this.outputStream.write(JSON.stringify(features, null, 2));
139
+ }
140
+ getFeatureData({
141
+ gherkinDocument,
142
+ elements
143
+ }) {
144
+ const meta = _GherkinDocument.GherkinDocumentMessage.extractMeta(gherkinDocument);
145
+ const feature = gherkinDocument.feature;
146
+ const featureNameWithProject = (0, _Projects.getFeatureNameWithProject)(meta.projectName, feature.name);
147
+ return {
148
+ description: feature.description,
149
+ elements,
150
+ id: this.convertNameToId({
151
+ name: featureNameWithProject
152
+ }),
153
+ line: feature.location.line,
154
+ keyword: feature.keyword,
155
+ name: this.userOptions.addProjectToFeatureName ? featureNameWithProject : feature.name,
156
+ tags: this.getFeatureTags(feature),
157
+ uri: meta.originalUri,
158
+ metadata: this.getFeatureMetadata(gherkinDocument)
159
+ };
160
+ }
161
+ getFeatureMetadata(gherkinDocument) {
162
+ if (!this.userOptions.addMetadata) {
163
+ return;
164
+ }
165
+ const meta = _GherkinDocument.GherkinDocumentMessage.extractMeta(gherkinDocument);
166
+ const metadata = {
167
+ Project: meta.projectName || '',
168
+ Browser: meta.browserName || ''
169
+ };
170
+ return this.userOptions.addMetadata === 'object' ? metadata : Object.keys(metadata).map(name => ({
171
+ name,
172
+ value: metadata[name]
173
+ }));
174
+ }
175
+ getScenarioData({
176
+ feature,
177
+ gherkinScenarioLocationMap,
178
+ gherkinExampleRuleMap,
179
+ gherkinScenarioMap,
180
+ pickle,
181
+ steps
182
+ }) {
183
+ const description = getScenarioDescription({
184
+ pickle,
185
+ gherkinScenarioMap
186
+ });
187
+ return {
188
+ description,
189
+ id: this.formatScenarioId({
190
+ feature,
191
+ pickle,
192
+ gherkinExampleRuleMap
193
+ }),
194
+ keyword: gherkinScenarioMap[pickle.astNodeIds[0]].keyword,
195
+ line: gherkinScenarioLocationMap[pickle.astNodeIds[pickle.astNodeIds.length - 1]].line,
196
+ name: pickle.name,
197
+ steps,
198
+ tags: this.getScenarioTags({
199
+ feature,
200
+ pickle,
201
+ gherkinScenarioMap
202
+ }),
203
+ type: 'scenario'
204
+ };
205
+ }
206
+ formatScenarioId({
207
+ feature,
208
+ pickle,
209
+ gherkinExampleRuleMap
210
+ }) {
211
+ let parts;
212
+ const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]];
213
+ if ((0, _valueChecker.doesHaveValue)(rule)) {
214
+ parts = [feature, rule, pickle];
215
+ } else {
216
+ parts = [feature, pickle];
217
+ }
218
+ return parts.map(part => this.convertNameToId(part)).join(';');
219
+ }
220
+ getStepData({
221
+ isBeforeHook,
222
+ gherkinStepMap,
223
+ pickleStepMap,
224
+ testStep,
225
+ testStepAttachments,
226
+ testStepResult
227
+ }) {
228
+ const data = {};
229
+ if ((0, _valueChecker.doesHaveValue)(testStep.pickleStepId)) {
230
+ const pickleStep = pickleStepMap[testStep.pickleStepId];
231
+ data.arguments = this.formatStepArgument(pickleStep.argument, gherkinStepMap[pickleStep.astNodeIds[0]]);
232
+ data.keyword = getStepKeyword({
233
+ pickleStep,
234
+ gherkinStepMap
235
+ });
236
+ data.line = gherkinStepMap[pickleStep.astNodeIds[0]].location.line;
237
+ data.name = pickleStep.text;
238
+ } else {
239
+ data.keyword = isBeforeHook ? 'Before' : 'After';
240
+ data.hidden = true;
241
+ }
242
+ if ((0, _valueChecker.doesHaveValue)(testStep.stepDefinitionIds) && testStep.stepDefinitionIds.length === 1) {
243
+ const stepDefinition = this.supportCodeLibrary.stepDefinitions.find(s => {
244
+ var _testStep$stepDefinit;
245
+ return s.id === ((_testStep$stepDefinit = testStep.stepDefinitionIds) === null || _testStep$stepDefinit === void 0 ? void 0 : _testStep$stepDefinit[0]);
246
+ });
247
+ if ((0, _valueChecker.doesHaveValue)(stepDefinition)) {
248
+ data.match = {
249
+ location: (0, _locationHelpers.formatLocation)(stepDefinition)
250
+ };
251
+ }
252
+ }
253
+ const {
254
+ message,
255
+ status
256
+ } = testStepResult;
257
+ data.result = {
258
+ status: messages.TestStepResultStatus[status].toLowerCase()
259
+ };
260
+ if ((0, _valueChecker.doesHaveValue)(testStepResult.duration)) {
261
+ data.result.duration = (0, _durationHelpers.durationToNanoseconds)(testStepResult.duration);
262
+ }
263
+ if (status === messages.TestStepResultStatus.FAILED && (0, _valueChecker.doesHaveValue)(message)) {
264
+ data.result.error_message = message;
265
+ }
266
+ const allowedAttachments = this.getAllowedAttachments(testStepAttachments);
267
+ if (allowedAttachments && allowedAttachments.length > 0) {
268
+ data.embeddings = allowedAttachments.map(attachment => ({
269
+ data: attachment.contentEncoding === messages.AttachmentContentEncoding.IDENTITY ? Buffer.from(attachment.body).toString('base64') : attachment.body,
270
+ mime_type: attachment.mediaType
271
+ }));
272
+ }
273
+ return data;
274
+ }
275
+ getFeatureTags(feature) {
276
+ return feature.tags.map(tagData => ({
277
+ name: tagData.name,
278
+ line: tagData.location.line
279
+ }));
280
+ }
281
+ getScenarioTags({
282
+ feature,
283
+ pickle,
284
+ gherkinScenarioMap
285
+ }) {
286
+ const scenario = gherkinScenarioMap[pickle.astNodeIds[0]];
287
+ return pickle.tags.map(tagData => this.getScenarioTag(tagData, feature, scenario));
288
+ }
289
+ getScenarioTag(tagData, feature, scenario) {
290
+ var _tag$location;
291
+ const byAstNodeId = tag => tag.id === tagData.astNodeId;
292
+ const flatten = (acc, val) => acc.concat(val);
293
+ const tag = feature.tags.find(byAstNodeId) || scenario.tags.find(byAstNodeId) || scenario.examples.map(e => e.tags).reduce((acc, val) => flatten(acc, val), []).find(byAstNodeId);
294
+ return {
295
+ name: tagData.name,
296
+ line: tag === null || tag === void 0 || (_tag$location = tag.location) === null || _tag$location === void 0 ? void 0 : _tag$location.line
297
+ };
298
+ }
299
+ getAllowedAttachments(testStepAttachments) {
300
+ const {
301
+ skipAttachments
302
+ } = this.userOptions;
303
+ if (Array.isArray(skipAttachments)) {
304
+ return testStepAttachments === null || testStepAttachments === void 0 ? void 0 : testStepAttachments.filter(attachment => {
305
+ return !skipAttachments.includes(attachment.mediaType);
306
+ });
307
+ } else {
308
+ return skipAttachments ? [] : testStepAttachments;
309
+ }
310
+ }
311
+ }
312
+ exports.default = JsonReporter;