@zohodesk/testinglibrary 0.4.88-n18-experimental → 0.4.90-n18-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.
package/.gitlab-ci.yml CHANGED
@@ -160,4 +160,3 @@ uat-smoketest:
160
160
  paths:
161
161
  - examples/uat/playwright-report
162
162
 
163
-
package/README.md CHANGED
@@ -19,17 +19,25 @@
19
19
 
20
20
  ## Version History
21
21
 
22
- ### v3.2.6 - 02-09-2025
22
+ ### v3.2.7 - 10-09-2025
23
+
24
+ ### Bug fix
25
+ - Fixed a bug where the default profile page was not being handled properly in `this`.
26
+
27
+ ### v3.2.6 - 05-09-2025
23
28
 
24
29
  #### Feature
25
30
 
26
- - Multi-actor execution support – now possible to switch between multiple profile agents within scenarios using the new `actorCtx` custom fixture.
31
+ - Multi-actor execution support – now possible to switch between multiple profile agents within scenarios using the predefined step: - `access the {string} profile page`
32
+
33
+ ### Bug fix
34
+ - Fixed the issue where localapp and hcapp UAT were not running properly.
27
35
 
28
36
  ### v3.2.5 - 28-08-2025
29
37
 
30
38
  #### Enhancement
31
39
 
32
- - Removed the searchFake dependency from the project level and adopted it inside the framework, reducing project-side maintenance.
40
+ - Removed the searchFake dependency from the project level and adopted it inside the framework, reducing project-side maintenance. use this predefined step: - `Given (a search entity)`
33
41
 
34
42
  ### v3.2.4 - 29-07-2025
35
43
 
@@ -1,15 +1,20 @@
1
1
  import { createBdd } from '@zohodesk/testinglibrary';
2
2
  const { BeforeScenario, Given } = createBdd();
3
3
 
4
- BeforeScenario(async function({ actorCtx }) {
4
+ BeforeScenario(async function({ page, context, browser, cacheLayer, executionContext, actorContext }) {
5
5
  // This will run before each scenario and set all the fixtures into this context
6
+ this.page = page;
7
+ this.context = context;
8
+ this.browser = browser;
9
+ this.cacheLayer = cacheLayer;
10
+ this.executionContext = executionContext;
6
11
  this.setActor = async (role) => {
7
- const userPage = actorCtx.actorsObj[role];
12
+ const userPage = actorContext.actorsObj[role];
8
13
  if (userPage) {
9
14
  this.page = userPage.page;
10
15
  this.context = userPage.context;
11
16
  this.browser = userPage.browser;
12
- this.executionContext = userPage.actorInfo;
17
+ this.executionContext = userPage.executionContext;
13
18
  } else {
14
19
  throw new Error(`Actor "${role}" not found in user pages.`);
15
20
  }
@@ -5,16 +5,25 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _logger = require("../../../utils/logger");
8
- var _customFixturesHelper = require("../helpers/customFixturesHelper");
8
+ var _additionalProfiles = require("../helpers/additionalProfiles");
9
9
  var _loginDefaultStepsHelper = require("../helpers/auth/loginDefaultStepsHelper");
10
- class additionalActorContext {
10
+ class ActorContext {
11
11
  constructor() {
12
12
  this.actorsObj = {};
13
13
  }
14
- async setupAdditionalActors(browser, $tags, testInfo) {
14
+ async setup(browser, $tags, testInfo, context, page, executionContext) {
15
15
  try {
16
- const actorInfoMap = (0, _customFixturesHelper.getCustomAccountDetails)($tags);
17
- const additionalActors = actorInfoMap.additional;
16
+ const {
17
+ profile
18
+ } = executionContext.actorInfo;
19
+ this.actorsObj[profile] = {
20
+ role: profile,
21
+ browser,
22
+ context,
23
+ page,
24
+ executionContext
25
+ };
26
+ const additionalActors = (0, _additionalProfiles.additionProfiles)($tags);
18
27
  await Promise.all(Object.entries(additionalActors).map(async ([role, actorInfo]) => {
19
28
  let context = await browser.newContext();
20
29
  let page = await context.newPage();
@@ -30,7 +39,9 @@ class additionalActorContext {
30
39
  browser,
31
40
  context,
32
41
  page,
33
- actorInfo
42
+ executionContext: {
43
+ actorInfo
44
+ }
34
45
  };
35
46
  }));
36
47
  } catch (error) {
@@ -49,12 +60,15 @@ class additionalActorContext {
49
60
  }
50
61
  }
51
62
  var _default = exports.default = {
52
- actorCtx: async ({
63
+ actorContext: async ({
64
+ page,
65
+ context,
66
+ executionContext,
53
67
  $tags,
54
68
  browser
55
69
  }, use, testInfo) => {
56
- const ctxObject = new additionalActorContext();
57
- await ctxObject.setupAdditionalActors(browser, $tags, testInfo);
70
+ const ctxObject = new ActorContext();
71
+ await ctxObject.setup(browser, $tags, testInfo, context, page, executionContext);
58
72
  await use(ctxObject);
59
73
  await ctxObject.cleanup();
60
74
  }
@@ -9,8 +9,9 @@ var _default = exports.default = {
9
9
  executionContext: async ({
10
10
  $tags
11
11
  }, use) => {
12
- const allActorsObj = (0, _customFixturesHelper.getCustomAccountDetails)($tags);
13
- const currentActor = allActorsObj.main;
14
- await use(currentActor);
12
+ const actorInfo = (0, _customFixturesHelper.getCustomAccountDetails)($tags);
13
+ await use({
14
+ actorInfo
15
+ });
15
16
  }
16
17
  };
@@ -12,14 +12,14 @@ var _addTags = _interopRequireDefault(require("./addTags"));
12
12
  var _i18N = _interopRequireDefault(require("./i18N"));
13
13
  var _unauthenticatedPage = _interopRequireDefault(require("./unauthenticatedPage"));
14
14
  var _executionContext = _interopRequireDefault(require("./executionContext"));
15
- var _actorCtx = _interopRequireDefault(require("./actorCtx"));
15
+ var _actorContext = _interopRequireDefault(require("./actorContext"));
16
16
  function extractTagsFromTitle(text) {
17
17
  return text.match(/@\w+/g) || [];
18
18
  }
19
19
  function getBuiltInFixtures(bddMode) {
20
20
  let builtInFixtures = {
21
21
  ..._page.default,
22
- ..._actorCtx.default,
22
+ ..._actorContext.default,
23
23
  ..._context.default,
24
24
  ..._cacheLayer.default,
25
25
  ..._i18N.default,
@@ -13,7 +13,7 @@ var _default = exports.default = {
13
13
  page,
14
14
  executionContext
15
15
  }, use, testInfo) => {
16
- let testPortalDetails = executionContext;
16
+ let testPortalDetails = executionContext.actorInfo;
17
17
  let testDetails = {
18
18
  page,
19
19
  $tags,
@@ -5,7 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.additionProfiles = additionProfiles;
7
7
  var _getUsers = require("./auth/getUsers");
8
- function additionProfiles(tags, editionInfo, betaFeature, portalInfo) {
8
+ var _customFixturesHelper = require("./customFixturesHelper");
9
+ function additionProfiles(tags) {
10
+ const {
11
+ editionInfo,
12
+ betaFeature,
13
+ portalInfo
14
+ } = (0, _customFixturesHelper.extractTagInfo)(tags);
9
15
  const additionalProfileTags = tags.filter(tag => tag.startsWith('@additional_profile_'));
10
16
  let additionalProfileActors = {};
11
17
  if (additionalProfileTags.length > 0 && editionInfo) {
@@ -9,6 +9,7 @@ exports.performDefaultPageSteps = performDefaultPageSteps;
9
9
  exports.verifyPageIsLoaded = verifyPageIsLoaded;
10
10
  var _auth = require("../auth");
11
11
  var _readConfigFile = require("../../readConfigFile");
12
+ var _logger = require("../../../../utils/logger");
12
13
  let {
13
14
  testSetup,
14
15
  isAuthMode
@@ -48,6 +49,6 @@ async function executeDefaultLoginSteps(context, testInfo, testDetails, testPort
48
49
  process.env.actorInfo = JSON.stringify(testPortalDetails);
49
50
  }
50
51
  } catch (error) {
51
- Logger.log(Logger.FAILURE_TYPE, 'Error while executing the default login steps:', error);
52
+ _logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error while executing the default login steps:', error);
52
53
  }
53
54
  }
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.extractTagInfo = extractTagInfo;
6
7
  exports.getCustomAccountDetails = getCustomAccountDetails;
7
8
  var _auth = require("../helpers/auth");
8
- var _additionalProfiles = require("../helpers/additionalProfiles");
9
9
  var _logger = require("../../../utils/logger");
10
10
  /* eslint-disable global-require */
11
11
 
@@ -17,27 +17,42 @@ function getTagInputFromSelectedTags(tags, inputString) {
17
17
  }
18
18
  return tagInput;
19
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
+ }
20
42
  function getCustomAccountDetails(tags) {
21
43
  try {
22
- const tagsTobeFiltered = ['@profile', '@edition', '@beta', '@portal', '@additional_profile'];
23
- const filteredTags = tags.filter(tag => tagsTobeFiltered.some(prefix => tag.startsWith(prefix)));
24
- if (filteredTags && filteredTags.length > 0) {
25
- const portalInfo = getTagInputFromSelectedTags(filteredTags, '@portal');
26
- const betaFeature = getTagInputFromSelectedTags(filteredTags, '@beta');
27
- const profileInfo = getTagInputFromSelectedTags(filteredTags, '@profile');
28
- const editionInfo = getTagInputFromSelectedTags(filteredTags, '@edition');
29
- const mainActor = (0, _auth.getUserForSelectedEditionAndProfile)(editionInfo, profileInfo, betaFeature, portalInfo);
30
- const additionalActors = (0, _additionalProfiles.additionProfiles)(tags, editionInfo, betaFeature, portalInfo);
31
- return {
32
- main: mainActor,
33
- additional: additionalActors
34
- };
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;
35
53
  }
36
- return {
37
- main: (0, _auth.getDefaultActor)(),
38
- additional: {}
39
- };
54
+ return (0, _auth.getDefaultActor)();
40
55
  } catch (err) {
41
- _logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error while getting custom account details:', err);
56
+ _logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error while getting accounts details:', err);
42
57
  }
43
58
  }
@@ -102,6 +102,7 @@ const createSpecEntry = (rootDir, test, testResultsById) => ({
102
102
  ...(test.location && {
103
103
  snippet: formSnippet(test.location)
104
104
  }),
105
+ tags: test.tags,
105
106
  tests: [extractTestDetails(test, testResultsById)]
106
107
  });
107
108
  const extractTestDetails = (test, testResultsById) => {
@@ -112,7 +113,6 @@ const extractTestDetails = (test, testResultsById) => {
112
113
  expectedStatus: test.expectedStatus,
113
114
  timeout: test.timeout,
114
115
  retries: test.retries,
115
- tags: test.tags,
116
116
  results: testResultsById.get(key) ?? [],
117
117
  status: test.outcome()
118
118
  };
@@ -14,16 +14,14 @@ describe('executionContext', () => {
14
14
  profile: 'admin',
15
15
  email: 'xxx.x+uat@zohotest.com'
16
16
  };
17
- const mockActorInfo = {
18
- main: mockMainActorInfo,
19
- additional: {}
20
- };
21
- _customFixturesHelper.getCustomAccountDetails.mockReturnValue(mockActorInfo);
17
+ _customFixturesHelper.getCustomAccountDetails.mockReturnValue(mockMainActorInfo);
22
18
  const use = jest.fn();
23
19
  await _executionContext.default.executionContext({
24
20
  $tags: mockTags
25
21
  }, use);
26
22
  expect(_customFixturesHelper.getCustomAccountDetails).toHaveBeenCalledWith(mockTags);
27
- expect(use).toHaveBeenCalledWith(mockMainActorInfo);
23
+ expect(use).toHaveBeenCalledWith({
24
+ actorInfo: mockMainActorInfo
25
+ });
28
26
  });
29
27
  });
@@ -0,0 +1,38 @@
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
+ describe('additionalProfiles', () => {
20
+ beforeEach(() => {
21
+ jest.clearAllMocks();
22
+ });
23
+ test('should return empty object when no additional profile tags are present', () => {
24
+ const result = (0, _additionalProfiles.additionProfiles)(defaultTags);
25
+ expect(result).toEqual({});
26
+ });
27
+ test('should return empty object when additional profile tags are present but no editionInfo', () => {
28
+ const tags = ['@smoke', '@additional_profile_admin'];
29
+ const result = (0, _additionalProfiles.additionProfiles)(tags);
30
+ expect(result).toEqual({});
31
+ });
32
+ test('should return additional profile actors when additional profile tags and editionInfo are present', () => {
33
+ const mockBetaFeature = null;
34
+ const mockPortalInfo = null;
35
+ const result = (0, _additionalProfiles.additionProfiles)(editionTags, mockBetaFeature, mockPortalInfo);
36
+ expect(Object.keys(result)).toEqual(['manager', 'agent']);
37
+ });
38
+ });
@@ -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
+ });
@@ -4,35 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Logger = void 0;
7
- // const SUCCESS_TYPE = 'success';
8
- // const FAILURE_TYPE = 'failure';
9
- // const INFO_TYPE = 'info';
10
-
11
- // function logger() {
12
- // this.colors = {
13
- // 'success': ['\x1b[36m', '\x1b[0m'],
14
- // 'failure': ['\x1b[31m', '\x1b[0m'],
15
- // 'info': ['\x1b[33m', '\x1b[0m']
16
- // }
17
- // this.consoleLogger = console;
18
- // return {
19
- // SUCCESS_TYPE,
20
- // FAILURE_TYPE,
21
- // INFO_TYPE,
22
- // error: () => { },
23
- // info: () => { },
24
- // log: (type, message) => {
25
- // const color = this.colors[type];
26
- // console.log(type, color)
27
- // this.consoleLogger.log(`${color[0]}${message}${color[1]}`)
28
- // }
29
- // }
30
- // }
31
-
32
- // module.exports = {
33
- // Logger: logger()
34
- // }
35
-
36
7
  class LoggerImpl {
37
8
  constructor() {
38
9
  this.SUCCESS_TYPE = 'success';
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.4.88-n18-experimental",
3
+ "version": "0.4.90-n18-experimental",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@zohodesk/testinglibrary",
9
- "version": "0.4.88-n18-experimental",
9
+ "version": "0.4.90-n18-experimental",
10
10
  "hasInstallScript": true,
11
11
  "license": "ISC",
12
12
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.4.88-n18-experimental",
3
+ "version": "0.4.90-n18-experimental",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -8,7 +8,6 @@
8
8
  "test": "jest",
9
9
  "clean": "rm -rf build && mkdir build",
10
10
  "build-babel": "babel -d ./build ./src --copy-files",
11
- "copy-common": "cp -r src/common build/",
12
11
  "build": "npm run clean && npm run build-babel",
13
12
  "prepare": "npm run build",
14
13
  "lint": "eslint src/* --fix"
@@ -257,4 +257,4 @@ header {
257
257
  font-size: 1rem;
258
258
  padding: 0 0.5rem;
259
259
  }
260
- </style></head><body><div class="jesthtml-content"><header><h1 id="title">Unit Report</h1></header><div id="metadata-container"><div id="timestamp">Started: 2025-09-03 08:57:31</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed ">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (1)</div><div class="summary-passed ">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><input id="collapsible-0" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-0"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/buildInFixtures/__tests__/executionContext.test.js</div><div class="suite-time">0.851s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">executionContext</div><div class="test-title">should pass actorInfo with details from getCustomAccountDetails to use</div><div class="test-status">passed</div><div class="test-duration">0.004s</div></div></div></div></div></div></body></html>
260
+ </style></head><body><div class="jesthtml-content"><header><h1 id="title">Unit Report</h1></header><div id="metadata-container"><div id="timestamp">Started: 2025-09-15 18:30:25</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (12)</div><div class="summary-passed ">12 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (41)</div><div class="summary-passed ">41 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><input id="collapsible-0" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-0"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/__tests__/tagProcessor.test.js</div><div class="suite-time">1.141s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should return tagArgs if no edition is provided</div><div class="test-status">passed</div><div class="test-duration">0.004s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should handle a single edition with &lt;= operator</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should handle a single edition with &gt;= operator</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should handle a single edition with &lt; operator</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should handle a single edition with &gt; operator</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should handle a single edition with no operator</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should log a message if edition is not found</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should handle multiple editions</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">TagProcessor</div><div class="test-title">should build tags correctly when tags are empty</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div></div></div><div id="suite-2" class="suite-container"><input id="collapsible-1" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-1"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/customFixturesHelper.test.js</div><div class="suite-time">1.208s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">getCustomAccountDetails</div><div class="test-title">returns selected user when any tag info is present</div><div class="test-status">passed</div><div class="test-duration">0.013s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">getCustomAccountDetails</div><div class="test-title">logs and returns undefined if getCustomAccountDetails function throws</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">getCustomAccountDetails</div><div class="test-title">returns default actor when no tag info is not provided</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div></div></div><div id="suite-3" class="suite-container"><input id="collapsible-2" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-2"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/buildInFixtures/__tests__/executionContext.test.js</div><div class="suite-time">1.27s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">executionContext</div><div class="test-title">should pass actorInfo with details from getCustomAccountDetails to use</div><div class="test-status">passed</div><div class="test-duration">0.025s</div></div></div></div></div><div id="suite-4" class="suite-container"><input id="collapsible-3" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-3"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/getUsers_ListOfActors.test.js</div><div class="suite-time">0.299s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">getListOfActors</div><div class="test-title">throws an error when config file cannot be loaded</div><div class="test-status">passed</div><div class="test-duration">0.025s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">getListOfActors</div><div class="test-title">throws an error when beta feature config does not exist</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">getListOfActors</div><div class="test-title">loads main configuration when betaFeature is not provided and main config file exists</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">getListOfActors</div><div class="test-title">falls back to default configuration if main config file does not exist</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">getListOfActors</div><div class="test-title">loads beta feature configuration when betaFeature is provided</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div></div></div><div id="suite-5" class="suite-container"><input id="collapsible-4" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-4"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/additionalProfiles.test.js</div><div class="suite-time">0.171s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">additionalProfiles</div><div class="test-title">should return empty object when no additional profile tags are present</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">additionalProfiles</div><div class="test-title">should return empty object when additional profile tags are present but no editionInfo</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">additionalProfiles</div><div class="test-title">should return additional profile actors when additional profile tags and editionInfo are present</div><div class="test-status">passed</div><div class="test-duration">0.003s</div></div></div></div></div><div id="suite-6" class="suite-container"><input id="collapsible-5" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-5"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js</div><div class="suite-time">0.246s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">getUATFileName</div><div class="test-title">return the pipeline matched config files for pipeline matched files exists</div><div class="test-status">passed</div><div class="test-duration">0.004s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">getUATFileName</div><div class="test-title">return the default config files for pipeline matched files not exists</div><div class="test-status">passed</div><div class="test-duration">0.005s</div></div></div></div></div><div id="suite-7" class="suite-container"><input id="collapsible-6" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-6"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/examples/src/__tests__/App.test.js</div><div class="suite-time">0.168s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">example functions</div><div class="test-title">add function adds two numbers correctly</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">example functions</div><div class="test-title">greet function greets a person with their name</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div></div></div><div id="suite-8" class="suite-container"><input id="collapsible-7" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-7"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/configuration/__tests__/Configuration.test.js</div><div class="suite-time">0.174s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">Configuration Class</div><div class="test-title">should add new key-value pair to the configuration</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">Configuration Class</div><div class="test-title">should combine configurations correctly using addAll</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">Configuration Class</div><div class="test-title">should return correct value for a given key</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div></div></div><div id="suite-9" class="suite-container"><input id="collapsible-8" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-8"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/runner/__tests__/RunnerHelper.test.js</div><div class="suite-time">1.871s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">RunnerHelper &gt; createRunner</div><div class="test-title">should throw error on invalid runner type</div><div class="test-status">passed</div><div class="test-duration">0.004s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">RunnerHelper &gt; createRunner</div><div class="test-title">should create a valid runner class</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div></div></div><div id="suite-10" class="suite-container"><input id="collapsible-9" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-9"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/runner/__tests__/SpawnRunner.test.js</div><div class="suite-time">1.912s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">SpawnRunner &gt; run</div><div class="test-title">should call runPreprocessing when bddMode is true</div><div class="test-status">passed</div><div class="test-duration">0.004s</div></div></div></div></div><div id="suite-11" class="suite-container"><input id="collapsible-10" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-10"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/__tests__/validateFeature.test.js</div><div class="suite-time">1.941s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">validateFeatureFiles</div><div class="test-title">runPreprocessing with correct arguments and log success</div><div class="test-status">passed</div><div class="test-duration">0.006s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">validateFeatureFiles</div><div class="test-title">runPreprocessing with playwright conf</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">validateFeatureFiles</div><div class="test-title">error when runPreprocessing fails</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div></div></div><div id="suite-12" class="suite-container"><input id="collapsible-11" type="checkbox" class="toggle" checked="checked"/><label for="collapsible-11"><div class="suite-info"><div class="suite-path">/Users/muthu-19817/git/testing-framework/src/test/core/playwright/helpers/__tests__/fileMutex.test.js</div><div class="suite-time">2.22s</div></div></label><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename">FileMutex &gt; acquire</div><div class="test-title">should create the lock file if it does not exist</div><div class="test-status">passed</div><div class="test-duration">0.038s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">FileMutex &gt; acquire</div><div class="test-title">should wait for lock file deletion if it exists</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">FileMutex &gt; acquire</div><div class="test-title">should reject if watch timeout exceeds</div><div class="test-status">passed</div><div class="test-duration">1.038s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">FileMutex &gt; release</div><div class="test-title">should delete the lock file if it exists</div><div class="test-status">passed</div><div class="test-duration">0.002s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">FileMutex &gt; release</div><div class="test-title">should release lock by deleting lock file</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">FileMutex &gt; release</div><div class="test-title">should not attempt to delete the lock file if it does not exist</div><div class="test-status">passed</div><div class="test-duration">0s</div></div></div><div class="test-result passed"><div class="test-info"><div class="test-suitename">FileMutex &gt; release</div><div class="test-title">should log an error if deleting the lock file fails</div><div class="test-status">passed</div><div class="test-duration">0.008s</div></div></div></div></div></div></body></html>