@zohodesk/testinglibrary 4.1.4 → 4.1.6

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 (24) hide show
  1. package/README.md +8 -0
  2. package/build/common/data-generator/steps/DataGenerator.spec.js +5 -5
  3. package/build/common/data-generator/steps/DataGeneratorStepsHelper.js +2 -2
  4. package/build/core/dataGenerator/DataGenerator.js +9 -4
  5. package/build/core/dataGenerator/DataGeneratorError.js +12 -2
  6. package/build/core/dataGenerator/authenticator/Authenticator.js +37 -0
  7. package/build/core/dataGenerator/authenticator/CookieAuthenticator.js +48 -0
  8. package/build/core/dataGenerator/authenticator/JWTauthenticator.js +64 -0
  9. package/build/core/dataGenerator/authenticator/OAuthAuthenticator.js +26 -0
  10. package/build/core/dataGenerator/authenticator/OrgOAuthAuthenticator.js +26 -0
  11. package/build/core/dataGenerator/authenticator/cookieAuthConfig.js +11 -0
  12. package/build/core/playwright/readConfigFile.js +2 -0
  13. package/build/core/playwright/setup/ProjectConfiguration.js +3 -1
  14. package/build/core/playwright/types.js +1 -0
  15. package/build/setup-folder-structure/samples/uat-config-sample.js +2 -0
  16. package/build/test/core/dataGenerator/authenticator/__tests__/Authenticator.test.js +88 -0
  17. package/build/test/core/dataGenerator/authenticator/__tests__/JWTauthenticator.test.js +129 -0
  18. package/build/test/core/dataGenerator/authenticator/__tests__/OAuthAuthenticator.test.js +39 -0
  19. package/build/test/core/dataGenerator/authenticator/__tests__/OrgOAuthAuthenticator.test.js +39 -0
  20. package/build/test/core/playwright/__tests__/validateFeature.test.js +4 -1
  21. package/build/test/core/playwright/runner/__tests__/RunnerHelper.test.js +3 -0
  22. package/build/test/core/playwright/runner/__tests__/SpawnRunner.test.js +3 -0
  23. package/npm-shrinkwrap.json +63 -63
  24. package/package.json +1 -1
package/README.md CHANGED
@@ -17,6 +17,14 @@
17
17
 
18
18
  - npm run report
19
19
 
20
+
21
+ ### v4.1.5/v3.3.3 - 19-06-2026
22
+
23
+ #### Refactor
24
+ - Authenticator module refactored to use static imports instead of dynamic imports
25
+ - Removed unnecessary `extends Authenticator` from concrete authenticator classes (`JWTauthenticator`, `OAuthAuthenticator`, `OrgOAuthAuthenticator`, `CookieAuthenticator`) to eliminate circular dependency
26
+ - Unit test cases updated to align with actual source behavior
27
+
20
28
  ### v4.1.4/v3.3.3 - 18-06-2026
21
29
 
22
30
  #### Bugfix
@@ -4,16 +4,16 @@ import { generateAndCacheTestData } from './DataGeneratorStepsHelper';
4
4
  const { Given } = createBdd();
5
5
 
6
6
  Given('generate a {string} entity {string} with generator {string}', async ({ page, context, i18N, cacheLayer, executionContext}, module, entityName, generatorName, dataTable) => {
7
- await generateAndCacheTestData(executionContext, "template", generatorName, dataTable, cacheLayer, entityName);
7
+ await generateAndCacheTestData({ executionContext, type: "template", identifier: generatorName, dataTable, cacheLayer, entityName, page });
8
8
  });
9
9
 
10
10
  Given('generate a {string} entity {string} with API {string}', async ({ page, context, i18N, cacheLayer, executionContext}, module, entityName, operationId, dataTable) => {
11
- await generateAndCacheTestData(executionContext, "API", operationId, dataTable, cacheLayer, entityName);
11
+ await generateAndCacheTestData({ executionContext, type: "API", identifier: operationId, dataTable, cacheLayer, entityName, page });
12
12
  });
13
13
  Given('generate a {string} entity {string} with generator {string} using {string} profile', async ({ page, context, i18N, cacheLayer, executionContext}, module, entityName, generatorName, profile, dataTable) => {
14
- await generateAndCacheTestData(executionContext, "template", generatorName, dataTable, cacheLayer, entityName, profile);
14
+ await generateAndCacheTestData({ executionContext, type: "template", identifier: generatorName, dataTable, cacheLayer, entityName, profile, page });
15
15
  });
16
16
 
17
17
  Given('generate a {string} entity {string} with API {string} using {string} profile', async ({ page, context, i18N, cacheLayer, executionContext}, module, entityName, operationId, profile, dataTable) => {
18
- await generateAndCacheTestData(executionContext, "API", operationId, dataTable, cacheLayer, entityName, profile);
19
- });
18
+ await generateAndCacheTestData({ executionContext, type: "API", identifier: operationId, dataTable, cacheLayer, entityName, profile, page });
19
+ });
@@ -4,7 +4,7 @@ import DataGenerator from '@zohodesk/testinglibrary/DataGenerator';
4
4
 
5
5
  const dataGenerator = new DataGenerator();
6
6
 
7
- export async function generateAndCacheTestData(executionContext, type, identifier, dataTable, cacheLayer, entityName, profile = null) {
7
+ export async function generateAndCacheTestData({ executionContext, type, identifier, dataTable, cacheLayer, entityName, profile = null, page = null }) {
8
8
  let actorInfo;
9
9
  const testInfo = test.info();
10
10
  const scenarioName = testInfo.title.split('/').pop() || 'Unknown Scenario';
@@ -16,6 +16,6 @@ export async function generateAndCacheTestData(executionContext, type, identifie
16
16
  actorInfo = executionContext.actorInfo;
17
17
  }
18
18
 
19
- const generatedData = await dataGenerator.generate(testInfo, actorInfo, type, identifier, scenarioName, dataTable ? dataTable.hashes() : []);
19
+ const generatedData = await dataGenerator.generate(testInfo, actorInfo, type, identifier, scenarioName, dataTable ? dataTable.hashes() : [], page);
20
20
  await cacheLayer.set(entityName, generatedData.data);
21
21
  }
@@ -9,6 +9,7 @@ var _path = _interopRequireDefault(require("path"));
9
9
  var _fs = _interopRequireDefault(require("fs"));
10
10
  var _logger = require("../../utils/logger");
11
11
  var _DataGeneratorHelper = require("./DataGeneratorHelper");
12
+ var _Authenticator = _interopRequireDefault(require("./authenticator/Authenticator.js"));
12
13
  var _helpers = require("@zohodesk/testinglibrary/helpers");
13
14
  var _DataGeneratorError = require("./DataGeneratorError");
14
15
  function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
@@ -19,7 +20,7 @@ class DataGenerator {
19
20
  constructor() {
20
21
  _classPrivateMethodInitSpec(this, _DataGenerator_brand);
21
22
  }
22
- async generate(testInfo, actorInfo, generatorType, generatorName, scenarioName, dataTable) {
23
+ async generate(testInfo, actorInfo, generatorType, generatorName, scenarioName, dataTable, page = null) {
23
24
  try {
24
25
  let generators;
25
26
  if (generatorType === 'API') {
@@ -28,7 +29,7 @@ class DataGenerator {
28
29
  generators = await _assertClassBrand(_DataGenerator_brand, this, _getGenerator).call(this, testInfo, generatorName);
29
30
  }
30
31
  const processedGenerators = await (0, _DataGeneratorHelper.processGenerator)(generators, dataTable);
31
- const apiPayload = await _assertClassBrand(_DataGenerator_brand, this, _constructApiPayload).call(this, scenarioName, processedGenerators, actorInfo);
32
+ const apiPayload = await _assertClassBrand(_DataGenerator_brand, this, _constructApiPayload).call(this, scenarioName, processedGenerators, actorInfo, page);
32
33
  const response = await (0, _DataGeneratorHelper.makeRequest)(process.env.DG_SERVICE_DOMAIN + process.env.DG_SERVICE_API_PATH, apiPayload);
33
34
  _logger.Logger.log(_logger.Logger.INFO_TYPE, `Generated response for the generator: ${generatorName} for scenario: ${scenarioName}, Response: ${JSON.stringify(response)}`);
34
35
  return response;
@@ -72,12 +73,12 @@ async function _generateAPIGenerator(operationId) {
72
73
  name: operationId
73
74
  }];
74
75
  }
75
- async function _constructApiPayload(scenarioName, processedGenerators, actorInfo) {
76
+ async function _constructApiPayload(scenarioName, processedGenerators, actorInfo, page = null) {
76
77
  const dataGeneratorObj = actorInfo['data-generator'];
77
78
  if (!dataGeneratorObj) {
78
79
  throw new _DataGeneratorError.DataGeneratorConfigurationError(`Data Generator configuration is missing for the profile: ${actorInfo['profile']}`);
79
80
  }
80
- const apiPayload = {
81
+ let apiPayload = {
81
82
  scenario_name: scenarioName,
82
83
  data_generation_templates: processedGenerators,
83
84
  ...dataGeneratorObj
@@ -94,6 +95,10 @@ async function _constructApiPayload(scenarioName, processedGenerators, actorInfo
94
95
  environmentDetails.host = domainUrl.origin;
95
96
  }
96
97
  apiPayload.environmentDetails = environmentDetails;
98
+
99
+ // Only perform auth augmentation via Authenticator
100
+ apiPayload = await new _Authenticator.default().constructPayload(apiPayload, actorInfo, page);
101
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, `Final API Payload after authentication augmentation: ${JSON.stringify(apiPayload)}`);
97
102
  return apiPayload;
98
103
  }
99
104
  var _default = exports.default = DataGenerator;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.GeneratorError = exports.DataGeneratorError = exports.DataGeneratorConfigurationError = void 0;
6
+ exports.GeneratorError = exports.DataGeneratorError = exports.DataGeneratorConfigurationError = exports.AuthenticationError = void 0;
7
7
  class DataGeneratorError extends Error {
8
8
  constructor(message) {
9
9
  super(message);
@@ -47,4 +47,14 @@ class GeneratorError extends DataGeneratorError {
47
47
  }
48
48
  }
49
49
  }
50
- exports.GeneratorError = GeneratorError;
50
+ exports.GeneratorError = GeneratorError;
51
+ class AuthenticationError extends DataGeneratorError {
52
+ constructor(message) {
53
+ super(message);
54
+ this.name = 'AuthenticationError';
55
+ if (Error.captureStackTrace) {
56
+ Error.captureStackTrace(this, AuthenticationError);
57
+ }
58
+ }
59
+ }
60
+ exports.AuthenticationError = AuthenticationError;
@@ -0,0 +1,37 @@
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 _DataGeneratorError = require("../DataGeneratorError.js");
9
+ var _JWTauthenticator = _interopRequireDefault(require("./JWTauthenticator.js"));
10
+ var _OAuthAuthenticator = _interopRequireDefault(require("./OAuthAuthenticator.js"));
11
+ var _OrgOAuthAuthenticator = _interopRequireDefault(require("./OrgOAuthAuthenticator.js"));
12
+ var _CookieAuthenticator = _interopRequireDefault(require("./CookieAuthenticator.js"));
13
+ class Authenticator {
14
+ // Only route authentication augmentations; do not modify environment or base payload here.
15
+ async constructPayload(apiPayload, actorInfo, page = null) {
16
+ var _actorInfo$dataGener;
17
+ const authenticationLoaders = {
18
+ 'jwt-auth': () => new _JWTauthenticator.default(),
19
+ 'oauth2': () => new _OAuthAuthenticator.default(),
20
+ 'org-oauth': () => new _OrgOAuthAuthenticator.default(),
21
+ 'cookie-auth': () => new _CookieAuthenticator.default()
22
+ };
23
+ const authentications = (actorInfo === null || actorInfo === void 0 || (_actorInfo$dataGener = actorInfo['data-generator']) === null || _actorInfo$dataGener === void 0 || (_actorInfo$dataGener = _actorInfo$dataGener.account) === null || _actorInfo$dataGener === void 0 ? void 0 : _actorInfo$dataGener.authentications) || [];
24
+ const authenticationTypes = authentications.map(auth => String(auth).toLowerCase()).filter(Boolean);
25
+ for (const authenticationType of authenticationTypes) {
26
+ const authenticatorLoader = authenticationLoaders[authenticationType];
27
+ if (!authenticatorLoader) {
28
+ throw new _DataGeneratorError.AuthenticationError(`Unknown authentication type: "${authenticationType}". Supported types are: ${Object.keys(authenticationLoaders).join(', ')}`);
29
+ }
30
+ const authenticatorInstance = await authenticatorLoader();
31
+ apiPayload = await authenticatorInstance.constructPayload(apiPayload, actorInfo, page);
32
+ break;
33
+ }
34
+ return apiPayload;
35
+ }
36
+ }
37
+ exports.default = Authenticator;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _cookieAuthConfig = require("./cookieAuthConfig.js");
8
+ var _DataGeneratorError = require("../DataGeneratorError.js");
9
+ /**
10
+ * CookieAuthenticator prepares the payload for cookie-based authentication.
11
+ * It extracts cookies from the browser page context and attaches them
12
+ * as cookieAuthHeaders in the account block for the data generator service.
13
+ */
14
+ class CookieAuthenticator {
15
+ async constructPayload(apiPayload, actorInfo, page = null) {
16
+ if (!page) {
17
+ throw new _DataGeneratorError.AuthenticationError('Cookie authentication failed: "page" is required but was not provided');
18
+ }
19
+ const {
20
+ csrfHeaderName
21
+ } = _cookieAuthConfig.COOKIE_AUTH_CONFIG;
22
+ const {
23
+ csrfToken,
24
+ cookieString
25
+ } = await _getCookies.call(CookieAuthenticator, page);
26
+ apiPayload.account.authHeaders = {
27
+ Cookie: cookieString,
28
+ [csrfHeaderName]: csrfToken
29
+ };
30
+ return apiPayload;
31
+ }
32
+ }
33
+ async function _getCookies(page) {
34
+ const {
35
+ csrfCookieName,
36
+ csrfParamName
37
+ } = _cookieAuthConfig.COOKIE_AUTH_CONFIG;
38
+ const context = page.context();
39
+ const pageUrl = new URL(page.url());
40
+ const currentDomain = pageUrl.hostname;
41
+ const cookies = await context.cookies([page.url()]);
42
+ const csrfCookies = cookies.filter(cookie => cookie.domain.includes(currentDomain) && cookie.name === csrfCookieName);
43
+ return {
44
+ csrfToken: csrfCookies.map(c => `${csrfParamName}=${c.value}`).join('; '),
45
+ cookieString: cookies.map(c => `${c.name}=${c.value}`).join('; ')
46
+ };
47
+ }
48
+ var _default = exports.default = CookieAuthenticator;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _DataGeneratorError = require("../DataGeneratorError.js");
8
+ /**
9
+ * JWTauthenticator constructs payload by fetching a JWT access token
10
+ * from the authenticator app and attaching it to the account.jwt config.
11
+ */
12
+ class JWTauthenticator {
13
+ async constructPayload(apiPayload, actorInfo) {
14
+ const account = actorInfo['data-generator'].account;
15
+ if (!account) {
16
+ throw new _DataGeneratorError.AuthenticationError('JWT authentication failed: "account" is missing in actor configuration');
17
+ }
18
+ const jwtConf = account['jwt-oauth'];
19
+ if (!jwtConf) {
20
+ throw new _DataGeneratorError.AuthenticationError('JWT authentication failed: "jwt-oauth" is missing in actor configuration');
21
+ }
22
+
23
+ // Build payload for authenticator service
24
+ const userToken = encodeURIComponent((actorInfo === null || actorInfo === void 0 ? void 0 : actorInfo.email) || '');
25
+ const jwtAuthUrl = process.env.DG_JWT_AUTH_URL;
26
+ const responseType = jwtConf.response_type;
27
+ const clientId = jwtConf.client_id;
28
+ const tokenUrl = jwtConf.token_url;
29
+ const domainUrl = process.env.DG_DOMAIN_URL;
30
+ const authPayload = {
31
+ user_token: userToken,
32
+ jwt_secret: jwtConf.jwt_secret,
33
+ jwt_auth_url: jwtAuthUrl,
34
+ response_type: responseType,
35
+ client_id: clientId,
36
+ token_url: tokenUrl,
37
+ domain_url: domainUrl
38
+ };
39
+ const authenticatorApi = process.env.DG_JWT_AUTHENTICATOR_API;
40
+ const resp = await fetch(authenticatorApi, {
41
+ method: 'POST',
42
+ headers: {
43
+ 'Content-Type': 'application/json'
44
+ },
45
+ body: JSON.stringify(authPayload)
46
+ });
47
+ if (!resp.ok) {
48
+ const errorBody = await resp.text();
49
+ throw new Error(`JWT authenticator error! status: ${resp.status}, body: ${errorBody}`);
50
+ }
51
+ const json = await resp.json();
52
+ const accessToken = json === null || json === void 0 ? void 0 : json.access_token;
53
+ if (!accessToken) {
54
+ throw new Error('JWT authenticator did not return access_token');
55
+ }
56
+
57
+ // Attach access token to authHeaders so downstream API calls can use it directly
58
+ apiPayload.account = apiPayload.account || {};
59
+ apiPayload.account.authHeaders = apiPayload.account.authHeaders || {};
60
+ apiPayload.account.authHeaders.Authorization = `Zoho-oauthtoken ${accessToken}`;
61
+ return apiPayload;
62
+ }
63
+ }
64
+ var _default = exports.default = JWTauthenticator;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _DataGeneratorError = require("../DataGeneratorError.js");
8
+ /**
9
+ * OAuthAuthenticator prepares the payload for OAuth2-based authentication.
10
+ * It ensures oauth2 config is present in the account block so the
11
+ * data generator service can use it.
12
+ */
13
+ class OAuthAuthenticator {
14
+ async constructPayload(apiPayload, actorInfo) {
15
+ const account = actorInfo['data-generator'].account;
16
+ if (!account) {
17
+ throw new _DataGeneratorError.AuthenticationError('OAuth2 authentication failed: "account" is missing in actor configuration');
18
+ }
19
+ if (!account.oauth2) {
20
+ throw new _DataGeneratorError.AuthenticationError('OAuth2 authentication failed: "oauth2" is missing in actor configuration');
21
+ }
22
+ apiPayload.account.oauth2 = account.oauth2;
23
+ return apiPayload;
24
+ }
25
+ }
26
+ var _default = exports.default = OAuthAuthenticator;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _DataGeneratorError = require("../DataGeneratorError.js");
8
+ /**
9
+ * OrgOAuthAuthenticator prepares the payload for org_oauth authentication.
10
+ * It ensures org_oauth config is present in the account block so the
11
+ * data generator service can use it.
12
+ */
13
+ class OrgOAuthAuthenticator {
14
+ async constructPayload(apiPayload, actorInfo) {
15
+ const account = actorInfo['data-generator'].account;
16
+ if (!account) {
17
+ throw new _DataGeneratorError.AuthenticationError('OrgOAuth authentication failed: "account" is missing in actor configuration');
18
+ }
19
+ if (!account.org_oauth) {
20
+ throw new _DataGeneratorError.AuthenticationError('OrgOAuth authentication failed: "org_oauth" is missing in actor configuration');
21
+ }
22
+ apiPayload.account.org_oauth = account.org_oauth;
23
+ return apiPayload;
24
+ }
25
+ }
26
+ var _default = exports.default = OrgOAuthAuthenticator;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.COOKIE_AUTH_CONFIG = void 0;
7
+ const COOKIE_AUTH_CONFIG = exports.COOKIE_AUTH_CONFIG = {
8
+ csrfHeaderName: 'X-ZCSRF-TOKEN',
9
+ csrfCookieName: 'crmcsr',
10
+ csrfParamName: 'crmcsrfparam'
11
+ };
@@ -37,6 +37,7 @@ function getDefaultConfig() {
37
37
  forbidOnly: false,
38
38
  retries: 0,
39
39
  trace: false,
40
+ smokeTestTrace: 'on',
40
41
  video: false,
41
42
  isAuthMode: false,
42
43
  openReportOn: 'never',
@@ -96,6 +97,7 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
96
97
  * @property {string} uatDirectory - Directory in which uat configuration is places.
97
98
  * @property {string} headless - Headless Browsers mode.
98
99
  * @property {number} trace - trace for test cases.
100
+ * @property {string} smokeTestTrace - trace mode for the smokeTest project (e.g. 'on', 'off', 'retain-on-failure'). Default is 'on'.
99
101
  * @property {boolean} video - video for test cases,
100
102
  * @property {boolean} debug - debug mode
101
103
  * @property {boolean} isAuthMode - Auth Mode. config whether authentication step needed before running test cases
@@ -21,6 +21,7 @@ const {
21
21
  bddMode,
22
22
  authFilePath,
23
23
  trace,
24
+ smokeTestTrace,
24
25
  video,
25
26
  testIdAttribute,
26
27
  viewport,
@@ -44,7 +45,8 @@ function smokeTestConfig() {
44
45
  uatPath: _path.default.join(process.cwd(), _configConstants.default.TEST_SLICE_FOLDER, stage, 'smokeTest')
45
46
  });
46
47
  const commonConfig = {
47
- storageState: isAuthMode ? (0, _readConfigFile.getAuthFilePath)(_path.default.resolve(process.cwd(), authFilePath)) : {}
48
+ storageState: isAuthMode ? (0, _readConfigFile.getAuthFilePath)(_path.default.resolve(process.cwd(), authFilePath)) : {},
49
+ trace: smokeTestTrace
48
50
  };
49
51
  smokeTestProject.setTestDir(smokeTestDir);
50
52
  smokeTestProject.setRetries(0);
@@ -21,6 +21,7 @@
21
21
  * @property {string} uatDirectory - Directory in which uat configuration is places.
22
22
  * @property {string} headless - Headless Browsers mode.
23
23
  * @property {number} trace - trace for test cases.
24
+ * @property {string} smokeTestTrace - trace mode for the smokeTest project (e.g. 'on', 'off', 'retain-on-failure'). Default is 'on'.
24
25
  * @property {boolean} video - video for test cases,
25
26
  * @property {boolean} debug - debug mode
26
27
  * @property {string} mode: mode in which the test cases needs to run
@@ -9,6 +9,7 @@ const testSetup = require('../../fixtures/testSetup');
9
9
  * @typedef {Object} UserConfig
10
10
  * @property {string} headless - Headless Browsers mode.
11
11
  * @property {number} trace - trace for test cases.
12
+ * @property {string} smokeTestTrace - trace mode for the smokeTest project (e.g. 'on', 'off', 'retain-on-failure'). Default is 'on'.
12
13
  * @property {boolean} video - video for test cases,
13
14
  * @property {boolean} debug - debug mode
14
15
  * @property {string} mode: mode in which the test cases needs to run
@@ -37,6 +38,7 @@ module.exports = {
37
38
  isAuthMode: true,
38
39
  authFilePath: 'uat/playwright/.auth/user.json',
39
40
  trace: true,
41
+ smokeTestTrace: 'on',
40
42
  video: true,
41
43
  bddMode: true,
42
44
  featureFilesFolder: 'feature-files',
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _Authenticator = _interopRequireDefault(require("../../../../../../src/core/dataGenerator/authenticator/Authenticator"));
5
+ describe('Authenticator', () => {
6
+ it('should throw an error when an unknown authentication type is present', async () => {
7
+ const authenticator = new _Authenticator.default();
8
+ const apiPayload = {
9
+ account: {
10
+ name: 'sample'
11
+ }
12
+ };
13
+ const actorInfo = {
14
+ 'data-generator': {
15
+ account: {
16
+ authentications: ['apikey', 'basic']
17
+ }
18
+ }
19
+ };
20
+ await expect(authenticator.constructPayload(apiPayload, actorInfo)).rejects.toThrow('Unknown authentication type: "apikey"');
21
+ });
22
+ it('should route oauth2 authentication and merge oauth2 config into payload', async () => {
23
+ const authenticator = new _Authenticator.default();
24
+ const apiPayload = {
25
+ account: {}
26
+ };
27
+ const actorInfo = {
28
+ 'data-generator': {
29
+ account: {
30
+ authentications: ['oauth2'],
31
+ oauth2: {
32
+ client_id: 'client_1',
33
+ client_secret: 'secret_1'
34
+ }
35
+ }
36
+ }
37
+ };
38
+ const result = await authenticator.constructPayload(apiPayload, actorInfo);
39
+ expect(result.account.oauth2).toEqual({
40
+ client_id: 'client_1',
41
+ client_secret: 'secret_1'
42
+ });
43
+ });
44
+ it('should treat authentication values case-insensitively and deduplicate them', async () => {
45
+ const authenticator = new _Authenticator.default();
46
+ const apiPayload = {
47
+ account: {}
48
+ };
49
+ const actorInfo = {
50
+ 'data-generator': {
51
+ account: {
52
+ authentications: ['OAUTH2', 'oauth2', 'OAuth2'],
53
+ oauth2: {
54
+ scope: 'read'
55
+ }
56
+ }
57
+ }
58
+ };
59
+ const result = await authenticator.constructPayload(apiPayload, actorInfo);
60
+ expect(result.account.oauth2).toEqual({
61
+ scope: 'read'
62
+ });
63
+ });
64
+ it('should apply only the first supported authentication type', async () => {
65
+ const authenticator = new _Authenticator.default();
66
+ const apiPayload = {
67
+ account: {}
68
+ };
69
+ const actorInfo = {
70
+ 'data-generator': {
71
+ account: {
72
+ authentications: ['oauth2', 'org-oauth'],
73
+ oauth2: {
74
+ client_id: 'oauth-client'
75
+ },
76
+ org_oauth: {
77
+ org_id: 'org-101'
78
+ }
79
+ }
80
+ }
81
+ };
82
+ const result = await authenticator.constructPayload(apiPayload, actorInfo);
83
+ expect(result.account.oauth2).toEqual({
84
+ client_id: 'oauth-client'
85
+ });
86
+ expect(result.account.org_oauth).toBeUndefined();
87
+ });
88
+ });
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _JWTauthenticator = _interopRequireDefault(require("../../../../../../src/core/dataGenerator/authenticator/JWTauthenticator"));
5
+ describe('JWTauthenticator', () => {
6
+ let fetchMock;
7
+ beforeEach(() => {
8
+ fetchMock = jest.fn();
9
+ global.fetch = fetchMock;
10
+ process.env.DG_JWT_AUTH_URL = 'https://jwt-auth.example.com';
11
+ process.env.DG_DOMAIN_URL = 'https://domain.example.com';
12
+ process.env.DG_JWT_AUTHENTICATOR_API = 'https://authenticator.example.com/jwtToken';
13
+ });
14
+ afterEach(() => {
15
+ delete global.fetch;
16
+ delete process.env.DG_JWT_AUTH_URL;
17
+ delete process.env.DG_DOMAIN_URL;
18
+ delete process.env.DG_JWT_AUTHENTICATOR_API;
19
+ });
20
+ it('should throw when jwt-oauth config is missing', async () => {
21
+ const jwtAuthenticator = new _JWTauthenticator.default();
22
+ const apiPayload = {
23
+ account: {}
24
+ };
25
+ const actorInfo = {
26
+ email: 'user@example.com',
27
+ 'data-generator': {
28
+ account: {}
29
+ }
30
+ };
31
+ await expect(jwtAuthenticator.constructPayload(apiPayload, actorInfo)).rejects.toThrow('JWT authentication failed: "jwt-oauth" is missing in actor configuration');
32
+ expect(fetchMock).not.toHaveBeenCalled();
33
+ });
34
+ it('should fetch jwt access token and set it in authHeaders', async () => {
35
+ fetchMock.mockResolvedValue({
36
+ ok: true,
37
+ json: async () => ({
38
+ access_token: 'access-token-123'
39
+ })
40
+ });
41
+ const jwtAuthenticator = new _JWTauthenticator.default();
42
+ const apiPayload = {
43
+ account: {}
44
+ };
45
+ const actorInfo = {
46
+ email: 'user.one@example.com',
47
+ 'data-generator': {
48
+ account: {
49
+ 'jwt-oauth': {
50
+ jwt_secret: 'jwt-secret',
51
+ response_type: 'token',
52
+ client_id: '12345.client-id',
53
+ token_url: 'https://token.example.com/12345/oauth'
54
+ }
55
+ }
56
+ }
57
+ };
58
+ const result = await jwtAuthenticator.constructPayload(apiPayload, actorInfo);
59
+ expect(fetchMock).toHaveBeenCalledTimes(1);
60
+ expect(fetchMock).toHaveBeenCalledWith('https://authenticator.example.com/jwtToken', expect.objectContaining({
61
+ method: 'POST',
62
+ headers: {
63
+ 'Content-Type': 'application/json'
64
+ }
65
+ }));
66
+ const requestBody = JSON.parse(fetchMock.mock.calls[0][1].body);
67
+ expect(requestBody).toEqual(expect.objectContaining({
68
+ user_token: encodeURIComponent('user.one@example.com'),
69
+ jwt_secret: 'jwt-secret',
70
+ jwt_auth_url: 'https://jwt-auth.example.com',
71
+ response_type: 'token',
72
+ client_id: '12345.client-id',
73
+ token_url: 'https://token.example.com/12345/oauth',
74
+ domain_url: 'https://domain.example.com'
75
+ }));
76
+ expect(result.account.authHeaders.Authorization).toBe('Zoho-oauthtoken access-token-123');
77
+ });
78
+ it('should throw a descriptive error when authenticator API returns non-ok response', async () => {
79
+ fetchMock.mockResolvedValue({
80
+ ok: false,
81
+ status: 500,
82
+ text: async () => 'internal error'
83
+ });
84
+ const jwtAuthenticator = new _JWTauthenticator.default();
85
+ const apiPayload = {
86
+ account: {}
87
+ };
88
+ const actorInfo = {
89
+ email: 'user@example.com',
90
+ 'data-generator': {
91
+ account: {
92
+ 'jwt-oauth': {
93
+ jwt_secret: 'jwt-secret',
94
+ response_type: 'token',
95
+ client_id: '12345.client-id',
96
+ token_url: 'https://token.example.com/12345/oauth'
97
+ }
98
+ }
99
+ }
100
+ };
101
+ await expect(jwtAuthenticator.constructPayload(apiPayload, actorInfo)).rejects.toThrow('JWT authenticator error! status: 500, body: internal error');
102
+ });
103
+ it('should throw when authenticator response has no access_token', async () => {
104
+ fetchMock.mockResolvedValue({
105
+ ok: true,
106
+ json: async () => ({
107
+ token_type: 'Bearer'
108
+ })
109
+ });
110
+ const jwtAuthenticator = new _JWTauthenticator.default();
111
+ const apiPayload = {
112
+ account: {}
113
+ };
114
+ const actorInfo = {
115
+ email: 'user@example.com',
116
+ 'data-generator': {
117
+ account: {
118
+ 'jwt-oauth': {
119
+ jwt_secret: 'jwt-secret',
120
+ response_type: 'token',
121
+ client_id: '12345.client-id',
122
+ token_url: 'https://token.example.com/12345/oauth'
123
+ }
124
+ }
125
+ }
126
+ };
127
+ await expect(jwtAuthenticator.constructPayload(apiPayload, actorInfo)).rejects.toThrow('JWT authenticator did not return access_token');
128
+ });
129
+ });
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _OAuthAuthenticator = _interopRequireDefault(require("../../../../../../src/core/dataGenerator/authenticator/OAuthAuthenticator"));
5
+ describe('OAuthAuthenticator', () => {
6
+ it('should assign oauth2 from actor info into payload account', async () => {
7
+ const oauthAuthenticator = new _OAuthAuthenticator.default();
8
+ const apiPayload = {
9
+ account: {}
10
+ };
11
+ const actorInfo = {
12
+ 'data-generator': {
13
+ account: {
14
+ oauth2: {
15
+ client_id: 'new-client',
16
+ scope: 'tickets.read'
17
+ }
18
+ }
19
+ }
20
+ };
21
+ const result = await oauthAuthenticator.constructPayload(apiPayload, actorInfo);
22
+ expect(result.account.oauth2).toEqual({
23
+ client_id: 'new-client',
24
+ scope: 'tickets.read'
25
+ });
26
+ });
27
+ it('should throw when oauth2 is absent in actor configuration', async () => {
28
+ const oauthAuthenticator = new _OAuthAuthenticator.default();
29
+ const apiPayload = {
30
+ account: {}
31
+ };
32
+ const actorInfo = {
33
+ 'data-generator': {
34
+ account: {}
35
+ }
36
+ };
37
+ await expect(oauthAuthenticator.constructPayload(apiPayload, actorInfo)).rejects.toThrow('OAuth2 authentication failed: "oauth2" is missing in actor configuration');
38
+ });
39
+ });
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _OrgOAuthAuthenticator = _interopRequireDefault(require("../../../../../../src/core/dataGenerator/authenticator/OrgOAuthAuthenticator"));
5
+ describe('OrgOAuthAuthenticator', () => {
6
+ it('should assign org_oauth from actor info into payload account', async () => {
7
+ const orgOAuthAuthenticator = new _OrgOAuthAuthenticator.default();
8
+ const apiPayload = {
9
+ account: {}
10
+ };
11
+ const actorInfo = {
12
+ 'data-generator': {
13
+ account: {
14
+ org_oauth: {
15
+ org_id: 'org-1001',
16
+ region: 'us'
17
+ }
18
+ }
19
+ }
20
+ };
21
+ const result = await orgOAuthAuthenticator.constructPayload(apiPayload, actorInfo);
22
+ expect(result.account.org_oauth).toEqual({
23
+ org_id: 'org-1001',
24
+ region: 'us'
25
+ });
26
+ });
27
+ it('should throw when org_oauth is absent in actor configuration', async () => {
28
+ const orgOAuthAuthenticator = new _OrgOAuthAuthenticator.default();
29
+ const apiPayload = {
30
+ account: {}
31
+ };
32
+ const actorInfo = {
33
+ 'data-generator': {
34
+ account: {}
35
+ }
36
+ };
37
+ await expect(orgOAuthAuthenticator.constructPayload(apiPayload, actorInfo)).rejects.toThrow('OrgOAuth authentication failed: "org_oauth" is missing in actor configuration');
38
+ });
39
+ });
@@ -13,7 +13,10 @@ jest.mock('../../../../core/playwright/helpers/parseUserArgs', () => ({
13
13
  }));
14
14
  jest.mock('../../../../core/playwright/readConfigFile');
15
15
  jest.mock('../../../../core/playwright/tagProcessor');
16
- jest.mock('../../../../core/playwright/test-runner');
16
+ jest.mock('../../../../core/playwright/test-runner', () => ({
17
+ __esModule: true,
18
+ runPreprocessing: jest.fn()
19
+ }));
17
20
  jest.mock('../../../../utils/logger', () => ({
18
21
  __esModule: true,
19
22
  Logger: {
@@ -3,6 +3,9 @@
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
  var _RunnerHelper = _interopRequireDefault(require("../../../../../core/playwright/runner/RunnerHelper"));
5
5
  var _SpawnRunner = _interopRequireDefault(require("../../../../../core/playwright/runner/SpawnRunner"));
6
+ jest.mock('../../../../../core/playwright/setup/config-utils', () => ({
7
+ getBrowsersList: jest.fn().mockReturnValue([])
8
+ }));
6
9
  describe('RunnerHelper', () => {
7
10
  describe('createRunner', () => {
8
11
  it('should throw error on invalid runner type', () => {
@@ -6,6 +6,9 @@ var _Runner = _interopRequireDefault(require("../../../../../core/playwright/run
6
6
  var _Configuration = _interopRequireDefault(require("../../../../../core/playwright/configuration/Configuration"));
7
7
  jest.mock('child_process');
8
8
  jest.mock('../../../../../utils/logger');
9
+ jest.mock('../../../../../core/playwright/setup/config-utils', () => ({
10
+ getBrowsersList: jest.fn().mockReturnValue([])
11
+ }));
9
12
  describe('SpawnRunner', () => {
10
13
  let spawnRunner;
11
14
  const runnerObj = new _Runner.default();
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "4.1.4",
3
+ "version": "4.1.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@zohodesk/testinglibrary",
9
- "version": "4.1.4",
9
+ "version": "4.1.6",
10
10
  "hasInstallScript": true,
11
11
  "license": "ISC",
12
12
  "dependencies": {
@@ -3773,13 +3773,13 @@
3773
3773
  }
3774
3774
  },
3775
3775
  "node_modules/@napi-rs/wasm-runtime": {
3776
- "version": "1.1.5",
3777
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz",
3778
- "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==",
3776
+ "version": "1.1.6",
3777
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
3778
+ "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
3779
3779
  "license": "MIT",
3780
3780
  "optional": true,
3781
3781
  "dependencies": {
3782
- "@tybys/wasm-util": "^0.10.2"
3782
+ "@tybys/wasm-util": "^0.10.3"
3783
3783
  },
3784
3784
  "funding": {
3785
3785
  "type": "github",
@@ -4083,9 +4083,9 @@
4083
4083
  }
4084
4084
  },
4085
4085
  "node_modules/@tybys/wasm-util": {
4086
- "version": "0.10.2",
4087
- "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
4088
- "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
4086
+ "version": "0.10.3",
4087
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
4088
+ "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
4089
4089
  "license": "MIT",
4090
4090
  "optional": true,
4091
4091
  "dependencies": {
@@ -4265,12 +4265,12 @@
4265
4265
  "peer": true
4266
4266
  },
4267
4267
  "node_modules/@types/node": {
4268
- "version": "25.9.3",
4269
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz",
4270
- "integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==",
4268
+ "version": "26.0.0",
4269
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.0.tgz",
4270
+ "integrity": "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==",
4271
4271
  "license": "MIT",
4272
4272
  "dependencies": {
4273
- "undici-types": ">=7.24.0 <7.24.7"
4273
+ "undici-types": "~8.3.0"
4274
4274
  }
4275
4275
  },
4276
4276
  "node_modules/@types/prop-types": {
@@ -4345,9 +4345,9 @@
4345
4345
  "license": "MIT"
4346
4346
  },
4347
4347
  "node_modules/@ungap/structured-clone": {
4348
- "version": "1.3.1",
4349
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz",
4350
- "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==",
4348
+ "version": "1.3.2",
4349
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz",
4350
+ "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==",
4351
4351
  "license": "ISC"
4352
4352
  },
4353
4353
  "node_modules/@unrs/resolver-binding-android-arm-eabi": {
@@ -5297,9 +5297,9 @@
5297
5297
  }
5298
5298
  },
5299
5299
  "node_modules/axios": {
5300
- "version": "1.18.0",
5301
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz",
5302
- "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==",
5300
+ "version": "1.18.1",
5301
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz",
5302
+ "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==",
5303
5303
  "license": "MIT",
5304
5304
  "dependencies": {
5305
5305
  "follow-redirects": "^1.16.0",
@@ -5569,9 +5569,9 @@
5569
5569
  }
5570
5570
  },
5571
5571
  "node_modules/browserslist": {
5572
- "version": "4.28.2",
5573
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
5574
- "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
5572
+ "version": "4.28.4",
5573
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz",
5574
+ "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==",
5575
5575
  "funding": [
5576
5576
  {
5577
5577
  "type": "opencollective",
@@ -5588,10 +5588,10 @@
5588
5588
  ],
5589
5589
  "license": "MIT",
5590
5590
  "dependencies": {
5591
- "baseline-browser-mapping": "^2.10.12",
5592
- "caniuse-lite": "^1.0.30001782",
5593
- "electron-to-chromium": "^1.5.328",
5594
- "node-releases": "^2.0.36",
5591
+ "baseline-browser-mapping": "^2.10.38",
5592
+ "caniuse-lite": "^1.0.30001799",
5593
+ "electron-to-chromium": "^1.5.376",
5594
+ "node-releases": "^2.0.48",
5595
5595
  "update-browserslist-db": "^1.2.3"
5596
5596
  },
5597
5597
  "bin": {
@@ -6623,9 +6623,9 @@
6623
6623
  "license": "MIT"
6624
6624
  },
6625
6625
  "node_modules/create-jest/node_modules/semver": {
6626
- "version": "7.8.4",
6627
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
6628
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
6626
+ "version": "7.8.5",
6627
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
6628
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
6629
6629
  "license": "ISC",
6630
6630
  "bin": {
6631
6631
  "semver": "bin/semver.js"
@@ -6996,9 +6996,9 @@
6996
6996
  }
6997
6997
  },
6998
6998
  "node_modules/electron-to-chromium": {
6999
- "version": "1.5.375",
7000
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz",
7001
- "integrity": "sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==",
6999
+ "version": "1.5.378",
7000
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz",
7001
+ "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==",
7002
7002
  "license": "ISC"
7003
7003
  },
7004
7004
  "node_modules/emittery": {
@@ -9013,9 +9013,9 @@
9013
9013
  }
9014
9014
  },
9015
9015
  "node_modules/istanbul-lib-instrument/node_modules/semver": {
9016
- "version": "7.8.4",
9017
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
9018
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
9016
+ "version": "7.8.5",
9017
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
9018
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
9019
9019
  "license": "ISC",
9020
9020
  "bin": {
9021
9021
  "semver": "bin/semver.js"
@@ -9054,9 +9054,9 @@
9054
9054
  }
9055
9055
  },
9056
9056
  "node_modules/istanbul-lib-report/node_modules/semver": {
9057
- "version": "7.8.4",
9058
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
9059
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
9057
+ "version": "7.8.5",
9058
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
9059
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
9060
9060
  "license": "ISC",
9061
9061
  "bin": {
9062
9062
  "semver": "bin/semver.js"
@@ -10844,9 +10844,9 @@
10844
10844
  "license": "MIT"
10845
10845
  },
10846
10846
  "node_modules/jest-snapshot/node_modules/semver": {
10847
- "version": "7.8.4",
10848
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
10849
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
10847
+ "version": "7.8.5",
10848
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
10849
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
10850
10850
  "license": "ISC",
10851
10851
  "bin": {
10852
10852
  "semver": "bin/semver.js"
@@ -11869,9 +11869,9 @@
11869
11869
  "license": "MIT"
11870
11870
  },
11871
11871
  "node_modules/jest/node_modules/semver": {
11872
- "version": "7.8.4",
11873
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
11874
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
11872
+ "version": "7.8.5",
11873
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
11874
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
11875
11875
  "license": "ISC",
11876
11876
  "bin": {
11877
11877
  "semver": "bin/semver.js"
@@ -12384,21 +12384,21 @@
12384
12384
  }
12385
12385
  },
12386
12386
  "node_modules/msw/node_modules/tldts": {
12387
- "version": "7.4.3",
12388
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.3.tgz",
12389
- "integrity": "sha512-A3BDQBeeukYPzB4QdQ1DtdlUmp4x2OCH8n5UVhEWbyANxNep8GavottKzd1xYKFJKjUgMyPT7EzOfnBO55s8Sg==",
12387
+ "version": "7.4.4",
12388
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.4.tgz",
12389
+ "integrity": "sha512-kFXFK7O4WPextIUAOk8qtnw9dxR9UIXP9CjuH1cTBVBZMDeQcUPgr/IazGiw1B0Yiw5L75gHLWeW4iD793r90g==",
12390
12390
  "license": "MIT",
12391
12391
  "dependencies": {
12392
- "tldts-core": "^7.4.3"
12392
+ "tldts-core": "^7.4.4"
12393
12393
  },
12394
12394
  "bin": {
12395
12395
  "tldts": "bin/cli.js"
12396
12396
  }
12397
12397
  },
12398
12398
  "node_modules/msw/node_modules/tldts-core": {
12399
- "version": "7.4.3",
12400
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.3.tgz",
12401
- "integrity": "sha512-27ep5H9PzdBrNd5OFM/j3WCU8F3kPwM9D0BOaOf7uYfxMJfyr0K5Tjj69Gri+sZlh2WXd5buIm47NuPF29CDiw==",
12399
+ "version": "7.4.4",
12400
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.4.tgz",
12401
+ "integrity": "sha512-vwVLJVvvpslm7vqAH7+XNj/neA/Ynq7DT2EEcMuwc5YzN5XaMyRAqxwU+uX3azZ1FQtB2gvrvnLnAEkvYlVdfg==",
12402
12402
  "license": "MIT"
12403
12403
  },
12404
12404
  "node_modules/msw/node_modules/tough-cookie": {
@@ -12483,9 +12483,9 @@
12483
12483
  "license": "MIT"
12484
12484
  },
12485
12485
  "node_modules/node-releases": {
12486
- "version": "2.0.48",
12487
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz",
12488
- "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==",
12486
+ "version": "2.0.49",
12487
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.49.tgz",
12488
+ "integrity": "sha512-f06bl1D+8ZDkn2oOQQKAh5/otFWqVnM1Q5oerA8Pex7UfT66Tx4IPHIqVVFKqFT3FUtaDstdgkM7yT7JWhqxfw==",
12489
12489
  "license": "MIT",
12490
12490
  "engines": {
12491
12491
  "node": ">=18"
@@ -14353,9 +14353,9 @@
14353
14353
  }
14354
14354
  },
14355
14355
  "node_modules/ts-jest/node_modules/semver": {
14356
- "version": "7.8.4",
14357
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
14358
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
14356
+ "version": "7.8.5",
14357
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
14358
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
14359
14359
  "dev": true,
14360
14360
  "license": "ISC",
14361
14361
  "bin": {
@@ -14537,9 +14537,9 @@
14537
14537
  "license": "MIT"
14538
14538
  },
14539
14539
  "node_modules/undici-types": {
14540
- "version": "7.24.6",
14541
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
14542
- "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
14540
+ "version": "8.3.0",
14541
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
14542
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
14543
14543
  "license": "MIT"
14544
14544
  },
14545
14545
  "node_modules/unicode-canonical-property-names-ecmascript": {
@@ -15021,9 +15021,9 @@
15021
15021
  "license": "ISC"
15022
15022
  },
15023
15023
  "node_modules/yargs": {
15024
- "version": "17.7.2",
15025
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
15026
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
15024
+ "version": "17.7.3",
15025
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
15026
+ "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
15027
15027
  "license": "MIT",
15028
15028
  "dependencies": {
15029
15029
  "cliui": "^8.0.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "4.1.4",
3
+ "version": "4.1.6",
4
4
  "main": "./build/index.js",
5
5
  "scripts": {
6
6
  "postinstall": "node bin/postinstall.js",