a04bf614eeadac136f2df8ff44cf1519846d8221
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('responseLogData', function () {
145 it('gives data', function () {
147 getHeaders: () => ({}),
151 const result
= common
.responseLogData(res
);
152 assert
.deepStrictEqual(result
, {
157 }); // responseLogData
159 describe('setOptions', function () {
160 it('sets options', function () {
167 const defaultOptions
= {
176 common
.setOptions(target
, defaultOptions
, options
);
177 assert
.deepStrictEqual(target
, expected
);
181 describe('splitFirst', function () {
182 it('splits', function () {
183 const expected
= ['foo', 'awoo'];
184 const src
= 'foo?awoo';
187 const result
= common
.splitFirst(src
, delim
, fill
);
188 assert
.deepStrictEqual(result
, expected
);
190 it('fills', function () {
191 const expected
= ['foo', 'fill'];
195 const result
= common
.splitFirst(src
, delim
, fill
);
196 assert
.deepStrictEqual(result
, expected
);
200 describe('mergeEnum', function () {
201 it('merges enums', function () {
204 TextHTML: 'text/html',
209 errorMessage: 'Bad Request',
215 TextPlain: 'text/plain',
220 errorMessage: 'Unauthorized',
230 TextHTML: 'text/html',
231 TextPlain: 'text/plain',
236 errorMessage: 'Bad Request',
240 errorMessage: 'Unauthorized',
248 const result
= common
.mergeEnum(origEnum
, newEnum
);
249 assert
.deepStrictEqual(result
, mergedEnum
);
253 describe('requestId', function () {
254 it('returns a string', function () {
255 const id
= common
.requestId();
256 assert
.strictEqual(typeof id
, 'string');
257 assert(id
.length
> 0);
261 describe('ensureLoggerLevels', function () {
262 it('adds missing levels', function () {
263 const result
= common
.ensureLoggerLevels();
264 assert
.deepStrictEqual(result
, common
.nullLogger
);
266 }); // ensureLoggerLevels
268 describe('httpStatusCodeClass', function () {
269 it('works', function () {
270 for (const [statusCode
, statusClassExpected
] of Object
.entries({
276 const statusClass
= common
.httpStatusCodeClass(statusCode
);
277 assert
.strictEqual(statusClass
, statusClassExpected
);
280 }); // ensureLoggerLevels
282 describe('mergeDeep', function () {
283 it('simple merge', function () {
298 const result
= common
.mergeDeep(o1
, o2
, o3
);
299 assert
.deepStrictEqual(result
, expected
);
301 it('deep merge', function () {
329 myList: ['fancy', 'pants'],
340 const result
= common
.mergeDeep(o1
, o2
, o3
);
341 assert
.deepStrictEqual(result
, expected
);
343 it('merged object is distinct', function () {
362 const result
= common
.mergeDeep(o1
, o2
);
363 assert
.deepStrictEqual(result
, expected
);
374 assert
.deepStrictEqual(result
, expected2
);
375 assert
.strictEqual(o1
.foo
.bar
, 3);
376 assert
.strictEqual(o2
.baz
.quux
, 4);
380 describe('unfoldHeaderLines', function () {
381 it('folds', function () {
383 'Normal-Header: some header data',
384 'Folded-Header: more data',
385 ' second line of data',
386 ' third line of data',
389 'Normal-Header: some header data',
390 'Folded-Header: more data second line of data third line of data',
392 const result
= common
.unfoldHeaderLines(lines
);
393 assert
.deepStrictEqual(result
, expected
);
395 it('covers no input', function () {
396 const lines
= undefined;
397 const result
= common
.unfoldHeaderLines();
398 assert
.deepStrictEqual(result
, lines
);
400 }); // unfoldHeaderLines