Skip to content

Commit 22aab6d

Browse files
authoredSep 28, 2024··
Unified Handler Tests (#2020)
* cleaning up * added some debug * fixed typo * refactored tests to show they are almost identical * fixed rejection trigger * removed debug code * cleaning up * replaced hack with Mocha setting * removed unreferenced variable
1 parent 51a4551 commit 22aab6d

File tree

5 files changed

+124
-226
lines changed

5 files changed

+124
-226
lines changed
 

‎.mocharc.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
allow-uncaught: true
12
exclude:
23
- test/helpers/scripts/*.js
34
exit: true

‎test/helpers/handler-tests.js

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
const assume = require('assume');
2+
3+
const helpers = require('.');
4+
const winston = require('../../lib/winston');
5+
6+
module.exports = function ({ helper, listener, name, setup, toggleSetting, trigger }) {
7+
describe('basics', function () {
8+
var handler;
9+
10+
beforeEach(function () {
11+
handler = helpers[helper]();
12+
});
13+
14+
it('has expected methods', function () {
15+
assume(handler.handle).is.a('function');
16+
assume(handler.unhandle).is.a('function');
17+
assume(handler.getAllInfo).is.a('function');
18+
assume(handler.getProcessInfo).is.a('function');
19+
assume(handler.getOsInfo).is.a('function');
20+
assume(handler.getTrace).is.a('function');
21+
});
22+
23+
it(`new ${name}()`, function () {
24+
assume(function () {
25+
// eslint-disable-next-line no-new
26+
new winston[name]();
27+
}).throws(/Logger is required/);
28+
});
29+
30+
it(`new ${name}(logger)`, function () {
31+
var logger = winston.createLogger();
32+
var handler_ = new winston[name](logger);
33+
assume(handler_.logger).equals(logger);
34+
});
35+
36+
it('.getProcessInfo()', function () {
37+
helpers.assertProcessInfo(handler.getProcessInfo());
38+
});
39+
40+
it('.getOsInfo()', function () {
41+
helpers.assertOsInfo(handler.getOsInfo());
42+
});
43+
44+
it('.getTrace(new Error)', function () {
45+
helpers.assertTrace(handler.getTrace(new Error()));
46+
});
47+
48+
it('.getTrace()', function () {
49+
helpers.assertTrace(handler.getTrace());
50+
});
51+
52+
it('.getAllInfo(undefined)', function () {
53+
// eslint-disable-next-line no-undefined
54+
handler.getAllInfo(undefined);
55+
});
56+
});
57+
58+
describe('when error case is triggered', function () {
59+
beforeEach(function () {
60+
this.listeners = helpers[setup]();
61+
});
62+
63+
afterEach(function () {
64+
this.listeners.restore();
65+
});
66+
67+
it('.handle()', function (done) {
68+
var msg = new Date().toString();
69+
var writeable = helpers.writeable(function (info) {
70+
assume(info).is.an('object');
71+
assume(info.error).is.an('error');
72+
assume(info.error.message).equals(msg);
73+
assume(info.message).includes(`${listener}: ${msg}`);
74+
assume(info.stack).is.a('string');
75+
assume(info.process).is.an('object');
76+
assume(info.os).is.an('object');
77+
assume(info.trace).is.an('array');
78+
79+
done();
80+
});
81+
82+
var transport = new winston.transports.Stream({ stream: writeable });
83+
var handler = helpers[helper]({
84+
exitOnError: false,
85+
transports: [transport]
86+
});
87+
88+
assume(handler.catcher).is.a('undefined');
89+
90+
transport[toggleSetting] = true;
91+
handler.handle();
92+
93+
assume(handler.catcher).is.a('function');
94+
assume(process.listeners(listener)).deep.equals([
95+
handler.catcher
96+
]);
97+
98+
trigger(msg);
99+
});
100+
});
101+
};

‎test/helpers/index.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88

99
const assume = require('assume'),
1010
fs = require('fs'),
11-
path = require('path'),
1211
through = require('through2'),
1312
spawn = require('child_process').spawn,
1413
stream = require('stream'),
15-
util = require('util'),
1614
winston = require('../../lib/winston'),
1715
mockTransport = require('./mocks/mock-transport');
1816

@@ -100,7 +98,7 @@ helpers.clearExceptions = function () {
10098
*/
10199
helpers.clearRejections = function () {
102100
var listeners = process.listeners('unhandledRejection');
103-
process.removeAllListeners('unhandledRejections');
101+
process.removeAllListeners('unhandledRejection');
104102

105103
return {
106104
restore: function () {
@@ -125,9 +123,7 @@ helpers.throw = function (msg) {
125123
* @param {String} msg Error mesage to use
126124
*/
127125
helpers.reject = function (msg) {
128-
return new Promise((resolve, reject) => {
129-
reject(msg);
130-
});
126+
return Promise.reject(msg);
131127
};
132128

133129
/**

‎test/unit/winston/exception-handler.test.js

+10-109
Original file line numberDiff line numberDiff line change
@@ -6,117 +6,18 @@
66
*
77
*/
88

9-
const stream = require('stream');
10-
const assume = require('assume');
11-
const mocha = require('mocha');
12-
const winston = require('../../../lib/winston');
9+
const baseHandlerTests = require('../../helpers/handler-tests');
1310
const helpers = require('../../helpers');
1411

15-
//
16-
// This is an awful and fragile hack that
17-
// needs to be changed ASAP.
18-
// https://github.com/mochajs/mocha/issues/1985
19-
//
20-
var _runTest = mocha.Runner.prototype.runTest;
21-
mocha.Runner.prototype.runTest = function () {
22-
this.allowUncaught = true;
23-
_runTest.apply(this, arguments);
24-
};
25-
2612
describe('ExceptionHandler', function () {
27-
this.timeout(5000);
28-
29-
it('has expected methods', function () {
30-
var handler = helpers.exceptionHandler();
31-
assume(handler.handle).is.a('function');
32-
assume(handler.unhandle).is.a('function');
33-
assume(handler.getAllInfo).is.a('function');
34-
assume(handler.getProcessInfo).is.a('function');
35-
assume(handler.getOsInfo).is.a('function');
36-
assume(handler.getTrace).is.a('function');
37-
});
38-
39-
it('new ExceptionHandler()', function () {
40-
assume(function () {
41-
new winston.ExceptionHandler();
42-
}).throws(/Logger is required/);
43-
});
44-
45-
it('new ExceptionHandler(logger)', function () {
46-
var logger = winston.createLogger();
47-
var handler = new winston.ExceptionHandler(logger);
48-
assume(handler.logger).equals(logger);
49-
});
50-
51-
it('.getProcessInfo()', function () {
52-
var handler = helpers.exceptionHandler();
53-
helpers.assertProcessInfo(handler.getProcessInfo());
54-
});
55-
56-
it('.getOsInfo()', function () {
57-
var handler = helpers.exceptionHandler();
58-
helpers.assertOsInfo(handler.getOsInfo());
59-
});
60-
61-
it('.getTrace(new Error)', function () {
62-
var handler = helpers.exceptionHandler();
63-
helpers.assertTrace(handler.getTrace(new Error()));
64-
});
65-
66-
it('.getTrace()', function () {
67-
var handler = helpers.exceptionHandler();
68-
helpers.assertTrace(handler.getTrace());
69-
});
70-
71-
it('.handle()', function (done) {
72-
var existing = helpers.clearExceptions();
73-
var writeable = new stream.Writable({
74-
objectMode: true,
75-
write: function (info) {
76-
assume(info).is.an('object');
77-
assume(info.error).is.an('error');
78-
assume(info.error.message).equals('wtf this error');
79-
assume(info.message).includes('uncaughtException: wtf this error');
80-
assume(info.stack).is.a('string');
81-
assume(info.process).is.an('object');
82-
assume(info.os).is.an('object');
83-
assume(info.trace).is.an('array');
84-
85-
existing.restore();
86-
done();
87-
}
88-
});
89-
90-
var transport = new winston.transports.Stream({ stream: writeable });
91-
var handler = helpers.exceptionHandler({
92-
exitOnError: false,
93-
transports: [transport]
94-
});
95-
96-
assume(handler.catcher).equals(undefined);
97-
98-
transport.handleExceptions = true;
99-
handler.handle();
100-
101-
assume(handler.catcher).is.a('function');
102-
assume(process.listeners('uncaughtException')).deep.equals([
103-
handler.catcher
104-
]);
105-
106-
helpers.throw('wtf this error');
107-
});
108-
109-
it('.getAllInfo(undefined)', function () {
110-
var handler = helpers.exceptionHandler();
111-
// eslint-disable-next-line no-undefined
112-
handler.getAllInfo(undefined);
113-
});
114-
115-
after(function () {
116-
//
117-
// Restore normal `runTest` functionality
118-
// so that we only affect the current suite.
119-
//
120-
mocha.Runner.prototype.runTest = _runTest;
13+
this.timeout(100);
14+
15+
baseHandlerTests({
16+
name: 'ExceptionHandler',
17+
helper: 'exceptionHandler',
18+
setup: 'clearExceptions',
19+
listener: 'uncaughtException',
20+
toggleSetting: 'handleExceptions',
21+
trigger: msg => helpers.throw(msg)
12122
});
12223
});

‎test/unit/winston/rejection-handler.test.js

+10-111
Original file line numberDiff line numberDiff line change
@@ -6,119 +6,18 @@
66
*
77
*/
88

9-
const stream = require('stream');
10-
const assume = require('assume');
11-
const mocha = require('mocha');
12-
const winston = require('../../../lib/winston');
9+
const baseHandlerTests = require('../../helpers/handler-tests');
1310
const helpers = require('../../helpers');
1411

15-
//
16-
// This is an awful and fragile hack that
17-
// needs to be changed ASAP.
18-
// https://github.com/mochajs/mocha/issues/1985
19-
//
20-
var _runTest = mocha.Runner.prototype.runTest;
21-
mocha.Runner.prototype.runTest = function () {
22-
this.allowUncaught = true;
23-
_runTest.apply(this, arguments);
24-
};
25-
2612
describe('UnhandledRejectionHandler', function () {
27-
this.timeout(5000);
28-
29-
it('has expected methods', function () {
30-
var handler = helpers.rejectionHandler();
31-
assume(handler.handle).is.a('function');
32-
assume(handler.unhandle).is.a('function');
33-
assume(handler.getAllInfo).is.a('function');
34-
assume(handler.getProcessInfo).is.a('function');
35-
assume(handler.getOsInfo).is.a('function');
36-
assume(handler.getTrace).is.a('function');
37-
});
38-
39-
it('new RejectionHandler()', function () {
40-
assume(function () {
41-
new winston.RejectionHandler();
42-
}).throws(/Logger is required/);
43-
});
44-
45-
it('new RejectionHandler(logger)', function () {
46-
var logger = winston.createLogger();
47-
var handler = new winston.RejectionHandler(logger);
48-
assume(handler.logger).equals(logger);
49-
});
50-
51-
it('.getProcessInfo()', function () {
52-
var handler = helpers.rejectionHandler();
53-
helpers.assertProcessInfo(handler.getProcessInfo());
54-
});
55-
56-
it('.getOsInfo()', function () {
57-
var handler = helpers.rejectionHandler();
58-
helpers.assertOsInfo(handler.getOsInfo());
59-
});
60-
61-
it('.getTrace(new Error)', function () {
62-
var handler = helpers.rejectionHandler();
63-
helpers.assertTrace(handler.getTrace(new Error()));
64-
});
65-
66-
it('.getTrace()', function () {
67-
var handler = helpers.rejectionHandler();
68-
helpers.assertTrace(handler.getTrace());
69-
});
70-
71-
it('.handle()', function (done) {
72-
process.removeAllListeners('unhandledRejection');
73-
var existing = helpers.clearRejections();
74-
var writeable = new stream.Writable({
75-
objectMode: true,
76-
write: function (info) {
77-
assume(info).is.an('object');
78-
assume(info.error).is.an('error');
79-
assume(info.rejection).is.true();
80-
assume(info.error.message).equals('wtf this rejection');
81-
assume(info.message).includes('unhandledRejection: wtf this rejection');
82-
assume(info.stack).is.a('string');
83-
assume(info.process).is.an('object');
84-
assume(info.os).is.an('object');
85-
assume(info.trace).is.an('array');
86-
87-
existing.restore();
88-
done();
89-
}
90-
});
91-
92-
var transport = new winston.transports.Stream({ stream: writeable });
93-
var handler = helpers.rejectionHandler({
94-
exitOnError: false,
95-
transports: [transport]
96-
});
97-
98-
assume(handler.catcher).equals(undefined);
99-
100-
transport.handleRejections = true;
101-
handler.handle();
102-
103-
assume(handler.catcher).is.a('function');
104-
assume(process.listeners('unhandledRejection')).deep.equals([
105-
handler.catcher
106-
]);
107-
108-
helpers.reject(new Error('wtf this rejection'));
109-
});
110-
111-
it('.getAllInfo(undefined)', function () {
112-
var handler = helpers.rejectionHandler();
113-
// eslint-disable-next-line no-undefined
114-
handler.getAllInfo(undefined);
115-
});
116-
117-
after(function () {
118-
//
119-
// Restore normal `runTest` functionality
120-
// so that we only affect the current suite.
121-
//
122-
mocha.Runner.prototype.runTest = _runTest;
13+
this.timeout(100);
14+
15+
baseHandlerTests({
16+
name: 'RejectionHandler',
17+
helper: 'rejectionHandler',
18+
setup: 'clearRejections',
19+
listener: 'unhandledRejection',
20+
toggleSetting: 'handleRejections',
21+
trigger: msg => helpers.reject(new Error(msg))
12322
});
12423
});

0 commit comments

Comments
 (0)
Please sign in to comment.