1 /* eslint-disable capitalized-comments */
5 const assert
= require('assert');
6 const sinon
= require('sinon'); // eslint-disable-line node/no-unpublished-require
7 const common
= require('../../lib/common');
10 describe('common', function () {
12 describe('fileScope', function () {
13 it('names a file path', function () {
14 const filename
= 'lib/foo/bar.js';
15 const result
= common
.fileScope(filename
)('baz');
16 assert
.strictEqual(result
, 'bar:baz');
18 it('names an index path', function () {
19 const filename
= 'lib/foo/index.js';
20 const result
= common
.fileScope(filename
)('baz');
21 assert
.strictEqual(result
, 'foo:baz');
25 describe('generateETag', function () {
26 it('generates a tag from data', function () {
27 const expected
= '"RHUvNyculE/SyROjU0LqzN0arxibrlBnazAashP8UGE"';
28 const data
= 'example data';
29 const result
= common
.generateETag(undefined, undefined, data
);
30 assert
.strictEqual(result
, expected
);
32 it('generates a tag from data and stats', function () {
33 const expected
= '"mtI0qCyqXsZVfX0Pgi+G6mQM10y9yVyi1NZejXSYttk"';
35 mtimeMs: 1600113038270.2375,
37 const data
= 'example data';
38 const result
= common
.generateETag(undefined, stat
, data
);
39 assert
.strictEqual(result
, expected
);
43 describe('get', function () {
44 const def
= 'default';
45 it('covers missing obj', function () {
46 const result
= common
.get(undefined, undefined, def
);
47 assert
.strictEqual(result
, def
);
49 it('covers missing prop', function () {
50 const result
= common
.get({}, undefined, def
);
51 assert
.strictEqual(result
, def
);
53 it('covers default', function () {
54 const result
= common
.get({ k: 'v' }, 'x', def
);
55 assert
.strictEqual(result
, def
);
57 it('covers prop', function () {
58 const result
= common
.get({ k: 'v' }, 'k', def
);
59 assert
.strictEqual(result
, 'v');
63 describe('isClientCached', function () {
64 let req
, modifiedTimeMs
, eTag
;
65 const blueMoon
= 'Sat, 31 Oct 2020 07:51:00 GMT';
66 const blueMoonMs
= 1604130660000;
67 const oneDayMs
= 86400000;
68 const anotherETag
= '"RHUvNyculE/SyROjU0LqzN0arxibrlBnazAashP8UGE"';
69 beforeEach(function () {
71 getHeader: sinon
.stub(),
74 eTag
= '"mtI0qCyqXsZVfX0Pgi+G6mQM10y9yVyi1NZejXSYttk"';
76 it('no headers, not cached', function () {
77 const result
= common
.isClientCached(req
, modifiedTimeMs
, eTag
);
78 assert
.strictEqual(result
, false);
80 it('modified header, not cached', function () {
81 req
.getHeader
.onCall(0).returns(blueMoon
);
82 modifiedTimeMs
= blueMoonMs
+ oneDayMs
;
83 const result
= common
.isClientCached(req
, modifiedTimeMs
, eTag
);
84 assert
.strictEqual(result
, false);
86 it('modified header, cached', function () {
87 req
.getHeader
.onCall(0).returns(blueMoon
);
88 modifiedTimeMs
= blueMoonMs
- oneDayMs
;
89 const result
= common
.isClientCached(req
, modifiedTimeMs
, eTag
);
90 assert
.strictEqual(result
, true);
92 it('match header, not matched', function () {
93 req
.getHeader
.onCall(1).returns(anotherETag
);
94 const result
= common
.isClientCached(req
, modifiedTimeMs
, eTag
);
95 assert
.strictEqual(result
, false);
97 it('match header, matched', function () {
98 req
.getHeader
.onCall(1).returns(`${anotherETag}, ${eTag}, ${anotherETag}`);
99 const result
= common
.isClientCached(req
, modifiedTimeMs
, eTag
);
100 assert
.strictEqual(result
, true);
102 it('match header any, matched', function () {
103 req
.getHeader
.onCall(1).returns('*');
104 const result
= common
.isClientCached(req
, modifiedTimeMs
, eTag
);
105 assert
.strictEqual(result
, true);
107 it('modified header cached, match header not matched, not cached', function () {
108 req
.getHeader
.onCall(0).returns(blueMoon
);
109 modifiedTimeMs
= blueMoonMs
- oneDayMs
;
110 req
.getHeader
.onCall(1).returns(`${anotherETag}, ${anotherETag}`);
111 const result
= common
.isClientCached(req
, modifiedTimeMs
, eTag
);
112 assert
.strictEqual(result
, false);
114 }); // iscClientCached
116 describe('pick', function () {
117 it('picks', function () {
123 const result
= common
.pick(srcObj
, ['a', 'c', 'd']);
124 assert
.deepStrictEqual(result
, {
131 describe('requestLogData', function () {
132 it('gives data', function () {
135 somethingElse: 'blah',
137 const result
= common
.requestLogData(req
);
138 assert
.deepStrictEqual(result
, {
142 }); // requestLogData
144 describe('obscureAuthorizationHeader', function () {
145 it('obscures basic data', function () {
146 const authHeader
= 'Basic Zm9vOmJhcg==';
147 const expected
= 'Basic ************';
148 const result
= common
.obscureAuthorizationHeader(authHeader
);
149 assert
.strictEqual(result
, expected
);
151 it('obscures all of other types', function () {
152 const authHeader
= 'someWeirdAuth';
153 const expected
= '*************';
154 const result
= common
.obscureAuthorizationHeader(authHeader
);
155 assert
.strictEqual(result
, expected
);
157 it('does nothing when empty', function () {
158 const authHeader
= undefined;
159 const expected
= undefined;
160 const result
= common
.obscureAuthorizationHeader(authHeader
);
161 assert
.strictEqual(result
, expected
);
163 }); // obscureAuthorizationHeader
165 describe('scrubHeaderObject', function () {
170 'authorization': 'Basic Zm9vOmJhcg==',
176 'authorization': 'Basic ************',
179 common
.scrubHeaderObject(data
);
180 assert
.deepStrictEqual(data
, expected
);
182 }); // scrubHeaderObject
184 describe('responseLogData', function () {
185 it('gives data', function () {
187 getHeaders: () => ({}),
191 const result
= common
.responseLogData(res
);
192 assert
.deepStrictEqual(result
, {
197 }); // responseLogData
199 describe('handlerLogData', function () {
200 it('covers', function () {
203 somethingElse: 'blah',
206 getHeaders: () => ({}),
211 const result
= common
.handlerLogData(req
, res
, ctx
);
212 assert
.deepStrictEqual(result
, {
223 }); // handlerLogData
225 describe('setOptions', function () {
226 it('sets options', function () {
233 const defaultOptions
= {
242 common
.setOptions(target
, defaultOptions
, options
);
243 assert
.deepStrictEqual(target
, expected
);
247 describe('splitFirst', function () {
248 it('splits', function () {
249 const expected
= ['foo', 'awoo'];
250 const src
= 'foo?awoo';
253 const result
= common
.splitFirst(src
, delim
, fill
);
254 assert
.deepStrictEqual(result
, expected
);
256 it('fills', function () {
257 const expected
= ['foo', 'fill'];
261 const result
= common
.splitFirst(src
, delim
, fill
);
262 assert
.deepStrictEqual(result
, expected
);
266 describe('mergeEnum', function () {
267 it('merges enums', function () {
270 TextHTML: 'text/html',
275 errorMessage: 'Bad Request',
281 TextPlain: 'text/plain',
286 errorMessage: 'Unauthorized',
296 TextHTML: 'text/html',
297 TextPlain: 'text/plain',
302 errorMessage: 'Bad Request',
306 errorMessage: 'Unauthorized',
314 const result
= common
.mergeEnum(origEnum
, newEnum
);
315 assert
.deepStrictEqual(result
, mergedEnum
);
319 describe('requestId', function () {
320 it('returns a string', function () {
321 const id
= common
.requestId();
322 assert
.strictEqual(typeof id
, 'string');
323 assert(id
.length
> 0);
327 describe('ensureLoggerLevels', function () {
328 it('adds missing levels', function () {
329 const result
= common
.ensureLoggerLevels();
330 assert
.deepStrictEqual(result
, common
.nullLogger
);
332 }); // ensureLoggerLevels
334 describe('httpStatusCodeClass', function () {
335 it('works', function () {
336 for (const [statusCode
, statusClassExpected
] of Object
.entries({
342 const statusClass
= common
.httpStatusCodeClass(statusCode
);
343 assert
.strictEqual(statusClass
, statusClassExpected
);
346 }); // ensureLoggerLevels
348 describe('mergeDeep', function () {
349 it('simple merge', function () {
364 const result
= common
.mergeDeep(o1
, o2
, o3
);
365 assert
.deepStrictEqual(result
, expected
);
367 it('deep merge', function () {
395 myList: ['fancy', 'pants'],
406 const result
= common
.mergeDeep(o1
, o2
, o3
);
407 assert
.deepStrictEqual(result
, expected
);
409 it('merged object is distinct', function () {
428 const result
= common
.mergeDeep(o1
, o2
);
429 assert
.deepStrictEqual(result
, expected
);
440 assert
.deepStrictEqual(result
, expected2
);
441 assert
.strictEqual(o1
.foo
.bar
, 3);
442 assert
.strictEqual(o2
.baz
.quux
, 4);
446 describe('unfoldHeaderLines', function () {
447 it('folds', function () {
449 'Normal-Header: some header data',
450 'Folded-Header: more data',
451 ' second line of data',
452 ' third line of data',
455 'Normal-Header: some header data',
456 'Folded-Header: more data second line of data third line of data',
458 const result
= common
.unfoldHeaderLines(lines
);
459 assert
.deepStrictEqual(result
, expected
);
461 it('covers no input', function () {
462 const lines
= undefined;
463 const result
= common
.unfoldHeaderLines();
464 assert
.deepStrictEqual(result
, lines
);
466 }); // unfoldHeaderLines