ui5-test-runner 5.6.0 → 5.6.2
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 +6 -5
- package/src/coverage.js +20 -10
- package/src/report.js +8 -6
- package/src/tests.js +0 -2
- package/src/ui5.js +28 -17
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ui5-test-runner",
|
|
3
|
-
"version": "5.6.
|
|
3
|
+
"version": "5.6.2",
|
|
4
4
|
"description": "Standalone test runner for UI5",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"test:coverall": "rimraf .nyc_output && jest --coverageDirectory .nyc_output --coverageReporters json && nyc --silent --no-clean npm run test:e2e && nyc merge .nyc_output .nyc_output/final/coverage.json && nyc report --temp-dir .nyc_output/final/ --report-dir coverage --branches 80 --functions 80 --lines 80 --statements 80",
|
|
18
18
|
"test:unit": "jest",
|
|
19
19
|
"test:unit:debug": "node --inspect node_modules/jest/bin/jest.js --runInBand --no-coverage",
|
|
20
|
-
"
|
|
20
|
+
"pretest:e2e": "npm install -g puppeteer selenium-webdriver playwright webdriverio jsdom",
|
|
21
|
+
"test:e2e": "node . --batch \"test/e2e/[\\w_]*\\.json\" --report-dir e2e --start \"node test/e2e/serve.js\" --start-wait-url http://localhost:8081 --start-wait-method HEAD --start-timeout 30s",
|
|
21
22
|
"test:report": "node ./src/defaults/report.js ./test/report && reserve --config ./test/report/reserve.json",
|
|
22
23
|
"test:text-report": "node ./src/defaults/text-report.js ./test/report",
|
|
23
24
|
"build:doc": "node build/doc",
|
|
@@ -50,8 +51,8 @@
|
|
|
50
51
|
"reserve": "2.1.0"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
|
-
"@openui5/types": "^1.
|
|
54
|
-
"@ui5/cli": "^4.0.
|
|
54
|
+
"@openui5/types": "^1.134.0",
|
|
55
|
+
"@ui5/cli": "^4.0.14",
|
|
55
56
|
"@ui5/middleware-code-coverage": "^2.0.1",
|
|
56
57
|
"dotenv": "^16.4.7",
|
|
57
58
|
"jest": "^29.7.0",
|
|
@@ -60,7 +61,7 @@
|
|
|
60
61
|
"rimraf": "^6.0.1",
|
|
61
62
|
"standard": "^17.1.2",
|
|
62
63
|
"typescript": "^5.8.2",
|
|
63
|
-
"ui5-tooling-transpile": "^3.7.
|
|
64
|
+
"ui5-tooling-transpile": "^3.7.3"
|
|
64
65
|
},
|
|
65
66
|
"optionalDependencies": {
|
|
66
67
|
"fsevents": "^2.3.3"
|
package/src/coverage.js
CHANGED
|
@@ -30,16 +30,19 @@ async function nyc (job, ...args) {
|
|
|
30
30
|
output.nyc(...args)
|
|
31
31
|
const childProcess = fork(nycScript, args, { stdio: 'pipe' })
|
|
32
32
|
output.monitor(childProcess)
|
|
33
|
-
const { promise, resolve
|
|
34
|
-
childProcess.on('close',
|
|
35
|
-
if (code !== 0) {
|
|
36
|
-
reject(UTRError.NYC_FAILED(`Return code ${code}`))
|
|
37
|
-
}
|
|
38
|
-
resolve()
|
|
39
|
-
})
|
|
33
|
+
const { promise, resolve } = allocPromise()
|
|
34
|
+
childProcess.on('close', resolve)
|
|
40
35
|
return promise
|
|
41
36
|
}
|
|
42
37
|
|
|
38
|
+
async function safeNyc (job, ...args) {
|
|
39
|
+
const code = await nyc(job, ...args)
|
|
40
|
+
if (code !== 0) {
|
|
41
|
+
const [command] = args
|
|
42
|
+
throw UTRError.NYC_FAILED(`nyc ${command} failed with code ${code}`)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
43
46
|
const globalContextSearch = 'var global=new Function("return this")();'
|
|
44
47
|
const globalContextReplace = 'var global=window.top;'
|
|
45
48
|
|
|
@@ -84,7 +87,7 @@ async function instrument (job) {
|
|
|
84
87
|
}
|
|
85
88
|
}
|
|
86
89
|
job.status = 'Instrumenting'
|
|
87
|
-
await
|
|
90
|
+
await safeNyc(job, 'instrument', job.webapp, join(job.coverageTempDir, 'instrumented'), '--nycrc-path', job[$nycSettingsPath])
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
function getUrlOrigin (job) {
|
|
@@ -250,7 +253,7 @@ async function generateCoverageReport (job) {
|
|
|
250
253
|
const coverageMergedDir = join(job.coverageTempDir, 'merged')
|
|
251
254
|
await createDir(coverageMergedDir)
|
|
252
255
|
const coverageFilename = join(coverageMergedDir, 'coverage.json')
|
|
253
|
-
await
|
|
256
|
+
await safeNyc(job, 'merge', job.coverageTempDir, coverageFilename)
|
|
254
257
|
if (job[$coverageRemote]) {
|
|
255
258
|
await checkAllSourcesAreAvailable(job, coverageFilename)
|
|
256
259
|
}
|
|
@@ -271,13 +274,20 @@ async function generateCoverageReport (job) {
|
|
|
271
274
|
'--check-coverage'
|
|
272
275
|
)
|
|
273
276
|
}
|
|
274
|
-
await nyc(job, 'report', ...reporters, ...checks, '--temp-dir', coverageMergedDir, '--report-dir', job.coverageReportDir, '--nycrc-path', job[$nycSettingsPath])
|
|
277
|
+
const returnCode = await nyc(job, 'report', ...reporters, ...checks, '--temp-dir', coverageMergedDir, '--report-dir', job.coverageReportDir, '--nycrc-path', job[$nycSettingsPath])
|
|
275
278
|
if (checks.length) {
|
|
276
279
|
// The checks are not triggered if the coverage is empty
|
|
277
280
|
const lcov = await stat(join(job.coverageReportDir, 'lcov.info'))
|
|
278
281
|
if (lcov.size === 0) {
|
|
279
282
|
throw UTRError.NYC_FAILED('No coverage information extracted')
|
|
280
283
|
}
|
|
284
|
+
if (returnCode === 1) {
|
|
285
|
+
// Assuming coverage report shows the error
|
|
286
|
+
output.debug('coverage', `nyc report failed with code ${returnCode}`)
|
|
287
|
+
job.failed = true
|
|
288
|
+
}
|
|
289
|
+
} else if (returnCode !== 0) {
|
|
290
|
+
throw UTRError.NYC_FAILED(`nyc report failed with code ${returnCode}`)
|
|
281
291
|
}
|
|
282
292
|
}
|
|
283
293
|
|
package/src/report.js
CHANGED
|
@@ -43,9 +43,15 @@ module.exports = {
|
|
|
43
43
|
|
|
44
44
|
async generate (job) {
|
|
45
45
|
const output = getOutput(job)
|
|
46
|
+
try {
|
|
47
|
+
await generateCoverageReport(job)
|
|
48
|
+
} catch (e) {
|
|
49
|
+
output.genericError(e)
|
|
50
|
+
job.failed = true
|
|
51
|
+
}
|
|
52
|
+
job.status = 'Generating reports'
|
|
46
53
|
job.end = new Date()
|
|
47
54
|
job.failed = !!job.failed
|
|
48
|
-
job.status = 'Generating reports'
|
|
49
55
|
job.testPageHashes = job.testPageUrls.map(url => filename(url))
|
|
50
56
|
await save(job)
|
|
51
57
|
await generateTextReport(job)
|
|
@@ -71,11 +77,7 @@ module.exports = {
|
|
|
71
77
|
})
|
|
72
78
|
return promise
|
|
73
79
|
})
|
|
74
|
-
promises.push(generateCoverageReport(job).catch(e => {
|
|
75
|
-
output.genericError(e)
|
|
76
|
-
job.failed = true
|
|
77
|
-
}))
|
|
78
80
|
await Promise.all(promises)
|
|
79
|
-
job.status = 'Reports
|
|
81
|
+
job.status = 'Reports generated'
|
|
80
82
|
}
|
|
81
83
|
}
|
package/src/tests.js
CHANGED
package/src/ui5.js
CHANGED
|
@@ -8,6 +8,7 @@ const { getOutput, newProgress } = require('./output')
|
|
|
8
8
|
const { download } = require('./tools')
|
|
9
9
|
const { $statusProgressCount, $statusProgressTotal } = require('./symbols')
|
|
10
10
|
const { parallelize } = require('./parallelize')
|
|
11
|
+
const { relative: relativePath } = require('path')
|
|
11
12
|
|
|
12
13
|
const buildCacheBase = job => {
|
|
13
14
|
const [, hostName] = /https?:\/\/([^/]*)/.exec(job.ui5)
|
|
@@ -128,27 +129,37 @@ module.exports = {
|
|
|
128
129
|
'ignore-unverifiable-certificate': true
|
|
129
130
|
}]
|
|
130
131
|
|
|
131
|
-
|
|
132
|
+
for (let { relative, source } of job.libs) {
|
|
132
133
|
if (source.endsWith('/') || source.endsWith('\\')) {
|
|
133
134
|
source = source.substring(0, source.length - 1)
|
|
134
135
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
136
|
+
const relativeUrl = relative.replace(/\//g, '\\/')
|
|
137
|
+
if (source.startsWith(job.webapp)) {
|
|
138
|
+
const relativeAbsoluteUrl = '/' + relativePath(job.webapp, source).replace(/\\/g, '/')
|
|
139
|
+
getOutput(job).debug('libs', `${relative} maps to webapp sub directory, use internal redirection to ${relativeAbsoluteUrl}`)
|
|
140
|
+
mappings.unshift({
|
|
141
|
+
match: new RegExp(`\\/resources\\/${relativeUrl}(.*)`),
|
|
142
|
+
custom: (request, response, $1) => `${relativeAbsoluteUrl}${$1}`
|
|
143
|
+
})
|
|
144
|
+
} else {
|
|
145
|
+
mappings.unshift({
|
|
146
|
+
match: new RegExp(`\\/resources\\/${relativeUrl}(.*)`),
|
|
147
|
+
cwd: source,
|
|
148
|
+
file: '$1',
|
|
149
|
+
static: !job.watch && !job.debugDevMode
|
|
150
|
+
}, {
|
|
151
|
+
match: new RegExp(`\\/resources\\/${relativeUrl}(.*)`),
|
|
152
|
+
custom: (request, response, $1) => {
|
|
153
|
+
if ($1 === undefined) {
|
|
154
|
+
getOutput(job).debug('libs', `Unable to map ${relative} : $1 is undefined`)
|
|
155
|
+
} else {
|
|
156
|
+
getOutput(job).debug('libs', `Unable to map ${relative}/${$1} to ${join(source, $1)}`)
|
|
157
|
+
}
|
|
158
|
+
return 404
|
|
147
159
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
})
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
}
|
|
152
163
|
|
|
153
164
|
return mappings
|
|
154
165
|
}
|