Skip to content

Commit 9648882

Browse files
Merge pull request #419 from anthony-redFox/master
fix(report): waiting promise resolve in onExist method fix #418
2 parents 32acafa + c93f061 commit 9648882

File tree

2 files changed

+85
-49
lines changed

2 files changed

+85
-49
lines changed

lib/reporter.js

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -218,58 +218,77 @@ var CoverageReporter = function (rootConfig, helper, logger, emitter) {
218218
coverageMap.merge(result.coverage)
219219
}
220220

221-
this.onRunComplete = async function (browsers, results) {
222-
const checkedCoverage = {}
223-
224-
for (const reporterConfig of reporters) {
225-
await Promise.all(browsers.map(async (browser) => {
226-
const coverageMap = coverageMaps[browser.id]
227-
if (!coverageMap) {
228-
return
229-
}
221+
let checkedCoverage = {}
222+
let promiseComplete = null
223+
224+
this.executeReport = async function (reporterConfig, browser) {
225+
const results = { exitCode: 0 }
226+
const coverageMap = coverageMaps[browser.id]
227+
if (!coverageMap) {
228+
return
229+
}
230230

231-
const mainDir = reporterConfig.dir || config.dir
232-
const subDir = reporterConfig.subdir || config.subdir
233-
const outputPath = generateOutputPath(basePath, browser.name, mainDir, subDir)
234-
const remappedCoverageMap = await sourceMapStore.transformCoverage(coverageMap)
235-
236-
const options = helper.merge(config, reporterConfig, {
237-
dir: outputPath,
238-
subdir: '',
239-
browser: browser,
240-
emitter: emitter,
241-
coverageMap: remappedCoverageMap
242-
})
243-
244-
// If config.check is defined, check coverage levels for each browser
245-
if (hasOwnProperty.call(config, 'check') && !checkedCoverage[browser.id]) {
246-
checkedCoverage[browser.id] = true
247-
var coverageFailed = checkCoverage(browser, remappedCoverageMap)
248-
if (coverageFailed && results) {
249-
results.exitCode = 1
250-
}
251-
}
231+
const mainDir = reporterConfig.dir || config.dir
232+
const subDir = reporterConfig.subdir || config.subdir
233+
const outputPath = generateOutputPath(basePath, browser.name, mainDir, subDir)
234+
const remappedCoverageMap = await sourceMapStore.transformCoverage(coverageMap)
235+
236+
const options = helper.merge(config, reporterConfig, {
237+
dir: outputPath,
238+
subdir: '',
239+
browser: browser,
240+
emitter: emitter,
241+
coverageMap: remappedCoverageMap
242+
})
252243

253-
const context = istanbulLibReport.createContext(options)
254-
const report = reports.create(reporterConfig.type || 'html', options)
244+
// If config.check is defined, check coverage levels for each browser
245+
if (hasOwnProperty.call(config, 'check') && !checkedCoverage[browser.id]) {
246+
checkedCoverage[browser.id] = true
247+
var coverageFailed = checkCoverage(browser, remappedCoverageMap)
248+
if (coverageFailed && results) {
249+
results.exitCode = 1
250+
}
251+
}
255252

256-
// // If reporting to console or in-memory skip directory creation
257-
const toDisk = !reporterConfig.type || !reporterConfig.type.match(/^(text|text-summary|in-memory)$/)
253+
const context = istanbulLibReport.createContext(options)
254+
const report = reports.create(reporterConfig.type || 'html', options)
258255

259-
if (!toDisk && reporterConfig.file === undefined) {
260-
report.execute(context)
261-
return
262-
}
256+
// // If reporting to console or in-memory skip directory creation
257+
const toDisk = !reporterConfig.type || !reporterConfig.type.match(/^(text|text-summary|in-memory)$/)
263258

264-
helper.mkdirIfNotExists(outputPath, function () {
265-
log.debug('Writing coverage to %s', outputPath)
266-
report.execute(context)
267-
})
268-
}))
259+
if (!toDisk && reporterConfig.file === undefined) {
260+
report.execute(context)
261+
return
269262
}
263+
264+
helper.mkdirIfNotExists(outputPath, function () {
265+
log.debug('Writing coverage to %s', outputPath)
266+
report.execute(context)
267+
})
268+
return results
270269
}
271270

272-
this.onExit = function (done) {
271+
this.onRunComplete = function (browsers) {
272+
checkedCoverage = {}
273+
let results = { exitCode: 0 }
274+
275+
const promiseCollection = reporters.map(reporterConfig =>
276+
Promise.all(browsers.map(async (browser) => {
277+
const res = await this.executeReport(reporterConfig, browser)
278+
if (res && res.exitCode === 1) {
279+
results = res
280+
}
281+
})))
282+
promiseComplete = Promise.all(promiseCollection).then(() => results)
283+
return promiseComplete
284+
}
285+
286+
this.onExit = async function (done) {
287+
const results = await promiseComplete
288+
if (results && results.exitCode === 1) {
289+
done(results.exitCode)
290+
return
291+
}
273292
if (typeof config._onExit === 'function') {
274293
config._onExit(done)
275294
} else {

test/reporter.spec.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ describe('reporter', () => {
141141
mkdirIfNotExistsStub.resetHistory()
142142
})
143143

144-
it('has no pending file writings', () => {
144+
it('has no pending file writings', async () => {
145145
const done = sinon.spy()
146-
reporter.onExit(done)
146+
await reporter.onExit(done)
147147
expect(done).to.have.been.called
148148
})
149149

@@ -298,6 +298,20 @@ describe('reporter', () => {
298298
expect(mkdirIfNotExistsStub).not.to.have.been.called
299299
})
300300

301+
it('should calls done callback when onComplete event will be complete', async () => {
302+
reporter = new m.CoverageReporter(rootConfig, mockHelper, mockLogger)
303+
reporter.onRunStart()
304+
browsers.forEach(b => reporter.onBrowserStart(b))
305+
reporter.onRunComplete(browsers)
306+
const done = sinon.stub()
307+
308+
const promiseExit = reporter.onExit(done)
309+
310+
expect(done.notCalled).to.be.true
311+
await promiseExit
312+
expect(done.calledOnce).to.be.true
313+
})
314+
301315
it('should create directory if reporting text* to file', async () => {
302316
const run = () => {
303317
reporter = new m.CoverageReporter(rootConfig, mockHelper, mockLogger)
@@ -435,7 +449,7 @@ describe('reporter', () => {
435449
expect(options.args[1].watermarks.lines).to.deep.equal(watermarks.lines)
436450
})
437451

438-
it('should log errors on low coverage and fail the build', async () => {
452+
it.only('should log errors on low coverage and fail the build', async () => {
439453
const customConfig = helper.merge({}, rootConfig, {
440454
coverageReporter: {
441455
check: {
@@ -472,10 +486,13 @@ describe('reporter', () => {
472486
reporter = new m.CoverageReporter(customConfig, mockHelper, customLogger)
473487
reporter.onRunStart()
474488
browsers.forEach(b => reporter.onBrowserStart(b))
475-
await reporter.onRunComplete(browsers, results)
489+
reporter.onRunComplete(browsers, results)
490+
491+
const done = sinon.stub()
492+
await reporter.onExit(done)
476493

477494
expect(spy1).to.have.been.called
478-
expect(results.exitCode).to.not.equal(0)
495+
expect(done.calledOnceWith(1)).to.be.true
479496
})
480497

481498
it('should not log errors on sufficient coverage and not fail the build', async () => {

0 commit comments

Comments
 (0)