@enact/ui-test-utils 4.0.1 → 4.0.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enact/ui-test-utils",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "UI Testing for the Enact framework",
5
5
  "repository": "https://github.com/enactjs/ui-test-utils",
6
6
  "type": "module",
@@ -23,38 +23,37 @@
23
23
  "author": "Roy Sutton <roy.sutton@lge.com>",
24
24
  "license": "Apache-2.0",
25
25
  "engines": {
26
- "node": "^20.12.0 || ^22.0.0 || >=24.0.0"
26
+ "node": "^20.19.0 || ^22.0.0 || >=24.0.0"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"
30
30
  },
31
31
  "dependencies": {
32
- "@wdio/cli": "^9.21.1",
33
- "@wdio/dot-reporter": "^9.20.0",
34
- "@wdio/local-runner": "^9.21.0",
35
- "@wdio/mocha-framework": "^9.21.0",
36
- "@wdio/spec-reporter": "^9.20.0",
37
- "@wdio/static-server-service": "^9.20.0",
38
- "@wdio/visual-service": "^9.0.2",
32
+ "@wdio/cli": "^9.27.2",
33
+ "@wdio/dot-reporter": "^9.27.2",
34
+ "@wdio/local-runner": "^9.27.2",
35
+ "@wdio/mocha-framework": "^9.27.2",
36
+ "@wdio/spec-reporter": "^9.27.2",
37
+ "@wdio/static-server-service": "^9.27.2",
38
+ "@wdio/visual-service": "^9.2.3",
39
39
  "chalk": "^5.6.2",
40
40
  "cross-spawn": "^7.0.6",
41
- "expect-webdriverio": "^5.5.0",
42
- "fs-extra": "^11.3.2",
41
+ "expect-webdriverio": "^5.6.8",
42
+ "fs-extra": "^11.3.5",
43
43
  "minimist": "^1.2.8",
44
- "query-string": "^7.1.3",
45
- "ramda": "^0.31.3",
46
- "readdirp": "^3.6.0",
44
+ "query-string": "^9.4.0",
45
+ "ramda": "^0.32.0",
46
+ "readdirp": "^5.0.0",
47
47
  "wdio-docker-service": "^3.2.1",
48
- "webdriverio": "^9.21.0"
48
+ "webdriverio": "^9.27.2"
49
49
  },
50
50
  "devDependencies": {
51
- "eslint": "^9.39.1",
52
- "eslint-config-enact": "^5.0.3",
53
- "globals": "^16.5.0"
51
+ "eslint": "^9.39.4",
52
+ "eslint-config-enact": "^5.1.2",
53
+ "globals": "^17.6.0"
54
54
  },
55
55
  "overrides": {
56
- "cross-spawn": "$cross-spawn",
57
- "express": "^4.21.2",
58
- "ws": "^8.18.0"
56
+ "serialize-javascript": "^7.0.4",
57
+ "simple-xml-to-json": "1.2.4"
59
58
  }
60
59
  }
@@ -32,6 +32,7 @@ const baselineRelativePath = 'screenshots/reference';
32
32
  const screenshotRelativePath = 'screenshots/screen';
33
33
  const baselineFolder = path.join(distPath, baselineRelativePath);
34
34
  const screenshotFolder = path.join(distPath, screenshotRelativePath);
35
+ const pendingFailuresFolder = path.join(distPath, 'pending-failures');
35
36
 
36
37
  const generateReferenceName = getScreenshotName(baselineFolder);
37
38
 
@@ -55,6 +56,12 @@ function onPrepare () {
55
56
  global.sessionFailures = new Map();
56
57
  global.failedSessions = new Set();
57
58
 
59
+ // Clear any leftover pending-failure files from a previous run
60
+ if (fs.existsSync(pendingFailuresFolder)) {
61
+ fs.rmSync(pendingFailuresFolder, {recursive: true, force: true});
62
+ }
63
+ fs.mkdirSync(pendingFailuresFolder, {recursive: true});
64
+
58
65
  if (!fs.existsSync('tests/screenshot/dist/screenshots/reference')) {
59
66
  console.log('No reference screenshots found, creating new references!');
60
67
  }
@@ -263,38 +270,30 @@ async function afterTest (testData, _context, {error, passed}) {
263
270
  });
264
271
  }
265
272
 
266
- if (!passed) {
267
- // Track failed tests to avoid duplicate logging during retries
268
- if (!global.loggedFailures) {
269
- global.loggedFailures = new Set();
270
- }
273
+ // Use a stable filename derived from the test identifier so the worker can find and
274
+ // delete the right file on a passing retry, even across different worker processes.
275
+ const testIdentifier = testData.title + '::' + fileName;
276
+ const pendingKey = cryptoModule.createHash('md5').update(testIdentifier).digest('hex');
277
+ const pendingFile = path.join(pendingFailuresFolder, `${pendingKey}.json`);
271
278
 
272
- const testIdentifier = testData.title + '::' + fileName;
273
-
274
- // Only log if we haven't already logged this test failure
275
- if (!global.loggedFailures.has(testIdentifier)) {
276
- global.loggedFailures.add(testIdentifier);
277
-
278
- const screenPath = path.join(screenshotRelativePath, 'actual', fileName);
279
- const diffPath = path.join(screenshotRelativePath, 'diff', fileName);
280
- fs.open(failedScreenshotFilename, 'a', (err, fd) => {
281
- if (err) {
282
- console.error('Unable to create failed test log file!');
283
- } else {
284
- const title = testData.title.replace(/~\//g, '/');
285
- const {params, url} = testData.context;
286
- const output = {title, diffPath, referencePath, screenPath, params, url};
287
- fs.appendFile(fd, `${JSON.stringify(output)},`, 'utf8', () => {
288
- fs.close(fd);
289
- });
290
- }
291
- });
279
+ if (!passed) {
280
+ // Track pending failed tests to avoid duplicate logging during retries
281
+ const screenPath = path.join(screenshotRelativePath, 'actual', fileName);
282
+ const diffPath = path.join(screenshotRelativePath, 'diff', fileName);
283
+ const title = testData.title.replace(/~\//g, '/');
284
+ const {params, url} = testData.context;
285
+ const output = {title, diffPath, referencePath, screenPath, params, url};
286
+ try {
287
+ fs.writeFileSync(pendingFile, JSON.stringify(output), 'utf8');
288
+ } catch (writeErr) {
289
+ console.error(`Unable to stage failure for "${title}": ${writeErr.message}`);
292
290
  }
293
291
  } else {
294
- // Test passed on retry - remove from logged failures
295
- if (global.loggedFailures) { // eslint-disable-line no-lonely-if
296
- const testIdentifier = testData.title + '::' + fileName;
297
- global.loggedFailures.delete(testIdentifier);
292
+ // Test passed (possibly on retry) remove the staged failure so it won't be reported
293
+ try {
294
+ fs.unlinkSync(pendingFile);
295
+ } catch (e) {
296
+ // test passed on first attempt — nothing to do
298
297
  }
299
298
  }
300
299
  }
@@ -303,6 +302,20 @@ async function afterTest (testData, _context, {error, passed}) {
303
302
  }
304
303
 
305
304
  function onComplete () {
305
+ // Write all tests that ultimately failed
306
+ if (fs.existsSync(pendingFailuresFolder)) {
307
+ const pendingFiles = fs.readdirSync(pendingFailuresFolder).filter(f => f.endsWith('.json'));
308
+ for (const file of pendingFiles) {
309
+ try {
310
+ const raw = fs.readFileSync(path.join(pendingFailuresFolder, file), 'utf8');
311
+ fs.appendFileSync(failedScreenshotFilename, `${raw},`, 'utf8');
312
+ } catch (e) {
313
+ console.error(`Failed to flush pending failure ${file}: ${e.message}`);
314
+ }
315
+ }
316
+ fs.rmSync(pendingFailuresFolder, {recursive: true, force: true});
317
+ }
318
+
306
319
  const {size: newSize} = fs.statSync(newScreenshotFilename),
307
320
  {size: failedSize} = fs.statSync(failedScreenshotFilename);
308
321
 
package/src/build-apps.js CHANGED
@@ -3,18 +3,20 @@ import path from 'path';
3
3
  let chalk;
4
4
  import spawn from 'cross-spawn';
5
5
  import fs from 'fs-extra';
6
- import readdirp from 'readdirp';
6
+ import {readdirpPromise} from 'readdirp';
7
7
  import * as url from 'url';
8
8
 
9
9
  const env = {
10
10
  ILIB_BASE_PATH: '/framework/ilib',
11
11
  ILIB_ASSET_CREATE: 'false',
12
12
  SIMPLE_CSS_IDENT: 'true',
13
- BROWSERSLIST: 'Chrome 79'
13
+ BROWSERSLIST: 'Chrome 132'
14
14
  };
15
15
 
16
16
  function findViews (base) {
17
- return readdirp.promise(path.join('tests', base, 'apps'), {fileFilter: '*-View.js'});
17
+ return readdirpPromise(path.join('tests', base, 'apps'), {
18
+ fileFilter: (entry) => entry.basename.endsWith('-View.js')
19
+ });
18
20
  }
19
21
 
20
22
  // eslint-disable-next-line no-shadow
package/utils/Page.js CHANGED
@@ -12,7 +12,7 @@ export class Page {
12
12
 
13
13
  async open (appPath, urlExtra = '?locale=en-US') {
14
14
  await browser.execute(function () {
15
- document.body.innerHTML = '';
15
+ document.body.textContent = '';
16
16
  });
17
17
 
18
18
  this._url = `/${appPath}/${urlExtra}`;
package/.travis.yml DELETED
@@ -1,13 +0,0 @@
1
- dist: jammy
2
- language: node_js
3
- node_js:
4
- - 21
5
- before_install:
6
- - sudo apt-get update
7
- - sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
8
- install:
9
- - npm install
10
- script:
11
- - echo -e "\x1b\x5b35;1m*** Linting...\x1b\x5b0m"
12
- - npm run lint -- --report-unused-disable-directives --max-warnings 0
13
- - echo -e "\x1b\x5b35;1m*** Linting complete...\x1b\x5b0m"