@villedemontreal/http-request 7.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,764 @@
1
+ // Ok in test files :
2
+ // tslint:disable:no-string-literal
3
+ // tslint:disable: max-func-body-length
4
+
5
+ import { IOrderBy, OrderByDirection, utils } from '@villedemontreal/general-utils/dist/src';
6
+ import { assert } from 'chai';
7
+ import * as express from 'express';
8
+ import * as http from 'http';
9
+ import httpHeaderFieldsTyped from 'http-header-fields-typed';
10
+ import * as HttpStatusCodes from 'http-status-codes';
11
+ import * as _ from 'lodash';
12
+ import * as superagent from 'superagent';
13
+ import { configs } from './config/configs';
14
+ import { constants } from './config/constants';
15
+ import { httpUtils } from './httpUtils';
16
+ import { setTestingConfigurations } from './utils/testingConfigurations';
17
+ const superagentMocker = require('superagent-mocker');
18
+
19
+ // ==========================================
20
+ // Set Testing configurations
21
+ // ==========================================
22
+ setTestingConfigurations();
23
+
24
+ describe('httpUtils', () => {
25
+ describe('urlJoin', () => {
26
+ it('single param with slash', async () => {
27
+ assert.equal(httpUtils.urlJoin('http://google.com/'), 'http://google.com');
28
+ });
29
+
30
+ it('single param no slash', async () => {
31
+ assert.equal(httpUtils.urlJoin('http://google.com'), 'http://google.com');
32
+ });
33
+
34
+ it('with slashes', async () => {
35
+ assert.equal(httpUtils.urlJoin('http://google.com/', 'foo/', '/bar/'), 'http://google.com/foo/bar');
36
+ });
37
+
38
+ it('without slashes', async () => {
39
+ assert.equal(httpUtils.urlJoin('http://google.com', 'foo', 'bar'), 'http://google.com/foo/bar');
40
+ });
41
+
42
+ it('without double slashes', async () => {
43
+ assert.equal(httpUtils.urlJoin('http://google.com/', '//foo/', '//bar/'), 'http://google.com/foo/bar');
44
+ });
45
+
46
+ it('with slashes without text', async () => {
47
+ assert.equal(httpUtils.urlJoin('http://google.com/', '///', '//bar/'), 'http://google.com/bar');
48
+ });
49
+
50
+ it('with slashes and empty text', async () => {
51
+ assert.equal(httpUtils.urlJoin('http://google.com/', '', '//bar/'), 'http://google.com/bar');
52
+ });
53
+
54
+ it('with slashes and null text', async () => {
55
+ assert.equal(httpUtils.urlJoin('http://google.com/', null, '//bar/'), 'http://google.com/bar');
56
+ });
57
+
58
+ it('with slashes and undefined text', async () => {
59
+ assert.equal(httpUtils.urlJoin('http://google.com/', undefined, '//bar/'), 'http://google.com/bar');
60
+ });
61
+
62
+ it('with http 2 slashes', async () => {
63
+ assert.equal(httpUtils.urlJoin('http://', 'google.com', 'foo', 'bar'), 'http://google.com/foo/bar');
64
+ });
65
+
66
+ it('with http 1 slash', async () => {
67
+ assert.equal(httpUtils.urlJoin('http:/', 'google.com', 'foo', 'bar'), 'http://google.com/foo/bar');
68
+ });
69
+
70
+ it('with http no slash', async () => {
71
+ assert.equal(httpUtils.urlJoin('http:', 'google.com', 'foo', 'bar'), 'http://google.com/foo/bar');
72
+ });
73
+
74
+ it('another example', async () => {
75
+ assert.equal(
76
+ httpUtils.urlJoin('http://api.montreal.ca/accounts/', '/inum', '@5441521452', 'tickets'),
77
+ 'http://api.montreal.ca/accounts/inum/@5441521452/tickets'
78
+ );
79
+ });
80
+ });
81
+
82
+ describe('send', () => {
83
+ describe('mocked', () => {
84
+ let mock: any;
85
+ before(async () => {
86
+ mock = superagentMocker(superagent);
87
+
88
+ mock.get('http://localhost/test', (req: any) => {
89
+ return {
90
+ body: {
91
+ headers: req.headers
92
+ }
93
+ };
94
+ });
95
+ });
96
+
97
+ after(async () => {
98
+ mock.clearRoutes();
99
+ mock.unmock(superagent);
100
+ });
101
+
102
+ it('URL must have a hostname', async () => {
103
+ const request = superagent.get('/test');
104
+ try {
105
+ await httpUtils.send(request);
106
+ assert.fail('expected send to throw an error');
107
+ } catch (err) {
108
+ assert.strictEqual(
109
+ err.message,
110
+ 'The URL in your request MUST have a protocol and a hostname. Received: /test'
111
+ );
112
+ }
113
+ });
114
+
115
+ it('The Correlation Id is set automatically', async () => {
116
+ const currentCid = configs.correlationId;
117
+
118
+ const request = superagent.get('http://localhost/test').set('titi', '123');
119
+
120
+ const response = await httpUtils.send(request);
121
+ assert.isOk(response);
122
+ assert.isOk(response.status);
123
+ assert.strictEqual(response.status, 200);
124
+ assert.isObject(response.body);
125
+ assert.isObject(response.body.headers);
126
+
127
+ const headers = response.body.headers;
128
+ assert.strictEqual(headers.titi, '123');
129
+ assert.strictEqual(headers[httpHeaderFieldsTyped.X_CORRELATION_ID.toLowerCase()], currentCid);
130
+ });
131
+
132
+ it('Regular response response', async () => {
133
+ for (const status of [200, 201, 301, 400, 404, 500, 501]) {
134
+ mock.get('http://localhost/test', (req: any) => {
135
+ return {
136
+ status,
137
+ body: {
138
+ msg: 'titi'
139
+ }
140
+ };
141
+ });
142
+
143
+ const request = superagent.get('http://localhost/test');
144
+ const response = await httpUtils.send(request);
145
+
146
+ assert.isOk(response);
147
+ assert.isOk(response.status);
148
+ assert.strictEqual(response.status, status);
149
+ assert.isObject(response.body);
150
+ assert.strictEqual(response.body.msg, 'titi');
151
+ }
152
+ });
153
+
154
+ it('Timeouts are added, if not already set', async () => {
155
+ const request = superagent.get('http://localhost/test').set('titi', '123');
156
+
157
+ assert.isUndefined(request['_responseTimeout']);
158
+ assert.isUndefined(request['_timeout']);
159
+
160
+ const response = await httpUtils.send(request);
161
+ assert.isOk(response);
162
+ assert.strictEqual(request['_responseTimeout'], constants.request.timeoutsDefault.response);
163
+ assert.strictEqual(request['_timeout'], constants.request.timeoutsDefault.deadline);
164
+ });
165
+
166
+ it('Response timeout already set', async () => {
167
+ const request = superagent.get('http://localhost/test').set('titi', '123');
168
+
169
+ request.timeout({
170
+ response: 55555
171
+ });
172
+
173
+ assert.strictEqual(request['_responseTimeout'], 55555);
174
+ assert.isUndefined(request['_timeout']);
175
+
176
+ const response = await httpUtils.send(request);
177
+ assert.isOk(response);
178
+ assert.strictEqual(request['_responseTimeout'], 55555);
179
+ assert.strictEqual(request['_timeout'], constants.request.timeoutsDefault.deadline);
180
+ });
181
+
182
+ it('Deadline timeout already set', async () => {
183
+ const request = superagent.get('http://localhost/test').set('titi', '123');
184
+
185
+ request.timeout({
186
+ deadline: 55555
187
+ });
188
+
189
+ assert.isUndefined(request['_responseTimeout']);
190
+ assert.strictEqual(request['_timeout'], 55555);
191
+
192
+ const response = await httpUtils.send(request);
193
+ assert.isOk(response);
194
+ assert.strictEqual(request['_responseTimeout'], constants.request.timeoutsDefault.response);
195
+ assert.strictEqual(request['_timeout'], 55555);
196
+ });
197
+
198
+ it('Both timeouts timeout already set', async () => {
199
+ const request = superagent.get('http://localhost/test').set('titi', '123');
200
+
201
+ request.timeout({
202
+ deadline: 55555,
203
+ response: 66666
204
+ });
205
+
206
+ assert.strictEqual(request['_responseTimeout'], 66666);
207
+ assert.strictEqual(request['_timeout'], 55555);
208
+
209
+ const response = await httpUtils.send(request);
210
+ assert.isOk(response);
211
+ assert.strictEqual(request['_responseTimeout'], 66666);
212
+ assert.strictEqual(request['_timeout'], 55555);
213
+ });
214
+ });
215
+
216
+ describe('Network/Server error', () => {
217
+ it('Network/Server error', async () => {
218
+ const mock: any = superagentMocker(superagent);
219
+
220
+ mock.get('http://localhost/test', (req: any) => {
221
+ throw new Error('Network error');
222
+ });
223
+
224
+ try {
225
+ const request = superagent.get('http://localhost/test');
226
+ const response = await httpUtils.send(request);
227
+ assert.isNotOk(response);
228
+ assert.fail();
229
+ } catch (err) {
230
+ /* ok */
231
+ }
232
+ });
233
+ });
234
+ describe('not mocked', () => {
235
+ it('Errors are handled properly', async () => {
236
+ try {
237
+ const request = superagent.get('httttp://nope').timeout(100);
238
+ const response = await httpUtils.send(request);
239
+ assert.isNotOk(response);
240
+ assert.fail();
241
+ } catch (err) {
242
+ assert.isObject(err);
243
+ assert.isTrue('msg' in err);
244
+ assert.isTrue('originalError' in err);
245
+ }
246
+ });
247
+ });
248
+ });
249
+
250
+ describe(`Express request related tests`, () => {
251
+ let app;
252
+ let server: http.Server;
253
+ let port: number;
254
+ let expressRequest: express.Request;
255
+
256
+ async function startServer(caseSensitive: boolean) {
257
+ app = express();
258
+ app.set('case sensitive routing', caseSensitive);
259
+ app.get(
260
+ '/',
261
+ async (req: express.Request, res: express.Response, next: express.NextFunction): Promise<void> => {
262
+ expressRequest = req;
263
+ res.sendStatus(HttpStatusCodes.OK);
264
+ }
265
+ );
266
+ port = await utils.findFreePort();
267
+ server = await app.listen(port);
268
+ }
269
+
270
+ async function send(pathAndQueryString: string) {
271
+ const superagentRequest = superagent.get(`http://localhost:${port}${pathAndQueryString}`);
272
+ const response = await httpUtils.send(superagentRequest);
273
+ assert.strictEqual(response.status, HttpStatusCodes.OK);
274
+ }
275
+
276
+ describe(`Query params functions - Case sensitive`, () => {
277
+ before(async () => {
278
+ // ==========================================
279
+ // Set the configs for case sensitivity!
280
+ // ==========================================
281
+ setTestingConfigurations(true);
282
+ await startServer(true);
283
+ });
284
+
285
+ after(() => {
286
+ server.close();
287
+ });
288
+
289
+ it(`no query params`, async () => {
290
+ await send(`/`);
291
+
292
+ const values = httpUtils.getQueryParamAll(expressRequest, 'k');
293
+ assert.deepEqual(values, []);
294
+
295
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k');
296
+ assert.deepEqual(value, undefined);
297
+
298
+ value = httpUtils.getQueryParamOneAsDate(expressRequest, 'k');
299
+ assert.deepEqual(value, undefined);
300
+
301
+ value = httpUtils.getQueryParamOneAsNumber(expressRequest, 'k');
302
+ assert.deepEqual(value, undefined);
303
+
304
+ value = httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
305
+ assert.deepEqual(value, undefined);
306
+ });
307
+
308
+ it(`one query params - simple string`, async () => {
309
+ await send(`/?k=toto`);
310
+
311
+ let values = httpUtils.getQueryParamAll(expressRequest, 'k');
312
+ assert.deepEqual(values, ['toto']);
313
+
314
+ values = httpUtils.getQueryParamAll(expressRequest, 'K'); // case sensitive
315
+ assert.deepEqual(values, []);
316
+
317
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k');
318
+ assert.deepEqual(value, 'toto');
319
+
320
+ value = httpUtils.getQueryParamOne(expressRequest, 'K'); // case sensitive
321
+ assert.deepEqual(value, undefined);
322
+
323
+ let error;
324
+ try {
325
+ httpUtils.getQueryParamOneAsDate(expressRequest, 'k');
326
+ } catch (err) {
327
+ error = err;
328
+ }
329
+ if (!error) {
330
+ assert.fail();
331
+ }
332
+
333
+ value = httpUtils.getQueryParamOneAsDate(expressRequest, 'k', (errMsg: string, val: string) => {
334
+ assert.isOk(errMsg);
335
+ assert.deepEqual(val, 'toto');
336
+ return undefined;
337
+ });
338
+ assert.deepEqual(value, undefined);
339
+
340
+ try {
341
+ httpUtils.getQueryParamOneAsNumber(expressRequest, 'k');
342
+ } catch (err) {
343
+ error = err;
344
+ }
345
+ if (!error) {
346
+ assert.fail();
347
+ }
348
+
349
+ value = httpUtils.getQueryParamOneAsNumber(expressRequest, 'k', (errMsg: string, val: string) => {
350
+ assert.isOk(errMsg);
351
+ assert.deepEqual(val, 'toto');
352
+ return 123;
353
+ });
354
+ assert.deepEqual(value, 123);
355
+
356
+ try {
357
+ httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
358
+ } catch (err) {
359
+ error = err;
360
+ }
361
+ if (!error) {
362
+ assert.fail();
363
+ }
364
+
365
+ value = httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k', (errMsg: string, val: string) => {
366
+ assert.isOk(errMsg);
367
+ assert.deepEqual(val, 'toto');
368
+ return 123;
369
+ });
370
+ assert.deepEqual(value, 123);
371
+ });
372
+
373
+ it('one query params - date string', async () => {
374
+ const dateStr = '2020-04-21T17:13:33.107Z';
375
+
376
+ await send(`/?k=${encodeURIComponent(dateStr)}`);
377
+
378
+ const values = httpUtils.getQueryParamAll(expressRequest, 'k');
379
+ assert.deepEqual(values, [dateStr]);
380
+
381
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k');
382
+ assert.deepEqual(value, dateStr);
383
+
384
+ value = httpUtils.getQueryParamOneAsDate(expressRequest, 'k');
385
+ assert.isTrue(_.isDate(value));
386
+ assert.deepEqual(value, new Date(dateStr));
387
+
388
+ value = httpUtils.getQueryParamOneAsDate(expressRequest, 'k', (_errMsg: string) => {
389
+ assert.fail();
390
+ });
391
+ assert.deepEqual(value, new Date(dateStr));
392
+
393
+ let error;
394
+ try {
395
+ httpUtils.getQueryParamOneAsNumber(expressRequest, 'k');
396
+ } catch (err) {
397
+ error = err;
398
+ }
399
+ if (!error) {
400
+ assert.fail();
401
+ }
402
+
403
+ try {
404
+ value = httpUtils.getQueryParamOneAsNumber(expressRequest, 'k', (_errMsg: string) => {
405
+ throw new Error(`Custom Error`);
406
+ });
407
+ } catch (err) {
408
+ error = err;
409
+ }
410
+ if (!error) {
411
+ assert.fail();
412
+ }
413
+ assert.deepEqual(error.message, `Custom Error`);
414
+
415
+ try {
416
+ httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
417
+ } catch (err) {
418
+ error = err;
419
+ }
420
+ if (!error) {
421
+ assert.fail();
422
+ }
423
+
424
+ try {
425
+ value = httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k', (_errMsg: string) => {
426
+ throw new Error(`Custom Error`);
427
+ });
428
+ } catch (err) {
429
+ error = err;
430
+ }
431
+ if (!error) {
432
+ assert.fail();
433
+ }
434
+ assert.deepEqual(error.message, `Custom Error`);
435
+ });
436
+
437
+ it('one query params - number string', async () => {
438
+ const testNumber = 123;
439
+
440
+ await send(`/?k=${testNumber}`);
441
+
442
+ const values = httpUtils.getQueryParamAll(expressRequest, 'k');
443
+ assert.deepEqual(values, [testNumber + '']);
444
+
445
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k');
446
+ assert.deepEqual(value, testNumber + '');
447
+
448
+ // ==========================================
449
+ // Well, it seems '123' can actually be parsed
450
+ // to a valid date. What can you do?
451
+ // ==========================================
452
+ value = httpUtils.getQueryParamOneAsDate(expressRequest, 'k');
453
+ assert.deepEqual(value, new Date(testNumber + ''));
454
+
455
+ value = httpUtils.getQueryParamOneAsNumber(expressRequest, 'k');
456
+ assert.deepEqual(value, testNumber);
457
+
458
+ value = httpUtils.getQueryParamOneAsNumber(expressRequest, 'k', (_errMsg: string) => {
459
+ assert.fail();
460
+ });
461
+ assert.deepEqual(value, testNumber);
462
+
463
+ let error;
464
+ try {
465
+ httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
466
+ } catch (err) {
467
+ error = err;
468
+ }
469
+ if (!error) {
470
+ assert.fail();
471
+ }
472
+ });
473
+
474
+ it(`one query params - boolean`, async () => {
475
+ await send(`/?k=true`);
476
+ let value: any = httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
477
+ assert.deepEqual(value, true);
478
+
479
+ await send(`/?k=TrUe`);
480
+ value = httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
481
+ assert.deepEqual(value, true);
482
+
483
+ await send(`/?k=false`);
484
+ value = httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
485
+ assert.deepEqual(value, false);
486
+
487
+ await send(`/?k=0`);
488
+ let error;
489
+ try {
490
+ httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
491
+ } catch (err) {
492
+ error = err;
493
+ }
494
+ if (!error) {
495
+ assert.fail();
496
+ }
497
+
498
+ await send(`/?k=1`);
499
+ try {
500
+ httpUtils.getQueryParamOneAsBoolean(expressRequest, 'k');
501
+ } catch (err) {
502
+ error = err;
503
+ }
504
+ if (!error) {
505
+ assert.fail();
506
+ }
507
+ });
508
+
509
+ it('two different query params', async () => {
510
+ await send(`/?k1=123&k2=titi`);
511
+
512
+ let values = httpUtils.getQueryParamAll(expressRequest, 'k1');
513
+ assert.deepEqual(values, ['123']);
514
+
515
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k1');
516
+ assert.deepEqual(value, '123');
517
+
518
+ values = httpUtils.getQueryParamAll(expressRequest, 'k2');
519
+ assert.deepEqual(values, ['titi']);
520
+
521
+ value = httpUtils.getQueryParamOne(expressRequest, 'k2');
522
+ assert.deepEqual(value, 'titi');
523
+ });
524
+
525
+ it('two different query params, different only by casing!', async () => {
526
+ await send(`/?k=123&K=titi`);
527
+
528
+ let values = httpUtils.getQueryParamAll(expressRequest, 'k');
529
+ assert.deepEqual(values, ['123']);
530
+
531
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k');
532
+ assert.deepEqual(value, '123');
533
+
534
+ values = httpUtils.getQueryParamAll(expressRequest, 'K');
535
+ assert.deepEqual(values, ['titi']);
536
+
537
+ value = httpUtils.getQueryParamOne(expressRequest, 'K');
538
+ assert.deepEqual(value, 'titi');
539
+ });
540
+
541
+ it('One query param with multiple values - first value is a number, second value is a date', async () => {
542
+ const dateStr = '2020-04-21T17:13:33.107Z';
543
+ const testNumber = 123;
544
+
545
+ await send(`/?k=${testNumber}&k=${encodeURIComponent(dateStr)}`);
546
+
547
+ const values = httpUtils.getQueryParamAll(expressRequest, 'k');
548
+ assert.deepEqual(values, [testNumber + '', dateStr]);
549
+
550
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k');
551
+ assert.deepEqual(value, dateStr); // last value wins
552
+
553
+ // last value wins and is parsable to a Date
554
+ value = httpUtils.getQueryParamOneAsDate(expressRequest, 'k');
555
+ assert.deepEqual(value, new Date(dateStr));
556
+
557
+ // last value wins and can't be parsed to a number
558
+ let error;
559
+ try {
560
+ httpUtils.getQueryParamOneAsNumber(expressRequest, 'k');
561
+ } catch (err) {
562
+ error = err;
563
+ }
564
+ if (!error) {
565
+ assert.fail();
566
+ }
567
+ });
568
+
569
+ it('One query param with multiple values - first value is a date, second value is a number', async () => {
570
+ const dateStr = '2020-04-21T17:13:33.107Z';
571
+ const testNumber = 123;
572
+
573
+ await send(`/?k=${encodeURIComponent(dateStr)}&k=${testNumber}`);
574
+
575
+ const values = httpUtils.getQueryParamAll(expressRequest, 'k');
576
+ assert.deepEqual(values, [dateStr, testNumber + '']);
577
+
578
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k');
579
+ assert.deepEqual(value, testNumber + ''); // last value wins
580
+
581
+ // last value wins and CAN be parsed to a Date...
582
+ // Yep, '123' can be parsed as date.
583
+ value = httpUtils.getQueryParamOneAsDate(expressRequest, 'k');
584
+ assert.deepEqual(value, new Date(testNumber + ''));
585
+
586
+ // last value wins and can be parsed to a number
587
+ value = httpUtils.getQueryParamOneAsNumber(expressRequest, 'k');
588
+ assert.deepEqual(value, testNumber);
589
+ });
590
+ });
591
+
592
+ describe('Query params functions - Case insensitive', () => {
593
+ before(async () => {
594
+ // ==========================================
595
+ // Set the configs for case insensitivity!
596
+ // ==========================================
597
+ setTestingConfigurations(false);
598
+ await startServer(false);
599
+ });
600
+
601
+ after(() => {
602
+ server.close();
603
+ });
604
+
605
+ it('two different query params, different by casing!', async () => {
606
+ await send(`/?k=123&K=titi`);
607
+
608
+ let values = httpUtils.getQueryParamAll(expressRequest, 'k'); // lowercase
609
+ assert.deepEqual(values, ['123', 'titi']);
610
+
611
+ let value: any = httpUtils.getQueryParamOne(expressRequest, 'k'); // lowercase
612
+ assert.deepEqual(value, 'titi'); // last value wins
613
+
614
+ values = httpUtils.getQueryParamAll(expressRequest, 'K'); // uppercase
615
+ assert.deepEqual(values, ['123', 'titi']);
616
+
617
+ value = httpUtils.getQueryParamOne(expressRequest, 'K'); // uppercase
618
+ assert.deepEqual(value, 'titi'); // last value wins
619
+ });
620
+ });
621
+
622
+ describe('getOrderBys - Case insensitive', () => {
623
+ before(async () => {
624
+ setTestingConfigurations(false);
625
+ await startServer(false);
626
+ });
627
+
628
+ after(() => {
629
+ server.close();
630
+ });
631
+
632
+ it('Nil', async () => {
633
+ await send(`/`);
634
+
635
+ let orderBys: IOrderBy[] = httpUtils.getOrderBys(null);
636
+ assert.deepEqual(orderBys, []);
637
+
638
+ orderBys = httpUtils.getOrderBys(undefined);
639
+ assert.deepEqual(orderBys, []);
640
+ });
641
+
642
+ it('No orderBys', async () => {
643
+ await send(`/`);
644
+
645
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
646
+ assert.deepEqual(orderBys, []);
647
+ });
648
+
649
+ it('one orderBy, default is asc', async () => {
650
+ await send(`/?orderBy=name`);
651
+
652
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
653
+ assert.deepEqual(orderBys, [
654
+ {
655
+ key: 'name',
656
+ direction: OrderByDirection.ASC
657
+ }
658
+ ]);
659
+ });
660
+
661
+ it('one orderBy, explicit asc', async () => {
662
+ await send(`/?orderBy=+name`);
663
+
664
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
665
+ assert.deepEqual(orderBys, [
666
+ {
667
+ key: 'name',
668
+ direction: OrderByDirection.ASC
669
+ }
670
+ ]);
671
+ });
672
+
673
+ it('one orderBy, desc', async () => {
674
+ await send(`/?orderBy=-name`);
675
+
676
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
677
+ assert.deepEqual(orderBys, [
678
+ {
679
+ key: 'name',
680
+ direction: OrderByDirection.DESC
681
+ }
682
+ ]);
683
+ });
684
+
685
+ it('multiple orderBys', async () => {
686
+ await send(`/?orderBy=-name,age,+nick,-color`);
687
+
688
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
689
+ assert.deepEqual(orderBys, [
690
+ {
691
+ key: 'name',
692
+ direction: OrderByDirection.DESC
693
+ },
694
+ {
695
+ key: 'age',
696
+ direction: OrderByDirection.ASC
697
+ },
698
+ {
699
+ key: 'nick',
700
+ direction: OrderByDirection.ASC
701
+ },
702
+ {
703
+ key: 'color',
704
+ direction: OrderByDirection.DESC
705
+ }
706
+ ]);
707
+ });
708
+
709
+ it('The case sensitivity of the "orderBy" key is not important', async () => {
710
+ await send(`/?ORDERBY=-name`);
711
+
712
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
713
+ assert.deepEqual(orderBys, [
714
+ {
715
+ key: 'name',
716
+ direction: OrderByDirection.DESC
717
+ }
718
+ ]);
719
+ });
720
+
721
+ it('The case sensitivity of the orderBy *value* is kept', async () => {
722
+ await send(`/?orderBy=-NAME`);
723
+
724
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
725
+ assert.deepEqual(orderBys, [
726
+ {
727
+ key: 'NAME',
728
+ direction: OrderByDirection.DESC
729
+ }
730
+ ]);
731
+ });
732
+ });
733
+
734
+ describe('getOrderBys - Case sensitive', () => {
735
+ before(async () => {
736
+ setTestingConfigurations(true);
737
+ await startServer(true);
738
+ });
739
+
740
+ after(() => {
741
+ server.close();
742
+ });
743
+
744
+ it('The case sensitivity of the "orderBy" key is important', async () => {
745
+ await send(`/?ORDERBY=-name`);
746
+
747
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
748
+ assert.deepEqual(orderBys, []);
749
+ });
750
+
751
+ it('The case sensitivity of the orderBy *value* is kept', async () => {
752
+ await send(`/?orderBy=-NAME`);
753
+
754
+ const orderBys: IOrderBy[] = httpUtils.getOrderBys(expressRequest);
755
+ assert.deepEqual(orderBys, [
756
+ {
757
+ key: 'NAME',
758
+ direction: OrderByDirection.DESC
759
+ }
760
+ ]);
761
+ });
762
+ });
763
+ });
764
+ });