@zohodesk/testinglibrary 0.1.9 → 0.1.16-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 (241) hide show
  1. package/.babelrc +4 -2
  2. package/.claude/settings.local.json +14 -0
  3. package/.gitlab-ci.yml +206 -0
  4. package/README.md +264 -1
  5. package/build/common/data-generator/steps/DataGenerator.spec.js +19 -0
  6. package/build/common/data-generator/steps/DataGeneratorStepsHelper.js +21 -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 +85 -0
  10. package/build/core/dataGenerator/DataGenerator.js +161 -0
  11. package/build/core/dataGenerator/DataGeneratorError.js +60 -0
  12. package/build/core/dataGenerator/DataGeneratorHelper.js +121 -0
  13. package/build/core/dataGenerator/authenticator/Authenticator.js +37 -0
  14. package/build/core/dataGenerator/authenticator/CookieAuthenticator.js +48 -0
  15. package/build/core/dataGenerator/authenticator/JWTauthenticator.js +59 -0
  16. package/build/core/dataGenerator/authenticator/OAuthAuthenticator.js +26 -0
  17. package/build/core/dataGenerator/authenticator/OrgOAuthAuthenticator.js +26 -0
  18. package/build/core/dataGenerator/authenticator/cookieAuthConfig.js +11 -0
  19. package/build/core/jest/preprocessor/jsPreprocessor.js +2 -7
  20. package/build/core/jest/setup/index.js +1 -7
  21. package/build/core/playwright/builtInFixtures/actorContext.js +78 -0
  22. package/build/core/playwright/builtInFixtures/caseTimeout.js +20 -0
  23. package/build/core/playwright/builtInFixtures/context.js +34 -16
  24. package/build/core/playwright/builtInFixtures/executionContext.js +17 -0
  25. package/build/core/playwright/builtInFixtures/i18N.js +8 -0
  26. package/build/core/playwright/builtInFixtures/index.js +7 -1
  27. package/build/core/playwright/builtInFixtures/page.js +22 -66
  28. package/build/core/playwright/clear-caches.js +17 -5
  29. package/build/core/playwright/codegen.js +4 -21
  30. package/build/core/playwright/configuration/Configuration.js +25 -0
  31. package/build/core/playwright/configuration/ConfigurationHelper.js +45 -0
  32. package/build/core/playwright/configuration/UserArgs.js +12 -0
  33. package/build/core/playwright/constants/configConstants.js +17 -0
  34. package/build/core/playwright/constants/failureTagConstants.js +17 -0
  35. package/build/core/playwright/constants/fileMutexConfig.js +9 -0
  36. package/build/core/playwright/constants/reporterConstants.js +20 -0
  37. package/build/core/playwright/constants/retryConstants.js +8 -0
  38. package/build/core/playwright/custom-commands.js +1 -1
  39. package/build/core/playwright/env-initializer.js +28 -9
  40. package/build/core/playwright/fixtures.js +24 -0
  41. package/build/core/playwright/helpers/additionalProfiles.js +25 -0
  42. package/build/core/playwright/helpers/auth/accountLogin.js +4 -1
  43. package/build/core/playwright/helpers/auth/checkAuthCookies.js +27 -23
  44. package/build/core/playwright/helpers/auth/getUsers.js +92 -45
  45. package/build/core/playwright/helpers/auth/index.js +30 -5
  46. package/build/core/playwright/helpers/auth/loginDefaultStepsHelper.js +62 -0
  47. package/build/core/playwright/helpers/auth/loginSteps.js +40 -22
  48. package/build/core/playwright/helpers/browserTimeoutFactor.js +16 -0
  49. package/build/core/playwright/helpers/caseTimeoutResolver.js +37 -0
  50. package/build/core/playwright/helpers/checkAuthDirectory.js +27 -0
  51. package/build/core/playwright/helpers/configFileNameProvider.js +26 -5
  52. package/build/core/playwright/helpers/configPathResolver.js +38 -0
  53. package/build/core/playwright/helpers/contextFailureHandler.js +81 -0
  54. package/build/core/playwright/helpers/customFixturesHelper.js +58 -0
  55. package/build/core/playwright/helpers/failureTagClassifier.js +197 -0
  56. package/build/core/playwright/helpers/fileMutex.js +71 -0
  57. package/build/core/playwright/helpers/logCollector.js +147 -0
  58. package/build/core/playwright/helpers/parseUserArgs.js +2 -3
  59. package/build/core/playwright/helpers/runtimeLogAnnotator.js +140 -0
  60. package/build/core/playwright/helpers/runtimeLogPath.js +61 -0
  61. package/build/core/playwright/helpers/runtimeLogReader.js +54 -0
  62. package/build/core/playwright/helpers/thirdPartyLib.js +13 -0
  63. package/build/core/playwright/index.js +8 -76
  64. package/build/core/playwright/patterns/casePatterns.js +9 -0
  65. package/build/core/playwright/patterns/codePatterns.js +9 -0
  66. package/build/core/playwright/patterns/environmentPatterns.js +15 -0
  67. package/build/core/playwright/patterns/index.js +33 -0
  68. package/build/core/playwright/patterns/logCollectorIgnorePatterns.js +15 -0
  69. package/build/core/playwright/patterns/toolPatterns.js +26 -0
  70. package/build/core/playwright/readConfigFile.js +49 -16
  71. package/build/core/playwright/reporter/PlaywrightReporter.js +58 -0
  72. package/build/core/playwright/reporter/Reporter.js +60 -0
  73. package/build/core/playwright/reporter/ShardReporter.js +62 -0
  74. package/build/core/playwright/reporter/UnitReporter.js +27 -0
  75. package/build/core/playwright/reporter/helpers/mergeAbortedTests.js +78 -0
  76. package/build/core/playwright/runCommand.js +71 -0
  77. package/build/core/playwright/runner/Runner.js +22 -0
  78. package/build/core/playwright/runner/RunnerHelper.js +43 -0
  79. package/build/core/playwright/runner/RunnerTypes.js +17 -0
  80. package/build/core/playwright/runner/SpawnRunner.js +93 -0
  81. package/build/core/playwright/setup/Project.js +35 -0
  82. package/build/core/playwright/setup/ProjectConfiguration.js +66 -0
  83. package/build/core/playwright/setup/config-creator.js +58 -40
  84. package/build/core/playwright/setup/config-utils.js +68 -37
  85. package/build/core/playwright/setup/custom-reporter.js +137 -14
  86. package/build/core/playwright/setup/merge-config.js +32 -0
  87. package/build/core/playwright/setup/qc-custom-reporter.js +342 -0
  88. package/build/core/playwright/tagProcessor.js +69 -0
  89. package/build/core/playwright/test-runner.js +44 -98
  90. package/build/core/playwright/types.js +4 -1
  91. package/build/core/playwright/validateFeature.js +28 -0
  92. package/build/decorators.d.ts +1 -1
  93. package/build/decorators.js +1 -1
  94. package/build/index.d.ts +17 -19
  95. package/build/index.js +28 -6
  96. package/build/lib/cli.js +42 -7
  97. package/build/setup-folder-structure/helper.js +2 -0
  98. package/build/setup-folder-structure/samples/accountLogin-sample.js +19 -0
  99. package/build/setup-folder-structure/samples/actors-index.js +2 -0
  100. package/build/setup-folder-structure/samples/auth-setup-sample.js +10 -67
  101. package/build/setup-folder-structure/samples/editions-index.js +3 -0
  102. package/build/setup-folder-structure/samples/free-sample.json +25 -0
  103. package/build/setup-folder-structure/samples/settings.json +7 -0
  104. package/build/setup-folder-structure/samples/testSetup-sample.js +14 -0
  105. package/build/setup-folder-structure/samples/uat-config-sample.js +7 -2
  106. package/build/setup-folder-structure/setupProject.js +23 -5
  107. package/build/test/core/dataGenerator/__tests__/DataGenerator.test.js +311 -0
  108. package/build/test/core/dataGenerator/__tests__/DataGeneratorHelper.test.js +204 -0
  109. package/build/test/core/dataGenerator/__tests__/DataGeneratorResolution.test.js +126 -0
  110. package/build/test/core/dataGenerator/authenticator/__tests__/Authenticator.test.js +88 -0
  111. package/build/test/core/dataGenerator/authenticator/__tests__/JWTauthenticator.test.js +136 -0
  112. package/build/test/core/dataGenerator/authenticator/__tests__/OAuthAuthenticator.test.js +39 -0
  113. package/build/test/core/dataGenerator/authenticator/__tests__/OrgOAuthAuthenticator.test.js +39 -0
  114. package/build/test/core/playwright/__tests__/runCommand.test.js +148 -0
  115. package/build/test/core/playwright/__tests__/tagProcessor.test.js +94 -0
  116. package/build/test/core/playwright/__tests__/validateFeature.test.js +72 -0
  117. package/build/test/core/playwright/buildInFixtures/__tests__/caseTimeout.test.js +96 -0
  118. package/build/test/core/playwright/buildInFixtures/__tests__/executionContext.test.js +27 -0
  119. package/build/test/core/playwright/configuration/__tests__/Configuration.test.js +53 -0
  120. package/build/test/core/playwright/helpers/__tests__/additionalProfiles.test.js +45 -0
  121. package/build/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js +75 -0
  122. package/build/test/core/playwright/helpers/__tests__/configPathResolver.test.js +55 -0
  123. package/build/test/core/playwright/helpers/__tests__/customFixturesHelper.test.js +51 -0
  124. package/build/test/core/playwright/helpers/__tests__/failureTagClassifier.test.js +604 -0
  125. package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +79 -0
  126. package/build/test/core/playwright/helpers/__tests__/getUsers_ListOfActors.test.js +83 -0
  127. package/build/test/core/playwright/helpers/__tests__/logCollector.test.js +163 -0
  128. package/build/test/core/playwright/helpers/__tests__/runtimeLogReader.test.js +112 -0
  129. package/build/test/core/playwright/helpers/auth/__tests__/checkAuthCookies.test.js +120 -0
  130. package/build/test/core/playwright/runner/__tests__/RunnerHelper.test.js +19 -0
  131. package/build/test/core/playwright/runner/__tests__/SpawnRunner.test.js +30 -0
  132. package/build/utils/cliArgsToObject.js +3 -0
  133. package/build/utils/commonUtils.js +20 -0
  134. package/build/utils/fileUtils.js +43 -1
  135. package/build/utils/logger.js +1 -30
  136. package/changelog.md +23 -0
  137. package/docs/CODE-REVIEW-AGENT.md +399 -0
  138. package/docs/code-review-instructions.md +157 -0
  139. package/jest.config.js +29 -11
  140. package/npm-shrinkwrap.json +13478 -4778
  141. package/package.json +39 -28
  142. package/playwright.config.js +13 -57
  143. package/unit_reports/unit-report.html +277 -0
  144. package/build/bdd-framework/cli/commands/env.js +0 -42
  145. package/build/bdd-framework/cli/commands/export.js +0 -47
  146. package/build/bdd-framework/cli/commands/test.js +0 -64
  147. package/build/bdd-framework/cli/index.js +0 -11
  148. package/build/bdd-framework/cli/options.js +0 -19
  149. package/build/bdd-framework/cli/worker.js +0 -13
  150. package/build/bdd-framework/config/configDir.js +0 -35
  151. package/build/bdd-framework/config/enrichReporterData.js +0 -23
  152. package/build/bdd-framework/config/env.js +0 -50
  153. package/build/bdd-framework/config/index.js +0 -94
  154. package/build/bdd-framework/config/lang.js +0 -14
  155. package/build/bdd-framework/cucumber/buildStepDefinition.js +0 -43
  156. package/build/bdd-framework/cucumber/createTestStep.js +0 -43
  157. package/build/bdd-framework/cucumber/formatter/EventDataCollector.js +0 -126
  158. package/build/bdd-framework/cucumber/formatter/GherkinDocumentParser.js +0 -72
  159. package/build/bdd-framework/cucumber/formatter/PickleParser.js +0 -25
  160. package/build/bdd-framework/cucumber/formatter/durationHelpers.js +0 -13
  161. package/build/bdd-framework/cucumber/formatter/getColorFns.js +0 -57
  162. package/build/bdd-framework/cucumber/formatter/index.js +0 -16
  163. package/build/bdd-framework/cucumber/formatter/locationHelpers.js +0 -16
  164. package/build/bdd-framework/cucumber/loadConfig.js +0 -17
  165. package/build/bdd-framework/cucumber/loadFeatures.js +0 -70
  166. package/build/bdd-framework/cucumber/loadSnippetBuilder.js +0 -20
  167. package/build/bdd-framework/cucumber/loadSteps.js +0 -47
  168. package/build/bdd-framework/cucumber/resolveFeaturePaths.js +0 -62
  169. package/build/bdd-framework/cucumber/stepArguments.js +0 -21
  170. package/build/bdd-framework/cucumber/types.js +0 -5
  171. package/build/bdd-framework/cucumber/valueChecker.js +0 -23
  172. package/build/bdd-framework/decorators.js +0 -18
  173. package/build/bdd-framework/gen/fixtures.js +0 -48
  174. package/build/bdd-framework/gen/formatter.js +0 -123
  175. package/build/bdd-framework/gen/i18n.js +0 -39
  176. package/build/bdd-framework/gen/index.js +0 -185
  177. package/build/bdd-framework/gen/testFile.js +0 -465
  178. package/build/bdd-framework/gen/testMeta.js +0 -60
  179. package/build/bdd-framework/gen/testNode.js +0 -60
  180. package/build/bdd-framework/gen/testPoms.js +0 -133
  181. package/build/bdd-framework/hooks/scenario.js +0 -130
  182. package/build/bdd-framework/hooks/worker.js +0 -89
  183. package/build/bdd-framework/index.js +0 -52
  184. package/build/bdd-framework/playwright/fixtureParameterNames.js +0 -93
  185. package/build/bdd-framework/playwright/getLocationInFile.js +0 -79
  186. package/build/bdd-framework/playwright/loadConfig.js +0 -42
  187. package/build/bdd-framework/playwright/loadUtils.js +0 -33
  188. package/build/bdd-framework/playwright/testTypeImpl.js +0 -61
  189. package/build/bdd-framework/playwright/transform.js +0 -88
  190. package/build/bdd-framework/playwright/types.js +0 -5
  191. package/build/bdd-framework/playwright/utils.js +0 -34
  192. package/build/bdd-framework/reporter/cucumber/base.js +0 -57
  193. package/build/bdd-framework/reporter/cucumber/custom.js +0 -73
  194. package/build/bdd-framework/reporter/cucumber/helper.js +0 -12
  195. package/build/bdd-framework/reporter/cucumber/html.js +0 -35
  196. package/build/bdd-framework/reporter/cucumber/index.js +0 -74
  197. package/build/bdd-framework/reporter/cucumber/json.js +0 -312
  198. package/build/bdd-framework/reporter/cucumber/junit.js +0 -205
  199. package/build/bdd-framework/reporter/cucumber/message.js +0 -20
  200. package/build/bdd-framework/reporter/cucumber/messagesBuilder/AttachmentMapper.js +0 -64
  201. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Builder.js +0 -196
  202. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocument.js +0 -43
  203. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocumentClone.js +0 -52
  204. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocuments.js +0 -105
  205. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Hook.js +0 -70
  206. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Meta.js +0 -45
  207. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Pickles.js +0 -27
  208. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Projects.js +0 -38
  209. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCase.js +0 -128
  210. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRun.js +0 -126
  211. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRunHooks.js +0 -102
  212. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepAttachments.js +0 -50
  213. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepRun.js +0 -88
  214. package/build/bdd-framework/reporter/cucumber/messagesBuilder/index.js +0 -30
  215. package/build/bdd-framework/reporter/cucumber/messagesBuilder/pwUtils.js +0 -51
  216. package/build/bdd-framework/reporter/cucumber/messagesBuilder/timing.js +0 -35
  217. package/build/bdd-framework/reporter/cucumber/messagesBuilder/types.js +0 -5
  218. package/build/bdd-framework/run/StepInvoker.js +0 -68
  219. package/build/bdd-framework/run/bddDataAttachment.js +0 -46
  220. package/build/bdd-framework/run/bddFixtures.js +0 -191
  221. package/build/bdd-framework/run/bddWorld.js +0 -79
  222. package/build/bdd-framework/run/bddWorldInternal.js +0 -15
  223. package/build/bdd-framework/snippets/index.js +0 -132
  224. package/build/bdd-framework/snippets/snippetSyntax.js +0 -43
  225. package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +0 -26
  226. package/build/bdd-framework/snippets/snippetSyntaxTs.js +0 -18
  227. package/build/bdd-framework/stepDefinitions/createBdd.js +0 -66
  228. package/build/bdd-framework/stepDefinitions/decorators/class.js +0 -68
  229. package/build/bdd-framework/stepDefinitions/decorators/steps.js +0 -99
  230. package/build/bdd-framework/stepDefinitions/defineStep.js +0 -62
  231. package/build/bdd-framework/stepDefinitions/stepConfig.js +0 -24
  232. package/build/bdd-framework/utils/AutofillMap.js +0 -20
  233. package/build/bdd-framework/utils/exit.js +0 -62
  234. package/build/bdd-framework/utils/index.js +0 -93
  235. package/build/bdd-framework/utils/jsStringWrap.js +0 -44
  236. package/build/bdd-framework/utils/logger.js +0 -30
  237. package/build/bdd-framework/utils/stripAnsiEscapes.js +0 -20
  238. package/build/core/playwright/report-generator.js +0 -42
  239. package/build/core/playwright/tag-processor.js +0 -68
  240. package/build/setup-folder-structure/samples/authUsers-sample.json +0 -9
  241. package/build/setup-folder-structure/samples/env-config-sample.json +0 -21
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _caseTimeout = _interopRequireDefault(require("../../../../../core/playwright/builtInFixtures/caseTimeout"));
5
+ var _caseTimeoutResolver = require("../../../../../core/playwright/helpers/caseTimeoutResolver");
6
+ var _browserTypes = require("../../../../../core/playwright/constants/browserTypes");
7
+ var _logger = require("../../../../../utils/logger");
8
+ jest.mock('../../../../../utils/logger');
9
+ describe('resolveCaseTimeoutMs', () => {
10
+ beforeEach(() => {
11
+ jest.clearAllMocks();
12
+ });
13
+ test('returns null when no timeout tag is present', () => {
14
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@smoke', '@edition_Free'], _browserTypes.BROWSER_PROJECT_MAPPING.CHROME)).toBeNull();
15
+ });
16
+ test('returns null when tags is not an array', () => {
17
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(undefined, _browserTypes.BROWSER_PROJECT_MAPPING.CHROME)).toBeNull();
18
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(null, _browserTypes.BROWSER_PROJECT_MAPPING.CHROME)).toBeNull();
19
+ });
20
+ test('parses @timeout_<n> as seconds for Chrome (factor 1)', () => {
21
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_180'], _browserTypes.BROWSER_PROJECT_MAPPING.CHROME)).toBe(180000);
22
+ });
23
+ test('applies Firefox 2x multiplier', () => {
24
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_180'], _browserTypes.BROWSER_PROJECT_MAPPING.FIREFOX)).toBe(360000);
25
+ });
26
+ test('returns 0 (no timeout) when tag is @timeout_0, regardless of browser', () => {
27
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_0'], _browserTypes.BROWSER_PROJECT_MAPPING.CHROME)).toBe(0);
28
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_0'], _browserTypes.BROWSER_PROJECT_MAPPING.FIREFOX)).toBe(0);
29
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_0'], _browserTypes.BROWSER_PROJECT_MAPPING.SAFARI)).toBe(0);
30
+ });
31
+ test('uses the first matching tag and logs a warning when multiple are present', () => {
32
+ const result = (0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_120', '@timeout_300'], _browserTypes.BROWSER_PROJECT_MAPPING.CHROME);
33
+ expect(result).toBe(120_000);
34
+ expect(_logger.Logger.log).toHaveBeenCalledWith(_logger.Logger.INFO_TYPE, expect.stringContaining('Multiple @timeout_* tags found'));
35
+ });
36
+ test('ignores malformed timeout-like tags', () => {
37
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_', '@timeout_abc', '@timeout_-5', '@timeoutfoo'], _browserTypes.BROWSER_PROJECT_MAPPING.CHROME)).toBeNull();
38
+ });
39
+ test('ignores non-string entries in tags', () => {
40
+ expect((0, _caseTimeoutResolver.resolveCaseTimeoutMs)(['@timeout_60', null, undefined, 42], _browserTypes.BROWSER_PROJECT_MAPPING.CHROME)).toBe(60_000);
41
+ });
42
+ });
43
+ describe('caseTimeout fixture', () => {
44
+ beforeEach(() => {
45
+ jest.clearAllMocks();
46
+ });
47
+ function getFixture() {
48
+ return _caseTimeout.default.caseTimeout[0];
49
+ }
50
+ test('is registered as an auto fixture', () => {
51
+ expect(_caseTimeout.default.caseTimeout[1]).toEqual({
52
+ auto: true
53
+ });
54
+ });
55
+ test('calls testInfo.setTimeout with scaled value when tag matches', async () => {
56
+ const use = jest.fn();
57
+ const testInfo = {
58
+ project: {
59
+ name: _browserTypes.BROWSER_PROJECT_MAPPING.FIREFOX
60
+ },
61
+ setTimeout: jest.fn()
62
+ };
63
+ await getFixture()({
64
+ $tags: ['@timeout_30']
65
+ }, use, testInfo);
66
+ expect(testInfo.setTimeout).toHaveBeenCalledWith(60_000);
67
+ expect(use).toHaveBeenCalled();
68
+ });
69
+ test('does not call testInfo.setTimeout when no tag is present', async () => {
70
+ const use = jest.fn();
71
+ const testInfo = {
72
+ project: {
73
+ name: _browserTypes.BROWSER_PROJECT_MAPPING.CHROME
74
+ },
75
+ setTimeout: jest.fn()
76
+ };
77
+ await getFixture()({
78
+ $tags: ['@smoke']
79
+ }, use, testInfo);
80
+ expect(testInfo.setTimeout).not.toHaveBeenCalled();
81
+ expect(use).toHaveBeenCalled();
82
+ });
83
+ test('passes 0 through to testInfo.setTimeout for @timeout_0', async () => {
84
+ const use = jest.fn();
85
+ const testInfo = {
86
+ project: {
87
+ name: _browserTypes.BROWSER_PROJECT_MAPPING.SAFARI
88
+ },
89
+ setTimeout: jest.fn()
90
+ };
91
+ await getFixture()({
92
+ $tags: ['@timeout_0']
93
+ }, use, testInfo);
94
+ expect(testInfo.setTimeout).toHaveBeenCalledWith(0);
95
+ });
96
+ });
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _customFixturesHelper = require("../../../../../core/playwright/helpers/customFixturesHelper");
5
+ var _executionContext = _interopRequireDefault(require("../../../../../core/playwright/builtInFixtures/executionContext"));
6
+ jest.mock('../../../../../core/playwright/helpers/customFixturesHelper');
7
+ describe('executionContext', () => {
8
+ test('should pass actorInfo with details from getCustomAccountDetails to use', async () => {
9
+ const mockTags = ['tag1', 'tag2'];
10
+ const mockMainActorInfo = {
11
+ id: '1',
12
+ edition: 'enterprise',
13
+ orgName: 'orgName',
14
+ profile: 'admin',
15
+ email: 'xxx.x+uat@zohotest.com'
16
+ };
17
+ _customFixturesHelper.getCustomAccountDetails.mockReturnValue(mockMainActorInfo);
18
+ const use = jest.fn();
19
+ await _executionContext.default.executionContext({
20
+ $tags: mockTags
21
+ }, use);
22
+ expect(_customFixturesHelper.getCustomAccountDetails).toHaveBeenCalledWith(mockTags);
23
+ expect(use).toHaveBeenCalledWith({
24
+ actorInfo: mockMainActorInfo
25
+ });
26
+ });
27
+ });
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ const Configuration = require("../../../../../core/playwright/configuration/Configuration");
4
+ const {
5
+ combineConfiguration
6
+ } = require("../../../../../core/playwright/configuration/ConfigurationHelper");
7
+ jest.mock('../../../../../core/playwright/configuration/ConfigurationHelper', () => ({
8
+ combineConfiguration: jest.fn()
9
+ }));
10
+ describe('Configuration Class', () => {
11
+ let config;
12
+ let sampleData;
13
+ beforeEach(() => {
14
+ // Sample data as a JSON object
15
+ sampleData = {
16
+ headless: false,
17
+ trace: true,
18
+ video: true,
19
+ bddMode: true
20
+ };
21
+
22
+ // Initialize the Configuration instance with sample data
23
+ config = new Configuration(sampleData);
24
+ });
25
+ test('should add new key-value pair to the configuration', () => {
26
+ config.add('newKey', 'newValue');
27
+ expect(config.get('newKey')).toBe('newValue');
28
+ });
29
+ test('should combine configurations correctly using addAll', () => {
30
+ const newConfig = new Configuration({
31
+ newKey1: 'newValue1',
32
+ trace: false // existing key to test override
33
+ });
34
+ const combinedConfig = {
35
+ headless: false,
36
+ trace: false,
37
+ // trace overridden
38
+ video: true,
39
+ bddMode: true,
40
+ newKey1: 'newValue1'
41
+ };
42
+ combineConfiguration.mockReturnValue(combinedConfig);
43
+ config.addAll(newConfig);
44
+ expect(combineConfiguration).toHaveBeenCalledWith(sampleData, newConfig.getAll());
45
+ expect(config.getAll()).toEqual(combinedConfig);
46
+ });
47
+ test('should return correct value for a given key', () => {
48
+ expect(config.get('headless')).toBe(false);
49
+ expect(config.get('trace')).toBe(true);
50
+ expect(config.get('video')).toBe(true);
51
+ expect(config.get('bddMode')).toBe(true);
52
+ });
53
+ });
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ var _additionalProfiles = require("../../../../../core/playwright/helpers/additionalProfiles");
4
+ jest.mock('../../../../../core/playwright/helpers/auth/getUsers', () => ({
5
+ getUserForSelectedEditionAndProfile: jest.fn((edition, profile, betaFeature, portalInfo) => {
6
+ return {
7
+ email: 'manager.m@zohotest.com',
8
+ id: '1',
9
+ edition: edition || 'enterprise',
10
+ orgName: 'orgName',
11
+ profile: profile || 'admin',
12
+ betaFeature: betaFeature || null,
13
+ portalInfo: portalInfo || null
14
+ };
15
+ })
16
+ }));
17
+ const defaultTags = ['@profile_admin', '@edition_enterprise'];
18
+ const editionTags = ['@profile_admin', '@edition_enterprise', '@additional_profile_manager', '@additional_profile_agent'];
19
+ const editionAndPortalTags = ['@profile_admin', '@edition_enterprise', '@beta_parentchild', '@portal_clientuat2', '@additional_profile_manager'];
20
+ describe('additionalProfiles', () => {
21
+ beforeEach(() => {
22
+ jest.clearAllMocks();
23
+ });
24
+ test('should return empty object when no additional profile tags are present', () => {
25
+ const result = (0, _additionalProfiles.additionProfiles)(defaultTags);
26
+ expect(result).toEqual({});
27
+ });
28
+ test('should return additional profile actors when additional profile tags and editionInfo are present', () => {
29
+ const result = (0, _additionalProfiles.additionProfiles)(editionTags);
30
+ expect(Object.keys(result)).toEqual(['manager', 'agent']);
31
+ expect(result.manager).toHaveProperty('email');
32
+ expect(result.agent).toHaveProperty('email');
33
+ expect(result.manager.profile).toBe('manager');
34
+ expect(result.manager.betaFeature).toBe(null);
35
+ expect(result.agent.portalInfo).toBe(null);
36
+ });
37
+ test('should return additional profile actors when all actor details are present', () => {
38
+ const result = (0, _additionalProfiles.additionProfiles)(editionAndPortalTags);
39
+ expect(Object.keys(result)).toEqual(['manager']);
40
+ expect(result.manager).toHaveProperty('email');
41
+ expect(result.manager.profile).toBe('manager');
42
+ expect(result.manager.betaFeature).toBe("parentchild");
43
+ expect(result.manager.portalInfo).toBe("clientuat2");
44
+ });
45
+ });
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _fs = require("fs");
5
+ var _path = _interopRequireDefault(require("path"));
6
+ var _configFileNameProvider = require("../../../../../core/playwright/helpers/configFileNameProvider");
7
+ var _configPathResolver = require("../../../../../core/playwright/helpers/configPathResolver");
8
+ jest.mock('fs');
9
+ jest.mock('path', () => ({
10
+ resolve: jest.fn()
11
+ }));
12
+ jest.mock("../../../../../core/playwright/helpers/configPathResolver", () => ({
13
+ getConfigPath: jest.fn()
14
+ }));
15
+ const mockCwd = '/mock/current/directory';
16
+ _path.default.resolve = jest.fn();
17
+ process.cwd = jest.fn(() => mockCwd);
18
+ describe('getUATFileName', () => {
19
+ beforeEach(() => {
20
+ jest.clearAllMocks();
21
+ _path.default.resolve.mockImplementation((...segments) => segments.join('/'));
22
+ });
23
+ test('should return pipeline-matched config path when file exists', () => {
24
+ const stage = 'uat';
25
+ const mode = 'cd';
26
+ _configPathResolver.getConfigPath.mockReturnValue(`${stage}/conf`);
27
+ _fs.existsSync.mockReturnValue(true);
28
+ const expected = `${process.cwd()}/${stage}/conf/${mode}/uat.config.js`;
29
+ const result = (0, _configFileNameProvider.getUATFileName)(stage, mode);
30
+ expect(_configPathResolver.getConfigPath).toHaveBeenCalledWith(stage);
31
+ expect(_fs.existsSync).toHaveBeenCalledWith(expected);
32
+ expect(result).toBe(expected);
33
+ });
34
+ test('should use default stage and mode when not provided', () => {
35
+ const mode = 'dev';
36
+ const stageConfigPath = 'uat/conf';
37
+ const expectedPath = `${mockCwd}/${stageConfigPath}/${mode}/uat.config.js`;
38
+ _fs.existsSync.mockReturnValue(true);
39
+ const result = (0, _configFileNameProvider.getUATFileName)(mode);
40
+ expect(_fs.existsSync).toHaveBeenCalledWith(`${mockCwd}/uat/conf/${mode}/uat.config.js`);
41
+ expect(result).toBe(expectedPath);
42
+ });
43
+ test('should return the default config files for pipeline matched files not exists', () => {
44
+ const mockStage = 'uat';
45
+ const mockMode = 'ci';
46
+ const stageConfigPath = 'uat/conf';
47
+ const nonExistingPath = `${mockCwd}/${stageConfigPath}/${mockMode}/uat.config.js`;
48
+ const expectedDefaultPath = `${mockCwd}/${mockStage}/conf/default/uat.config.js`;
49
+ _configPathResolver.getConfigPath.mockReturnValue(stageConfigPath);
50
+ _fs.existsSync.mockReturnValue(false);
51
+ const result = (0, _configFileNameProvider.getUATFileName)(mockStage, mockMode);
52
+ expect(_fs.existsSync).toHaveBeenCalledWith(nonExistingPath);
53
+ expect(result).toBe(expectedDefaultPath);
54
+ });
55
+ });
56
+ describe('getEnvConfigFilePath', () => {
57
+ beforeEach(() => {
58
+ jest.clearAllMocks();
59
+ _path.default.resolve.mockImplementation((...segments) => segments.join('/'));
60
+ });
61
+ test('should return conf file path when file exists', () => {
62
+ _configPathResolver.getConfigPath.mockReturnValue('uat/conf');
63
+ _fs.existsSync.mockReturnValue(true);
64
+ const result = (0, _configFileNameProvider.getEnvConfigFilePath)('uat', 'cd');
65
+ expect(_configPathResolver.getConfigPath).toHaveBeenCalledWith('uat');
66
+ expect(_fs.existsSync).toHaveBeenCalled();
67
+ expect(result).toBe('uat/conf/cd/settings.json');
68
+ });
69
+ test('should return default path when file does not exist', () => {
70
+ _configPathResolver.getConfigPath.mockReturnValue('uat/conf');
71
+ _fs.existsSync.mockReturnValue(false);
72
+ const result = (0, _configFileNameProvider.getEnvConfigFilePath)('uat', 'ci');
73
+ expect(result).toBe('uat/conf/default/settings.json');
74
+ });
75
+ });
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _fs = _interopRequireDefault(require("fs"));
5
+ var _path = _interopRequireDefault(require("path"));
6
+ var _propertiesReader = _interopRequireDefault(require("properties-reader"));
7
+ var _configPathResolver = require("../../../../../core/playwright/helpers/configPathResolver");
8
+ var _logger = require("../../../../../utils/logger");
9
+ var _configConstants = _interopRequireDefault(require("../../../../../core/playwright/constants/configConstants"));
10
+ jest.mock('fs');
11
+ jest.mock('path');
12
+ jest.mock('properties-reader');
13
+ jest.mock('../../../../../utils/logger', () => ({
14
+ Logger: {
15
+ log: jest.fn(),
16
+ INFO_TYPE: 'info',
17
+ FAILURE_TYPE: 'failure'
18
+ }
19
+ }));
20
+ describe('getConfigPath', () => {
21
+ const mockProps = {
22
+ get: jest.fn(),
23
+ set: jest.fn()
24
+ };
25
+ beforeEach(() => {
26
+ jest.clearAllMocks();
27
+ _propertiesReader.default.mockReturnValue(mockProps);
28
+ _path.default.resolve.mockImplementation((...args) => args.join('/'));
29
+ });
30
+ test('should return config path when properties file exists and has mapping', () => {
31
+ _fs.default.existsSync.mockReturnValue(true);
32
+ mockProps.get.mockReturnValue('uat/conf');
33
+ const result = (0, _configPathResolver.getConfigPath)('uat');
34
+ expect(_fs.default.existsSync).toHaveBeenCalledWith(expect.stringContaining(_configConstants.default.STAGE_CONFIG_MAP_FILE));
35
+ expect(_propertiesReader.default).toHaveBeenCalled();
36
+ expect(mockProps.get).toHaveBeenCalledWith('uat');
37
+ expect(result).toBe('uat/conf');
38
+ expect(_logger.Logger.log).not.toHaveBeenCalledWith(_logger.Logger.FAILURE_TYPE, expect.any(String));
39
+ });
40
+ test('should log info and use default mapping if file does not exist', () => {
41
+ _fs.default.existsSync.mockReturnValue(false);
42
+ mockProps.get.mockImplementation(key => key === 'uat' ? 'uat/conf' : undefined);
43
+ const result = (0, _configPathResolver.getConfigPath)('uat');
44
+ expect(_logger.Logger.log).toHaveBeenCalledWith(_logger.Logger.INFO_TYPE, expect.stringContaining('not found'));
45
+ expect(mockProps.set).toHaveBeenCalledWith('uat', 'uat/conf');
46
+ expect(result).toBe('uat/conf');
47
+ });
48
+ test('should log failure if config mapping not found for stage', () => {
49
+ _fs.default.existsSync.mockReturnValue(true);
50
+ mockProps.get.mockReturnValue(undefined);
51
+ const result = (0, _configPathResolver.getConfigPath)('stageX');
52
+ expect(_logger.Logger.log).toHaveBeenCalledWith(_logger.Logger.FAILURE_TYPE, expect.stringContaining('stageX'));
53
+ expect(result).toBeUndefined();
54
+ });
55
+ });
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _customFixturesHelper = require("../../../../../core/playwright/helpers/customFixturesHelper");
4
+ var _logger = require("../../../../../utils/logger");
5
+ var _getUsers = require("../../../../../core/playwright/helpers/auth/getUsers");
6
+ jest.mock('../../../../../core/playwright/helpers/auth/getUsers', () => ({
7
+ getUserForSelectedEditionAndProfile: jest.fn((edition, profile, betaFeature, portalInfo) => ({
8
+ email: 'manager.m@zohotest.com',
9
+ id: '1',
10
+ edition: edition || 'enterprise',
11
+ orgName: 'orgName',
12
+ profile: profile || 'admin',
13
+ betaFeature: betaFeature || null,
14
+ portalInfo: portalInfo || null
15
+ })),
16
+ getDefaultActor: jest.fn(() => ({
17
+ edition: 'enterprise',
18
+ profile: 'admin'
19
+ }))
20
+ }));
21
+ jest.mock('../../../../../utils/logger', () => ({
22
+ Logger: {
23
+ log: jest.fn(),
24
+ FAILURE_TYPE: 'FAILURE'
25
+ }
26
+ }));
27
+ const mockTags = ['@profile_admin', '@edition_enterprise', '@beta_feature', '@portal_clientuat'];
28
+ describe('getCustomAccountDetails', () => {
29
+ beforeEach(() => {
30
+ jest.clearAllMocks();
31
+ });
32
+ test('returns selected user when any tag info is present', () => {
33
+ const result = (0, _customFixturesHelper.getCustomAccountDetails)(mockTags);
34
+ expect(_getUsers.getUserForSelectedEditionAndProfile).toHaveBeenCalledWith('enterprise', 'admin', 'feature', 'clientuat');
35
+ expect(result).toHaveProperty('email', 'manager.m@zohotest.com');
36
+ });
37
+ test('logs and returns undefined if getCustomAccountDetails function throws', () => {
38
+ const error = new Error('failed to get user');
39
+ _getUsers.getUserForSelectedEditionAndProfile.mockImplementation(() => {
40
+ throw error;
41
+ });
42
+ const result = (0, _customFixturesHelper.getCustomAccountDetails)(mockTags);
43
+ expect(_logger.Logger.log).toHaveBeenCalledWith(_logger.Logger.FAILURE_TYPE, 'Error while getting accounts details:', error);
44
+ expect(result).toBeUndefined();
45
+ });
46
+ test('returns default actor when no tag info is not provided', () => {
47
+ const result = (0, _customFixturesHelper.getCustomAccountDetails)([]);
48
+ expect(_getUsers.getDefaultActor).toHaveBeenCalledTimes(1);
49
+ expect(result).toEqual((0, _getUsers.getDefaultActor)());
50
+ });
51
+ });