-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrequest-logger.test.ts
135 lines (125 loc) · 3.97 KB
/
request-logger.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import { LogProvider } from '../services/log-provider';
import { Request } from '../interfaces';
import { RequestLogger } from './request-logger';
import { RequestLoggerOpts } from './request-logger';
import { Response } from '../interfaces';
import { of } from 'rxjs';
const request: Request = {
path: '/foo/bar',
method: 'GET',
remoteAddr: '::1',
httpVersion: '1.2',
timestamp: Date.now()
};
const response: Response = {
// eslint-disable-next-line @typescript-eslint/naming-convention
headers: { 'Content-Length': '20' },
statusCode: 301
};
const error: Response = {
body: JSON.stringify({
error: 'xxx',
stack: 'y'
}),
// eslint-disable-next-line @typescript-eslint/naming-convention
headers: { 'Content-Length': '20' },
statusCode: 500
};
describe('RequestLogger unit tests', () => {
test('logs errors to console', (done) => {
const log: LogProvider = {
canColorize: () => false,
log: (_stuff) => {},
info: (_stuff) => {},
warn: (_stuff) => {},
error: (logLine) => {
expect(logLine).toContain('xxx');
done();
}
};
const opts: RequestLoggerOpts = { colorize: false, format: 'common' };
const logger = new RequestLogger(log, opts);
logger.postcatch(of({ request, response: error })).subscribe();
});
test('silent mode logs nothing', (done) => {
const log: LogProvider = {
canColorize: () => false,
log: (_stuff) => {},
info: (_stuff) => {},
warn: (_stuff) => {},
error: (_logLine) => {}
};
jest.spyOn(log, 'info');
const opts: RequestLoggerOpts = { silent: true };
const logger = new RequestLogger(log, opts);
logger.postcatch(of({ request, response })).subscribe(() => {
// eslint-disable-next-line @typescript-eslint/unbound-method
expect(log.info).not.toBeCalled();
done();
});
});
test('"common" format correctly logs messages', (done) => {
const log: LogProvider = {
canColorize: () => false,
log: (_stuff) => {},
info: (logLine) => {
expect(logLine).toMatch(
/^::1 - - \[.*\] "GET \/foo\/bar HTTP\/1.2" 301 20$/
);
done();
},
warn: (_stuff) => {},
error: (_stuff) => {}
};
const opts: RequestLoggerOpts = { colorize: false, format: 'common' };
const logger = new RequestLogger(log, opts);
logger.postcatch(of({ request, response })).subscribe();
});
test('"dev" format correctly logs messages', (done) => {
const log: LogProvider = {
canColorize: () => false,
log: (_stuff) => {},
info: (logLine) => {
expect(logLine).toMatch(/^GET \/foo\/bar 301 [0-9]+ms - 20$/);
done();
},
warn: (_stuff) => {},
error: (_stuff) => {}
};
const opts: RequestLoggerOpts = { colorize: false, format: 'dev' };
const logger = new RequestLogger(log, opts);
logger.postcatch(of({ request, response })).subscribe();
});
test('"short" format correctly logs messages', (done) => {
const log: LogProvider = {
canColorize: () => false,
log: (_stuff) => {},
info: (logLine) => {
expect(logLine).toMatch(
/^::1 - GET \/foo\/bar HTTP\/1.2 301 20 - [0-9]+ms$/
);
done();
},
warn: (_stuff) => {},
error: (_stuff) => {}
};
const opts: RequestLoggerOpts = { colorize: false, format: 'short' };
const logger = new RequestLogger(log, opts);
logger.postcatch(of({ request, response })).subscribe();
});
test('"tiny" format correctly logs messages', (done) => {
const log: LogProvider = {
canColorize: () => false,
log: (_stuff) => {},
info: (logLine) => {
expect(logLine).toMatch(/^GET \/foo\/bar 301 20 - [0-9]+ms$/);
done();
},
warn: (_stuff) => {},
error: (_stuff) => {}
};
const opts: RequestLoggerOpts = { colorize: false, format: 'tiny' };
const logger = new RequestLogger(log, opts);
logger.postcatch(of({ request, response })).subscribe();
});
});