@zohodesk/testinglibrary 0.0.7 → 0.0.8-n20-experimental

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 (160) hide show
  1. package/.babelrc +7 -2
  2. package/.eslintrc.js +5 -1
  3. package/.gitlab-ci.yml +206 -0
  4. package/README.md +172 -1
  5. package/build/common/data-generator/steps/DataGenerator.spec.js +19 -0
  6. package/build/common/data-generator/steps/DataGeneratorStepsHelper.js +19 -0
  7. package/build/common/multi-actor/steps/multiActorHandling.spec.js +26 -0
  8. package/build/common/searchFake/helpers/rpcRequestHelper.js +52 -0
  9. package/build/common/searchFake/steps/searchFake.spec.js +77 -0
  10. package/build/core/dataGenerator/DataGenerator.js +108 -0
  11. package/build/core/dataGenerator/DataGeneratorError.js +50 -0
  12. package/build/core/dataGenerator/DataGeneratorHelper.js +49 -0
  13. package/build/core/jest/preprocessor/jsPreprocessor.js +3 -9
  14. package/build/core/jest/setup/index.js +1 -7
  15. package/build/core/playwright/builtInFixtures/actorContext.js +75 -0
  16. package/build/core/playwright/builtInFixtures/addTags.js +19 -0
  17. package/build/core/playwright/builtInFixtures/cacheLayer.js +13 -0
  18. package/build/core/playwright/builtInFixtures/context.js +32 -0
  19. package/build/core/playwright/builtInFixtures/executionContext.js +17 -0
  20. package/build/core/playwright/builtInFixtures/i18N.js +41 -0
  21. package/build/core/playwright/builtInFixtures/index.js +46 -0
  22. package/build/core/playwright/builtInFixtures/page.js +38 -0
  23. package/build/core/playwright/builtInFixtures/unauthenticatedPage.js +18 -0
  24. package/build/core/playwright/clear-caches.js +49 -0
  25. package/build/core/playwright/codegen.js +4 -4
  26. package/build/core/playwright/configuration/Configuration.js +25 -0
  27. package/build/core/playwright/configuration/ConfigurationHelper.js +43 -0
  28. package/build/core/playwright/configuration/UserArgs.js +12 -0
  29. package/build/core/playwright/constants/browserTypes.js +12 -0
  30. package/build/core/playwright/constants/fileMutexConfig.js +9 -0
  31. package/build/core/playwright/custom-commands.js +1 -2
  32. package/build/core/playwright/env-initializer.js +28 -6
  33. package/build/core/playwright/fixtures.js +24 -0
  34. package/build/core/playwright/helpers/additionalProfiles.js +25 -0
  35. package/build/core/playwright/helpers/auth/accountLogin.js +21 -0
  36. package/build/core/playwright/helpers/auth/checkAuthCookies.js +41 -0
  37. package/build/core/playwright/helpers/auth/getUrlOrigin.js +13 -0
  38. package/build/core/playwright/helpers/auth/getUsers.js +118 -0
  39. package/build/core/playwright/helpers/auth/index.js +76 -0
  40. package/build/core/playwright/helpers/auth/loginDefaultStepsHelper.js +54 -0
  41. package/build/core/playwright/helpers/auth/loginSteps.js +50 -0
  42. package/build/core/playwright/helpers/checkAuthDirectory.js +27 -0
  43. package/build/core/playwright/helpers/configFileNameProvider.js +31 -0
  44. package/build/core/playwright/helpers/customFixturesHelper.js +58 -0
  45. package/build/core/playwright/helpers/fileMutex.js +71 -0
  46. package/build/core/playwright/helpers/getUserFixtures.js +23 -0
  47. package/build/core/playwright/helpers/mergeObjects.js +13 -0
  48. package/build/core/playwright/helpers/parseUserArgs.js +10 -0
  49. package/build/core/playwright/index.js +10 -98
  50. package/build/core/playwright/readConfigFile.js +93 -14
  51. package/build/core/playwright/report-generator.js +9 -8
  52. package/build/core/playwright/runner/Runner.js +22 -0
  53. package/build/core/playwright/runner/RunnerHelper.js +43 -0
  54. package/build/core/playwright/runner/RunnerTypes.js +17 -0
  55. package/build/core/playwright/runner/SpawnRunner.js +113 -0
  56. package/build/core/playwright/setup/Project.js +35 -0
  57. package/build/core/playwright/setup/ProjectConfiguration.js +80 -0
  58. package/build/core/playwright/setup/config-creator.js +75 -103
  59. package/build/core/playwright/setup/config-utils.js +188 -0
  60. package/build/core/playwright/setup/custom-reporter.js +136 -0
  61. package/build/core/playwright/setup/qc-custom-reporter.js +291 -0
  62. package/build/core/playwright/tagProcessor.js +69 -0
  63. package/build/core/playwright/test-runner.js +84 -98
  64. package/build/core/playwright/types.js +44 -0
  65. package/build/core/playwright/validateFeature.js +28 -0
  66. package/build/decorators.d.ts +1 -1
  67. package/build/decorators.js +1 -1
  68. package/build/index.d.ts +76 -3
  69. package/build/index.js +63 -17
  70. package/build/lib/cli.js +28 -4
  71. package/build/lib/post-install.js +19 -11
  72. package/build/parser/parser.js +0 -1
  73. package/build/setup-folder-structure/helper.js +37 -0
  74. package/build/setup-folder-structure/reportEnhancement/addonScript.html +25 -0
  75. package/build/setup-folder-structure/reportEnhancement/reportAlteration.js +25 -0
  76. package/build/setup-folder-structure/samples/accountLogin-sample.js +19 -0
  77. package/build/setup-folder-structure/samples/actors-index.js +2 -0
  78. package/build/setup-folder-structure/samples/auth-setup-sample.js +10 -67
  79. package/build/setup-folder-structure/samples/editions-index.js +3 -0
  80. package/build/setup-folder-structure/samples/free-sample.json +25 -0
  81. package/build/setup-folder-structure/samples/git-ignore.sample.js +8 -4
  82. package/build/setup-folder-structure/samples/settings.json +7 -0
  83. package/build/setup-folder-structure/samples/testSetup-sample.js +14 -0
  84. package/build/setup-folder-structure/samples/uat-config-sample.js +13 -2
  85. package/build/setup-folder-structure/setupProject.js +34 -12
  86. package/build/test/core/playwright/__tests__/tagProcessor.test.js +94 -0
  87. package/build/test/core/playwright/__tests__/validateFeature.test.js +69 -0
  88. package/build/test/core/playwright/buildInFixtures/__tests__/executionContext.test.js +27 -0
  89. package/build/test/core/playwright/configuration/__tests__/Configuration.test.js +53 -0
  90. package/build/test/core/playwright/helpers/__tests__/additionalProfiles.test.js +45 -0
  91. package/build/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js +34 -0
  92. package/build/test/core/playwright/helpers/__tests__/customFixturesHelper.test.js +51 -0
  93. package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +79 -0
  94. package/build/test/core/playwright/helpers/__tests__/getUsers_ListOfActors.test.js +80 -0
  95. package/build/test/core/playwright/runner/__tests__/RunnerHelper.test.js +16 -0
  96. package/build/test/core/playwright/runner/__tests__/SpawnRunner.test.js +27 -0
  97. package/build/utils/cliArgsToObject.js +8 -1
  98. package/build/utils/commonUtils.js +17 -0
  99. package/build/utils/fileUtils.js +60 -4
  100. package/build/utils/logger.js +1 -31
  101. package/build/utils/rootPath.js +16 -9
  102. package/build/utils/stepDefinitionsFormatter.js +1 -2
  103. package/changelog.md +167 -0
  104. package/jest.config.js +29 -11
  105. package/npm-shrinkwrap.json +9610 -6631
  106. package/package.json +34 -27
  107. package/playwright.config.js +0 -50
  108. package/test-results/.last-run.json +4 -0
  109. package/unit_reports/unit-report.html +277 -0
  110. package/Changelog.md +0 -42
  111. package/build/bdd-framework/cli/commands/env.js +0 -43
  112. package/build/bdd-framework/cli/commands/export.js +0 -48
  113. package/build/bdd-framework/cli/commands/test.js +0 -59
  114. package/build/bdd-framework/cli/index.js +0 -11
  115. package/build/bdd-framework/cli/options.js +0 -20
  116. package/build/bdd-framework/cli/worker.js +0 -13
  117. package/build/bdd-framework/config/dir.js +0 -27
  118. package/build/bdd-framework/config/env.js +0 -49
  119. package/build/bdd-framework/config/index.js +0 -91
  120. package/build/bdd-framework/cucumber/buildStepDefinition.js +0 -43
  121. package/build/bdd-framework/cucumber/gherkin.d.js +0 -5
  122. package/build/bdd-framework/cucumber/gherkin.d.ts +0 -45
  123. package/build/bdd-framework/cucumber/loadConfig.js +0 -17
  124. package/build/bdd-framework/cucumber/loadFeatures.js +0 -39
  125. package/build/bdd-framework/cucumber/loadSnippetBuilder.js +0 -20
  126. package/build/bdd-framework/cucumber/loadSources.js +0 -57
  127. package/build/bdd-framework/cucumber/loadSteps.js +0 -35
  128. package/build/bdd-framework/decorators.js +0 -22
  129. package/build/bdd-framework/gen/formatter.js +0 -88
  130. package/build/bdd-framework/gen/i18n.js +0 -35
  131. package/build/bdd-framework/gen/index.js +0 -160
  132. package/build/bdd-framework/gen/poms.js +0 -46
  133. package/build/bdd-framework/gen/testFile.js +0 -356
  134. package/build/bdd-framework/gen/testNode.js +0 -48
  135. package/build/bdd-framework/gen/testPoms.js +0 -123
  136. package/build/bdd-framework/index.js +0 -45
  137. package/build/bdd-framework/playwright/fixtureParameterNames.js +0 -77
  138. package/build/bdd-framework/playwright/getLocationInFile.js +0 -46
  139. package/build/bdd-framework/playwright/loadConfig.js +0 -42
  140. package/build/bdd-framework/playwright/testTypeImpl.js +0 -41
  141. package/build/bdd-framework/playwright/transform.js +0 -80
  142. package/build/bdd-framework/playwright/types.js +0 -5
  143. package/build/bdd-framework/playwright/utils.js +0 -34
  144. package/build/bdd-framework/run/bddFixtures.js +0 -108
  145. package/build/bdd-framework/run/bddWorld.js +0 -87
  146. package/build/bdd-framework/snippets/index.js +0 -131
  147. package/build/bdd-framework/snippets/snippetSyntax.js +0 -41
  148. package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +0 -26
  149. package/build/bdd-framework/snippets/snippetSyntaxTs.js +0 -18
  150. package/build/bdd-framework/stepDefinitions/createBdd.js +0 -49
  151. package/build/bdd-framework/stepDefinitions/createDecorators.js +0 -109
  152. package/build/bdd-framework/stepDefinitions/decorators/poms.js +0 -50
  153. package/build/bdd-framework/stepDefinitions/decorators/steps.js +0 -94
  154. package/build/bdd-framework/stepDefinitions/defineStep.js +0 -61
  155. package/build/bdd-framework/stepDefinitions/stepConfig.js +0 -24
  156. package/build/bdd-framework/utils/index.js +0 -50
  157. package/build/bdd-framework/utils/jsStringWrap.js +0 -44
  158. package/build/bdd-framework/utils/logger.js +0 -29
  159. package/build/setup-folder-structure/samples/authUsers-sample.json +0 -9
  160. package/build/setup-folder-structure/samples/env-config-sample.json +0 -21
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractTagInfo = extractTagInfo;
7
+ exports.getCustomAccountDetails = getCustomAccountDetails;
8
+ var _auth = require("../helpers/auth");
9
+ var _logger = require("../../../utils/logger");
10
+ /* eslint-disable global-require */
11
+
12
+ function getTagInputFromSelectedTags(tags, inputString) {
13
+ const selectedTag = [...tags].reverse().find(tag => tag.startsWith(inputString));
14
+ let tagInput = null;
15
+ if (selectedTag) {
16
+ tagInput = selectedTag.split(`${inputString}_`).pop().toLowerCase();
17
+ }
18
+ return tagInput;
19
+ }
20
+ function extractTagInfo(tags) {
21
+ const tagsTobeFiltered = ['@profile', '@edition', '@beta', '@portal'];
22
+ const filteredTags = tags.filter(tag => tagsTobeFiltered.some(prefix => tag.startsWith(prefix)));
23
+ if (!filteredTags.length) {
24
+ return {
25
+ portalInfo: null,
26
+ betaFeature: null,
27
+ profileInfo: null,
28
+ editionInfo: null
29
+ };
30
+ }
31
+ const portalInfo = getTagInputFromSelectedTags(filteredTags, '@portal');
32
+ const betaFeature = getTagInputFromSelectedTags(filteredTags, '@beta');
33
+ const profileInfo = getTagInputFromSelectedTags(filteredTags, '@profile');
34
+ const editionInfo = getTagInputFromSelectedTags(filteredTags, '@edition');
35
+ return {
36
+ portalInfo,
37
+ betaFeature,
38
+ profileInfo,
39
+ editionInfo
40
+ };
41
+ }
42
+ function getCustomAccountDetails(tags) {
43
+ try {
44
+ const {
45
+ portalInfo,
46
+ betaFeature,
47
+ profileInfo,
48
+ editionInfo
49
+ } = extractTagInfo(tags);
50
+ if (portalInfo || betaFeature || profileInfo || editionInfo) {
51
+ const user = (0, _auth.getUserForSelectedEditionAndProfile)(editionInfo, profileInfo, betaFeature, portalInfo);
52
+ return user;
53
+ }
54
+ return (0, _auth.getDefaultActor)();
55
+ } catch (err) {
56
+ _logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error while getting accounts details:', err);
57
+ }
58
+ }
@@ -0,0 +1,71 @@
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 = require("fs");
10
+ function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
11
+ function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
12
+ function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
13
+ var _FileMutex_brand = /*#__PURE__*/new WeakSet();
14
+ class FileMutex {
15
+ constructor(directory, lockFileName, fileDeletionTimeoutConfig) {
16
+ _classPrivateMethodInitSpec(this, _FileMutex_brand);
17
+ this.directory = directory;
18
+ this.lockFileName = lockFileName + ".lock";
19
+ this.fileDeletionTimeout = fileDeletionTimeoutConfig.timeout;
20
+ this.lockFilePath = _assertClassBrand(_FileMutex_brand, this, _getLockFilePath).call(this);
21
+ _assertClassBrand(_FileMutex_brand, this, _createDirectoryIfNotExist).call(this);
22
+ }
23
+ async acquire() {
24
+ return new Promise((resolve, reject) => {
25
+ if (!(0, _fs.existsSync)(this.lockFilePath)) {
26
+ (0, _fs.writeFileSync)(this.lockFilePath, 'locked');
27
+ console.log(`Lock file created: ${this.lockFilePath}, worker index - ${process.env.TEST_WORKER_INDEX}`);
28
+ return resolve();
29
+ }
30
+ const timeout = setTimeout(() => {
31
+ watcher.close();
32
+ reject(new Error('Watch timeout exceeded'));
33
+ }, this.fileDeletionTimeout);
34
+ const watcher = (0, _fs.watch)(this.directory, (eventType, filename) => {
35
+ try {
36
+ if (eventType === 'rename' && filename === this.lockFileName) {
37
+ clearTimeout(timeout);
38
+ console.log(`Lock file deleted! Proceeding, worker index - ${process.env.TEST_WORKER_INDEX}`);
39
+ watcher.close();
40
+ resolve();
41
+ }
42
+ } catch (err) {
43
+ console.error(`Error watching for lock file deletion: ${err.message}`);
44
+ watcher.close();
45
+ }
46
+ });
47
+ });
48
+ }
49
+ async release() {
50
+ try {
51
+ if ((0, _fs.existsSync)(this.lockFilePath)) {
52
+ (0, _fs.unlinkSync)(this.lockFilePath);
53
+ console.log(`Lock file deleted: ${this.lockFilePath}, worker index - ${process.env.TEST_WORKER_INDEX}`);
54
+ }
55
+ } catch (err) {
56
+ console.error(`Error deleting lock file: ${err.message}, worker index - ${process.env.TEST_WORKER_INDEX}`);
57
+ throw err;
58
+ }
59
+ }
60
+ }
61
+ function _getLockFilePath() {
62
+ return _path.default.resolve(_path.default.join(this.directory, this.lockFileName));
63
+ }
64
+ async function _createDirectoryIfNotExist() {
65
+ if (!(0, _fs.existsSync)(this.directory)) {
66
+ (0, _fs.mkdirSync)(this.directory, {
67
+ recursive: true
68
+ });
69
+ }
70
+ }
71
+ var _default = exports.default = FileMutex;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _logger = require("../../../utils/logger");
8
+ var _readConfigFile = require("../readConfigFile");
9
+ function getUserFixtures() {
10
+ const {
11
+ additionalPages
12
+ } = (0, _readConfigFile.generateConfigFromFile)();
13
+
14
+ // if (additionalPages.page || additionalPages.context) {
15
+ // // Logger.log(
16
+ // // Logger.INFO_TYPE,
17
+ // // 'Not allowed to override the page and context fixture. Use Test Setup in uat configuration'
18
+ // // );
19
+ // }
20
+
21
+ return additionalPages;
22
+ }
23
+ var _default = exports.default = getUserFixtures;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.mergeObjects = mergeObjects;
7
+ // Utility function to merge objects using spread operator
8
+ function mergeObjects(obj1, obj2) {
9
+ return {
10
+ ...obj1,
11
+ ...obj2
12
+ };
13
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parseUserArgs = parseUserArgs;
7
+ var _cliArgsToObject = require("../../../utils/cliArgsToObject");
8
+ function parseUserArgs() {
9
+ return (0, _cliArgsToObject.cliArgsToObject)(process.argv.slice(2));
10
+ }
@@ -3,110 +3,22 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.When = exports.Then = exports.Given = void 0;
7
- Object.defineProperty(exports, "createBdd", {
6
+ exports.createBdd = void 0;
7
+ Object.defineProperty(exports, "expect", {
8
8
  enumerable: true,
9
9
  get: function () {
10
- return _bddFramework.createBdd;
10
+ return _test.expect;
11
11
  }
12
12
  });
13
- Object.defineProperty(exports, "expect", {
13
+ Object.defineProperty(exports, "test", {
14
14
  enumerable: true,
15
15
  get: function () {
16
- return _test.expect;
16
+ return _playwrightBdd.test;
17
17
  }
18
18
  });
19
- exports.test = void 0;
20
- var _bddFramework = require("../../bdd-framework");
19
+ var _playwrightBdd = require("playwright-bdd");
21
20
  var _test = require("@playwright/test");
22
- var _readConfigFile = require("./readConfigFile");
23
- // function test(descrition, callback) {
24
- // return test(descrition, ({ page }) => {
25
- // const { locator, ...custompage } = page
26
- // callback({ page: custompage })
27
- // })
28
- // }
29
-
30
- // class FilteredPage {
31
- // constructor(page) {
32
- // this.page = page;
33
- // this.allowedMethods = ['getByText', 'getByTitle'];
34
- // this.context = page.context;
35
- // }
36
-
37
- // goto(...args) {
38
- // return this.page['goto'](...args);
39
- // }
40
-
41
- // getByRole(...args) {
42
- // return this.page['getByRole'](...args);
43
- // }
44
- // }
45
-
46
- // function FilteredPage(page) {
47
- // return {
48
- // getByRole: () => {
49
- // throw new Error('You cannnot use getByRole property')
50
- // }
51
- // }
52
- // }
53
- const {
54
- additionalPages = {},
55
- bddMode
56
- } = (0, _readConfigFile.generateConfigFromFile)();
57
- let base = bddMode ? _bddFramework.test : _test.test;
58
- const test = base.extend({
59
- page: async ({
60
- page
61
- }, use) => {
62
- // const proxyPage = new Proxy(page, {
63
- // get: function (obj, prop) {
64
- // console.log('Gettig Priop', prop);
65
- // let filterMethod = FilteredPage(page)[prop];
66
- // if (filterMethod) {
67
- // return filterMethod;
68
- // } else {
69
- // return obj[prop] ? obj[prop] : 'property does not exist';
70
- // }
71
- // }
72
- // })
73
- page.getBaseUrl = function () {
74
- if (process.env.mode === 'dev') {
75
- return `${process.env.domain}?devURL=${process.env.devUrl}`;
76
- }
77
- return `${process.env.domain}`;
78
- };
79
- page.getCustomPageUrl = function (url) {
80
- if (process.env.mode === 'dev') {
81
- return `${process.env.domain}/${url}?devURL=${process.env.devUrl}`;
82
- }
83
- return `${process.env.domain}/${url}`;
84
- };
85
- await use(page);
86
-
87
- //await use(new FilteredPage(page));
88
-
89
- // await use(async (page) => {
90
- // delete page.getByTestId;
91
- // await page;
92
- // });
93
- },
94
-
95
- context: async ({
96
- context
97
- }, use) => {
98
- // eslint-disable-next-line no-undef
99
- await context.addInitScript(() => window.localStorage.setItem('isDnBannerHide', true));
100
- await use(context);
101
- },
102
- ...additionalPages
103
- });
104
- exports.test = test;
105
- const {
106
- Given,
107
- When,
108
- Then
109
- } = (0, _bddFramework.createBdd)();
110
- exports.Then = Then;
111
- exports.When = When;
112
- exports.Given = Given;
21
+ let createBdd = function () {
22
+ return (0, _playwrightBdd.createBdd)(_playwrightBdd.test);
23
+ };
24
+ exports.createBdd = createBdd;
@@ -4,27 +4,93 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.fileName = void 0;
8
7
  exports.generateConfigFromFile = generateConfigFromFile;
9
8
  exports.getAuthFilePath = getAuthFilePath;
9
+ exports.getDefaultConfig = getDefaultConfig;
10
10
  exports.isUserConfigFileAvailable = isUserConfigFileAvailable;
11
11
  var _fs = require("fs");
12
12
  var _path = _interopRequireDefault(require("path"));
13
13
  var _logger = require("../../utils/logger");
14
- const fileName = 'uat.config.js';
14
+ var _configFileNameProvider = require("./helpers/configFileNameProvider");
15
+ var _mergeObjects = require("./helpers/mergeObjects");
16
+ var _Configuration = _interopRequireDefault(require("./configuration/Configuration"));
17
+ var _UserArgs = _interopRequireDefault(require("./configuration/UserArgs"));
18
+ var _ConfigurationHelper = require("./configuration/ConfigurationHelper");
19
+ let cachedConfig = null;
20
+ function getDefaultConfig() {
21
+ return {
22
+ isTearDown: true,
23
+ uatDirectory: _path.default.join(process.cwd(), 'uat'),
24
+ headless: false,
25
+ browsers: ['Chrome'],
26
+ forbidOnly: false,
27
+ retries: 0,
28
+ trace: false,
29
+ video: false,
30
+ isAuthMode: false,
31
+ openReportOn: 'never',
32
+ reportPath: _path.default.join(process.cwd(), 'uat', 'playwright-report'),
33
+ bddMode: false,
34
+ expectTimeout: 5 * 1000,
35
+ testTimeout: 60 * 1000,
36
+ authFilePath: 'uat/playwright/.auth/user.json',
37
+ viewport: {
38
+ width: 1280,
39
+ height: 720
40
+ },
41
+ debug: false,
42
+ testIdAttribute: 'data-testid',
43
+ additionalPages: {},
44
+ featureFilesFolder: 'feature-files',
45
+ stepDefinitionsFolder: 'steps',
46
+ testSetup: {},
47
+ editionOrder: ['Free', 'Express', 'Standard', 'Professional', 'Enterprise']
48
+ };
49
+ }
50
+ function combineDefaultConfigWithUserConfig(userConfiguration) {
51
+ let defaultConfig = getDefaultConfig();
52
+ let configurationObj = {};
53
+ Object.keys(userConfiguration).forEach(configKey => {
54
+ let configValue = userConfiguration[configKey];
55
+ if (configValue !== null && configValue !== undefined) {
56
+ configurationObj[configKey] = configValue;
57
+ } else if (defaultConfig[configKey]) {
58
+ configurationObj[configKey] = defaultConfig[configKey];
59
+ } else {
60
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, `key - ${configKey} is not yet supported in uat configuration. This will not be used while creating playwright configuration`);
61
+ }
62
+ });
63
+ return (0, _mergeObjects.mergeObjects)(defaultConfig, configurationObj);
64
+ }
65
+ /**
66
+ * @typedef {Object|null} viewportConfig
67
+ * @property {number} width - width of the viewport
68
+ * @property {number} height - height of the viewport
69
+ */
70
+ /**
71
+ * @typedef {Object|null} viewportConfig
72
+ * @property {number} width - width of the viewport
73
+ * @property {number} height - height of the viewport
74
+ */
75
+
76
+ /**
77
+ * @typedef {Object|null} testSetupConfig
78
+ * @property {any} page - Function that will be called while setting up page fixtures
79
+ * @property {any} context - Function that will be called while setting up context fixtures
80
+ */
15
81
 
16
82
  /**
17
83
  * Represents the user configuration object.
18
84
  * @typedef {Object} UserConfig
85
+ * @property {string} uatDirectory - Directory in which uat configuration is places.
19
86
  * @property {string} headless - Headless Browsers mode.
20
87
  * @property {number} trace - trace for test cases.
21
88
  * @property {boolean} video - video for test cases,
22
89
  * @property {boolean} debug - debug mode
23
- * @property {string} mode: mode in which the test cases needs to run
24
- * @property {boolean} isAuthMode - Auth Mode
90
+ * @property {boolean} isAuthMode - Auth Mode. config whether authentication step needed before running test cases
25
91
  * @property {string} authFilePath - File Path where the cookies stored
26
92
  * @property {any} browsers: List of browsers
27
- * @property {string} openReportOn: default Option value (never, on-failure and always)
93
+ * @property {string} openReportOn: default Option value (never, on-failure and always)
28
94
  * @property {any} reportPath : directory where report is generate
29
95
  * @property {boolean} bddMode: Feature files needs to be processed
30
96
  * @property {number} expectTimeout: time in milliseconds which the expect condition should fail
@@ -32,25 +98,37 @@ const fileName = 'uat.config.js';
32
98
  * @property {Object} additionalPages: custom pages configuration
33
99
  * @property {string} featureFilesFolder: folder name under which feature-files will be placed. Default is feature-files
34
100
  * @property {string} stepDefinitionsFolder: folder name under which step implementations will be placed. Default is steps
101
+ * @property {viewportConfig} viewport: viewport configuration for the browser. Default is { width: 1280, height: 720 }
102
+ * @property {string} testIdAttribute: Change the default data-testid attribute. configure what attribute to search while calling getByTestId
103
+ * @property {Array} editionOrder: Order in the form of larger editions in the back. Edition with the most privelages should be last
104
+ * @property {testSetupConfig} testSetup: Specify page and context functions that will be called while intilaizing fixtures.
35
105
  */
36
106
 
37
107
  /**
38
108
  * Generates a configuration object from a file, if it exists.
39
109
  *
40
110
  * @returns {UserConfig}
41
- */
42
- exports.fileName = fileName;
111
+ */
112
+
113
+ function getConfigFilePath() {
114
+ return _path.default.resolve(process.cwd(), (0, _configFileNameProvider.getUATFileName)());
115
+ }
43
116
  function generateConfigFromFile() {
44
- const filePath = _path.default.resolve(process.cwd(), fileName);
45
- if ((0, _fs.existsSync)(filePath)) {
46
- /** @type {UserConfig} */
47
- const config = require(filePath);
48
- return config;
117
+ if (cachedConfig === null) {
118
+ // Getting the default config's from framework
119
+ const uatConfig = new _Configuration.default(getDefaultConfig());
120
+ // overriding the application config's from project
121
+ const appConfig = new _Configuration.default((0, _ConfigurationHelper.getApplicationConfig)());
122
+ const userArgConfig = new _Configuration.default(_UserArgs.default.parseToObject(process.argv.slice(2)));
123
+ // overriding the user config's from CLI
124
+ uatConfig.addAll(appConfig);
125
+ uatConfig.addAll(userArgConfig);
126
+ cachedConfig = uatConfig.getAll();
49
127
  }
50
- return {};
128
+ return cachedConfig;
51
129
  }
52
130
  function isUserConfigFileAvailable() {
53
- const filePath = _path.default.resolve(process.cwd(), fileName);
131
+ const filePath = getConfigFilePath();
54
132
  if ((0, _fs.existsSync)(filePath)) {
55
133
  return true;
56
134
  }
@@ -65,5 +143,6 @@ function getAuthFilePath(filePath) {
65
143
  }
66
144
  } catch (err) {
67
145
  _logger.Logger.log(_logger.Logger.FAILURE_TYPE, `Founded Path - ${filePath} Authetication file not Exist ...`);
146
+ _logger.Logger.error(err);
68
147
  }
69
148
  }
@@ -10,14 +10,15 @@ var _path = _interopRequireDefault(require("path"));
10
10
  var _logger = require("../../utils/logger");
11
11
  var _rootPath = require("../../utils/rootPath");
12
12
  var _readConfigFile = require("./readConfigFile");
13
- const userArgs = process.argv.slice(3);
14
- const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
15
- const command = playwrightPath;
16
- const {
17
- reportPath: htmlPath = _path.default.resolve(process.cwd(), 'uat', './playwright-report')
18
- } = (0, _readConfigFile.generateConfigFromFile)();
19
- const args = ['show-report', htmlPath].concat(userArgs);
20
- function generateReport() {
13
+ async function generateReport() {
14
+ // await preProcessReport()
15
+ const userArgs = process.argv.slice(3);
16
+ const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
17
+ const command = playwrightPath;
18
+ const {
19
+ reportPath: htmlPath
20
+ } = (0, _readConfigFile.generateConfigFromFile)();
21
+ const args = ['show-report', htmlPath].concat(userArgs);
21
22
  const childProcess = (0, _child_process.spawn)(command, args, {
22
23
  stdio: 'inherit'
23
24
  });
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ class Runner {
4
+ constructor(config) {
5
+ this.tagArgs = "";
6
+ this.userArgs = "";
7
+ this.config = config;
8
+ }
9
+ setUserArgs(userArgs) {
10
+ this.userArgs = userArgs;
11
+ }
12
+ setTagArgs(tagArgs) {
13
+ this.tagArgs = tagArgs;
14
+ }
15
+ setConfig(config) {
16
+ this.config = config;
17
+ }
18
+ run() {
19
+ throw new Error("Method 'run()' must be implemented.");
20
+ }
21
+ }
22
+ module.exports = Runner;
@@ -0,0 +1,43 @@
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 _RunnerTypes = _interopRequireDefault(require("./RunnerTypes"));
9
+ var _configUtils = require("../setup/config-utils");
10
+ var _cliArgsToObject = require("../../../utils/cliArgsToObject");
11
+ var _browserTypes = require("../constants/browserTypes");
12
+ var _customCommands = require("../custom-commands");
13
+ class RunnerHelper {
14
+ static createRunner(type, runnerObj) {
15
+ const runnerClass = _RunnerTypes.default.getRunnerClass(type, runnerObj);
16
+ if (!runnerClass) {
17
+ throw new Error("Invalid runner type");
18
+ }
19
+ return runnerClass;
20
+ }
21
+ static getPlaywrightArgs(userArgsObject, debug, bddMode, tagArgs, headless) {
22
+ const {
23
+ browsers = null
24
+ } = userArgsObject;
25
+ let browserList = (0, _configUtils.getBrowsersList)(browsers);
26
+ const playwrightArgs = (0, _cliArgsToObject.objectToCliArgs)(userArgsObject, key => !_customCommands.CUSTOM_COMMANDS.includes(key));
27
+ if (debug) {
28
+ playwrightArgs.push('--debug');
29
+ }
30
+ if (!bddMode && tagArgs) {
31
+ playwrightArgs.push('--grep');
32
+ playwrightArgs.push(tagArgs);
33
+ }
34
+ if (!headless && !userArgsObject.headed) {
35
+ playwrightArgs.push('--headed');
36
+ }
37
+ if (browserList && browserList.length > 0) {
38
+ browserList.map(browser => playwrightArgs.push(`--project=${_browserTypes.BROWSER_PROJECT_MAPPING[browser.toUpperCase()]}`));
39
+ }
40
+ return playwrightArgs;
41
+ }
42
+ }
43
+ var _default = exports.default = RunnerHelper;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _SpawnRunner = _interopRequireDefault(require("./SpawnRunner"));
5
+ class RunnerTypes {
6
+ static getRunnerClass(type, runnerObj) {
7
+ const RunnerClass = this.runnerTypes[type];
8
+ if (!RunnerClass) {
9
+ throw new Error("Invalid runner type");
10
+ }
11
+ return new RunnerClass(runnerObj);
12
+ }
13
+ static runnerTypes = {
14
+ spawn: _SpawnRunner.default //require("./SpawnRunner"), // used lazy loading to reduce circular dependencies
15
+ };
16
+ }
17
+ module.exports = RunnerTypes;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _readConfigFile = require("../readConfigFile");
5
+ var _rootPath = require("../../../utils/rootPath");
6
+ var _path = _interopRequireDefault(require("path"));
7
+ var _logger = require("../../../utils/logger");
8
+ var _child_process = require("child_process");
9
+ var _RunnerHelper = _interopRequireDefault(require("./RunnerHelper"));
10
+ var _Runner = _interopRequireDefault(require("./Runner"));
11
+ var _commonUtils = require("../../../utils/commonUtils");
12
+ class SpawnRunner extends _Runner.default {
13
+ constructor(runnerObj) {
14
+ super(runnerObj);
15
+ this.runnerObj = runnerObj;
16
+ }
17
+ run() {
18
+ const {
19
+ config
20
+ } = this.runnerObj;
21
+ let promises = [];
22
+ const {
23
+ bddMode
24
+ } = config.getAll();
25
+ if (bddMode) {
26
+ promises.push(this.runPreprocessing());
27
+ }
28
+ Promise.all(promises).then(() => this.runPlaywright()).catch(err => {
29
+ _logger.Logger.error(err);
30
+ process.exit();
31
+ });
32
+ }
33
+ runPreprocessing() {
34
+ //This below functoin is called to copy the data generator spec files to the current project
35
+ (0, _commonUtils.copyCommonSpecs)();
36
+ const {
37
+ tagArgs
38
+ } = this.runnerObj;
39
+ const configPath = (0, _readConfigFile.isUserConfigFileAvailable)() ? _path.default.resolve(__dirname, '../', 'setup', 'config-creator.js') : _path.default.resolve(__dirname, '../', '../', '../', '../', 'playwrightConfig.js');
40
+ const beforeCommand = 'node';
41
+ const bddGenPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('bddgen'));
42
+ const beforeArgs = [bddGenPath, '-c', require.resolve(configPath)];
43
+ if (tagArgs) {
44
+ beforeArgs.push('--tags');
45
+ beforeArgs.push(tagArgs);
46
+ }
47
+ return new Promise((resolve, reject) => {
48
+ const childProcessForPreprocessing = (0, _child_process.spawn)(beforeCommand, beforeArgs, {
49
+ stdio: 'inherit',
50
+ env: {
51
+ ...process.env
52
+ }
53
+ });
54
+ childProcessForPreprocessing.on('error', data => {
55
+ _logger.Logger.log(_logger.Logger.FAILURE_TYPE, data);
56
+ reject(data);
57
+ });
58
+ childProcessForPreprocessing.on('exit', code => {
59
+ if (code === 0) {
60
+ _logger.Logger.log(_logger.Logger.SUCCESS_TYPE, 'Feature Files Processed Successfully');
61
+ resolve();
62
+ } else {
63
+ reject(`BddGen exited with code ${code}`);
64
+ }
65
+ });
66
+ });
67
+ }
68
+ runPlaywright() {
69
+ const {
70
+ tagArgs,
71
+ config,
72
+ userArgs
73
+ } = this.runnerObj;
74
+ const {
75
+ debug,
76
+ bddMode = false,
77
+ headless = false
78
+ } = config.getAll();
79
+ const playwrightArgs = _RunnerHelper.default.getPlaywrightArgs(userArgs, debug, bddMode, tagArgs, headless);
80
+ const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
81
+ const command = playwrightPath;
82
+ const configPath = (0, _readConfigFile.isUserConfigFileAvailable)() ? _path.default.resolve(__dirname, '../', 'setup', 'config-creator.js') : _path.default.resolve('../', '../', '../', '../', 'playwrightConfig.js');
83
+ const args = ['test', '--config', require.resolve(configPath)].concat(playwrightArgs);
84
+ return new Promise((resolve, reject) => {
85
+ const childProcessForRunningPlaywright = (0, _child_process.spawn)(command, args, {
86
+ stdio: 'inherit',
87
+ env: {
88
+ ...process.env
89
+ }
90
+ });
91
+ childProcessForRunningPlaywright.on('error', error => {
92
+ _logger.Logger.log(_logger.Logger.FAILURE_TYPE, error);
93
+ });
94
+ childProcessForRunningPlaywright.on('exit', (code, signal) => {
95
+ if (code !== 0) {
96
+ reject(`Child Process Exited with Code ${code} and Signal ${signal}`);
97
+ } else {
98
+ _logger.Logger.log(_logger.Logger.SUCCESS_TYPE, 'Test Ran Successfully');
99
+ resolve();
100
+ }
101
+ });
102
+ process.on('exit', () => {
103
+ childProcessForRunningPlaywright.kill();
104
+ reject('Terminating Playwright Process...');
105
+ });
106
+ process.on('SIGINT', () => {
107
+ childProcessForRunningPlaywright.kill();
108
+ reject('Cleaning up...');
109
+ });
110
+ });
111
+ }
112
+ }
113
+ module.exports = SpawnRunner;