@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/.github/workflows/ci-branch.yml +24 -0
- package/.github/workflows/ci-pull-request.yml +19 -0
- package/.github/workflows/ci-reusable.yml +38 -0
- package/.github/workflows/update-copyright-years.yml +23 -0
- package/CHANGELOG.md +10 -0
- package/README.md +4 -4
- package/npm-shrinkwrap.json +2463 -2321
- package/package.json +20 -21
- package/screenshot/utils/confHelpers.js +42 -29
- package/src/build-apps.js +5 -3
- package/utils/Page.js +1 -1
- package/.travis.yml +0 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enact/ui-test-utils",
|
|
3
|
-
"version": "4.0.
|
|
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.
|
|
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.
|
|
33
|
-
"@wdio/dot-reporter": "^9.
|
|
34
|
-
"@wdio/local-runner": "^9.
|
|
35
|
-
"@wdio/mocha-framework": "^9.
|
|
36
|
-
"@wdio/spec-reporter": "^9.
|
|
37
|
-
"@wdio/static-server-service": "^9.
|
|
38
|
-
"@wdio/visual-service": "^9.
|
|
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.
|
|
42
|
-
"fs-extra": "^11.3.
|
|
41
|
+
"expect-webdriverio": "^5.6.8",
|
|
42
|
+
"fs-extra": "^11.3.5",
|
|
43
43
|
"minimist": "^1.2.8",
|
|
44
|
-
"query-string": "^
|
|
45
|
-
"ramda": "^0.
|
|
46
|
-
"readdirp": "^
|
|
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.
|
|
48
|
+
"webdriverio": "^9.27.2"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"eslint": "^9.39.
|
|
52
|
-
"eslint-config-enact": "^5.
|
|
53
|
-
"globals": "^
|
|
51
|
+
"eslint": "^9.39.4",
|
|
52
|
+
"eslint-config-enact": "^5.1.2",
|
|
53
|
+
"globals": "^17.6.0"
|
|
54
54
|
},
|
|
55
55
|
"overrides": {
|
|
56
|
-
"
|
|
57
|
-
"
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
fs.
|
|
281
|
-
|
|
282
|
-
|
|
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
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
|
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
|
|
13
|
+
BROWSERSLIST: 'Chrome 132'
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
function findViews (base) {
|
|
17
|
-
return
|
|
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
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"
|