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('setOptions', function () {
132 it('sets options', function () {
139 const defaultOptions
= {
148 common
.setOptions(target
, defaultOptions
, options
);
149 assert
.deepStrictEqual(target
, expected
);
153 describe('splitFirst', function () {
154 it('splits', function () {
155 const expected
= ['foo', 'awoo'];
156 const src
= 'foo?awoo';
159 const result
= common
.splitFirst(src
, delim
, fill
);
160 assert
.deepStrictEqual(result
, expected
);
162 it('fills', function () {
163 const expected
= ['foo', 'fill'];
167 const result
= common
.splitFirst(src
, delim
, fill
);
168 assert
.deepStrictEqual(result
, expected
);
172 describe('mergeEnum', function () {
173 it('merges enums', function () {
176 TextHTML: 'text/html',
181 errorMessage: 'Bad Request',
187 TextPlain: 'text/plain',
192 errorMessage: 'Unauthorized',
202 TextHTML: 'text/html',
203 TextPlain: 'text/plain',
208 errorMessage: 'Bad Request',
212 errorMessage: 'Unauthorized',
220 const result
= common
.mergeEnum(origEnum
, newEnum
);
221 assert
.deepStrictEqual(result
, mergedEnum
);
225 describe('requestId', function () {
226 it('returns a string', function () {
227 const id
= common
.requestId();
228 assert
.strictEqual(typeof id
, 'string');
229 assert(id
.length
> 0);
233 describe('httpStatusCodeClass', function () {
234 it('works', function () {
235 for (const [statusCode
, statusClassExpected
] of Object
.entries({
241 const statusClass
= common
.httpStatusCodeClass(statusCode
);
242 assert
.strictEqual(statusClass
, statusClassExpected
);
245 }); // ensureLoggerLevels
247 describe('mergeDeep', function () {
248 it('simple merge', function () {
263 const result
= common
.mergeDeep(o1
, o2
, o3
);
264 assert
.deepStrictEqual(result
, expected
);
266 it('deep merge', function () {
294 myList: ['fancy', 'pants'],
305 const result
= common
.mergeDeep(o1
, o2
, o3
);
306 assert
.deepStrictEqual(result
, expected
);
308 it('merged object is distinct', function () {
327 const result
= common
.mergeDeep(o1
, o2
);
328 assert
.deepStrictEqual(result
, expected
);
339 assert
.deepStrictEqual(result
, expected2
);
340 assert
.strictEqual(o1
.foo
.bar
, 3);
341 assert
.strictEqual(o2
.baz
.quux
, 4);
345 describe('unfoldHeaderLines', function () {
346 it('folds', function () {
348 'Normal-Header: some header data',
349 'Folded-Header: more data',
350 ' second line of data',
351 ' third line of data',
354 'Normal-Header: some header data',
355 'Folded-Header: more data second line of data third line of data',
357 const result
= common
.unfoldHeaderLines(lines
);
358 assert
.deepStrictEqual(result
, expected
);
360 it('covers no input', function () {
361 const lines
= undefined;
362 const result
= common
.unfoldHeaderLines();
363 assert
.deepStrictEqual(result
, lines
);
365 }); // unfoldHeaderLines