ui5-test-runner 1.1.5 → 2.0.0

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.
Files changed (93) hide show
  1. package/README.md +32 -188
  2. package/index.js +47 -16
  3. package/package.json +28 -10
  4. package/src/add-test-pages.js +35 -0
  5. package/src/add-test-pages.spec.js +95 -0
  6. package/src/browser.spec.js +724 -0
  7. package/src/browsers.js +220 -59
  8. package/src/capabilities/index.js +194 -0
  9. package/src/capabilities/tests/basic/iframe.html +8 -0
  10. package/src/capabilities/tests/basic/index.html +12 -0
  11. package/src/capabilities/tests/basic/index.js +20 -0
  12. package/src/capabilities/tests/basic/ui5.html +24 -0
  13. package/src/capabilities/tests/dynamic-include/index.js +21 -0
  14. package/src/capabilities/tests/dynamic-include/mix.html +11 -0
  15. package/src/capabilities/tests/dynamic-include/one.html +11 -0
  16. package/src/capabilities/tests/dynamic-include/post.js +3 -0
  17. package/src/capabilities/tests/dynamic-include/test.js +1 -0
  18. package/src/capabilities/tests/dynamic-include/two.html +11 -0
  19. package/src/capabilities/tests/index.js +16 -0
  20. package/src/capabilities/tests/local-storage/index.html +16 -0
  21. package/src/capabilities/tests/local-storage/index.js +21 -0
  22. package/src/capabilities/tests/screenshot/index.html +13 -0
  23. package/src/capabilities/tests/screenshot/index.js +18 -0
  24. package/src/capabilities/tests/scripts/index.js +50 -0
  25. package/src/capabilities/tests/scripts/qunit.html +22 -0
  26. package/src/capabilities/tests/scripts/testsuite.html +10 -0
  27. package/src/capabilities/tests/scripts/testsuite.js +8 -0
  28. package/src/capabilities/tests/timeout/index.html +21 -0
  29. package/src/capabilities/tests/timeout/index.js +19 -0
  30. package/src/capabilities/tests/traces/index.html +18 -0
  31. package/src/capabilities/tests/traces/index.js +81 -0
  32. package/src/cors.js +1 -1
  33. package/src/cors.spec.js +41 -0
  34. package/src/coverage.js +30 -18
  35. package/src/coverage.spec.js +79 -0
  36. package/src/csv-reader.js +36 -0
  37. package/src/csv-reader.spec.js +42 -0
  38. package/src/csv-writer.js +52 -0
  39. package/src/csv-writer.spec.js +77 -0
  40. package/src/defaults/browser.js +144 -0
  41. package/src/defaults/jsdom/compatibility.js +95 -0
  42. package/src/defaults/jsdom/debug.js +23 -0
  43. package/src/defaults/jsdom/resource-loader.js +43 -0
  44. package/src/defaults/jsdom/sap.ui.test.matchers.visible.js +39 -0
  45. package/src/defaults/jsdom.js +64 -0
  46. package/src/defaults/junit-xml-report.js +64 -0
  47. package/src/defaults/puppeteer.js +111 -0
  48. package/src/defaults/report/common.js +38 -0
  49. package/src/defaults/report/default.html +84 -0
  50. package/src/defaults/report/main.js +44 -0
  51. package/src/defaults/report/progress.js +49 -0
  52. package/src/defaults/report/styles.css +66 -0
  53. package/src/defaults/report.js +69 -0
  54. package/src/defaults/selenium-webdriver/chrome.js +38 -0
  55. package/src/defaults/selenium-webdriver/edge.js +25 -0
  56. package/src/defaults/selenium-webdriver/firefox.js +31 -0
  57. package/src/defaults/selenium-webdriver.js +138 -0
  58. package/src/endpoints.js +70 -124
  59. package/src/error.js +52 -0
  60. package/src/error.spec.js +17 -0
  61. package/src/get-job-progress.js +69 -0
  62. package/src/get-job-progress.spec.js +175 -0
  63. package/src/inject/post.js +96 -0
  64. package/src/inject/post.spec.js +147 -0
  65. package/src/inject/qunit-hooks.js +6 -21
  66. package/src/inject/qunit-intercept.js +30 -0
  67. package/src/inject/qunit-redirect.js +15 -7
  68. package/src/job-mode.js +45 -0
  69. package/src/job.js +254 -108
  70. package/src/job.spec.js +413 -0
  71. package/src/npm.js +73 -0
  72. package/src/npm.spec.js +98 -0
  73. package/src/options.js +73 -0
  74. package/src/options.spec.js +125 -0
  75. package/src/output.js +450 -131
  76. package/src/qunit-hooks.js +116 -0
  77. package/src/qunit-hooks.spec.js +687 -0
  78. package/src/report.js +42 -0
  79. package/src/reserve.js +3 -4
  80. package/src/simulate.spec.js +437 -0
  81. package/src/symbols.js +8 -0
  82. package/src/tests.js +127 -84
  83. package/src/timeout.spec.js +39 -0
  84. package/src/tools.js +111 -4
  85. package/src/tools.spec.js +90 -0
  86. package/src/ui5.js +3 -3
  87. package/src/unhandled.js +6 -6
  88. package/src/unhandled.spec.js +63 -0
  89. package/defaults/chromium.js +0 -62
  90. package/src/progress.html +0 -71
  91. package/src/proxies.js +0 -8
  92. package/src/report.html +0 -202
  93. /package/{defaults → src/defaults}/nyc.json +0 -0
package/src/report.js ADDED
@@ -0,0 +1,42 @@
1
+ 'use strict'
2
+
3
+ const { join } = require('path')
4
+ const { writeFile } = require('fs').promises
5
+ const { generateCoverageReport } = require('./coverage')
6
+ const { filename, allocPromise } = require('./tools')
7
+ const { fork } = require('child_process')
8
+ const { getOutput } = require('./output')
9
+
10
+ async function serialize (job, filename, json) {
11
+ await writeFile(join(job.reportDir, `${filename}.js`), `module.exports = ${JSON.stringify(json, undefined, 2)}`)
12
+ }
13
+
14
+ async function save (job) {
15
+ await serialize(job, 'job', job)
16
+ }
17
+
18
+ module.exports = {
19
+ save,
20
+
21
+ async generate (job) {
22
+ const output = getOutput(job)
23
+ job.end = new Date()
24
+ job.failed = !!job.failed
25
+ job.status = 'Generating reports'
26
+ output.results()
27
+ job.testPageHashes = job.testPageUrls.map(url => filename(url))
28
+ await save(job)
29
+ const promises = job.reportGenerator.map(generator => {
30
+ const { promise, resolve } = allocPromise()
31
+ const childProcess = fork(generator, [job.reportDir], {
32
+ stdio: [0, 0, 0, 'ipc']
33
+ })
34
+ childProcess.on('close', resolve)
35
+ return promise
36
+ })
37
+ promises.push(generateCoverageReport(job))
38
+ await Promise.all(promises)
39
+ output.timeSpent(job.start)
40
+ job.status = 'Done'
41
+ }
42
+ }
package/src/reserve.js CHANGED
@@ -1,6 +1,5 @@
1
1
  const { join } = require('path')
2
2
  const cors = require('./cors')
3
- const proxies = require('./proxies')
4
3
  const endpoints = require('./endpoints')
5
4
  const { mappings: coverage } = require('./coverage')
6
5
  const ui5 = require('./ui5')
@@ -11,16 +10,16 @@ module.exports = job => check({
11
10
  port: job.port,
12
11
  mappings: [
13
12
  cors,
14
- ...proxies(job),
15
- ...endpoints(job),
13
+ ...job.serveOnly ? [] : endpoints(job),
16
14
  ...ui5(job),
17
- ...coverage(job), {
15
+ ...job.serveOnly ? [] : coverage(job), {
18
16
  // Project mapping
19
17
  match: /^\/(.*)/,
20
18
  file: join(job.webapp, '$1'),
21
19
  strict: true,
22
20
  'ignore-if-not-found': true
23
21
  },
22
+ ...job.mappings ?? [],
24
23
  ...unhandled(job)
25
24
  ]
26
25
  })
@@ -0,0 +1,437 @@
1
+ const { join, dirname } = require('path')
2
+ const { mock } = require('reserve')
3
+ const jobFactory = require('./job')
4
+ const reserveConfigurationFactory = require('./reserve')
5
+ const { mock: mockChildProcess } = require('child_process')
6
+ const { execute } = require('./tests')
7
+ const nock = require('nock')
8
+ const { readFile, stat, writeFile } = require('fs').promises
9
+ const { cleanDir } = require('./tools')
10
+ const { UTRError } = require('./error')
11
+ const { $browsers } = require('./symbols')
12
+ const { getOutput } = require('./output')
13
+
14
+ describe('simulate', () => {
15
+ const simulatePath = join(__dirname, '../tmp/simulate')
16
+ const cwd = join(__dirname, '../test/project')
17
+
18
+ let job
19
+ let mocked
20
+ let pages = {}
21
+
22
+ beforeAll(() => {
23
+ const nockScope = nock('https://ui5.sap.com/').persist()
24
+ const nockContent = [
25
+ '/resources/sap-ui-core.js',
26
+ '/resources/sap/ui/qunit/qunit-redirect.js',
27
+ '/resources/sap/ui/thirdparty/qunit.js',
28
+ '/resources/sap/ui/thirdparty/qunit-2.js'
29
+ ]
30
+ nockContent.forEach(url => {
31
+ nockScope.get(url).reply(200, `/* ${url} */`)
32
+ })
33
+ nockScope.get('/resources/not-found.js').reply(404)
34
+ nockScope.get('/resources/error.js').reply(500)
35
+ return cleanDir(simulatePath)
36
+ })
37
+
38
+ async function get (url, referer) {
39
+ return await mocked.request('GET', url, { 'x-page-url': referer })
40
+ }
41
+
42
+ async function post (url, referer, body) {
43
+ const json = JSON.stringify(body)
44
+ return await mocked.request('POST', url, {
45
+ 'x-page-url': referer,
46
+ 'content-type': 'application/json',
47
+ 'content-length': json.length
48
+ }, json)
49
+ }
50
+
51
+ async function simulateOK (referer, __coverage__ = undefined) {
52
+ await post('/_/QUnit/begin', referer, { totalTests: 1, modules: [{ tests: [{ testId: '1' }] }] })
53
+ await post('/_/QUnit/testDone', referer, { testId: '1', failed: 0, passed: 1 })
54
+ await post('/_/QUnit/done', referer, { failed: 0, __coverage__ })
55
+ }
56
+
57
+ async function setup (name, parameters) {
58
+ mockChildProcess({
59
+ api: 'fork',
60
+ scriptPath: /puppeteer\.js$/,
61
+ exec: async childProcess => {
62
+ const config = JSON.parse((await readFile(childProcess.args[0])).toString())
63
+ const { capabilities, url: referer } = config
64
+ if (typeof capabilities === 'string') {
65
+ await writeFile(capabilities, JSON.stringify({
66
+ console: true,
67
+ scripts: true
68
+ }))
69
+ childProcess.close()
70
+ } else {
71
+ childProcess.on('message.received', message => {
72
+ if (message.command === 'stop') {
73
+ childProcess.close()
74
+ }
75
+ })
76
+ const pageName = Object.keys(pages).filter(page => referer.endsWith(page))[0]
77
+ if (pageName) {
78
+ await pages[pageName](referer)
79
+ } else {
80
+ console.warn(`Page ${referer} not found`)
81
+ expect(false).toStrictEqual(true)
82
+ }
83
+ }
84
+ },
85
+ close: false
86
+ })
87
+
88
+ mockChildProcess({
89
+ api: 'fork',
90
+ scriptPath: /\breport\.js$/,
91
+ exec: async childProcess => {
92
+ const reportDir = childProcess.args[0]
93
+ await writeFile(join(reportDir, 'report.html'), '<html />')
94
+ }
95
+ })
96
+
97
+ job = jobFactory.fromObject(cwd, {
98
+ reportDir: join(simulatePath, name, 'report'),
99
+ coverageTempDir: join(simulatePath, name, 'coverage/temp'),
100
+ coverageReportDir: join(simulatePath, name, 'coverage/report'),
101
+ coverage: false,
102
+ ...parameters
103
+ })
104
+ const configuration = await reserveConfigurationFactory(job)
105
+ mocked = await mock(configuration)
106
+ }
107
+
108
+ async function safeExecute () {
109
+ try {
110
+ getOutput(job).reportOnJobProgress()
111
+ await execute(job)
112
+ } catch (e) {
113
+ if (e instanceof UTRError && e.code === UTRError.BROWSER_FAILED_CODE) {
114
+ const exception = Object.keys(job[$browsers])
115
+ .map(url => job[$browsers][url].childProcess && job[$browsers][url].childProcess.exception)
116
+ .filter(e => !!e)[0]
117
+ throw exception
118
+ }
119
+ throw e
120
+ }
121
+ }
122
+
123
+ describe('legacy (local project)', () => {
124
+ describe('simple test execution', () => {
125
+ beforeAll(async () => {
126
+ await setup('simple')
127
+ pages = {
128
+ 'testsuite.qunit.html': async referer => {
129
+ const response = await get('/resources/sap/ui/qunit/qunit-redirect.js', referer)
130
+ expect(response.statusCode).toStrictEqual(200)
131
+ expect(response.toString().includes('qunit-redirect.js */')).toStrictEqual(false)
132
+ expect(response.toString().includes('addTestPages')).toStrictEqual(true)
133
+ await post('/_/addTestPages', referer, [
134
+ referer.replace('testsuite.qunit.html', 'page1.html'),
135
+ referer.replace('testsuite.qunit.html', 'page2.html')
136
+ ])
137
+ },
138
+ 'page1.html': async referer => {
139
+ const response = await get('/resources/sap/ui/thirdparty/qunit.js', referer)
140
+ expect(response.statusCode).toStrictEqual(200)
141
+ expect(response.toString().includes('qunit.js */')).toStrictEqual(true)
142
+ expect(response.toString().includes('QUnit/begin')).toStrictEqual(true)
143
+ simulateOK(referer)
144
+ },
145
+ 'page2.html': async referer => {
146
+ const response = await get('/resources/sap/ui/thirdparty/qunit-2.js', referer)
147
+ expect(response.statusCode).toStrictEqual(200)
148
+ expect(response.toString().includes('qunit-2.js */')).toStrictEqual(true)
149
+ expect(response.toString().includes('QUnit/begin')).toStrictEqual(true)
150
+ simulateOK(referer)
151
+ }
152
+ }
153
+ await safeExecute()
154
+ })
155
+
156
+ it('succeeded', () => {
157
+ expect(job.failed).toStrictEqual(false)
158
+ })
159
+
160
+ it('provides a progress endpoint', async () => {
161
+ const response = await mocked.request('GET', '/_/progress')
162
+ expect(response.statusCode).toStrictEqual(200)
163
+ const progress = JSON.parse(response.toString())
164
+ expect(Object.keys(progress.qunitPages).length).toStrictEqual(2)
165
+
166
+ const page1 = Object.keys(progress.qunitPages).filter(url => url.endsWith('page1.html'))
167
+ expect(page1).not.toBeUndefined()
168
+ const qunitPage1 = progress.qunitPages[page1]
169
+ expect(qunitPage1).not.toStrictEqual(undefined)
170
+ expect(qunitPage1.failed).toStrictEqual(0)
171
+ expect(qunitPage1.passed).toStrictEqual(1)
172
+ expect(qunitPage1.report).not.toStrictEqual(undefined)
173
+
174
+ const page2 = Object.keys(progress.qunitPages).filter(url => url.endsWith('page2.html'))
175
+ expect(page2).not.toBeUndefined()
176
+ const qunitPage2 = progress.qunitPages[page2]
177
+ expect(qunitPage2).not.toStrictEqual(undefined)
178
+ })
179
+
180
+ it('generates a report', async () => {
181
+ const info = await stat(join(job.reportDir, 'report.html'))
182
+ expect(info.isFile()).toStrictEqual(true)
183
+ expect(info.size).toBeGreaterThan(0)
184
+ })
185
+ })
186
+
187
+ describe('error', () => {
188
+ describe('one test fail', () => {
189
+ beforeAll(async () => {
190
+ await setup('error1')
191
+ pages = {
192
+ 'testsuite.qunit.html': async referer => {
193
+ await post('/_/addTestPages', referer, [
194
+ '/page1.html',
195
+ '/page2.html'
196
+ ])
197
+ },
198
+ 'page1.html': referer => simulateOK(referer),
199
+ 'page2.html': async referer => {
200
+ await post('/_/QUnit/begin', referer, { totalTests: 1, modules: [{ tests: [{ testId: '1' }] }] })
201
+ await post('/_/QUnit/testDone', referer, { testId: '1', failed: 1, passed: 0 })
202
+ await post('/_/QUnit/done', referer, { failed: 1 })
203
+ }
204
+ }
205
+ await safeExecute()
206
+ })
207
+
208
+ it('failed', () => {
209
+ expect(job.failed).toStrictEqual(true)
210
+ })
211
+ })
212
+
213
+ describe('several tests fail', () => {
214
+ beforeAll(async () => {
215
+ await setup('errorN')
216
+ pages = {
217
+ 'testsuite.qunit.html': async referer => {
218
+ await post('/_/addTestPages', referer, [
219
+ '/page1.html',
220
+ '/page2.html',
221
+ '/page3.html'
222
+ ])
223
+ },
224
+ 'page1.html': referer => simulateOK(referer),
225
+ 'page2.html': async referer => {
226
+ await post('/_/QUnit/begin', referer, { totalTests: 1, modules: [{ tests: [{ testId: '1' }] }] })
227
+ await post('/_/QUnit/testDone', referer, { testId: '1', failed: 1, passed: 0 })
228
+ await post('/_/QUnit/done', referer, { failed: 1 })
229
+ },
230
+ 'page3.html': async referer => {
231
+ await post('/_/QUnit/begin', referer, { totalTests: 2, modules: [{ tests: [{ testId: '2' }, { testId: '3' }] }] })
232
+ await post('/_/QUnit/testDone', referer, { testId: '2', failed: 2, passed: 0 })
233
+ await post('/_/QUnit/testDone', referer, { testId: '3', failed: 1, passed: 0 })
234
+ await post('/_/QUnit/done', referer, { failed: 3 })
235
+ }
236
+ }
237
+ await safeExecute()
238
+ })
239
+
240
+ it('failed', () => {
241
+ expect(job.failed).toStrictEqual(true)
242
+ })
243
+ })
244
+
245
+ describe('invalid QUnit hooks', () => {
246
+ beforeAll(async () => {
247
+ await setup('errorQunit')
248
+ pages = {
249
+ 'testsuite.qunit.html': async referer => {
250
+ await post('/_/addTestPages', referer, [
251
+ '/page1.html',
252
+ '/page2.html'
253
+ ])
254
+ },
255
+ 'page1.html': async referer => {
256
+ simulateOK(referer)
257
+ },
258
+ 'page2.html': async referer => {
259
+ // The next call will dump an error because the missing /_/QUnit/begin call generates the page structure
260
+ await post('/_/QUnit/testDone', referer, { failed: 1, passed: 0 })
261
+ await post('/_/QUnit/done', referer, { failed: 1 })
262
+ }
263
+ }
264
+ await safeExecute()
265
+ })
266
+
267
+ it('failed', () => {
268
+ expect(job.failed).toStrictEqual(true)
269
+ })
270
+ })
271
+ })
272
+
273
+ describe('global timeout', () => {
274
+ beforeAll(async () => {
275
+ await setup('timeout', {
276
+ parallel: 1,
277
+ globalTimeout: 10000
278
+ })
279
+ pages = {
280
+ 'testsuite.qunit.html': async referer => {
281
+ await post('/_/addTestPages', referer, [
282
+ '/page1.html',
283
+ '/page2.html'
284
+ ])
285
+ },
286
+ 'page1.html': async headers => {
287
+ job.globalTimeout = 1 // Update to ensure the code will globally time out *after* page1
288
+ simulateOK(headers)
289
+ },
290
+ 'page2.html': async headers => {
291
+ expect(false).toStrictEqual(true) // Should not be executed
292
+ }
293
+ }
294
+ await safeExecute()
295
+ })
296
+
297
+ it('failed', () => {
298
+ expect(job.failed).toStrictEqual(true)
299
+ })
300
+ })
301
+
302
+ describe('coverage substitution and ui5 cache', () => {
303
+ let ui5Cache
304
+
305
+ beforeAll(async () => {
306
+ ui5Cache = join(__dirname, '../tmp/simulate/coverage_and_cache/ui5')
307
+ await cleanDir(ui5Cache)
308
+ await setup('coverage_and_cache', {
309
+ cache: ui5Cache,
310
+ coverage: true,
311
+ browserRetry: 0
312
+ })
313
+ pages = {
314
+ 'testsuite.qunit.html': async referer => {
315
+ const cachedResponses = await Promise.all([
316
+ get('/resources/sap-ui-core.js', referer),
317
+ get('/resources/sap-ui-core.js', referer)
318
+ ])
319
+ expect(cachedResponses[0].statusCode).toStrictEqual(200)
320
+ expect(cachedResponses[0].toString().includes('sap-ui-core.js */')).toStrictEqual(true)
321
+ const notFoundResponse = await get('/resources/not-found.js', referer)
322
+ expect(notFoundResponse.statusCode).toStrictEqual(404)
323
+ const errorResponse = await get('/resources/error.js', referer)
324
+ expect(errorResponse.statusCode).toStrictEqual(500)
325
+ await post('/_/addTestPages', referer, [
326
+ '/page1.html',
327
+ '/page2.html'
328
+ ])
329
+ },
330
+ 'page1.html': async referer => {
331
+ const coverageResponse = await get('/component.js', referer)
332
+ expect(coverageResponse.statusCode).toStrictEqual(200)
333
+ expect(coverageResponse.toString().includes('UIComponent.extend(\'app.Component\'')).toStrictEqual(true)
334
+ expect(coverageResponse.toString().includes('var global=new Function("return this")();')).toStrictEqual(false)
335
+ expect(coverageResponse.toString().includes('var global=window.top;')).toStrictEqual(true)
336
+ const cachedResponse = await get('/resources/sap/ui/thirdparty/qunit.js', referer)
337
+ expect(cachedResponse.statusCode).toStrictEqual(200)
338
+ expect(cachedResponse.toString().includes('qunit.js */')).toStrictEqual(true)
339
+ expect(cachedResponse.toString().includes('QUnit/begin')).toStrictEqual(true)
340
+ simulateOK(referer, {})
341
+ },
342
+ 'page2.html': async referer => {
343
+ const cachedResponse = await get('/resources/not-found.js', referer)
344
+ expect(cachedResponse.statusCode).toStrictEqual(404)
345
+ simulateOK(referer, {})
346
+ }
347
+ }
348
+ await safeExecute()
349
+ })
350
+
351
+ it('succeeded', () => {
352
+ expect(job.failed).toStrictEqual(false)
353
+ })
354
+ })
355
+
356
+ describe('error and failFast (stop after first failure)', () => {
357
+ beforeAll(async () => {
358
+ await setup('fail_fast', {
359
+ parallel: 1,
360
+ failFast: null
361
+ })
362
+ pages = {
363
+ 'testsuite.qunit.html': async headers => {
364
+ await post('/_/addTestPages', headers, [
365
+ '/page1.html',
366
+ '/page2.html',
367
+ '/page3.html',
368
+ '/page4.html'
369
+ ])
370
+ },
371
+ 'page1.html': async referer => {
372
+ simulateOK(referer)
373
+ },
374
+ 'page2.html': async referer => {
375
+ await post('/_/QUnit/begin', referer, { totalTests: 1 })
376
+ await post('/_/QUnit/testDone', referer, { failed: 1, passed: 0 })
377
+ await post('/_/QUnit/done', referer, { failed: 1 })
378
+ }
379
+ // Should not try to run page 3 & 4
380
+ }
381
+ await execute(job)
382
+ })
383
+
384
+ it('failed', () => {
385
+ expect(job.failed).toStrictEqual(true)
386
+ })
387
+ })
388
+
389
+ describe('error when no page found', () => {
390
+ beforeAll(async () => {
391
+ await setup('no_page', {
392
+ parallel: 1
393
+ })
394
+ pages = {
395
+ 'testsuite.qunit.html': async referer => {
396
+ await post('/_/addTestPages', referer, [])
397
+ }
398
+ }
399
+ await execute(job)
400
+ })
401
+
402
+ it('failed', () => {
403
+ expect(job.failed).toStrictEqual(true)
404
+ })
405
+ })
406
+
407
+ describe('ui5 libraries', () => {
408
+ beforeAll(async () => {
409
+ await setup('libs', {
410
+ ui5: 'https://any.cdn.com/',
411
+ libs: [dirname(__dirname), `inject/=${join(__dirname, 'inject')}`]
412
+ })
413
+ pages = {
414
+ 'testsuite.qunit.html': async referer => {
415
+ await post('/_/addTestPages', referer, [
416
+ '/page1.html'
417
+ ])
418
+ },
419
+ 'page1.html': async referer => {
420
+ const response1 = await get('/resources/inject/qunit-hooks.js', referer)
421
+ expect(response1.statusCode).toStrictEqual(200)
422
+ expect(response1.toString().includes('/* Injected QUnit hooks */')).toStrictEqual(true)
423
+ const response2 = await get('/resources/src/inject/qunit-hooks.js', referer)
424
+ expect(response2.statusCode).toStrictEqual(200)
425
+ expect(response2.toString().includes('/* Injected QUnit hooks */')).toStrictEqual(true)
426
+ simulateOK(referer)
427
+ }
428
+ }
429
+ await execute(job)
430
+ })
431
+
432
+ it('succeeded', () => {
433
+ expect(job.failed).toStrictEqual(false)
434
+ })
435
+ })
436
+ })
437
+ })
package/src/symbols.js ADDED
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ $browsers: Symbol('browsers'),
3
+ $probeUrlsStarted: Symbol('probeUrlsStarted'),
4
+ $probeUrlsCompleted: Symbol('probeUrlsCompleted'),
5
+ $testPagesStarted: Symbol('testPagesStarted'),
6
+ $testPagesCompleted: Symbol('testPagesCompleted'),
7
+ $valueSources: Symbol('valueSources')
8
+ }