Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81154 views
1
// Load modules
2
3
var Util = require('util');
4
var Code = require('code');
5
var Boom = require('../lib');
6
var Lab = require('lab');
7
8
9
// Declare internals
10
11
var internals = {};
12
13
14
// Test shortcuts
15
16
var lab = exports.lab = Lab.script();
17
var describe = lab.describe;
18
var it = lab.it;
19
var expect = Code.expect;
20
21
22
it('returns the same object when already boom', function (done) {
23
24
var error = Boom.badRequest();
25
var wrapped = Boom.wrap(error);
26
expect(error).to.equal(wrapped);
27
done();
28
});
29
30
it('returns an error with info when constructed using another error', function (done) {
31
32
var error = new Error('ka-boom');
33
error.xyz = 123;
34
var err = Boom.wrap(error);
35
expect(err.xyz).to.equal(123);
36
expect(err.message).to.equal('ka-boom');
37
expect(err.output).to.deep.equal({
38
statusCode: 500,
39
payload: {
40
statusCode: 500,
41
error: 'Internal Server Error',
42
message: 'An internal server error occurred'
43
},
44
headers: {}
45
});
46
expect(err.data).to.equal(null);
47
done();
48
});
49
50
it('does not override data when constructed using another error', function (done) {
51
52
var error = new Error('ka-boom');
53
error.data = { useful: 'data' };
54
var err = Boom.wrap(error);
55
expect(err.data).to.equal(error.data);
56
done();
57
});
58
59
it('sets new message when none exists', function (done) {
60
61
var error = new Error();
62
var wrapped = Boom.wrap(error, 400, 'something bad');
63
expect(wrapped.message).to.equal('something bad');
64
done();
65
});
66
67
it('throws when statusCode is not a number', function (done) {
68
69
expect(function () {
70
71
Boom.create('x');
72
}).to.throw('First argument must be a number (400+): x');
73
done();
74
});
75
76
it('will cast a number-string to an integer', function (done) {
77
78
var codes = [
79
{ input: '404', result: 404 },
80
{ input: '404.1', result: 404 },
81
{ input: 400, result: 400 },
82
{ input: 400.123, result: 400 }]
83
for (var i = 0, il = codes.length; i < il; ++i) {
84
var code = codes[i];
85
var err = Boom.create(code.input);
86
expect(err.output.statusCode).to.equal(code.result);
87
}
88
89
done();
90
});
91
92
it('throws when statusCode is not finite', function (done) {
93
94
expect(function () {
95
96
Boom.create(1 / 0);
97
}).to.throw('First argument must be a number (400+): null');
98
done();
99
});
100
101
it('sets error code to unknown', function (done) {
102
103
var err = Boom.create(999);
104
expect(err.output.payload.error).to.equal('Unknown');
105
done();
106
});
107
108
describe('create()', function () {
109
110
it('does not sets null message', function (done) {
111
112
var error = Boom.unauthorized(null);
113
expect(error.output.payload.message).to.not.exist();
114
expect(error.isServer).to.be.false();
115
done();
116
});
117
118
it('sets message and data', function (done) {
119
120
var error = Boom.badRequest('Missing data', { type: 'user' });
121
expect(error.data.type).to.equal('user');
122
expect(error.output.payload.message).to.equal('Missing data');
123
done();
124
});
125
});
126
127
describe('isBoom()', function () {
128
129
it('returns true for Boom object', function (done) {
130
131
expect(Boom.badRequest().isBoom).to.equal(true);
132
done();
133
});
134
135
it('returns false for Error object', function (done) {
136
137
expect((new Error()).isBoom).to.not.exist();
138
done();
139
});
140
});
141
142
describe('badRequest()', function () {
143
144
it('returns a 400 error statusCode', function (done) {
145
146
var error = Boom.badRequest();
147
148
expect(error.output.statusCode).to.equal(400);
149
expect(error.isServer).to.be.false();
150
done();
151
});
152
153
it('sets the message with the passed in message', function (done) {
154
155
expect(Boom.badRequest('my message').message).to.equal('my message');
156
done();
157
});
158
159
it('sets the message to HTTP status if none provided', function (done) {
160
161
expect(Boom.badRequest().message).to.equal('Bad Request');
162
done();
163
});
164
});
165
166
describe('unauthorized()', function () {
167
168
it('returns a 401 error statusCode', function (done) {
169
170
var err = Boom.unauthorized();
171
expect(err.output.statusCode).to.equal(401);
172
expect(err.output.headers).to.deep.equal({});
173
done();
174
});
175
176
it('sets the message with the passed in message', function (done) {
177
178
expect(Boom.unauthorized('my message').message).to.equal('my message');
179
done();
180
});
181
182
it('returns a WWW-Authenticate header when passed a scheme', function (done) {
183
184
var err = Boom.unauthorized('boom', 'Test');
185
expect(err.output.statusCode).to.equal(401);
186
expect(err.output.headers['WWW-Authenticate']).to.equal('Test error="boom"');
187
done();
188
});
189
190
it('returns a WWW-Authenticate header set to the schema array value', function (done) {
191
192
var err = Boom.unauthorized(null, ['Test','one','two']);
193
expect(err.output.statusCode).to.equal(401);
194
expect(err.output.headers['WWW-Authenticate']).to.equal('Test, one, two');
195
done();
196
});
197
198
it('returns a WWW-Authenticate header when passed a scheme and attributes', function (done) {
199
200
var err = Boom.unauthorized('boom', 'Test', { a: 1, b: 'something', c: null, d: 0 });
201
expect(err.output.statusCode).to.equal(401);
202
expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0", error="boom"');
203
done();
204
});
205
206
it('returns a WWW-Authenticate header when passed attributes, missing error', function (done) {
207
208
var err = Boom.unauthorized(null, 'Test', { a: 1, b: 'something', c: null, d: 0 });
209
expect(err.output.statusCode).to.equal(401);
210
expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0"');
211
expect(err.isMissing).to.equal(true);
212
done();
213
});
214
215
it('sets the isMissing flag when error message is empty', function (done) {
216
217
var err = Boom.unauthorized('', 'Basic');
218
expect(err.isMissing).to.equal(true);
219
done();
220
});
221
222
it('does not set the isMissing flag when error message is not empty', function (done) {
223
224
var err = Boom.unauthorized('message', 'Basic');
225
expect(err.isMissing).to.equal(undefined);
226
done();
227
});
228
229
it('sets a WWW-Authenticate when passed as an array', function (done) {
230
231
var err = Boom.unauthorized('message', ['Basic', 'Example e="1"', 'Another x="3", y="4"']);
232
expect(err.output.headers['WWW-Authenticate']).to.equal('Basic, Example e="1", Another x="3", y="4"');
233
done();
234
});
235
});
236
237
238
describe('methodNotAllowed()', function () {
239
240
it('returns a 405 error statusCode', function (done) {
241
242
expect(Boom.methodNotAllowed().output.statusCode).to.equal(405);
243
done();
244
});
245
246
it('sets the message with the passed in message', function (done) {
247
248
expect(Boom.methodNotAllowed('my message').message).to.equal('my message');
249
done();
250
});
251
});
252
253
254
describe('notAcceptable()', function () {
255
256
it('returns a 406 error statusCode', function (done) {
257
258
expect(Boom.notAcceptable().output.statusCode).to.equal(406);
259
done();
260
});
261
262
it('sets the message with the passed in message', function (done) {
263
264
expect(Boom.notAcceptable('my message').message).to.equal('my message');
265
done();
266
});
267
});
268
269
270
describe('proxyAuthRequired()', function () {
271
272
it('returns a 407 error statusCode', function (done) {
273
274
expect(Boom.proxyAuthRequired().output.statusCode).to.equal(407);
275
done();
276
});
277
278
it('sets the message with the passed in message', function (done) {
279
280
expect(Boom.proxyAuthRequired('my message').message).to.equal('my message');
281
done();
282
});
283
});
284
285
286
describe('clientTimeout()', function () {
287
288
it('returns a 408 error statusCode', function (done) {
289
290
expect(Boom.clientTimeout().output.statusCode).to.equal(408);
291
done();
292
});
293
294
it('sets the message with the passed in message', function (done) {
295
296
expect(Boom.clientTimeout('my message').message).to.equal('my message');
297
done();
298
});
299
});
300
301
302
describe('conflict()', function () {
303
304
it('returns a 409 error statusCode', function (done) {
305
306
expect(Boom.conflict().output.statusCode).to.equal(409);
307
done();
308
});
309
310
it('sets the message with the passed in message', function (done) {
311
312
expect(Boom.conflict('my message').message).to.equal('my message');
313
done();
314
});
315
});
316
317
318
describe('resourceGone()', function () {
319
320
it('returns a 410 error statusCode', function (done) {
321
322
expect(Boom.resourceGone().output.statusCode).to.equal(410);
323
done();
324
});
325
326
it('sets the message with the passed in message', function (done) {
327
328
expect(Boom.resourceGone('my message').message).to.equal('my message');
329
done();
330
});
331
});
332
333
334
describe('lengthRequired()', function () {
335
336
it('returns a 411 error statusCode', function (done) {
337
338
expect(Boom.lengthRequired().output.statusCode).to.equal(411);
339
done();
340
});
341
342
it('sets the message with the passed in message', function (done) {
343
344
expect(Boom.lengthRequired('my message').message).to.equal('my message');
345
done();
346
});
347
});
348
349
350
describe('preconditionFailed()', function () {
351
352
it('returns a 412 error statusCode', function (done) {
353
354
expect(Boom.preconditionFailed().output.statusCode).to.equal(412);
355
done();
356
});
357
358
it('sets the message with the passed in message', function (done) {
359
360
expect(Boom.preconditionFailed('my message').message).to.equal('my message');
361
done();
362
});
363
});
364
365
366
describe('entityTooLarge()', function () {
367
368
it('returns a 413 error statusCode', function (done) {
369
370
expect(Boom.entityTooLarge().output.statusCode).to.equal(413);
371
done();
372
});
373
374
it('sets the message with the passed in message', function (done) {
375
376
expect(Boom.entityTooLarge('my message').message).to.equal('my message');
377
done();
378
});
379
});
380
381
382
describe('uriTooLong()', function () {
383
384
it('returns a 414 error statusCode', function (done) {
385
386
expect(Boom.uriTooLong().output.statusCode).to.equal(414);
387
done();
388
});
389
390
it('sets the message with the passed in message', function (done) {
391
392
expect(Boom.uriTooLong('my message').message).to.equal('my message');
393
done();
394
});
395
});
396
397
398
describe('unsupportedMediaType()', function () {
399
400
it('returns a 415 error statusCode', function (done) {
401
402
expect(Boom.unsupportedMediaType().output.statusCode).to.equal(415);
403
done();
404
});
405
406
it('sets the message with the passed in message', function (done) {
407
408
expect(Boom.unsupportedMediaType('my message').message).to.equal('my message');
409
done();
410
});
411
});
412
413
414
describe('rangeNotSatisfiable()', function () {
415
416
it('returns a 416 error statusCode', function (done) {
417
418
expect(Boom.rangeNotSatisfiable().output.statusCode).to.equal(416);
419
done();
420
});
421
422
it('sets the message with the passed in message', function (done) {
423
424
expect(Boom.rangeNotSatisfiable('my message').message).to.equal('my message');
425
done();
426
});
427
});
428
429
430
describe('expectationFailed()', function () {
431
432
it('returns a 417 error statusCode', function (done) {
433
434
expect(Boom.expectationFailed().output.statusCode).to.equal(417);
435
done();
436
});
437
438
it('sets the message with the passed in message', function (done) {
439
440
expect(Boom.expectationFailed('my message').message).to.equal('my message');
441
done();
442
});
443
});
444
445
446
describe('badData()', function () {
447
448
it('returns a 422 error statusCode', function (done) {
449
450
expect(Boom.badData().output.statusCode).to.equal(422);
451
done();
452
});
453
454
it('sets the message with the passed in message', function (done) {
455
456
expect(Boom.badData('my message').message).to.equal('my message');
457
done();
458
});
459
});
460
461
462
describe('tooManyRequests()', function () {
463
464
it('returns a 429 error statusCode', function (done) {
465
466
expect(Boom.tooManyRequests().output.statusCode).to.equal(429);
467
done();
468
});
469
470
it('sets the message with the passed-in message', function (done) {
471
472
expect(Boom.tooManyRequests('my message').message).to.equal('my message');
473
done();
474
});
475
});
476
477
describe('serverTimeout()', function () {
478
479
it('returns a 503 error statusCode', function (done) {
480
481
expect(Boom.serverTimeout().output.statusCode).to.equal(503);
482
done();
483
});
484
485
it('sets the message with the passed in message', function (done) {
486
487
expect(Boom.serverTimeout('my message').message).to.equal('my message');
488
done();
489
});
490
});
491
492
describe('forbidden()', function () {
493
494
it('returns a 403 error statusCode', function (done) {
495
496
expect(Boom.forbidden().output.statusCode).to.equal(403);
497
done();
498
});
499
500
it('sets the message with the passed in message', function (done) {
501
502
expect(Boom.forbidden('my message').message).to.equal('my message');
503
done();
504
});
505
});
506
507
describe('notFound()', function () {
508
509
it('returns a 404 error statusCode', function (done) {
510
511
expect(Boom.notFound().output.statusCode).to.equal(404);
512
done();
513
});
514
515
it('sets the message with the passed in message', function (done) {
516
517
expect(Boom.notFound('my message').message).to.equal('my message');
518
done();
519
});
520
});
521
522
describe('internal()', function () {
523
524
it('returns a 500 error statusCode', function (done) {
525
526
expect(Boom.internal().output.statusCode).to.equal(500);
527
done();
528
});
529
530
it('sets the message with the passed in message', function (done) {
531
532
var err = Boom.internal('my message');
533
expect(err.message).to.equal('my message');
534
expect(err.isServer).to.true();
535
expect(err.output.payload.message).to.equal('An internal server error occurred');
536
done();
537
});
538
539
it('passes data on the callback if its passed in', function (done) {
540
541
expect(Boom.internal('my message', { my: 'data' }).data.my).to.equal('data');
542
done();
543
});
544
545
it('returns an error with composite message', function (done) {
546
547
try {
548
JSON.parse('{');
549
}
550
catch (err) {
551
var boom = Boom.internal('Someting bad', err);
552
expect(boom.message).to.equal('Someting bad: Unexpected end of input');
553
expect(boom.isServer).to.be.true();
554
done();
555
}
556
});
557
});
558
559
describe('notImplemented()', function () {
560
561
it('returns a 501 error statusCode', function (done) {
562
563
expect(Boom.notImplemented().output.statusCode).to.equal(501);
564
done();
565
});
566
567
it('sets the message with the passed in message', function (done) {
568
569
expect(Boom.notImplemented('my message').message).to.equal('my message');
570
done();
571
});
572
});
573
574
575
describe('badGateway()', function () {
576
577
it('returns a 502 error statusCode', function (done) {
578
579
expect(Boom.badGateway().output.statusCode).to.equal(502);
580
done();
581
});
582
583
it('sets the message with the passed in message', function (done) {
584
585
expect(Boom.badGateway('my message').message).to.equal('my message');
586
done();
587
});
588
});
589
590
describe('gatewayTimeout()', function () {
591
592
it('returns a 504 error statusCode', function (done) {
593
594
expect(Boom.gatewayTimeout().output.statusCode).to.equal(504);
595
done();
596
});
597
598
it('sets the message with the passed in message', function (done) {
599
600
expect(Boom.gatewayTimeout('my message').message).to.equal('my message');
601
done();
602
});
603
});
604
605
describe('badImplementation()', function () {
606
607
it('returns a 500 error statusCode', function (done) {
608
609
var err = Boom.badImplementation();
610
expect(err.output.statusCode).to.equal(500);
611
expect(err.isDeveloperError).to.equal(true);
612
expect(err.isServer).to.be.true();
613
done();
614
});
615
});
616
617