@zohodesk/testinglibrary 0.1.9-exp-actors → 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 -84
  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 +26 -7
  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 +20 -19
  44. package/build/core/playwright/helpers/auth/getUsers.js +57 -49
  45. package/build/core/playwright/helpers/auth/index.js +14 -1
  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 +21 -7
  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 -88
  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 -97
  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 +2 -22
  95. package/build/index.js +12 -2
  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 -66
  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,81 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.handleContextFailureSegregation = handleContextFailureSegregation;
7
+ exports.performDefaultContextSteps = performDefaultContextSteps;
8
+ var _failureTagClassifier = require("./failureTagClassifier");
9
+ var _runtimeLogPath = require("./runtimeLogPath");
10
+ var _logger = require("../../../utils/logger");
11
+ async function performDefaultContextSteps({
12
+ context,
13
+ testSetup
14
+ }) {
15
+ if (testSetup.context && typeof testSetup.context === 'function') {
16
+ await testSetup.context({
17
+ context
18
+ });
19
+ }
20
+ }
21
+
22
+ // Fixture teardown has no Playwright result.stdout/stderr; use the thrown
23
+ // error text so TOOL/CASE stdio patterns (e.g. data-generator failures) match.
24
+ function buildStdioTextFromTestInfo(testInfo) {
25
+ // A stack already starts with the message, so emitting both would halve the
26
+ // truncation budget the recorded match evidence gets.
27
+ return (testInfo.errors || []).map(err => (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.message) || (err === null || err === void 0 ? void 0 : err.value) || '').filter(Boolean).join('\n');
28
+ }
29
+ function splitTagList(description = '') {
30
+ return description.split(',').map(tag => tag.trim()).filter(Boolean);
31
+ }
32
+
33
+ // Prepends TOOL_failure (etc.) into the "tags" annotation so Playwright HTML
34
+ // shows: tags: TOOL_failure, @edition_enterprise, @profile_admin
35
+ function prependFailureTagsToAnnotations(testInfo, failureTags) {
36
+ const annotations = testInfo.annotations ?? (testInfo.annotations = []);
37
+ const tagsAnnotation = annotations.find(annotation => annotation.type === 'tags');
38
+ const description = (0, _failureTagClassifier.mergeFailureTags)(splitTagList(tagsAnnotation === null || tagsAnnotation === void 0 ? void 0 : tagsAnnotation.description), failureTags).join(', ');
39
+ if (tagsAnnotation) {
40
+ tagsAnnotation.description = description;
41
+ } else {
42
+ annotations.push({
43
+ type: 'tags',
44
+ description
45
+ });
46
+ }
47
+ }
48
+
49
+ // Failure-only: write runtime logs and attach failure-tag metadata.
50
+ async function handleContextFailureSegregation({
51
+ collector,
52
+ testInfo,
53
+ logsDir
54
+ }) {
55
+ const isFailure = testInfo.status && testInfo.status !== testInfo.expectedStatus;
56
+ if (!isFailure) {
57
+ return;
58
+ }
59
+ try {
60
+ const base = (0, _runtimeLogPath.resolveRuntimeLogBaseName)({
61
+ workerIndex: testInfo.workerIndex,
62
+ retry: testInfo.retry,
63
+ title: testInfo.title,
64
+ titlePath: testInfo.titlePath
65
+ });
66
+ collector.flushToFile(logsDir, base);
67
+ const metadata = (0, _failureTagClassifier.classifyFailureDetailsFromEvents)(collector.events, buildStdioTextFromTestInfo(testInfo));
68
+ prependFailureTagsToAnnotations(testInfo, metadata.tags);
69
+
70
+ // classifyFailureDetailsFromEvents always yields at least CODE, so attachment is non-null.
71
+ const attachment = (0, _failureTagClassifier.buildFailureTagMetadataAttachment)(metadata);
72
+ await testInfo.attach(attachment.name, {
73
+ contentType: attachment.contentType,
74
+ body: attachment.body
75
+ });
76
+ } catch (err) {
77
+ // Runs from the fixture's finally after a failure; a throw here would
78
+ // replace the real test error with a bookkeeping error.
79
+ _logger.Logger.error(err);
80
+ }
81
+ }
@@ -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,197 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.buildFailureTagMetadataAttachment = buildFailureTagMetadataAttachment;
8
+ exports.classifyFailureDetails = classifyFailureDetails;
9
+ exports.classifyFailureDetailsFromEvents = classifyFailureDetailsFromEvents;
10
+ exports.classifyFailureDetailsFromResult = classifyFailureDetailsFromResult;
11
+ exports.classifyFailureTags = classifyFailureTags;
12
+ exports.isFailingResultStatus = isFailingResultStatus;
13
+ exports.mergeFailureTags = mergeFailureTags;
14
+ exports.upsertFailureTagMetadataAttachment = upsertFailureTagMetadataAttachment;
15
+ var _path = _interopRequireDefault(require("path"));
16
+ var _failureTagConstants = require("../constants/failureTagConstants");
17
+ var _patterns = require("../patterns");
18
+ var _readConfigFile = require("../readConfigFile");
19
+ var _runtimeLogReader = require("./runtimeLogReader");
20
+ var _runtimeLogAnnotator = require("./runtimeLogAnnotator");
21
+ // A failing test resolves to a SINGLE category tag by strict priority:
22
+ // TOOL > CASE > CODE > ENVIRONMENT. If several categories match, only the
23
+ // highest-priority one is emitted (e.g. CODE + ENVIRONMENT -> CODE only).
24
+ // Metadata `matches` keeps only that winning category's unique hits (deduped by
25
+ // tag + pattern + text). CODE/ENVIRONMENT patterns are matched against the
26
+ // runtime log; TOOL/CASE against stdout/stderr. If a failure matches no
27
+ // category at all it defaults to CODE. Retry-passed (flaky) outcomes are not tagged.
28
+
29
+ const UNEXPECTED_OUTCOME = 'unexpected';
30
+ function isFailingResultStatus(status) {
31
+ return !['passed', 'skipped'].includes(status);
32
+ }
33
+
34
+ // Single-tag priority: the highest-ranked matched category wins.
35
+ const CATEGORY_PRIORITY = [_failureTagConstants.FAILURE_TAGS.TOOL, _failureTagConstants.FAILURE_TAGS.CASE, _failureTagConstants.FAILURE_TAGS.CODE, _failureTagConstants.FAILURE_TAGS.ENVIRONMENT];
36
+ const STDIO_RULES = [{
37
+ tag: _failureTagConstants.FAILURE_TAGS.TOOL,
38
+ patterns: _patterns.TOOL_PATTERNS
39
+ }, {
40
+ tag: _failureTagConstants.FAILURE_TAGS.CASE,
41
+ patterns: _patterns.CASE_PATTERNS
42
+ }];
43
+ function resolveLogsDir() {
44
+ const {
45
+ reportPath
46
+ } = (0, _readConfigFile.generateConfigFromFile)();
47
+ return _path.default.join(reportPath, 'runtime-logs');
48
+ }
49
+ function stdioToText(entries = []) {
50
+ return entries.map(entry => {
51
+ if (typeof entry === 'string') {
52
+ return entry;
53
+ }
54
+ if (!entry || typeof entry !== 'object') {
55
+ return '';
56
+ }
57
+ if (entry.text) {
58
+ return entry.text;
59
+ }
60
+ if (entry.buffer) {
61
+ try {
62
+ return Buffer.from(entry.buffer, 'base64').toString('utf8');
63
+ } catch {
64
+ return '';
65
+ }
66
+ }
67
+ return '';
68
+ }).join('\n');
69
+ }
70
+ function buildStdioText(result = {}) {
71
+ return `${stdioToText(result.stdout)}\n${stdioToText(result.stderr)}`;
72
+ }
73
+ function findStdioMatch(stdio, patterns, tag) {
74
+ for (const pattern of patterns) {
75
+ if ((0, _runtimeLogAnnotator.testPattern)(pattern, stdio)) {
76
+ return {
77
+ tag,
78
+ pattern: (0, _runtimeLogAnnotator.patternLabel)(pattern),
79
+ source: 'stdio',
80
+ text: (0, _runtimeLogAnnotator.truncateText)(stdio)
81
+ };
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ function collectStdioMatches(stdio) {
87
+ const matches = [];
88
+ for (const rule of STDIO_RULES) {
89
+ const match = findStdioMatch(stdio, rule.patterns, rule.tag);
90
+ if (match) {
91
+ matches.push(match);
92
+ }
93
+ }
94
+ return matches;
95
+ }
96
+ function matchKey(match) {
97
+ return `${match.tag}\0${match.pattern}\0${match.text}`;
98
+ }
99
+ function uniqueMatchesByEvidence(matches = []) {
100
+ const uniqueMatches = [];
101
+ const seen = new Set();
102
+ for (const match of matches) {
103
+ const key = matchKey(match);
104
+ if (seen.has(key)) {
105
+ continue;
106
+ }
107
+ seen.add(key);
108
+ uniqueMatches.push(match);
109
+ }
110
+ return uniqueMatches;
111
+ }
112
+ function collectMatchesFromResult(result, testTitle) {
113
+ const events = (0, _runtimeLogAnnotator.normalizeRuntimeLogEvents)((0, _runtimeLogReader.readRuntimeLogEventsForResult)(result, testTitle, resolveLogsDir()));
114
+ return [...(0, _runtimeLogAnnotator.collectRuntimeLogMatches)(events), ...collectStdioMatches(buildStdioText(result))];
115
+ }
116
+ function buildFailureTagMetadata(matches = []) {
117
+ // Collapse the matched categories to the single highest-priority winner.
118
+ // When a failure matched no category, fall back to CODE.
119
+ const winningCategory = CATEGORY_PRIORITY.find(tag => matches.some(match => match.tag === tag)) || _failureTagConstants.FAILURE_TAGS.CODE;
120
+
121
+ // Only the winning category's evidence is surfaced; drop lower-priority
122
+ // categories (e.g. ENVIRONMENT when CODE wins) and identical duplicates.
123
+ const winningMatches = uniqueMatchesByEvidence(matches.filter(match => match.tag === winningCategory));
124
+ return {
125
+ tags: [winningCategory],
126
+ matches: winningMatches
127
+ };
128
+ }
129
+
130
+ // events = browser runtime log; stdioText = stdout/stderr or test error text
131
+ // (TOOL/CASE patterns only match against stdioText).
132
+ function classifyFailureDetailsFromEvents(events = [], stdioText = '') {
133
+ return buildFailureTagMetadata([...(0, _runtimeLogAnnotator.collectRuntimeLogMatches)((0, _runtimeLogAnnotator.normalizeRuntimeLogEvents)(events)), ...collectStdioMatches(stdioText)]);
134
+ }
135
+ function classifyFailureDetailsFromResult(result, testTitle) {
136
+ return buildFailureTagMetadata(collectMatchesFromResult(result, testTitle));
137
+ }
138
+ function classifyFailureDetails(testDetails = [], testTitle = 'test') {
139
+ const unexpectedDetails = testDetails.filter(detail => detail.status === UNEXPECTED_OUTCOME);
140
+ if (unexpectedDetails.length === 0) {
141
+ return {
142
+ tags: [],
143
+ matches: []
144
+ };
145
+ }
146
+ const matches = [];
147
+ for (const detail of unexpectedDetails) {
148
+ const failingResult = pickFailingResult(detail.results);
149
+ if (!failingResult) {
150
+ continue;
151
+ }
152
+ matches.push(...collectMatchesFromResult(failingResult, testTitle));
153
+ }
154
+ return buildFailureTagMetadata(matches);
155
+ }
156
+ function classifyFailureTags(testDetails = [], testTitle = 'test') {
157
+ return classifyFailureDetails(testDetails, testTitle).tags;
158
+ }
159
+ function pickFailingResult(results = []) {
160
+ const failing = results.filter(result => isFailingResultStatus(result.status));
161
+ if (failing.length === 0) {
162
+ return null;
163
+ }
164
+ return failing[failing.length - 1];
165
+ }
166
+ function formatFailureTag(tag) {
167
+ return `${tag}${_failureTagConstants.FAILURE_TAG_SUFFIX}`;
168
+ }
169
+ function mergeFailureTags(existingTags = [], failureTags = []) {
170
+ const formatted = failureTags.map(formatFailureTag);
171
+ const merged = [...formatted];
172
+ for (const tag of existingTags) {
173
+ if (!merged.includes(tag)) {
174
+ merged.push(tag);
175
+ }
176
+ }
177
+ return merged;
178
+ }
179
+ function buildFailureTagMetadataAttachment(details) {
180
+ var _details$tags;
181
+ if (!(details !== null && details !== void 0 && (_details$tags = details.tags) !== null && _details$tags !== void 0 && _details$tags.length)) {
182
+ return null;
183
+ }
184
+ return {
185
+ name: _failureTagConstants.FAILURE_TAG_METADATA_ATTACHMENT,
186
+ contentType: 'application/json',
187
+ body: Buffer.from(JSON.stringify(details, null, 2))
188
+ };
189
+ }
190
+ function upsertFailureTagMetadataAttachment(attachments = [], details) {
191
+ const metadataAttachment = buildFailureTagMetadataAttachment(details);
192
+ if (!metadataAttachment) {
193
+ return attachments;
194
+ }
195
+ const withoutMetadata = attachments.filter(item => item.name !== _failureTagConstants.FAILURE_TAG_METADATA_ATTACHMENT);
196
+ return [...withoutMetadata, metadataAttachment];
197
+ }
@@ -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,147 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.LogCollector = void 0;
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _fileUtils = require("../../../utils/fileUtils");
10
+ var _logCollectorIgnorePatterns = require("../patterns/logCollectorIgnorePatterns");
11
+ var _runtimeLogAnnotator = require("./runtimeLogAnnotator");
12
+ // Per-context Playwright runtime event collector — network failures,
13
+ // console errors, page errors and crashes. Buffered in-memory and flushed
14
+ // to the project runtime-logs folder per test.
15
+
16
+ const DEFAULT_CONFIG = {
17
+ maxEvents: 2000,
18
+ ignoreMessagePatterns: _logCollectorIgnorePatterns.IGNORE_MESSAGE_PATTERNS,
19
+ ignoreUrlPatterns: _logCollectorIgnorePatterns.IGNORE_URL_PATTERNS
20
+ };
21
+ class LogCollector {
22
+ constructor(config = {}) {
23
+ this.config = {
24
+ ...DEFAULT_CONFIG,
25
+ ...config
26
+ };
27
+ this.events = [];
28
+ this._bound = [];
29
+ }
30
+ _push(evt) {
31
+ if (this.events.length >= this.config.maxEvents) {
32
+ this.events.shift();
33
+ }
34
+ this.events.push({
35
+ ts: Date.now(),
36
+ ...evt
37
+ });
38
+ }
39
+ _shouldIgnore(url) {
40
+ if (!url) {
41
+ return false;
42
+ }
43
+ return this.config.ignoreUrlPatterns.some(re => re.test(url));
44
+ }
45
+ _shouldIgnoreMessage(message) {
46
+ if (!message) {
47
+ return false;
48
+ }
49
+ return this.config.ignoreMessagePatterns.some(re => re.test(message));
50
+ }
51
+ _bind(target, event, handler) {
52
+ target.on(event, handler);
53
+ this._bound.push([target, event, handler]);
54
+ }
55
+ attachToContext(context) {
56
+ context.pages().forEach(p => this._attachPage(p));
57
+ this._bind(context, 'page', p => this._attachPage(p));
58
+ this._bind(context, 'response', res => {
59
+ const url = res.url();
60
+ if (this._shouldIgnore(url)) {
61
+ return;
62
+ }
63
+ if (res.status() >= 400) {
64
+ this._push({
65
+ kind: 'response',
66
+ status: res.status(),
67
+ method: res.request().method(),
68
+ url,
69
+ fromCache: res.fromServiceWorker()
70
+ });
71
+ }
72
+ });
73
+ this._bind(context, 'requestfailed', req => {
74
+ var _req$failure;
75
+ const url = req.url();
76
+ const failure = (_req$failure = req.failure()) === null || _req$failure === void 0 ? void 0 : _req$failure.errorText;
77
+ if (this._shouldIgnore(url) || this._shouldIgnoreMessage(failure)) {
78
+ return;
79
+ }
80
+ this._push({
81
+ kind: 'requestfailed',
82
+ method: req.method(),
83
+ url,
84
+ failure,
85
+ resourceType: req.resourceType()
86
+ });
87
+ });
88
+ }
89
+ _attachPage(page) {
90
+ this._bind(page, 'console', msg => {
91
+ const type = msg.type();
92
+ if (type !== 'error') {
93
+ return;
94
+ }
95
+ const text = msg.text();
96
+ const location = msg.location();
97
+ if (this._shouldIgnoreMessage(text) || this._shouldIgnore(location === null || location === void 0 ? void 0 : location.url)) {
98
+ return;
99
+ }
100
+ this._push({
101
+ kind: 'console',
102
+ level: type,
103
+ text,
104
+ location
105
+ });
106
+ });
107
+ this._bind(page, 'pageerror', err => {
108
+ if (this._shouldIgnoreMessage(err.message)) {
109
+ return;
110
+ }
111
+ this._push({
112
+ kind: 'pageerror',
113
+ name: err.name,
114
+ message: err.message,
115
+ stack: err.stack
116
+ });
117
+ });
118
+ this._bind(page, 'crash', () => {
119
+ this._push({
120
+ kind: 'crash',
121
+ url: page.url()
122
+ });
123
+ });
124
+ }
125
+ detach() {
126
+ for (const [target, event, handler] of this._bound) {
127
+ try {
128
+ target.removeListener(event, handler);
129
+ } catch {
130
+ // context may already be closed
131
+ }
132
+ }
133
+ this._bound.length = 0;
134
+ }
135
+ flushToFile(dir, baseName) {
136
+ if (this.events.length === 0) {
137
+ return null;
138
+ }
139
+ const file = _path.default.join(dir, `${baseName}.jsonl`);
140
+ // Keep in-memory events raw; annotate category matches only on disk.
141
+ const lines = (0, _runtimeLogAnnotator.annotateRuntimeLogEvents)(this.events);
142
+ const body = lines.map(e => JSON.stringify(e)).join('\n') + '\n';
143
+ (0, _fileUtils.writeFileContents)(file, body);
144
+ return file;
145
+ }
146
+ }
147
+ exports.LogCollector = LogCollector;
@@ -3,9 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.parseUserArgs = parseUserArgs;
7
7
  var _cliArgsToObject = require("../../../utils/cliArgsToObject");
8
8
  function parseUserArgs() {
9
9
  return (0, _cliArgsToObject.cliArgsToObject)(process.argv.slice(2));
10
- }
11
- var _default = exports.default = parseUserArgs;
10
+ }