From f41d29f35fb1c134d4cce9a9bb1051026f4cfb85 Mon Sep 17 00:00:00 2001 From: Bradley Momberger Date: Wed, 6 Jun 2018 15:00:52 -0400 Subject: [PATCH 1/3] Catch mocha errors in before/after hooks, and report them back as part of the contextual test in the current suite --- src/adapters/mocha.js | 20 +++- test/mocha/mocha-errors.html | 29 +++++ test/mocha/test-errors.js | 36 ++++++ test/mocha/test.js | 1 - test/test.js | 218 +++++++++++++++++++++++++++++++++++ 5 files changed, 302 insertions(+), 2 deletions(-) create mode 100644 test/mocha/mocha-errors.html create mode 100644 test/mocha/test-errors.js diff --git a/src/adapters/mocha.js b/src/adapters/mocha.js index ad52a57..82e913d 100644 --- a/src/adapters/mocha.js +++ b/src/adapters/mocha.js @@ -41,11 +41,29 @@ function TesteeReporter(runner) { }); pipe('fail', function(data, err) { - var diff = self.diff(data); + var diff; + var title = data.title; + if(data && data.type === "hook") { + if(data.ctx.currentTest) { + data = data.ctx.currentTest; + } else if(data.title === '"before all" hook') { + // tests in this suite will never run if before() fails, + // so create the first test in order to fail it. + data = data.parent.tests[0]; + diff = self.diff(data); + self.api['test'](diff); + } else { + // after all hook. apply to last test, which has already ran + data = data.parent.tests[data.parent.tests.length - 1]; + } + } + + diff = self.diff(data); diff.err = { message: err.message, stack: err.stack || '' }; + diff.title = title; return diff; }); diff --git a/test/mocha/mocha-errors.html b/test/mocha/mocha-errors.html new file mode 100644 index 0000000..179cc82 --- /dev/null +++ b/test/mocha/mocha-errors.html @@ -0,0 +1,29 @@ + + + + Mocha + + + + +
+ + + + + + + + + diff --git a/test/mocha/test-errors.js b/test/mocha/test-errors.js new file mode 100644 index 0000000..7c11d5b --- /dev/null +++ b/test/mocha/test-errors.js @@ -0,0 +1,36 @@ +describe('mocha', function() { + describe('Errors in setup/teardown', function() { + describe('before', function() { + before(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + describe('beforeEach', function() { + beforeEach(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + describe('afterEach', function() { + afterEach(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + describe('after', function() { + after(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + }) +}); diff --git a/test/mocha/test.js b/test/mocha/test.js index d889d5c..86343fd 100644 --- a/test/mocha/test.js +++ b/test/mocha/test.js @@ -24,5 +24,4 @@ describe('Test module', function() { }); }); }); - }); \ No newline at end of file diff --git a/test/test.js b/test/test.js index c9f8e0a..977053f 100644 --- a/test/test.js +++ b/test/test.js @@ -567,6 +567,224 @@ unit.test( testTester('mocha/mocha.html', mochaSnapshot) ); +// var mochaErrorsSnapshot = [{ +// "name": "api/runs::create", +// "data": { +// "status": "running", +// "environment": navigator.userAgent, +// "runner": "Mocha", +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/suites::create", +// "data": { +// "status": "running", +// "title": "", +// "pending": false, +// "root": true, +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/suites::create", +// "data": { +// "status": "running", +// "title": "mocha", +// "pending": false, +// "root": false, +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/suites::create", +// "data": { +// "status": "running", +// "title": "Errors in setup/teardown", +// "pending": false, +// "root": false, +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/suites::create", +// "data": { +// "status": "running", +// "title": "before", +// "pending": false, +// "root": false, +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::create", +// "data": { +// "title": "passes", +// "sync": true, +// "timedOut": false, +// //"pending": true, +// "type": "test", +// //"status": "pending", +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::patch", +// "data": { +// "status": "failed", +// "state": "failed", +// "title": "\"before all\" hook", +// "err": { +// "message": "Test error" +// } +// } +// }, { +// "name": "api/suites::patch", +// "data": { +// "status": "finished" +// } +// }, { +// "name": "api/suites::create", +// "data": { +// "status": "running", +// "title": "beforeEach", +// "pending": false, +// "root": false, +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::create", +// "data": { +// "title": "passes", +// "sync": true, +// "timedOut": false, +// "type": "test", +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::patch", +// "data": { +// "status": "failed", +// "state": "failed", +// "title": "\"before each\" hook for \"passes\"", +// "err": { +// "message": "Test error" +// } +// } +// }, { +// "name": "api/suites::patch", +// "data": { +// "status": "finished" +// } +// }, { +// "name": "api/suites::create", +// "data": { +// "status": "running", +// "title": "afterEach", +// "pending": false, +// "root": false, +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::create", +// "data": { +// "title": "passes", +// "sync": true, +// "timedOut": false, +// "type": "test", +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::patch", +// "data": { +// "status": "passed", +// "state": "passed" +// } +// }, { +// "name": "api/tests::patch", +// "data": { +// "status": "failed", +// "state": "failed", +// "title": "\"after each\" hook for \"passes\"", +// "err": { +// "message": "Test error" +// } +// } +// }, { +// "name": "api/suites::patch", +// "data": { +// "status": "finished" +// } +// }, { +// "name": "api/suites::create", +// "data": { +// "status": "running", +// "title": "after", +// "pending": false, +// "root": false, +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::create", +// "data": { +// "title": "passes", +// "sync": true, +// "timedOut": false, +// "type": "test", +// "file": /mocha\/mocha-errors\.html/ +// } +// }, { +// "name": "api/tests::patch", +// "data": { +// "status": "passed", +// "state": "passed" +// } +// }, { +// "name": "api/tests::patch", +// "data": { +// "status": "failed", +// "state": "failed", +// "title": "\"after all\" hook", +// "err": { +// "message": "Test error" +// } +// } +// }, { +// "name": "api/suites::patch", +// "data": { +// "status": "finished" +// } +// }, { +// "name": "api/suites::patch", +// "data": { +// "status": "finished" +// } +// }, { +// "name": "api/suites::patch", +// "data": { +// "status": "finished" +// } +// }, { +// "name": "api/suites::patch", +// "data": { +// "status": "finished" +// } +// }, { +// "name": "api/coverages::create", +// "data": { +// coverage: { +// "test": "Mocha coverage" +// } +// } +// }, { +// "name": "api/runs::patch", +// "data": { +// "status": "finished", +// "total": 6, +// "failed": 4, +// "pending": 0, +// "passed": 2 +// } +// }]; +// unit.test( +// 'runs the Mocha test and errors as appropriate', +// testTester('mocha/mocha-errors.html', mochaErrorsSnapshot) +// ); + var jasmineSnapshot = [{ "name": "api/runs::create", "data": { From 047299bf3e9cd30d01d29a7d889d0941da2871e0 Mon Sep 17 00:00:00 2001 From: Bradley Momberger Date: Wed, 6 Jun 2018 15:06:18 -0400 Subject: [PATCH 2/3] Add notes about reverting client-only change when server can be fixed --- src/adapters/mocha.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/adapters/mocha.js b/src/adapters/mocha.js index 82e913d..3bbdcf9 100644 --- a/src/adapters/mocha.js +++ b/src/adapters/mocha.js @@ -42,6 +42,10 @@ function TesteeReporter(runner) { pipe('fail', function(data, err) { var diff; + // Note: this is a workaround until https://github.com/bitovi/testee-client/pull/43 + // can be merged. The associated server PR https://github.com/bitovi/testee/pull/163 + // currently is failing to pass the tests, so #43 cannot be merged. Once that is working + // working, this change should be reverted. --BM 2018-06-06 var title = data.title; if(data && data.type === "hook") { if(data.ctx.currentTest) { From 090f363726bfd20f16a376cb738d7eaf6df0fa10 Mon Sep 17 00:00:00 2001 From: Bradley Momberger Date: Thu, 7 Jun 2018 14:35:59 -0400 Subject: [PATCH 3/3] Uncomment test for mocha errors --- test/test.js | 434 +++++++++++++++++++++++++-------------------------- 1 file changed, 217 insertions(+), 217 deletions(-) diff --git a/test/test.js b/test/test.js index 977053f..80c2448 100644 --- a/test/test.js +++ b/test/test.js @@ -567,223 +567,223 @@ unit.test( testTester('mocha/mocha.html', mochaSnapshot) ); -// var mochaErrorsSnapshot = [{ -// "name": "api/runs::create", -// "data": { -// "status": "running", -// "environment": navigator.userAgent, -// "runner": "Mocha", -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/suites::create", -// "data": { -// "status": "running", -// "title": "", -// "pending": false, -// "root": true, -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/suites::create", -// "data": { -// "status": "running", -// "title": "mocha", -// "pending": false, -// "root": false, -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/suites::create", -// "data": { -// "status": "running", -// "title": "Errors in setup/teardown", -// "pending": false, -// "root": false, -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/suites::create", -// "data": { -// "status": "running", -// "title": "before", -// "pending": false, -// "root": false, -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::create", -// "data": { -// "title": "passes", -// "sync": true, -// "timedOut": false, -// //"pending": true, -// "type": "test", -// //"status": "pending", -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::patch", -// "data": { -// "status": "failed", -// "state": "failed", -// "title": "\"before all\" hook", -// "err": { -// "message": "Test error" -// } -// } -// }, { -// "name": "api/suites::patch", -// "data": { -// "status": "finished" -// } -// }, { -// "name": "api/suites::create", -// "data": { -// "status": "running", -// "title": "beforeEach", -// "pending": false, -// "root": false, -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::create", -// "data": { -// "title": "passes", -// "sync": true, -// "timedOut": false, -// "type": "test", -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::patch", -// "data": { -// "status": "failed", -// "state": "failed", -// "title": "\"before each\" hook for \"passes\"", -// "err": { -// "message": "Test error" -// } -// } -// }, { -// "name": "api/suites::patch", -// "data": { -// "status": "finished" -// } -// }, { -// "name": "api/suites::create", -// "data": { -// "status": "running", -// "title": "afterEach", -// "pending": false, -// "root": false, -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::create", -// "data": { -// "title": "passes", -// "sync": true, -// "timedOut": false, -// "type": "test", -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::patch", -// "data": { -// "status": "passed", -// "state": "passed" -// } -// }, { -// "name": "api/tests::patch", -// "data": { -// "status": "failed", -// "state": "failed", -// "title": "\"after each\" hook for \"passes\"", -// "err": { -// "message": "Test error" -// } -// } -// }, { -// "name": "api/suites::patch", -// "data": { -// "status": "finished" -// } -// }, { -// "name": "api/suites::create", -// "data": { -// "status": "running", -// "title": "after", -// "pending": false, -// "root": false, -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::create", -// "data": { -// "title": "passes", -// "sync": true, -// "timedOut": false, -// "type": "test", -// "file": /mocha\/mocha-errors\.html/ -// } -// }, { -// "name": "api/tests::patch", -// "data": { -// "status": "passed", -// "state": "passed" -// } -// }, { -// "name": "api/tests::patch", -// "data": { -// "status": "failed", -// "state": "failed", -// "title": "\"after all\" hook", -// "err": { -// "message": "Test error" -// } -// } -// }, { -// "name": "api/suites::patch", -// "data": { -// "status": "finished" -// } -// }, { -// "name": "api/suites::patch", -// "data": { -// "status": "finished" -// } -// }, { -// "name": "api/suites::patch", -// "data": { -// "status": "finished" -// } -// }, { -// "name": "api/suites::patch", -// "data": { -// "status": "finished" -// } -// }, { -// "name": "api/coverages::create", -// "data": { -// coverage: { -// "test": "Mocha coverage" -// } -// } -// }, { -// "name": "api/runs::patch", -// "data": { -// "status": "finished", -// "total": 6, -// "failed": 4, -// "pending": 0, -// "passed": 2 -// } -// }]; -// unit.test( -// 'runs the Mocha test and errors as appropriate', -// testTester('mocha/mocha-errors.html', mochaErrorsSnapshot) -// ); +var mochaErrorsSnapshot = [{ + "name": "api/runs::create", + "data": { + "status": "running", + "environment": navigator.userAgent, + "runner": "Mocha", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "", + "pending": false, + "root": true, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "mocha", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "Errors in setup/teardown", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "before", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + //"pending": true, + "type": "test", + //"status": "pending", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"before all\" hook", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "beforeEach", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + "type": "test", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"before each\" hook for \"passes\"", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "afterEach", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + "type": "test", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "passed", + "state": "passed" + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"after each\" hook for \"passes\"", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "after", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + "type": "test", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "passed", + "state": "passed" + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"after all\" hook", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/coverages::create", + "data": { + coverage: { + "test": "Mocha coverage" + } + } +}, { + "name": "api/runs::patch", + "data": { + "status": "finished", + "total": 6, + "failed": 4, + "pending": 0, + "passed": 2 + } +}]; +unit.test( + 'runs the Mocha test and errors as appropriate', + testTester('mocha/mocha-errors.html', mochaErrorsSnapshot) +); var jasmineSnapshot = [{ "name": "api/runs::create",