Skip to content

Commit e01debf

Browse files
authored
Merge pull request #13 from blackflux/dev
[Gally]: master <- dev
2 parents c2705bd + def375e commit e01debf

7 files changed

Lines changed: 136 additions & 5 deletions

File tree

‎README.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,10 @@ Type: `number`<br>
5353
Default: `null`
5454

5555
Set timestamp to freeze time to. Will modify the result of e.g. `new Date()`.
56+
57+
#### recordConsole
58+
59+
Type: `boolean`<br>
60+
Default: `false`
61+
62+
When set to true, console logging calls are recorded and can be accessed by calling `getLogs()` from within the test.

‎src/index.js‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
module.exports.desc = require('./util/desc');
22
module.exports.EnvManager = require('./util/env-manager');
33
module.exports.timeKeeper = require('./util/time-keeper');
4+
module.exports.ConsoleRecorder = require('./util/console-recorder');

‎src/util/console-recorder.js‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/* eslint-disable no-console */
2+
const assert = require('assert');
3+
4+
module.exports = (verbose) => {
5+
let consoleOriginal = null;
6+
const logs = [];
7+
const defaultLogs = [];
8+
const errorLogs = [];
9+
return {
10+
inject: () => {
11+
assert(consoleOriginal === null);
12+
consoleOriginal = ['log', 'info', 'error', 'warn']
13+
.reduce((p, c) => Object.assign(p, { [c]: console[c] }), {});
14+
logs.length = 0;
15+
defaultLogs.length = 0;
16+
errorLogs.length = 0;
17+
Object.keys(consoleOriginal).forEach((logLevel) => {
18+
console[logLevel] = (...args) => {
19+
if (verbose === true) {
20+
consoleOriginal[logLevel](...args);
21+
}
22+
logs.push(...args);
23+
(['log', 'info'].includes(logLevel) ? defaultLogs : errorLogs).push(...args);
24+
};
25+
});
26+
},
27+
release: () => {
28+
assert(consoleOriginal !== null);
29+
Object.assign(console, consoleOriginal);
30+
consoleOriginal = null;
31+
},
32+
get: () => ({
33+
logs: logs.slice(),
34+
defaultLogs: defaultLogs.slice(),
35+
errorLogs: errorLogs.slice()
36+
})
37+
};
38+
};

‎src/util/desc.js‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const nockBack = require('nock').back;
77
const Joi = require('joi-strict');
88
const EnvManager = require('./env-manager');
99
const timeKeeper = require('./time-keeper');
10+
const ConsoleRecorder = require('./console-recorder');
1011

1112
const getParents = (test) => {
1213
const names = [];
@@ -38,19 +39,22 @@ module.exports = (suiteName, optsOrTests, testsOrNull = null) => {
3839
useTmpDir: Joi.boolean().optional(),
3940
useNock: Joi.boolean().optional(),
4041
envVars: Joi.object().optional().unknown(true).pattern(Joi.string(), Joi.string()),
41-
timestamp: Joi.number().optional().min(0)
42+
timestamp: Joi.number().optional().min(0),
43+
recordConsole: Joi.boolean().optional()
4244
}), 'Bad Options Provided');
4345
const useTmpDir = get(opts, 'useTmpDir', false);
4446
const useNock = get(opts, 'useNock', false);
4547
const envVars = get(opts, 'envVars', null);
4648
const timestamp = get(opts, 'timestamp', null);
49+
const recordConsole = get(opts, 'recordConsole', false);
4750

4851
let dir = null;
4952
let nockDone = null;
5053
let envManagerFile = null;
5154
let envManagerDesc = null;
55+
let consoleRecorder = null;
5256

53-
const getArgs = () => ({ dir });
57+
const getArgs = () => ({ dir, ...(consoleRecorder === null ? {} : { getLogs: consoleRecorder.get }) });
5458
let beforeCb = () => {};
5559
let afterCb = () => {};
5660
let beforeEachCb = () => {};
@@ -102,18 +106,26 @@ module.exports = (suiteName, optsOrTests, testsOrNull = null) => {
102106
nockBack.fixtures = `${testFile}__cassettes/`;
103107
nockDone = await new Promise((resolve) => nockBack(genCassetteName(this.currentTest), {}, resolve));
104108
}
109+
if (recordConsole === true) {
110+
consoleRecorder = ConsoleRecorder(true);
111+
consoleRecorder.inject();
112+
}
105113
await beforeEachCb(getArgs());
106114
})();
107115
});
108116

109117
afterEach(async () => {
110-
if (dir !== null) {
111-
dir = null;
118+
if (consoleRecorder !== null) {
119+
consoleRecorder.release();
120+
consoleRecorder = null;
112121
}
113122
if (nockDone !== null) {
114123
nockDone();
115124
nockDone = null;
116125
}
126+
if (dir !== null) {
127+
dir = null;
128+
}
117129
await afterEachCb(getArgs());
118130
});
119131

‎test/index.spec.js‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ describe('Testing index.js', () => {
66
expect(Object.keys(index)).to.deep.equal([
77
'desc',
88
'EnvManager',
9-
'timeKeeper'
9+
'timeKeeper',
10+
'ConsoleRecorder'
1011
]);
1112
});
1213
});

‎test/util/console-recorder.spec.js‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* eslint-disable no-console */
2+
const expect = require('chai').expect;
3+
const ConsoleRecorder = require('../../src/util/console-recorder');
4+
5+
const testConsole = (verbose) => {
6+
const logs = [];
7+
const consoleLogOriginal = console.log;
8+
const consoleErrorOriginal = console.error;
9+
console.log = (...args) => {
10+
logs.push(...args);
11+
};
12+
console.error = (...args) => {
13+
logs.push(...args);
14+
};
15+
const consoleRecorder = ConsoleRecorder(verbose);
16+
consoleRecorder.inject();
17+
console.log('test-log1');
18+
console.log('test-log2');
19+
console.error('test-log3');
20+
consoleRecorder.release();
21+
const result = consoleRecorder.get();
22+
expect(result.logs).to.deep.equal(['test-log1', 'test-log2', 'test-log3']);
23+
expect(result.defaultLogs).to.deep.equal(['test-log1', 'test-log2']);
24+
expect(result.errorLogs).to.deep.equal(['test-log3']);
25+
if (verbose === true) {
26+
expect(logs).to.deep.equal(['test-log1', 'test-log2', 'test-log3']);
27+
} else {
28+
expect(logs).to.deep.equal([]);
29+
}
30+
console.log = consoleLogOriginal;
31+
console.error = consoleErrorOriginal;
32+
};
33+
34+
describe('Testing ConsoleRecorder', () => {
35+
it('Testing Logging Silent', () => {
36+
testConsole(false);
37+
});
38+
39+
it('Testing Logging Verbose', () => {
40+
testConsole(true);
41+
});
42+
});

‎test/util/desc.spec.js‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,36 @@ desc('Testing freezing time', { timestamp: 123456789 }, ({ it, before, after })
120120
});
121121
});
122122

123+
desc('Testing console recording', { recordConsole: true }, ({ it }) => {
124+
const logger = ['log', 'info', 'error', 'warn'].reduce((p, c) => Object.assign(p, {
125+
// eslint-disable-next-line no-console
126+
[c]: (...args) => console[c](...args)
127+
}), {});
128+
129+
it('Testing recorded logs', ({ getLogs }) => {
130+
expect(getLogs()).to.deep.equal({
131+
defaultLogs: [],
132+
errorLogs: [],
133+
logs: []
134+
});
135+
logger.log('log');
136+
logger.warn('warn');
137+
logger.error('error');
138+
logger.info('info');
139+
expect(getLogs()).to.deep.equal({
140+
defaultLogs: ['log', 'info'],
141+
errorLogs: ['warn', 'error'],
142+
logs: ['log', 'warn', 'error', 'info']
143+
});
144+
});
145+
146+
it('Testing recording resets', ({ getLogs }) => {
147+
expect(getLogs().logs).to.deep.equal([]);
148+
logger.log('log');
149+
expect(getLogs().logs).to.deep.equal(['log']);
150+
});
151+
});
152+
123153
desc('Testing Before/After', ({
124154
before, after, beforeEach, afterEach, it
125155
}) => {

0 commit comments

Comments
 (0)