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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ui5-test-runner",
3
- "version": "5.6.0",
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
- "test:e2e": "node . --batch test/e2e/.*\\.json --report-dir e2e --start \"node test/e2e/serve.js\" --start-wait-url http://localhost:8081 --start-wait-method HEAD --start-timeout 30s",
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.133.0",
54
- "@ui5/cli": "^4.0.13",
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.1"
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, reject } = allocPromise()
34
- childProcess.on('close', async code => {
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 nyc(job, 'instrument', job.webapp, join(job.coverageTempDir, 'instrumented'), '--nycrc-path', job[$nycSettingsPath])
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 nyc(job, 'merge', job.coverageTempDir, coverageFilename)
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 gemerated'
81
+ job.status = 'Reports generated'
80
82
  }
81
83
  }
package/src/tests.js CHANGED
@@ -127,8 +127,6 @@ async function process (job) {
127
127
  }
128
128
 
129
129
  await generate(job)
130
-
131
- // TODO: #105 integrate end, find a way it can change job.failed
132
130
  }
133
131
 
134
132
  module.exports = {
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
- job.libs.forEach(({ relative, source }) => {
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
- mappings.unshift({
136
- match: new RegExp(`\\/resources\\/${relative.replace(/\//g, '\\/')}(.*)`),
137
- cwd: source,
138
- file: '$1',
139
- static: !job.watch && !job.debugDevMode
140
- }, {
141
- match: new RegExp(`\\/resources\\/${relative.replace(/\//g, '\\/')}(.*)`),
142
- custom: async (request, response, $1) => {
143
- if ($1 === undefined) {
144
- getOutput(job).debug('libs', `Unable to map ${relative} : $1 is undefined`)
145
- } else {
146
- getOutput(job).debug('libs', `Unable to map ${relative}/${$1} to ${join(source, $1)}`)
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
- return 404
149
- }
150
- })
151
- })
160
+ })
161
+ }
162
+ }
152
163
 
153
164
  return mappings
154
165
  }