bacd6be3d54d2aaa7e6b019c98e0e664050392dc
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('setOptions', function () {
200 it('sets options', function () {
207 const defaultOptions
= {
216 common
.setOptions(target
, defaultOptions
, options
);
217 assert
.deepStrictEqual(target
, expected
);
221 describe('splitFirst', function () {
222 it('splits', function () {
223 const expected
= ['foo', 'awoo'];
224 const src
= 'foo?awoo';
227 const result
= common
.splitFirst(src
, delim
, fill
);
228 assert
.deepStrictEqual(result
, expected
);
230 it('fills', function () {
231 const expected
= ['foo', 'fill'];
235 const result
= common
.splitFirst(src
, delim
, fill
);
236 assert
.deepStrictEqual(result
, expected
);
240 describe('mergeEnum', function () {
241 it('merges enums', function () {
244 TextHTML: 'text/html',
249 errorMessage: 'Bad Request',
255 TextPlain: 'text/plain',
260 errorMessage: 'Unauthorized',
270 TextHTML: 'text/html',
271 TextPlain: 'text/plain',
276 errorMessage: 'Bad Request',
280 errorMessage: 'Unauthorized',
288 const result
= common
.mergeEnum(origEnum
, newEnum
);
289 assert
.deepStrictEqual(result
, mergedEnum
);
293 describe('requestId', function () {
294 it('returns a string', function () {
295 const id
= common
.requestId();
296 assert
.strictEqual(typeof id
, 'string');
297 assert(id
.length
> 0);
301 describe('ensureLoggerLevels', function () {
302 it('adds missing levels', function () {
303 const result
= common
.ensureLoggerLevels();
304 assert
.deepStrictEqual(result
, common
.nullLogger
);
306 }); // ensureLoggerLevels
308 describe('httpStatusCodeClass', function () {
309 it('works', function () {
310 for (const [statusCode
, statusClassExpected
] of Object
.entries({
316 const statusClass
= common
.httpStatusCodeClass(statusCode
);
317 assert
.strictEqual(statusClass
, statusClassExpected
);
320 }); // ensureLoggerLevels
322 describe('mergeDeep', function () {
323 it('simple merge', function () {
338 const result
= common
.mergeDeep(o1
, o2
, o3
);
339 assert
.deepStrictEqual(result
, expected
);
341 it('deep merge', function () {
369 myList: ['fancy', 'pants'],
380 const result
= common
.mergeDeep(o1
, o2
, o3
);
381 assert
.deepStrictEqual(result
, expected
);
383 it('merged object is distinct', function () {
402 const result
= common
.mergeDeep(o1
, o2
);
403 assert
.deepStrictEqual(result
, expected
);
414 assert
.deepStrictEqual(result
, expected2
);
415 assert
.strictEqual(o1
.foo
.bar
, 3);
416 assert
.strictEqual(o2
.baz
.quux
, 4);
420 describe('unfoldHeaderLines', function () {
421 it('folds', function () {
423 'Normal-Header: some header data',
424 'Folded-Header: more data',
425 ' second line of data',
426 ' third line of data',
429 'Normal-Header: some header data',
430 'Folded-Header: more data second line of data third line of data',
432 const result
= common
.unfoldHeaderLines(lines
);
433 assert
.deepStrictEqual(result
, expected
);
435 it('covers no input', function () {
436 const lines
= undefined;
437 const result
= common
.unfoldHeaderLines();
438 assert
.deepStrictEqual(result
, lines
);
440 }); // unfoldHeaderLines