@zohodesk/testinglibrary 0.4.32-experimental → 0.4.34-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
@@ -14,18 +14,23 @@ stages:
14
14
 
15
15
  default:
16
16
  cache:
17
- key: build-cache
17
+ key: node14-build-cache
18
18
  paths:
19
19
  - node_modules
20
20
  - build
21
+ - npm-shrinkwrap.json
21
22
 
22
23
  # Install dependencies stage
23
24
  build:
24
25
  stage: build
25
26
  script:
27
+ - npm -v
28
+ - node -v
26
29
  - npm install --ignore-scripts
27
30
  - npm run build
28
31
  - npm install
32
+ - npm shrinkwrap
33
+ - npm run build
29
34
 
30
35
  # Unit tests stage
31
36
  unit:
@@ -45,9 +50,7 @@ uat-auth:
45
50
  - npm install $(npm pack ../../testing-framework | tail -1)
46
51
  - output=$(npm run uatauth)
47
52
  - echo "$output"
48
- - if [[ "$output" == *"failed"* ]]; then
49
- - exit 1
50
- - fi
53
+ - node ../ValidateUATReport.js examples
51
54
 
52
55
  artifacts:
53
56
  when: always
@@ -61,9 +64,7 @@ uat-noauth:
61
64
  - npm install $(npm pack ../../testing-framework | tail -1)
62
65
  - output=$(npm run uatnoauth)
63
66
  - echo "$output"
64
- - if [[ "$output" == *"failed"* ]]; then
65
- - exit 1
66
- - fi
67
+ - node ../ValidateUATReport.js examples
67
68
 
68
69
  artifacts:
69
70
  when: always
@@ -77,9 +78,7 @@ uat-profile:
77
78
  - npm install $(npm pack ../../testing-framework | tail -1)
78
79
  - output=$(npm run uatprofile)
79
80
  - echo "$output"
80
- - if [[ "$output" == *"failed"* ]]; then
81
- - exit 1
82
- - fi
81
+ - node ../ValidateUATReport.js examples
83
82
 
84
83
  artifacts:
85
84
  when: always
@@ -89,17 +88,12 @@ uat-profile:
89
88
 
90
89
  uat-unauth:
91
90
  stage: uat
92
- image: repository.desk.csez.zohocorpin.com/base-image/testing-framework-gitlab-runne-base:v2
93
91
  script:
94
- - npm install
95
- - npm run build
96
92
  - cd examples
97
93
  - npm install $(npm pack ../../testing-framework | tail -1)
98
94
  - output=$(npm run uatunauth)
99
95
  - echo "$output"
100
- - if [[ "$output" == *"failed"* ]]; then
101
- - exit 1
102
- - fi
96
+ - node ../ValidateUATReport.js examples
103
97
 
104
98
 
105
99
  artifacts:
@@ -112,11 +106,9 @@ uat-nobdd:
112
106
  script:
113
107
  - cd nobdd
114
108
  - npm install $(npm pack ../../testing-framework | tail -1)
115
- - output=$(npm run uatnobdd)
109
+ - output=$(npm run uatnobdd -- --headless)
116
110
  - echo "$output"
117
- - if [[ "$output" == *"failed"* ]]; then
118
- - exit 1
119
- - fi
111
+ - node ../ValidateUATReport.js nobdd
120
112
 
121
113
 
122
114
  artifacts:
@@ -1,12 +1,10 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.default = void 0;
8
7
  var _auth = require("../helpers/auth");
9
- var _getUrlOrigin = _interopRequireDefault(require("../helpers/auth/getUrlOrigin"));
10
8
  var _readConfigFile = require("../readConfigFile");
11
9
  /* eslint-disable global-require */
12
10
 
@@ -44,19 +42,9 @@ async function loginSteps(pageDetail) {
44
42
  await page.goto(process.env.domain);
45
43
  }
46
44
  }
47
- async function performDefaultPageSteps({
48
- context,
49
- $tags,
50
- page
51
- }) {
45
+ async function performDefaultPageSteps(testInfo) {
52
46
  if (testSetup.page && typeof testSetup.page === 'function') {
53
- await testSetup.page({
54
- context,
55
- $tags,
56
- page
57
- });
58
- } else {
59
- await page.goto(process.env.domain);
47
+ await testSetup.page(testInfo);
60
48
  }
61
49
  }
62
50
  async function verifyPageIsLoaded(testInfo) {
@@ -71,26 +59,22 @@ var _default = exports.default = {
71
59
  $tags,
72
60
  page
73
61
  }, use) => {
62
+ let testPortalDetails, user;
74
63
  try {
75
64
  //This block is used to skip the login process if the @unauthenticated tag is added to the script
76
65
  if ($tags.includes('@unauthenticated')) {
77
66
  await context.clearCookies();
78
- await use(page);
79
67
  return;
80
68
  }
81
69
  const {
82
70
  isAuthMode
83
71
  } = (0, _readConfigFile.generateConfigFromFile)();
84
72
  if (!isAuthMode) {
85
- await use(page);
86
73
  return;
87
74
  }
88
- const testPortalDetails = getCustomAccountDetails($tags);
75
+ testPortalDetails = getCustomAccountDetails($tags);
89
76
  if (testPortalDetails) {
90
77
  await context.clearCookies();
91
- const {
92
- email
93
- } = testPortalDetails;
94
78
  await (0, _auth.performLoginSteps)({
95
79
  page,
96
80
  $tags,
@@ -100,14 +84,19 @@ var _default = exports.default = {
100
84
  return await verifyPageIsLoaded(testInfo);
101
85
  }, loginSteps);
102
86
  process.env.actorInfo = JSON.stringify(testPortalDetails);
87
+ } else {
88
+ user = (0, _auth.getDefaultActor)();
89
+ process.env.actorInfo = JSON.stringify(user);
103
90
  }
104
91
  } catch (e) {
105
92
  console.error('Error during page', e);
106
93
  } finally {
94
+ testPortalDetails = testPortalDetails || user;
107
95
  await performDefaultPageSteps({
108
96
  context,
109
97
  $tags,
110
- page
98
+ page,
99
+ ...testPortalDetails
111
100
  });
112
101
  await use(page);
113
102
  await context.close();
@@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.CUSTOM_COMMANDS = void 0;
7
- const CUSTOM_COMMANDS = exports.CUSTOM_COMMANDS = ['mode', 'tags', 'edition', 'browsers', 'filePath'];
7
+ const CUSTOM_COMMANDS = exports.CUSTOM_COMMANDS = ['mode', 'tags', 'edition', 'browsers', 'filePath', 'headless'];
@@ -25,12 +25,9 @@ async function performLoginSteps(testInfo, isLoggedIn, loginSteps) {
25
25
  try {
26
26
  await fileMutex.acquire();
27
27
  await (0, _checkAuthCookies.loadCookiesIfPresent)(page, authFile);
28
- await page.goto(process.env.domain);
29
- await Promise.race([page.waitForNavigation(), page.waitForLoadState('networkidle'), page.waitForTimeout(5000)]);
30
28
  const isAlreadyLoggedIn = await isLoggedIn(testInfo);
31
29
  if (!isAlreadyLoggedIn) {
32
30
  await loginSteps(testInfo);
33
- await page.goto(process.env.domain);
34
31
  await isLoggedIn(testInfo);
35
32
  await page.context().storageState({
36
33
  path: authFile
@@ -21,13 +21,13 @@ class FileMutex {
21
21
  }
22
22
  async acquire() {
23
23
  _assertClassBrand(_FileMutex_brand, this, _createDirectoryIfNotExist).call(this);
24
- const lockFilePath = _path.default.resolve(this.directory, this.lockFileName);
24
+ const lockFilePath = _assertClassBrand(_FileMutex_brand, this, _getLockFilePath).call(this);
25
25
  try {
26
26
  if (!(0, _fs.existsSync)(lockFilePath)) {
27
27
  console.log(`[DEBUG] Creating missing lock file:`, this.lockFileName);
28
28
  (0, _fs.writeFileSync)(lockFilePath, 'locked');
29
29
  }
30
- await _properLockfile.default.lock(_assertClassBrand(_FileMutex_brand, this, _getLockFilePath).call(this), this.options);
30
+ await _properLockfile.default.lock(lockFilePath, this.options);
31
31
  } catch (err) {
32
32
  throw new Error(`Failed to acquire lock after ${this.options.retries.retries} attempts: ${err.message}`);
33
33
  }
@@ -10,12 +10,14 @@ class TagProcessor {
10
10
  _classPrivateMethodInitSpec(this, _TagProcessor_brand);
11
11
  this.editionOrder = editionOrder;
12
12
  }
13
- processTags(userArgs) {
14
- const tagArgs = userArgs['tags'] || '';
15
- const edition = userArgs['edition'] || null;
16
- if (!edition) return tagArgs;
13
+ processTags(config) {
14
+ const {
15
+ tags,
16
+ edition
17
+ } = config.getAll();
18
+ if (!edition) return tags;
17
19
  const editionsArray = edition.split(',');
18
- const editionTags = editionsArray.length === 1 ? _assertClassBrand(_TagProcessor_brand, this, _processSingleEdition).call(this, editionsArray[0], tagArgs) : _assertClassBrand(_TagProcessor_brand, this, _processMultipleEditions).call(this, editionsArray, tagArgs);
20
+ const editionTags = editionsArray.length === 1 ? _assertClassBrand(_TagProcessor_brand, this, _processSingleEdition).call(this, editionsArray[0], tags) : _assertClassBrand(_TagProcessor_brand, this, _processMultipleEditions).call(this, editionsArray, tags);
19
21
  return editionTags;
20
22
  }
21
23
  }
@@ -104,7 +104,7 @@ function main() {
104
104
  //This is only used for pass the user arguments to need places in legacy code. We need to rewamp that also.
105
105
  const userArgsObject = userArgConfig.getAll();
106
106
  const tagProcessor = new _tagProcessor.default(editionOrder);
107
- const tagArgs = tagProcessor.processTags(userArgsObject);
107
+ const tagArgs = tagProcessor.processTags(uatConfig);
108
108
  const runnerObj = new _Runner.default();
109
109
  runnerObj.setTagArgs(tagArgs);
110
110
  runnerObj.setUserArgs(userArgsObject);
@@ -2,6 +2,7 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
  var _tagProcessor = _interopRequireDefault(require("../../../../../src/core/playwright/tagProcessor"));
5
+ var _Configuration = _interopRequireDefault(require("../../../../../src/core/playwright/configuration/Configuration.js"));
5
6
  var _logger = require("../../../../utils/logger");
6
7
  jest.mock('../../../../utils/logger');
7
8
  describe('TagProcessor', () => {
@@ -11,83 +12,83 @@ describe('TagProcessor', () => {
11
12
  });
12
13
  test('should return tagArgs if no edition is provided', () => {
13
14
  const tagProcessor = new _tagProcessor.default(editionOrder);
14
- const userArgs = {
15
+ const userArgs = new _Configuration.default({
15
16
  tags: 'tag1',
16
17
  edition: null
17
- };
18
+ });
18
19
  const result = tagProcessor.processTags(userArgs);
19
20
  expect(result).toBe('tag1');
20
21
  });
21
22
  test('should handle a single edition with <= operator', () => {
22
23
  const tagProcessor = new _tagProcessor.default(editionOrder);
23
- const userArgs = {
24
+ const userArgs = new _Configuration.default({
24
25
  tags: 'tag1',
25
26
  edition: '<=edition2'
26
- };
27
+ });
27
28
  const result = tagProcessor.processTags(userArgs);
28
29
  expect(result).toBe('tag1 and not (@edition_edition3 or @edition_edition4)');
29
30
  });
30
31
  test('should handle a single edition with >= operator', () => {
31
32
  const tagProcessor = new _tagProcessor.default(editionOrder);
32
- const userArgs = {
33
+ const userArgs = new _Configuration.default({
33
34
  tags: 'tag1',
34
35
  edition: '>=edition2'
35
- };
36
+ });
36
37
  const result = tagProcessor.processTags(userArgs);
37
38
  expect(result).toBe('tag1 and not (@edition_edition1)');
38
39
  });
39
40
  test('should handle a single edition with < operator', () => {
40
41
  const tagProcessor = new _tagProcessor.default(editionOrder);
41
- const userArgs = {
42
+ const userArgs = new _Configuration.default({
42
43
  tags: 'tag1',
43
44
  edition: '<edition3'
44
- };
45
+ });
45
46
  const result = tagProcessor.processTags(userArgs);
46
47
  expect(result).toBe('tag1 and not (@edition_edition3 or @edition_edition4)');
47
48
  });
48
49
  test('should handle a single edition with > operator', () => {
49
50
  const tagProcessor = new _tagProcessor.default(editionOrder);
50
- const userArgs = {
51
+ const userArgs = new _Configuration.default({
51
52
  tags: 'tag1',
52
53
  edition: '>edition1'
53
- };
54
+ });
54
55
  const result = tagProcessor.processTags(userArgs);
55
56
  expect(result).toBe('tag1 and not (@edition_edition1)');
56
57
  });
57
58
  test('should handle a single edition with no operator', () => {
58
59
  const tagProcessor = new _tagProcessor.default(editionOrder);
59
- const userArgs = {
60
+ const userArgs = new _Configuration.default({
60
61
  tags: 'tag1',
61
62
  edition: 'edition2'
62
- };
63
+ });
63
64
  const result = tagProcessor.processTags(userArgs);
64
65
  expect(result).toBe('tag1 and not (@edition_edition1 or @edition_edition3 or @edition_edition4)');
65
66
  });
66
67
  test('should log a message if edition is not found', () => {
67
68
  const tagProcessor = new _tagProcessor.default(editionOrder);
68
- const userArgs = {
69
+ const userArgs = new _Configuration.default({
69
70
  tags: 'tag1',
70
71
  edition: 'nonexistentEdition'
71
- };
72
+ });
72
73
  const result = tagProcessor.processTags(userArgs);
73
74
  expect(result).toBe('tag1');
74
75
  expect(_logger.Logger.log).toHaveBeenCalledWith(_logger.Logger.INFO_TYPE, expect.stringContaining('No matching editions for nonexistentEdition found.'));
75
76
  });
76
77
  test('should handle multiple editions', () => {
77
78
  const tagProcessor = new _tagProcessor.default(editionOrder);
78
- const userArgs = {
79
+ const userArgs = new _Configuration.default({
79
80
  tags: 'tag1',
80
81
  edition: 'edition1,edition3'
81
- };
82
+ });
82
83
  const result = tagProcessor.processTags(userArgs);
83
84
  expect(result).toBe('tag1 and not (@edition_edition2 or @edition_edition4)');
84
85
  });
85
86
  test('should build tags correctly when tags are empty', () => {
86
87
  const tagProcessor = new _tagProcessor.default(editionOrder);
87
- const userArgs = {
88
+ const userArgs = new _Configuration.default({
88
89
  tags: '',
89
90
  edition: 'edition1'
90
- };
91
+ });
91
92
  const result = tagProcessor.processTags(userArgs);
92
93
  expect(result).toBe('not (@edition_edition2 or @edition_edition3 or @edition_edition4)');
93
94
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.4.32-experimental",
3
+ "version": "0.4.34-experimental",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -2196,9 +2196,9 @@
2196
2196
  "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
2197
2197
  },
2198
2198
  "@types/node": {
2199
- "version": "22.10.2",
2200
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
2201
- "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
2199
+ "version": "22.10.5",
2200
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz",
2201
+ "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==",
2202
2202
  "requires": {
2203
2203
  "undici-types": "~6.20.0"
2204
2204
  }
@@ -2866,9 +2866,9 @@
2866
2866
  }
2867
2867
  },
2868
2868
  "commander": {
2869
- "version": "11.1.0",
2870
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
2871
- "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
2869
+ "version": "11.0.0",
2870
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz",
2871
+ "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==",
2872
2872
  "dev": true
2873
2873
  },
2874
2874
  "commondir": {
@@ -3131,9 +3131,9 @@
3131
3131
  }
3132
3132
  },
3133
3133
  "electron-to-chromium": {
3134
- "version": "1.5.75",
3135
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz",
3136
- "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q=="
3134
+ "version": "1.5.76",
3135
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz",
3136
+ "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ=="
3137
3137
  },
3138
3138
  "emittery": {
3139
3139
  "version": "0.13.1",
@@ -3167,9 +3167,9 @@
3167
3167
  }
3168
3168
  },
3169
3169
  "es-abstract": {
3170
- "version": "1.23.7",
3171
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz",
3172
- "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==",
3170
+ "version": "1.23.9",
3171
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
3172
+ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
3173
3173
  "dev": true,
3174
3174
  "requires": {
3175
3175
  "array-buffer-byte-length": "^1.0.2",
@@ -3183,10 +3183,11 @@
3183
3183
  "es-define-property": "^1.0.1",
3184
3184
  "es-errors": "^1.3.0",
3185
3185
  "es-object-atoms": "^1.0.0",
3186
- "es-set-tostringtag": "^2.0.3",
3186
+ "es-set-tostringtag": "^2.1.0",
3187
3187
  "es-to-primitive": "^1.3.0",
3188
3188
  "function.prototype.name": "^1.1.8",
3189
- "get-intrinsic": "^1.2.6",
3189
+ "get-intrinsic": "^1.2.7",
3190
+ "get-proto": "^1.0.0",
3190
3191
  "get-symbol-description": "^1.1.0",
3191
3192
  "globalthis": "^1.0.4",
3192
3193
  "gopd": "^1.2.0",
@@ -3207,9 +3208,12 @@
3207
3208
  "object-inspect": "^1.13.3",
3208
3209
  "object-keys": "^1.1.1",
3209
3210
  "object.assign": "^4.1.7",
3211
+ "own-keys": "^1.0.1",
3210
3212
  "regexp.prototype.flags": "^1.5.3",
3211
3213
  "safe-array-concat": "^1.1.3",
3214
+ "safe-push-apply": "^1.0.0",
3212
3215
  "safe-regex-test": "^1.1.0",
3216
+ "set-proto": "^1.0.0",
3213
3217
  "string.prototype.trim": "^1.2.10",
3214
3218
  "string.prototype.trimend": "^1.0.9",
3215
3219
  "string.prototype.trimstart": "^1.0.8",
@@ -3246,14 +3250,15 @@
3246
3250
  }
3247
3251
  },
3248
3252
  "es-set-tostringtag": {
3249
- "version": "2.0.3",
3250
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
3251
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
3253
+ "version": "2.1.0",
3254
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
3255
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
3252
3256
  "dev": true,
3253
3257
  "requires": {
3254
- "get-intrinsic": "^1.2.4",
3258
+ "es-errors": "^1.3.0",
3259
+ "get-intrinsic": "^1.2.6",
3255
3260
  "has-tostringtag": "^1.0.2",
3256
- "hasown": "^2.0.1"
3261
+ "hasown": "^2.0.2"
3257
3262
  }
3258
3263
  },
3259
3264
  "es-to-primitive": {
@@ -3575,20 +3580,20 @@
3575
3580
  "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
3576
3581
  },
3577
3582
  "get-intrinsic": {
3578
- "version": "1.2.6",
3579
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
3580
- "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
3583
+ "version": "1.2.7",
3584
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
3585
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
3581
3586
  "requires": {
3582
3587
  "call-bind-apply-helpers": "^1.0.1",
3583
- "dunder-proto": "^1.0.0",
3584
3588
  "es-define-property": "^1.0.1",
3585
3589
  "es-errors": "^1.3.0",
3586
3590
  "es-object-atoms": "^1.0.0",
3587
3591
  "function-bind": "^1.1.2",
3592
+ "get-proto": "^1.0.0",
3588
3593
  "gopd": "^1.2.0",
3589
3594
  "has-symbols": "^1.1.0",
3590
3595
  "hasown": "^2.0.2",
3591
- "math-intrinsics": "^1.0.0"
3596
+ "math-intrinsics": "^1.1.0"
3592
3597
  }
3593
3598
  },
3594
3599
  "get-package-type": {
@@ -3596,6 +3601,15 @@
3596
3601
  "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
3597
3602
  "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
3598
3603
  },
3604
+ "get-proto": {
3605
+ "version": "1.0.1",
3606
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
3607
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
3608
+ "requires": {
3609
+ "dunder-proto": "^1.0.1",
3610
+ "es-object-atoms": "^1.0.0"
3611
+ }
3612
+ },
3599
3613
  "get-stream": {
3600
3614
  "version": "6.0.1",
3601
3615
  "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -3908,12 +3922,15 @@
3908
3922
  "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
3909
3923
  },
3910
3924
  "is-async-function": {
3911
- "version": "2.0.0",
3912
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
3913
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
3925
+ "version": "2.1.0",
3926
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz",
3927
+ "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==",
3914
3928
  "dev": true,
3915
3929
  "requires": {
3916
- "has-tostringtag": "^1.0.0"
3930
+ "call-bound": "^1.0.3",
3931
+ "get-proto": "^1.0.1",
3932
+ "has-tostringtag": "^1.0.2",
3933
+ "safe-regex-test": "^1.1.0"
3917
3934
  }
3918
3935
  },
3919
3936
  "is-bigint": {
@@ -4002,11 +4019,14 @@
4002
4019
  "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
4003
4020
  },
4004
4021
  "is-generator-function": {
4005
- "version": "1.0.10",
4006
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
4007
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
4022
+ "version": "1.1.0",
4023
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
4024
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
4008
4025
  "requires": {
4009
- "has-tostringtag": "^1.0.0"
4026
+ "call-bound": "^1.0.3",
4027
+ "get-proto": "^1.0.0",
4028
+ "has-tostringtag": "^1.0.2",
4029
+ "safe-regex-test": "^1.1.0"
4010
4030
  }
4011
4031
  },
4012
4032
  "is-glob": {
@@ -4080,7 +4100,6 @@
4080
4100
  "version": "1.2.1",
4081
4101
  "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
4082
4102
  "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
4083
- "dev": true,
4084
4103
  "requires": {
4085
4104
  "call-bound": "^1.0.2",
4086
4105
  "gopd": "^1.2.0",
@@ -5319,6 +5338,17 @@
5319
5338
  "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
5320
5339
  "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="
5321
5340
  },
5341
+ "own-keys": {
5342
+ "version": "1.0.1",
5343
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
5344
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
5345
+ "dev": true,
5346
+ "requires": {
5347
+ "get-intrinsic": "^1.2.6",
5348
+ "object-keys": "^1.1.1",
5349
+ "safe-push-apply": "^1.0.0"
5350
+ }
5351
+ },
5322
5352
  "p-limit": {
5323
5353
  "version": "2.3.0",
5324
5354
  "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -5576,18 +5606,18 @@
5576
5606
  "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
5577
5607
  },
5578
5608
  "reflect.getprototypeof": {
5579
- "version": "1.0.9",
5580
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz",
5581
- "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==",
5609
+ "version": "1.0.10",
5610
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
5611
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
5582
5612
  "dev": true,
5583
5613
  "requires": {
5584
5614
  "call-bind": "^1.0.8",
5585
5615
  "define-properties": "^1.2.1",
5586
- "dunder-proto": "^1.0.1",
5587
- "es-abstract": "^1.23.6",
5616
+ "es-abstract": "^1.23.9",
5588
5617
  "es-errors": "^1.3.0",
5589
- "get-intrinsic": "^1.2.6",
5590
- "gopd": "^1.2.0",
5618
+ "es-object-atoms": "^1.0.0",
5619
+ "get-intrinsic": "^1.2.7",
5620
+ "get-proto": "^1.0.1",
5591
5621
  "which-builtin-type": "^1.2.1"
5592
5622
  }
5593
5623
  },
@@ -5634,14 +5664,16 @@
5634
5664
  "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="
5635
5665
  },
5636
5666
  "regexp.prototype.flags": {
5637
- "version": "1.5.3",
5638
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
5639
- "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
5667
+ "version": "1.5.4",
5668
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
5669
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
5640
5670
  "dev": true,
5641
5671
  "requires": {
5642
- "call-bind": "^1.0.7",
5672
+ "call-bind": "^1.0.8",
5643
5673
  "define-properties": "^1.2.1",
5644
5674
  "es-errors": "^1.3.0",
5675
+ "get-proto": "^1.0.1",
5676
+ "gopd": "^1.2.0",
5645
5677
  "set-function-name": "^2.0.2"
5646
5678
  }
5647
5679
  },
@@ -5791,11 +5823,20 @@
5791
5823
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
5792
5824
  "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
5793
5825
  },
5826
+ "safe-push-apply": {
5827
+ "version": "1.0.0",
5828
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
5829
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
5830
+ "dev": true,
5831
+ "requires": {
5832
+ "es-errors": "^1.3.0",
5833
+ "isarray": "^2.0.5"
5834
+ }
5835
+ },
5794
5836
  "safe-regex-test": {
5795
5837
  "version": "1.1.0",
5796
5838
  "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
5797
5839
  "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
5798
- "dev": true,
5799
5840
  "requires": {
5800
5841
  "call-bound": "^1.0.2",
5801
5842
  "es-errors": "^1.3.0",
@@ -5858,6 +5899,17 @@
5858
5899
  "has-property-descriptors": "^1.0.2"
5859
5900
  }
5860
5901
  },
5902
+ "set-proto": {
5903
+ "version": "1.0.0",
5904
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
5905
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
5906
+ "dev": true,
5907
+ "requires": {
5908
+ "dunder-proto": "^1.0.1",
5909
+ "es-errors": "^1.3.0",
5910
+ "es-object-atoms": "^1.0.0"
5911
+ }
5912
+ },
5861
5913
  "shallow-clone": {
5862
5914
  "version": "3.0.1",
5863
5915
  "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
@@ -6257,9 +6309,9 @@
6257
6309
  }
6258
6310
  },
6259
6311
  "typescript": {
6260
- "version": "5.7.2",
6261
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
6262
- "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
6312
+ "version": "5.4.2",
6313
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
6314
+ "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
6263
6315
  "dev": true
6264
6316
  },
6265
6317
  "unbox-primitive": {
@@ -6576,9 +6628,9 @@
6576
6628
  "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
6577
6629
  },
6578
6630
  "yaml": {
6579
- "version": "2.6.1",
6580
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
6581
- "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg=="
6631
+ "version": "2.7.0",
6632
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
6633
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="
6582
6634
  },
6583
6635
  "yargs": {
6584
6636
  "version": "17.7.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.4.32-experimental",
3
+ "version": "0.4.34-experimental",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -53,8 +53,8 @@
53
53
  "@babel/polyfill": "7.12.1",
54
54
  "@babel/preset-env": "7.22.15",
55
55
  "@babel/runtime": "7.22.15",
56
- "commander": "^11.0.0",
57
- "jest-html-reporter": "^3.10.2",
58
- "typescript": "^5.4.2"
56
+ "commander": "11.0.0",
57
+ "jest-html-reporter": "3.10.2",
58
+ "typescript": "5.4.2"
59
59
  }
60
60
  }
@@ -0,0 +1,260 @@
1
+ <html><head><meta charset="utf-8"/><title>Unit Report</title><style type="text/css">html,
2
+ body {
3
+ font-family: Arial, Helvetica, sans-serif;
4
+ font-size: 1rem;
5
+ margin: 0;
6
+ padding: 0;
7
+ color: #333;
8
+ }
9
+ body {
10
+ padding: 2rem 1rem;
11
+ font-size: 0.85rem;
12
+ }
13
+ .jesthtml-content {
14
+ margin: 0 auto;
15
+ max-width: 70rem;
16
+ }
17
+ header {
18
+ display: flex;
19
+ align-items: center;
20
+ }
21
+ #title {
22
+ margin: 0;
23
+ flex-grow: 1;
24
+ }
25
+ #logo {
26
+ height: 4rem;
27
+ }
28
+ #timestamp {
29
+ color: #777;
30
+ margin-top: 0.5rem;
31
+ }
32
+
33
+ /** SUMMARY */
34
+ #summary {
35
+ color: #333;
36
+ margin: 2rem 0;
37
+ display: flex;
38
+ font-family: monospace;
39
+ font-size: 1rem;
40
+ }
41
+ #summary > div {
42
+ margin-right: 2rem;
43
+ background: #eee;
44
+ padding: 1rem;
45
+ min-width: 15rem;
46
+ }
47
+ #summary > div:last-child {
48
+ margin-right: 0;
49
+ }
50
+ @media only screen and (max-width: 720px) {
51
+ #summary {
52
+ flex-direction: column;
53
+ }
54
+ #summary > div {
55
+ margin-right: 0;
56
+ margin-top: 2rem;
57
+ }
58
+ #summary > div:first-child {
59
+ margin-top: 0;
60
+ }
61
+ }
62
+
63
+ .summary-total {
64
+ font-weight: bold;
65
+ margin-bottom: 0.5rem;
66
+ }
67
+ .summary-passed {
68
+ color: #4f8a10;
69
+ border-left: 0.4rem solid #4f8a10;
70
+ padding-left: 0.5rem;
71
+ }
72
+ .summary-failed,
73
+ .summary-obsolete-snapshots {
74
+ color: #d8000c;
75
+ border-left: 0.4rem solid #d8000c;
76
+ padding-left: 0.5rem;
77
+ }
78
+ .summary-pending {
79
+ color: #9f6000;
80
+ border-left: 0.4rem solid #9f6000;
81
+ padding-left: 0.5rem;
82
+ }
83
+ .summary-empty {
84
+ color: #999;
85
+ border-left: 0.4rem solid #999;
86
+ }
87
+
88
+ .test-result {
89
+ padding: 1rem;
90
+ margin-bottom: 0.25rem;
91
+ }
92
+ .test-result:last-child {
93
+ border: 0;
94
+ }
95
+ .test-result.passed {
96
+ background-color: #dff2bf;
97
+ color: #4f8a10;
98
+ }
99
+ .test-result.failed {
100
+ background-color: #ffbaba;
101
+ color: #d8000c;
102
+ }
103
+ .test-result.pending {
104
+ background-color: #ffdf61;
105
+ color: #9f6000;
106
+ }
107
+
108
+ .test-info {
109
+ display: flex;
110
+ justify-content: space-between;
111
+ }
112
+ .test-suitename {
113
+ width: 20%;
114
+ text-align: left;
115
+ font-weight: bold;
116
+ word-break: break-word;
117
+ }
118
+ .test-title {
119
+ width: 40%;
120
+ text-align: left;
121
+ font-style: italic;
122
+ }
123
+ .test-status {
124
+ width: 20%;
125
+ text-align: right;
126
+ }
127
+ .test-duration {
128
+ width: 10%;
129
+ text-align: right;
130
+ font-size: 0.75rem;
131
+ }
132
+
133
+ .failureMessages {
134
+ padding: 0 1rem;
135
+ margin-top: 1rem;
136
+ border-top: 1px dashed #d8000c;
137
+ }
138
+ .failureMessages.suiteFailure {
139
+ border-top: none;
140
+ }
141
+ .failureMsg {
142
+ white-space: pre-wrap;
143
+ white-space: -moz-pre-wrap;
144
+ white-space: -pre-wrap;
145
+ white-space: -o-pre-wrap;
146
+ word-wrap: break-word;
147
+ }
148
+
149
+ .suite-container {
150
+ margin-bottom: 2rem;
151
+ }
152
+ .suite-container > input[type="checkbox"] {
153
+ position: absolute;
154
+ left: -100vw;
155
+ }
156
+ .suite-container label {
157
+ display: block;
158
+ }
159
+ .suite-container .suite-tests {
160
+ overflow-y: hidden;
161
+ height: 0;
162
+ }
163
+ .suite-container > input[type="checkbox"]:checked ~ .suite-tests {
164
+ height: auto;
165
+ overflow: visible;
166
+ }
167
+ .suite-info {
168
+ padding: 1rem;
169
+ background-color: #eee;
170
+ color: #777;
171
+ display: flex;
172
+ align-items: center;
173
+ margin-bottom: 0.25rem;
174
+ }
175
+ .suite-info:hover {
176
+ background-color: #ddd;
177
+ cursor: pointer;
178
+ }
179
+ .suite-info .suite-path {
180
+ word-break: break-all;
181
+ flex-grow: 1;
182
+ font-family: monospace;
183
+ font-size: 1rem;
184
+ }
185
+ .suite-info .suite-time {
186
+ margin-left: 0.5rem;
187
+ padding: 0.2rem 0.3rem;
188
+ font-size: 0.75rem;
189
+ }
190
+ .suite-info .suite-time.warn {
191
+ background-color: #d8000c;
192
+ color: #fff;
193
+ }
194
+ .suite-info:before {
195
+ content: "\2303";
196
+ display: inline-block;
197
+ margin-right: 0.5rem;
198
+ transform: rotate(0deg);
199
+ }
200
+ .suite-container > input[type="checkbox"]:checked ~ label .suite-info:before {
201
+ transform: rotate(180deg);
202
+ }
203
+
204
+ /* CONSOLE LOGS */
205
+ .suite-consolelog {
206
+ margin-bottom: 0.25rem;
207
+ padding: 1rem;
208
+ background-color: #efefef;
209
+ }
210
+ .suite-consolelog-header {
211
+ font-weight: bold;
212
+ }
213
+ .suite-consolelog-item {
214
+ padding: 0.5rem;
215
+ }
216
+ .suite-consolelog-item pre {
217
+ margin: 0.5rem 0;
218
+ white-space: pre-wrap;
219
+ white-space: -moz-pre-wrap;
220
+ white-space: -pre-wrap;
221
+ white-space: -o-pre-wrap;
222
+ word-wrap: break-word;
223
+ }
224
+ .suite-consolelog-item-origin {
225
+ color: #777;
226
+ font-weight: bold;
227
+ }
228
+ .suite-consolelog-item-message {
229
+ color: #000;
230
+ font-size: 1rem;
231
+ padding: 0 0.5rem;
232
+ }
233
+
234
+ /* OBSOLETE SNAPSHOTS */
235
+ .suite-obsolete-snapshots {
236
+ margin-bottom: 0.25rem;
237
+ padding: 1rem;
238
+ background-color: #ffbaba;
239
+ color: #d8000c;
240
+ }
241
+ .suite-obsolete-snapshots-header {
242
+ font-weight: bold;
243
+ }
244
+ .suite-obsolete-snapshots-item {
245
+ padding: 0.5rem;
246
+ }
247
+ .suite-obsolete-snapshots-item pre {
248
+ margin: 0.5rem 0;
249
+ white-space: pre-wrap;
250
+ white-space: -moz-pre-wrap;
251
+ white-space: -pre-wrap;
252
+ white-space: -o-pre-wrap;
253
+ word-wrap: break-word;
254
+ }
255
+ .suite-obsolete-snapshots-item-message {
256
+ color: #000;
257
+ font-size: 1rem;
258
+ padding: 0 0.5rem;
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: 2024-12-18 15:33:53</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 (9)</div><div class="summary-passed ">9 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/durai-19814/Documents/Git/testing-framework/src/test/core/playwright/__tests__/tagProcessor.test.js</div><div class="suite-time">1.168s</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.002s</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 &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">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 no 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 log a message if edition is not found</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 multiple editions</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 build tags correctly when tags are empty</div><div class="test-status">passed</div><div class="test-duration">0.001s</div></div></div></div></div></div></body></html>