@zohodesk/testinglibrary 0.1.9 → 0.1.12-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 +65 -0
  73. package/build/core/playwright/reporter/ShardReporter.js +58 -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/runner/Runner.js +22 -0
  77. package/build/core/playwright/runner/RunnerHelper.js +43 -0
  78. package/build/core/playwright/runner/RunnerTypes.js +17 -0
  79. package/build/core/playwright/runner/SpawnRunner.js +93 -0
  80. package/build/core/playwright/setup/Project.js +35 -0
  81. package/build/core/playwright/setup/ProjectConfiguration.js +66 -0
  82. package/build/core/playwright/setup/config-creator.js +58 -40
  83. package/build/core/playwright/setup/config-utils.js +68 -37
  84. package/build/core/playwright/setup/custom-reporter.js +137 -14
  85. package/build/core/playwright/setup/merge-config.js +32 -0
  86. package/build/core/playwright/setup/qc-custom-reporter.js +342 -0
  87. package/build/core/playwright/spawnInheritChild.js +71 -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__/spawnInheritChild.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 +92 -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 +14994 -4793
  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,140 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.annotateRuntimeLogEvents = annotateRuntimeLogEvents;
7
+ exports.collectRuntimeLogMatches = collectRuntimeLogMatches;
8
+ exports.eventToText = eventToText;
9
+ exports.normalizeRuntimeLogEvents = normalizeRuntimeLogEvents;
10
+ exports.patternLabel = patternLabel;
11
+ exports.testPattern = testPattern;
12
+ exports.truncateText = truncateText;
13
+ var _failureTagConstants = require("../constants/failureTagConstants");
14
+ var _patterns = require("../patterns");
15
+ // Shared runtime-log event text + CODE/ENVIRONMENT tagging.
16
+ // Used by LogCollector (JSONL flush) and failureTagClassifier (metadata).
17
+
18
+ const RUNTIME_LOG_SOURCE = 'runtime-log';
19
+ const MAX_MATCH_TEXT_LENGTH = 500;
20
+ const RUNTIME_LOG_RULES = [{
21
+ tag: _failureTagConstants.FAILURE_TAGS.ENVIRONMENT,
22
+ patterns: _patterns.ENVIRONMENT_PATTERNS
23
+ }, {
24
+ tag: _failureTagConstants.FAILURE_TAGS.CODE,
25
+ patterns: _patterns.CODE_PATTERNS
26
+ }];
27
+ function testPattern(pattern, text) {
28
+ if (pattern.global || pattern.sticky) {
29
+ pattern.lastIndex = 0;
30
+ }
31
+ return pattern.test(text);
32
+ }
33
+ function truncateText(text) {
34
+ if (!text || text.length <= MAX_MATCH_TEXT_LENGTH) {
35
+ return text || '';
36
+ }
37
+ return `${text.slice(0, MAX_MATCH_TEXT_LENGTH)}...`;
38
+ }
39
+ function patternLabel(pattern) {
40
+ return pattern.source;
41
+ }
42
+ function eventToText(event) {
43
+ var _event$location;
44
+ switch (event.kind) {
45
+ case 'pageerror':
46
+ return `pageerror ${event.name || ''} ${event.message || ''}`;
47
+ case 'console':
48
+ return `console ${event.text || ''} ${((_event$location = event.location) === null || _event$location === void 0 ? void 0 : _event$location.url) || ''}`;
49
+ case 'requestfailed':
50
+ return `requestfailed ${event.resourceType || ''} ${event.method || ''} ${event.url || ''} ${event.failure || ''}`;
51
+ case 'response':
52
+ return `response ${event.status || ''} ${event.method || ''} ${event.url || ''}`;
53
+ default:
54
+ return JSON.stringify(event);
55
+ }
56
+ }
57
+ function matchingRuntimeLogTags(event) {
58
+ const text = eventToText(event);
59
+ const tags = [];
60
+ for (const rule of RUNTIME_LOG_RULES) {
61
+ if (rule.patterns.some(pattern => testPattern(pattern, text))) {
62
+ tags.push(rule.tag);
63
+ }
64
+ }
65
+ return tags;
66
+ }
67
+ function findAllEventMatches(events, patterns, tag, source) {
68
+ const matches = [];
69
+ for (const event of events) {
70
+ const text = eventToText(event);
71
+ for (const pattern of patterns) {
72
+ if (testPattern(pattern, text)) {
73
+ matches.push({
74
+ tag,
75
+ pattern: patternLabel(pattern),
76
+ source,
77
+ text: truncateText(text)
78
+ });
79
+ }
80
+ }
81
+ }
82
+ return matches;
83
+ }
84
+
85
+ // Matching events get a category `pattern` field (CODE / ENVIRONMENT).
86
+ // Dual matches emit two lines with the same payload.
87
+ function annotateRuntimeLogEvents(events = []) {
88
+ const lines = [];
89
+ for (const event of events) {
90
+ if (!event) {
91
+ continue;
92
+ }
93
+ const {
94
+ pattern: _ignored,
95
+ ...raw
96
+ } = event;
97
+ const matchedTags = matchingRuntimeLogTags(raw);
98
+ if (matchedTags.length === 0) {
99
+ lines.push(raw);
100
+ continue;
101
+ }
102
+ for (const tag of matchedTags) {
103
+ lines.push({
104
+ pattern: tag,
105
+ ...raw
106
+ });
107
+ }
108
+ }
109
+ return lines;
110
+ }
111
+
112
+ // Strip flush-time `pattern` annotations and drop duplicate event payloads so
113
+ // CODE+ENVIRONMENT dual lines on disk do not inflate classification counts.
114
+ function normalizeRuntimeLogEvents(events = []) {
115
+ const seen = new Set();
116
+ const normalized = [];
117
+ for (const event of events) {
118
+ if (!event) {
119
+ continue;
120
+ }
121
+ const {
122
+ pattern: _ignored,
123
+ ...raw
124
+ } = event;
125
+ const key = JSON.stringify(raw);
126
+ if (seen.has(key)) {
127
+ continue;
128
+ }
129
+ seen.add(key);
130
+ normalized.push(raw);
131
+ }
132
+ return normalized;
133
+ }
134
+ function collectRuntimeLogMatches(events = []) {
135
+ const matches = [];
136
+ for (const rule of RUNTIME_LOG_RULES) {
137
+ matches.push(...findAllEventMatches(events, rule.patterns, rule.tag, RUNTIME_LOG_SOURCE));
138
+ }
139
+ return matches;
140
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.resolveRuntimeLogBaseName = resolveRuntimeLogBaseName;
8
+ exports.resolveRuntimeLogFilePath = resolveRuntimeLogFilePath;
9
+ exports.sanitizeForFilename = sanitizeForFilename;
10
+ var _path = _interopRequireDefault(require("path"));
11
+ const MAX_FILENAME_LENGTH = 200;
12
+ const EXAMPLE_TITLE = /^Example\s*#\d+$/i;
13
+ const SPEC_FILE = /\.(js|ts)$/;
14
+ function sanitizeForFilename(name) {
15
+ if (!name) return 'test';
16
+ const cleaned = name.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
17
+ return cleaned || 'test';
18
+ }
19
+
20
+ // playwright-bdd nests Example rows under test.describe(scenario.name).
21
+ function extractOutlineScenarioName(titlePath = []) {
22
+ const segments = titlePath.filter(Boolean);
23
+ if (segments.length < 2 || !EXAMPLE_TITLE.test(segments[segments.length - 1])) {
24
+ return null;
25
+ }
26
+ for (let i = segments.length - 2; i >= 0; i--) {
27
+ const segment = segments[i];
28
+ if (segment && !SPEC_FILE.test(segment)) {
29
+ return segment;
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ function resolveRuntimeLogBaseName({
35
+ workerIndex = 0,
36
+ retry = 0,
37
+ title = 'test',
38
+ titlePath = []
39
+ }) {
40
+ const scenarioName = extractOutlineScenarioName(titlePath);
41
+ const label = scenarioName ? `${scenarioName} ${title}` : title;
42
+ const base = `w${workerIndex}-${sanitizeForFilename(label)}-${retry}`;
43
+ if (base.length <= MAX_FILENAME_LENGTH) {
44
+ return base;
45
+ }
46
+ return base.slice(0, MAX_FILENAME_LENGTH).replace(/-$/, '');
47
+ }
48
+ function resolveRuntimeLogFilePath(logsDir, {
49
+ workerIndex,
50
+ retry,
51
+ title,
52
+ titlePath = []
53
+ }) {
54
+ const base = resolveRuntimeLogBaseName({
55
+ workerIndex,
56
+ retry,
57
+ title,
58
+ titlePath
59
+ });
60
+ return _path.default.join(logsDir, `${base}.jsonl`);
61
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.readRuntimeLogEvents = readRuntimeLogEvents;
8
+ exports.readRuntimeLogEventsForResult = readRuntimeLogEventsForResult;
9
+ var _fs = _interopRequireDefault(require("fs"));
10
+ var _fileUtils = require("../../../utils/fileUtils");
11
+ var _runtimeLogPath = require("./runtimeLogPath");
12
+ // Reads per-test runtime browser logs from the project runtime-logs folder.
13
+ // Used by the failure-tag classifier to correlate browser events with a test failure.
14
+
15
+ function parseJsonlContent(raw) {
16
+ const trimmed = raw.trim();
17
+ if (!trimmed) {
18
+ return [];
19
+ }
20
+ const events = [];
21
+ for (const line of trimmed.split('\n')) {
22
+ const lineTrimmed = line.trim();
23
+ if (!lineTrimmed) {
24
+ continue;
25
+ }
26
+ try {
27
+ events.push(JSON.parse(lineTrimmed));
28
+ } catch {
29
+ // skip malformed line
30
+ }
31
+ }
32
+ return events;
33
+ }
34
+ function readRuntimeLogEvents(filePath) {
35
+ if (!filePath || !_fs.default.existsSync(filePath)) {
36
+ return [];
37
+ }
38
+ const rawContent = (0, _fileUtils.readFileContents)(filePath);
39
+ if (typeof rawContent !== 'string') {
40
+ return [];
41
+ }
42
+ return parseJsonlContent(rawContent);
43
+ }
44
+ function readRuntimeLogEventsForResult(result, testTitle, logsDir) {
45
+ if (!logsDir) {
46
+ return [];
47
+ }
48
+ const filePath = (0, _runtimeLogPath.resolveRuntimeLogFilePath)(logsDir, {
49
+ workerIndex: (result === null || result === void 0 ? void 0 : result.workerIndex) ?? 0,
50
+ retry: (result === null || result === void 0 ? void 0 : result.retry) ?? 0,
51
+ title: testTitle
52
+ });
53
+ return readRuntimeLogEvents(filePath);
54
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "jsonpath", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _jsonpath.default;
11
+ }
12
+ });
13
+ var _jsonpath = _interopRequireDefault(require("jsonpath"));
@@ -1,92 +1,24 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
- exports.When = exports.Then = exports.Given = void 0;
8
- Object.defineProperty(exports, "accountLogin", {
9
- enumerable: true,
10
- get: function () {
11
- return _index.accountLogin;
12
- }
13
- });
14
- Object.defineProperty(exports, "createBdd", {
15
- enumerable: true,
16
- get: function () {
17
- return _bddFramework.createBdd;
18
- }
19
- });
6
+ exports.createBdd = void 0;
20
7
  Object.defineProperty(exports, "expect", {
21
8
  enumerable: true,
22
9
  get: function () {
23
10
  return _test.expect;
24
11
  }
25
12
  });
26
- Object.defineProperty(exports, "getListOfUsers", {
13
+ Object.defineProperty(exports, "test", {
27
14
  enumerable: true,
28
15
  get: function () {
29
- return _index.getListOfUsers;
16
+ return _playwrightBdd.test;
30
17
  }
31
18
  });
32
- Object.defineProperty(exports, "getPrimaryUser", {
33
- enumerable: true,
34
- get: function () {
35
- return _index.getPrimaryUser;
36
- }
37
- });
38
- Object.defineProperty(exports, "getUserForSelectedEditionAndProfile", {
39
- enumerable: true,
40
- get: function () {
41
- return _index.getUserForSelectedEditionAndProfile;
42
- }
43
- });
44
- Object.defineProperty(exports, "isCI", {
45
- enumerable: true,
46
- get: function () {
47
- return _index.isCI;
48
- }
49
- });
50
- Object.defineProperty(exports, "loadCookiesIfPresent", {
51
- enumerable: true,
52
- get: function () {
53
- return _index.loadCookiesIfPresent;
54
- }
55
- });
56
- Object.defineProperty(exports, "performLoginSteps", {
57
- enumerable: true,
58
- get: function () {
59
- return _index.performLoginSteps;
60
- }
61
- });
62
- exports.test = void 0;
63
- Object.defineProperty(exports, "verifyIfCookieFileExists", {
64
- enumerable: true,
65
- get: function () {
66
- return _index.verifyIfCookieFileExists;
67
- }
68
- });
69
- var _bddFramework = require("../../bdd-framework");
19
+ var _playwrightBdd = require("playwright-bdd");
70
20
  var _test = require("@playwright/test");
71
- var _readConfigFile = require("./readConfigFile");
72
- var _builtInFixtures = _interopRequireDefault(require("./builtInFixtures"));
73
- var _index = require("./helpers/auth/index");
74
- var _getUserFixtures = _interopRequireDefault(require("./helpers/getUserFixtures"));
75
- const {
76
- bddMode
77
- } = (0, _readConfigFile.generateConfigFromFile)();
78
- let base = bddMode ? _bddFramework.test : _test.test;
79
- const buildInFixtures = (0, _builtInFixtures.default)(bddMode);
80
- const userFixtures = (0, _getUserFixtures.default)();
81
- const test = exports.test = base.extend({
82
- ...buildInFixtures,
83
- ...userFixtures
84
- });
85
- const {
86
- Given,
87
- When,
88
- Then
89
- } = (0, _bddFramework.createBdd)();
90
- exports.Then = Then;
91
- exports.When = When;
92
- exports.Given = Given;
21
+ let createBdd = function () {
22
+ return (0, _playwrightBdd.createBdd)(_playwrightBdd.test);
23
+ };
24
+ exports.createBdd = createBdd;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CASE_PATTERNS = void 0;
7
+ // Case patterns: test-case / assertion failures from Playwright output.
8
+ // Matched against the failing result's stdout + stderr.
9
+ const CASE_PATTERNS = exports.CASE_PATTERNS = [/GeneratorError: Generator/i, /DataGeneratorConfigurationError: Data Generator configuration is missing for the profile/i, /Data Generator Service Error/i, /status\s*:\s*DATA_GENERATION_ERROR/i, /There is no beta feature configured with the name/i, /The actors data is missing\./i, /There is no edition configured with the name/i, /There is no portal configured with the name/i, /There is no profile configured with the name/i];
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CODE_PATTERNS = void 0;
7
+ // Code patterns: real application defects surfacing as JS exceptions in the
8
+ // browser. Matched against a flattened text form of each runtime-log event.
9
+ const CODE_PATTERNS = exports.CODE_PATTERNS = [/Cannot read properties of (undefined|null)/i, /\bis not a function\b/i, /\bis not defined\b/i, /\bis not iterable\b/i, /\bis not valid JSON\b/i, /\bis not a valid URL\b/i, /\bFailed to load resource: the server responded with a status of 4\b/i, /errorCode: INTERNAL_SERVER_ERROR/i];
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ENVIRONMENT_PATTERNS = void 0;
7
+ // Environment patterns: infra / network / server breakage. Matched against a
8
+ // flattened text form of each runtime-log event (see runtimeLogAnnotator.eventToText).
9
+ const ENVIRONMENT_PATTERNS = exports.ENVIRONMENT_PATTERNS = [
10
+ // Main document navigation was aborted (page never loaded).
11
+ /^requestfailed document\b[\s\S]*ERR_ABORTED/i,
12
+ // Network / DNS / certificate / connection failures.
13
+ /ERR_TUNNEL_CONNECTION_FAILED|ERR_CERT_|ERR_CONNECTION_|ERR_NAME_NOT_RESOLVED|ERR_INTERNET_DISCONNECTED|ERR_TIMED_OUT|ERR_ADDRESS_UNREACHABLE/i,
14
+ // Server-side 5xx responses.
15
+ /^response 5\d\d\b/i, /status of 5\d\d/i];
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "CASE_PATTERNS", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _casePatterns.CASE_PATTERNS;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "CODE_PATTERNS", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _codePatterns.CODE_PATTERNS;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "ENVIRONMENT_PATTERNS", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _environmentPatterns.ENVIRONMENT_PATTERNS;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "TOOL_PATTERNS", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _toolPatterns.TOOL_PATTERNS;
28
+ }
29
+ });
30
+ var _environmentPatterns = require("./environmentPatterns");
31
+ var _codePatterns = require("./codePatterns");
32
+ var _casePatterns = require("./casePatterns");
33
+ var _toolPatterns = require("./toolPatterns");
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.IGNORE_URL_PATTERNS = exports.IGNORE_MESSAGE_PATTERNS = void 0;
7
+ // Ignore patterns for the runtime-log LogCollector. Matching events are dropped here so it is never recorded.
8
+
9
+ // Matched against console-error text, pageerror messages and requestfailed
10
+
11
+ const IGNORE_MESSAGE_PATTERNS = exports.IGNORE_MESSAGE_PATTERNS = [/Access is denied for this document/i, /enableDarkTheme is not a function/i, /disableDarkTheme is not a function/i, /enableZohoSearchAskZia is not a function/i, /enableSMSBridge is not a function/i, /Unexpected token '<'[\s\S]*not valid JSON/i, /blocked by CORS policy/i, /ERR_BLOCKED_BY_ORB/i];
12
+
13
+ // Matched against request/response/requestfailed URLs and console-error source URLs.
14
+
15
+ const IGNORE_URL_PATTERNS = exports.IGNORE_URL_PATTERNS = [/\.(png|jpe?g|gif|svg|webp|woff2?|ttf|css|map)(\?|$)/i, /google-analytics\.com|googletagmanager\.com|sentry\.io/i, /getHamburgerMenu\.do/i, /_chat\/unreadzmsg\.do/i, /_chat\/chatbarsync\.do/i, /agentAvailabilityConfig/i, /notifyAvailabilityStatus/i, /murphysdk/i, /phonebridge/i, /inproductsdk/i, /zquartz-tracker/i, /zohosearch\/.*gshandler/i, /stratuscdn\.com/i, /zohochat/i];
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TOOL_PATTERNS = void 0;
7
+ // Tool patterns: failures originating from the test tooling / data-generation
8
+ // layer (not the app under test). Matched against the failing result's
9
+ // stdout + stderr text. Add new patterns here to recognise more tool errors.
10
+ const TOOL_PATTERNS = exports.TOOL_PATTERNS = [/Error during login/i, /fetch failed/i,
11
+ // Data Generation
12
+ /Data Generator Service Error: status: 404/i,
13
+ // Configuration
14
+ /Config File Not Exists\. Please provide a/i, /Exception while getting the uat file from the application/i, /No config mapping found for stage:/i,
15
+ // Actor
16
+ /file missing\./i, /Error loading actor configuration from/i, /not found in user pages\./i,
17
+ // Module
18
+ /does not exist\. We have not triggered the execution for this module/i,
19
+ // Auth
20
+ /Error while parsing cookies/i,
21
+ // FileMutex
22
+ /Watch timeout exceeded/i,
23
+ // RPC
24
+ /Invalid payload\. It must be a non-null object\./i, /Invalid payload\.arguments\.entityId\./i,
25
+ // Search
26
+ /Invalid or missing data in dataTable/i, /JSONPath query/i];
@@ -6,38 +6,59 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.generateConfigFromFile = generateConfigFromFile;
8
8
  exports.getAuthFilePath = getAuthFilePath;
9
+ exports.getDefaultConfig = getDefaultConfig;
9
10
  exports.isUserConfigFileAvailable = isUserConfigFileAvailable;
10
11
  var _fs = require("fs");
11
12
  var _path = _interopRequireDefault(require("path"));
12
13
  var _logger = require("../../utils/logger");
13
14
  var _configFileNameProvider = require("./helpers/configFileNameProvider");
14
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
+ var _auth = require("./helpers/auth");
20
+ var _configConstants = _interopRequireDefault(require("./constants/configConstants"));
21
+ const stage = (0, _ConfigurationHelper.getRunStage)();
22
+ let cachedConfig = null;
23
+ function getPrimaryCookiePath() {
24
+ const {
25
+ email
26
+ } = (0, _auth.getDefaultActor)();
27
+ const authFilePrefix = process.env.authFilePrefix;
28
+ let authFileName = authFilePrefix ? `${authFilePrefix}-${email}` : `${email}`;
29
+ return `${_configConstants.default.TEST_SLICE_FOLDER}/${stage}/playwright/.auth/${authFileName}-cookies.json`;
30
+ }
15
31
  function getDefaultConfig() {
16
32
  return {
17
- uatDirectory: _path.default.join(process.cwd(), 'uat'),
33
+ isTearDown: true,
34
+ uatDirectory: _path.default.join(process.cwd(), _configConstants.default.TEST_SLICE_FOLDER, stage),
18
35
  headless: false,
19
36
  browsers: ['Chrome'],
37
+ forbidOnly: false,
38
+ retries: 0,
20
39
  trace: false,
40
+ smokeTestTrace: 'on',
21
41
  video: false,
22
42
  isAuthMode: false,
23
43
  openReportOn: 'never',
24
- reportPath: _path.default.join(process.cwd(), 'uat', 'playwright-report'),
44
+ reportPath: _path.default.join(process.cwd(), _configConstants.default.TEST_SLICE_FOLDER, stage, 'playwright-report'),
25
45
  bddMode: false,
26
46
  expectTimeout: 5 * 1000,
27
47
  testTimeout: 60 * 1000,
28
- authFilePath: 'uat/playwright/.auth/user.json',
48
+ authFilePath: getPrimaryCookiePath(),
29
49
  viewport: {
30
50
  width: 1280,
31
51
  height: 720
32
52
  },
33
53
  debug: false,
34
- mode: 'dev',
54
+ testIdAttribute: 'data-testid',
35
55
  additionalPages: {},
36
56
  featureFilesFolder: 'feature-files',
37
57
  stepDefinitionsFolder: 'steps',
38
- testIdAttribute: 'data-testid',
39
58
  testSetup: {},
40
- editionOrder: ['Free', 'Express', 'Standard', 'Professional', 'Enterprise']
59
+ editionOrder: ['Free', 'Express', 'Standard', 'Professional', 'Enterprise'],
60
+ failureSegregation: true,
61
+ showCaseTimings: false
41
62
  };
42
63
  }
43
64
  function combineDefaultConfigWithUserConfig(userConfiguration) {
@@ -78,9 +99,9 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
78
99
  * @property {string} uatDirectory - Directory in which uat configuration is places.
79
100
  * @property {string} headless - Headless Browsers mode.
80
101
  * @property {number} trace - trace for test cases.
102
+ * @property {string} smokeTestTrace - trace mode for the smokeTest project (e.g. 'on', 'off', 'retain-on-failure'). Default is 'on'.
81
103
  * @property {boolean} video - video for test cases,
82
104
  * @property {boolean} debug - debug mode
83
- * @property {string} mode: mode in which the test cases needs to run
84
105
  * @property {boolean} isAuthMode - Auth Mode. config whether authentication step needed before running test cases
85
106
  * @property {string} authFilePath - File Path where the cookies stored
86
107
  * @property {any} browsers: List of browsers
@@ -88,7 +109,7 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
88
109
  * @property {any} reportPath : directory where report is generate
89
110
  * @property {boolean} bddMode: Feature files needs to be processed
90
111
  * @property {number} expectTimeout: time in milliseconds which the expect condition should fail
91
- * @property {number} testTimeout: time in milliseconds which the test should fail
112
+ * @property {number} testTimeout: time in milliseconds which the test should fail. Can be overridden per-scenario by tagging the scenario with `@timeout_<seconds>` (e.g. `@timeout_180`). `@timeout_0` disables the timeout. Browser scaling (Firefox 2x, Safari 4x) is preserved.
92
113
  * @property {Object} additionalPages: custom pages configuration
93
114
  * @property {string} featureFilesFolder: folder name under which feature-files will be placed. Default is feature-files
94
115
  * @property {string} stepDefinitionsFolder: folder name under which step implementations will be placed. Default is steps
@@ -96,6 +117,8 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
96
117
  * @property {string} testIdAttribute: Change the default data-testid attribute. configure what attribute to search while calling getByTestId
97
118
  * @property {Array} editionOrder: Order in the form of larger editions in the back. Edition with the most privelages should be last
98
119
  * @property {testSetupConfig} testSetup: Specify page and context functions that will be called while intilaizing fixtures.
120
+ * @property {boolean} showCaseTimings: When true, the console reporter prints per-case start/end wall-clock times (h:mm:ss AM/PM) and a case-timings.json sidecar is written to reportPath for the HTML report addon. Default: true.
121
+ * @property {boolean} failureSegregation: When true, collect runtime browser logs on failure, classify failing tests into CODE/CASE/TOOL/ENVIRONMENT, attach additional_logs, and merge tags like CODE_failure into the report. Default: true.
99
122
  */
100
123
 
101
124
  /**
@@ -103,18 +126,27 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
103
126
  *
104
127
  * @returns {UserConfig}
105
128
  */
129
+
130
+ function getConfigFilePath() {
131
+ return (0, _configFileNameProvider.getUATFileName)();
132
+ }
106
133
  function generateConfigFromFile() {
107
- const filePath = _path.default.resolve(process.cwd(), (0, _configFileNameProvider.getUATFileName)());
108
- if ((0, _fs.existsSync)(filePath)) {
109
- /** @type {UserConfig} */
110
- const config = require(filePath);
111
- const modifiedConfiguration = combineDefaultConfigWithUserConfig(config);
112
- return modifiedConfiguration;
134
+ if (cachedConfig === null) {
135
+ // Getting the default config's from framework
136
+ const uatConfig = new _Configuration.default(getDefaultConfig());
137
+ // overriding the application config's from project
138
+ const userArgConfig = new _Configuration.default(_UserArgs.default.parseToObject(process.argv.slice(2)));
139
+ const stage = userArgConfig.get("stage");
140
+ const appConfig = new _Configuration.default((0, _ConfigurationHelper.getApplicationConfig)(stage));
141
+ // overriding the user config's from CLI
142
+ uatConfig.addAll(appConfig);
143
+ uatConfig.addAll(userArgConfig);
144
+ cachedConfig = uatConfig.getAll();
113
145
  }
114
- return {};
146
+ return cachedConfig;
115
147
  }
116
148
  function isUserConfigFileAvailable() {
117
- const filePath = _path.default.resolve(process.cwd(), (0, _configFileNameProvider.getUATFileName)());
149
+ const filePath = getConfigFilePath();
118
150
  if ((0, _fs.existsSync)(filePath)) {
119
151
  return true;
120
152
  }
@@ -129,5 +161,6 @@ function getAuthFilePath(filePath) {
129
161
  }
130
162
  } catch (err) {
131
163
  _logger.Logger.log(_logger.Logger.FAILURE_TYPE, `Founded Path - ${filePath} Authetication file not Exist ...`);
164
+ _logger.Logger.error(err);
132
165
  }
133
166
  }