8000 fix(test): moved connect logger test to tap · xcj-coding/log4js-node@93c3f2b · GitHub
[go: up one dir, main page]

Skip to content

Commit 93c3f2b

Browse files
author
Gareth Jones
committed
fix(test): moved connect logger test to tap
1 parent 2d7cee2 commit 93c3f2b

File tree

1 file changed

+243
-0
lines changed

1 file changed

+243
-0
lines changed

test/tap/connect-logger-test.js

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
/* jshint maxparams:7 */
2+
3+
'use strict';
4+
5+
const test = require('tap').test;
6+
const EE = require('events').EventEmitter;
7+
const levels = require('../../lib/levels');
8+
9+
class MockLogger {
10+
constructor() {
11+
this.level = levels.TRACE;
12+
this.messages = [];
13+
this.log = function (level, message) {
14+
this.messages.push({ level: level, message: message });
15+
};
16+
this.isLevelEnabled = function (level) {
17+
return level.isGreaterThanOrEqualTo(this.level);
18+
};
19+
}
20+
}
21+
22+
function MockRequest(remoteAddr, method, originalUrl, headers) {
23+
this.socket = { remoteAddress: remoteAddr };
24+
this.originalUrl = originalUrl;
25+
this.method = method;
26+
this.httpVersionMajor = '5';
27+
this.httpVersionMinor = '0';
28+
this.headers = headers || {};
29+
30+
const self = this;
31+
Object.keys(this.headers).forEach((key) => {
32+
self.headers[key.toLowerCase()] = self.headers[key];
33+
});
34+
}
35+
36+
class MockResponse extends EE {
37+
constructor() {
38+
super();
39+
const r = this;
40+
this.end = function () {
41+
r.emit('finish');
42+
};
43+
44+
this.writeHead = function (code, headers) {
45+
this.statusCode = code;
46+
this._headers = headers;
47+
};
48+
}
49+
}
50+
51+
function request(cl, method, url, code, reqHeaders, resHeaders) {
52+
const req = new MockRequest('my.remote.addr', method, url, reqHeaders);
53+
const res = new MockResponse();
54+
cl(req, res, () => {
55+
});
56+
res.writeHead(code, resHeaders);
57+
res.end('chunk', 'encoding');
58+
}
59+
60+
test('log4js connect logger', (batch) => {
61+
const clm = require('../../lib/connect-logger');
62+
batch.test('getConnectLoggerModule', (t) => {
63+
t.type(clm, 'object', 'should return a connect logger factory');
64+
65+
t.test('should take a log4js logger and return a "connect logger"', (assert) => {
66+
const ml = new MockLogger();
67+
const cl = clm.connectLogger(ml);
68+
69+
assert.type(cl, 'function');
70+
assert.end();
71+
});
72+
73+
t.test('log events', (assert) => {
74+
const ml = new MockLogger();
75+
const cl = clm.connectLogger(ml);
76+
request(cl, 'GET', 'http://url', 200);
77+
78+
const messages = ml.messages;
79+
assert.type(messages, 'Array');
80+
assert.equal(messages.length, 1);
81+
assert.ok(levels.INFO.isEqualTo(messages[0].level));
82+
assert.include(messages[0].message, 'GET');
83+
assert.include(messages[0].message, 'http://url');
84+
assert.include(messages[0].message, 'my.remote.addr');
85+
assert.include(messages[0].message, '200');
86+
assert.end();
87+
});
88+
89+
t.test('log events with level below logging level', (assert) => {
90+
const ml = new MockLogger();
91+
ml.level = levels.FATAL;
92+
const cl = clm.connectLogger(ml);
93+
request(cl, 'GET', 'http://url', 200);
94+
95+
assert.type(ml.messages, 'Array');
96+
assert.equal(ml.messages.length, 0);
97+
assert.end();
98+
});
99+
100+
t.test('log events with non-default level and custom format', (assert) => {
101+
const ml = new MockLogger();
102+
ml.level = levels.INFO;
103+
const cl = clm.connectLogger(ml, { level: levels.INFO, format: ':method :url' });
104+
request(cl, 'GET', 'http://url', 200);
105+
106+
const messages = ml.messages;
107+
assert.type(messages, Array);
108+
assert.equal(messages.length, 1);
109+
assert.ok(levels.INFO.isEqualTo(messages[0].level));
110+
assert.equal(messages[0].message, 'GET http://url');
111+
assert.end();
112+
});
113+
t.end();
114+
});
115+
116+
batch.test('logger with options as string', (t) => {
117+
const ml = new MockLogger();
118+
ml.level = levels.INFO;
119+
const cl = clm.connectLogger(ml, ':method :url');
120+
request(cl, 'POST', 'http://meh', 200);
121+
122+
const messages = ml.messages;
123+
t.equal(messages[0].message, 'POST http://meh');
124+
t.end();
125+
});
126+
127+
batch.test('auto log levels', (t) => {
128+
const ml = new MockLogger();
129+
ml.level = levels.INFO;
130+
const cl = clm.connectLogger(ml, { level: 'auto', format: ':method :url' });
131+
request(cl, 'GET', 'http://meh', 200);
132+
request(cl, 'GET', 'http://meh', 201);
133+
request(cl, 'GET', 'http://meh', 302);
134+
request(cl, 'GET', 'http://meh', 404);
135+
request(cl, 'GET', 'http://meh', 500);
136+
137+
const messages = ml.messages;
138+
t.test('should use INFO for 2xx', (assert) => {
139+
assert.ok(levels.INFO.isEqualTo(messages[0].level));
140+
assert.ok(levels.INFO.isEqualTo(messages[1].level));
141+
assert.end();
142+
});
143+
144+
t.test('should use WARN for 3xx', (assert) => {
145+
assert.ok(levels.WARN.isEqualTo(messages[2].level));
146+
assert.end();
147+
});
148+
149+
t.test('should use ERROR for 4xx', (assert) => {
150+
assert.ok(levels.ERROR.isEqualTo(messages[3].level));
151+
assert.end();
152+
});
153+
154+
t.test('should use ERROR for 5xx', (assert) => {
155+
assert.ok(levels.ERROR.isEqualTo(messages[4].level));
156+
assert.end();
157+
});
158+
t.end();
159+
});
160+
161+
batch.test('format using a function', (t) => {
162+
const ml = new MockLogger();
163+
ml.level = levels.INFO;
164+
const cl = clm.connectLogger(ml, () => 'I was called');
165+
request(cl, 'GET', 'http://blah', 200);
166+
167+
t.equal(ml.messages[0].message, 'I was called');
168+
t.end();
169+
});
170+
171+
batch.test('format that includes request headers', (t) => {
172+
const ml = new MockLogger();
173+
ml.level = levels.INFO;
174+
const cl = clm.connectLogger(ml, ':req[Content-Type]');
175+
request(
176+
cl,
177+
'GET', 'http://blah', 200,
178+
{ 'Content-Type': 'application/json' }
179+
);
180+
181+
t.equal(ml.messages[0].message, 'application/json');
182+
t.end();
183+
});
184+
185+
batch.test('format that includes response headers', (t) => {
186+
const ml = new MockLogger();
187+
ml.level = levels.INFO;
188+
const cl = clm.connectLogger(ml, ':res[Content-Type]');
189+
request(
190+
cl,
191+
'GET', 'http://blah', 200,
192+
null,
193+
{ 'Content-Type': 'application/cheese' }
194+
);
195+
196+
t.equal(ml.messages[0].message, 'application/cheese');
197+
t.end();
198+
});
199+
200+
batch.test('log events with custom token', (t) => {
201+
const ml = new MockLogger();
202+
ml.level = levels.INFO;
203+
const cl = clm.connectLogger(ml, {
204+
level: levels.INFO,
205+
format: ':method :url :custom_string',
206+
tokens: [
207+
{
208+
token: ':custom_string', replacement: 'fooBAR'
209+
}
210+
]
211+
});
212+
request(cl, 'GET', 'http://url', 200);
213+
214+
t.type(ml.messages, 'Array');
215+
t.equal(ml.messages.length, 1);
216+
t.ok(levels.INFO.isEqualTo(ml.messages[0].level));
217+
t.equal(ml.messages[0].message, 'GET http://url fooBAR');
218+
t.end();
219+
});
220+
221+
batch.test('log events with custom override token', (t) => {
222+
const ml = new MockLogger();
223+
ml.level = levels.INFO;
224+
const cl = clm.connectLogger(ml, {
225+
level: levels.INFO,
226+
format: ':method :url :date',
227+
tokens: [
228+
{
229+
token: ':date', replacement: '20150310'
230+
}
231+
]
232+
});
233+
request(cl, 'GET', 'http://url', 200);
234+
235+
t.type(ml.messages, 'Array');
236+
t.equal(ml.messages.length, 1);
237+
t.ok(levels.INFO.isEqualTo(ml.messages[0].level));
238+
t.equal(ml.messages[0].message, 'GET http://url 20150310');
239+
t.end();
240+
});
241+
242+
batch.end();
243+
});

0 commit comments

Comments
 (0)
0