@terreno/api 0.9.3 → 0.11.0
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.
- package/bunfig.toml +5 -2
- package/bunfig.unit.toml +3 -0
- package/dist/auth.test.js +257 -0
- package/dist/consentApp.test.js +245 -0
- package/dist/expressServer.js +3 -9
- package/dist/expressServer.test.js +4 -7
- package/dist/githubAuth.test.js +380 -0
- package/dist/logger.test.d.ts +1 -0
- package/dist/logger.test.js +143 -0
- package/dist/notifiers/googleChatNotifier.test.js +37 -0
- package/dist/openApi.js +2 -2
- package/dist/openApi.test.js +125 -0
- package/dist/openApiBuilder.d.ts +1 -0
- package/dist/openApiBuilder.js +13 -2
- package/dist/openApiBuilder.test.js +66 -0
- package/dist/openApiEtag.test.js +8 -0
- package/dist/openApiValidator.test.js +309 -0
- package/dist/permissions.middleware.test.d.ts +1 -0
- package/dist/permissions.middleware.test.js +341 -0
- package/dist/plugins.d.ts +8 -8
- package/dist/plugins.js +38 -32
- package/dist/populate.test.js +99 -0
- package/dist/syncConsents.js +2 -2
- package/dist/syncConsents.test.js +273 -0
- package/dist/tests/bunSetup.js +27 -22
- package/dist/tests.d.ts +3 -3
- package/dist/tests.js +78 -82
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +7 -7
- package/package.json +2 -1
- package/src/__snapshots__/openApi.test.ts.snap +48 -0
- package/src/auth.test.ts +147 -0
- package/src/consentApp.test.ts +162 -0
- package/src/expressServer.test.ts +4 -11
- package/src/expressServer.ts +4 -8
- package/src/githubAuth.test.ts +307 -1
- package/src/logger.test.ts +149 -0
- package/src/notifiers/googleChatNotifier.test.ts +24 -0
- package/src/openApi.test.ts +157 -1
- package/src/openApi.ts +6 -2
- package/src/openApiBuilder.test.ts +81 -0
- package/src/openApiBuilder.ts +17 -2
- package/src/openApiEtag.test.ts +11 -0
- package/src/openApiValidator.test.ts +410 -0
- package/src/permissions.middleware.test.ts +197 -0
- package/src/plugins.ts +32 -23
- package/src/populate.test.ts +78 -2
- package/src/syncConsents.test.ts +145 -0
- package/src/syncConsents.ts +1 -1
- package/src/tests/bunSetup.ts +14 -8
- package/src/tests.ts +8 -8
- package/src/utils.ts +4 -4
package/dist/syncConsents.js
CHANGED
|
@@ -176,7 +176,7 @@ var syncConsents = function (definitions_1) {
|
|
|
176
176
|
args_1[_i - 1] = arguments[_i];
|
|
177
177
|
}
|
|
178
178
|
return __awaiter(void 0, __spreadArray([definitions_1], __read(args_1), false), void 0, function (definitions, options) {
|
|
179
|
-
var _a, deactivateRemoved, _b, dryRun, result, slugs, activeForms, activeBySlug, slugs_1, slugs_1_1, slug, def, existing, newVersion, e_1_1, activeBySlug_1, activeBySlug_1_1, _c, slug,
|
|
179
|
+
var _a, deactivateRemoved, _b, dryRun, result, slugs, activeForms, activeBySlug, slugs_1, slugs_1_1, slug, def, existing, newVersion, e_1_1, activeBySlug_1, activeBySlug_1_1, _c, slug, e_2_1, summary;
|
|
180
180
|
var e_1, _d, e_2, _e;
|
|
181
181
|
var _f, _g, _h, _j;
|
|
182
182
|
if (options === void 0) { options = {}; }
|
|
@@ -291,7 +291,7 @@ var syncConsents = function (definitions_1) {
|
|
|
291
291
|
_k.label = 16;
|
|
292
292
|
case 16:
|
|
293
293
|
if (!!activeBySlug_1_1.done) return [3 /*break*/, 20];
|
|
294
|
-
_c = __read(activeBySlug_1_1.value,
|
|
294
|
+
_c = __read(activeBySlug_1_1.value, 1), slug = _c[0];
|
|
295
295
|
if (!!definitions[slug]) return [3 /*break*/, 19];
|
|
296
296
|
logger_1.logger.info("syncConsents: deactivating \"".concat(slug, "\""), { dryRun: dryRun });
|
|
297
297
|
if (!!dryRun) return [3 /*break*/, 18];
|
|
@@ -246,4 +246,277 @@ var baseDef = {
|
|
|
246
246
|
}
|
|
247
247
|
});
|
|
248
248
|
}); });
|
|
249
|
+
(0, bun_test_1.it)("publishes new version when type changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
250
|
+
var updated, result;
|
|
251
|
+
return __generator(this, function (_a) {
|
|
252
|
+
switch (_a.label) {
|
|
253
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
254
|
+
case 1:
|
|
255
|
+
_a.sent();
|
|
256
|
+
updated = __assign(__assign({}, baseDef), { type: "privacy" });
|
|
257
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
258
|
+
case 2:
|
|
259
|
+
result = _a.sent();
|
|
260
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
261
|
+
return [2 /*return*/];
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}); });
|
|
265
|
+
(0, bun_test_1.it)("publishes new version when order changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
266
|
+
var updated, result;
|
|
267
|
+
return __generator(this, function (_a) {
|
|
268
|
+
switch (_a.label) {
|
|
269
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
270
|
+
case 1:
|
|
271
|
+
_a.sent();
|
|
272
|
+
updated = __assign(__assign({}, baseDef), { order: 99 });
|
|
273
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
274
|
+
case 2:
|
|
275
|
+
result = _a.sent();
|
|
276
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
277
|
+
return [2 /*return*/];
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}); });
|
|
281
|
+
(0, bun_test_1.it)("publishes new version when required changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
282
|
+
var updated, result;
|
|
283
|
+
return __generator(this, function (_a) {
|
|
284
|
+
switch (_a.label) {
|
|
285
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
286
|
+
case 1:
|
|
287
|
+
_a.sent();
|
|
288
|
+
updated = __assign(__assign({}, baseDef), { required: false });
|
|
289
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
290
|
+
case 2:
|
|
291
|
+
result = _a.sent();
|
|
292
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
293
|
+
return [2 /*return*/];
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}); });
|
|
297
|
+
(0, bun_test_1.it)("publishes new version when requireScrollToBottom changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
298
|
+
var updated, result;
|
|
299
|
+
return __generator(this, function (_a) {
|
|
300
|
+
switch (_a.label) {
|
|
301
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
302
|
+
case 1:
|
|
303
|
+
_a.sent();
|
|
304
|
+
updated = __assign(__assign({}, baseDef), { requireScrollToBottom: true });
|
|
305
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
306
|
+
case 2:
|
|
307
|
+
result = _a.sent();
|
|
308
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
309
|
+
return [2 /*return*/];
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
}); });
|
|
313
|
+
(0, bun_test_1.it)("publishes new version when captureSignature changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
314
|
+
var updated, result;
|
|
315
|
+
return __generator(this, function (_a) {
|
|
316
|
+
switch (_a.label) {
|
|
317
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
318
|
+
case 1:
|
|
319
|
+
_a.sent();
|
|
320
|
+
updated = __assign(__assign({}, baseDef), { captureSignature: true });
|
|
321
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
322
|
+
case 2:
|
|
323
|
+
result = _a.sent();
|
|
324
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
325
|
+
return [2 /*return*/];
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}); });
|
|
329
|
+
(0, bun_test_1.it)("publishes new version when agreeButtonText changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
330
|
+
var updated, result;
|
|
331
|
+
return __generator(this, function (_a) {
|
|
332
|
+
switch (_a.label) {
|
|
333
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
334
|
+
case 1:
|
|
335
|
+
_a.sent();
|
|
336
|
+
updated = __assign(__assign({}, baseDef), { agreeButtonText: "Consent" });
|
|
337
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
338
|
+
case 2:
|
|
339
|
+
result = _a.sent();
|
|
340
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
341
|
+
return [2 /*return*/];
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
}); });
|
|
345
|
+
(0, bun_test_1.it)("publishes new version when allowDecline changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
346
|
+
var updated, result;
|
|
347
|
+
return __generator(this, function (_a) {
|
|
348
|
+
switch (_a.label) {
|
|
349
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
350
|
+
case 1:
|
|
351
|
+
_a.sent();
|
|
352
|
+
updated = __assign(__assign({}, baseDef), { allowDecline: true });
|
|
353
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
354
|
+
case 2:
|
|
355
|
+
result = _a.sent();
|
|
356
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
357
|
+
return [2 /*return*/];
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}); });
|
|
361
|
+
(0, bun_test_1.it)("publishes new version when declineButtonText changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
362
|
+
var updated, result;
|
|
363
|
+
return __generator(this, function (_a) {
|
|
364
|
+
switch (_a.label) {
|
|
365
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
366
|
+
case 1:
|
|
367
|
+
_a.sent();
|
|
368
|
+
updated = __assign(__assign({}, baseDef), { allowDecline: true, declineButtonText: "No Thanks" });
|
|
369
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
370
|
+
case 2:
|
|
371
|
+
result = _a.sent();
|
|
372
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
373
|
+
return [2 /*return*/];
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
}); });
|
|
377
|
+
(0, bun_test_1.it)("publishes new version when defaultLocale changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
378
|
+
var updated, result;
|
|
379
|
+
return __generator(this, function (_a) {
|
|
380
|
+
switch (_a.label) {
|
|
381
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
382
|
+
case 1:
|
|
383
|
+
_a.sent();
|
|
384
|
+
updated = __assign(__assign({}, baseDef), { defaultLocale: "es" });
|
|
385
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
386
|
+
case 2:
|
|
387
|
+
result = _a.sent();
|
|
388
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
389
|
+
return [2 /*return*/];
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
}); });
|
|
393
|
+
(0, bun_test_1.it)("publishes new version when content locale count changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
394
|
+
var updated, result;
|
|
395
|
+
return __generator(this, function (_a) {
|
|
396
|
+
switch (_a.label) {
|
|
397
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
398
|
+
case 1:
|
|
399
|
+
_a.sent();
|
|
400
|
+
updated = __assign(__assign({}, baseDef), { content: { en: baseDef.content.en, es: "# Términos" } });
|
|
401
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
402
|
+
case 2:
|
|
403
|
+
result = _a.sent();
|
|
404
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
405
|
+
return [2 /*return*/];
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}); });
|
|
409
|
+
(0, bun_test_1.it)("publishes new version when checkbox count changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
410
|
+
var updated, result;
|
|
411
|
+
return __generator(this, function (_a) {
|
|
412
|
+
switch (_a.label) {
|
|
413
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({
|
|
414
|
+
terms: __assign(__assign({}, baseDef), { checkboxes: [{ label: "Agree", required: true }] }),
|
|
415
|
+
})];
|
|
416
|
+
case 1:
|
|
417
|
+
_a.sent();
|
|
418
|
+
updated = __assign(__assign({}, baseDef), { checkboxes: [
|
|
419
|
+
{ label: "Agree", required: true },
|
|
420
|
+
{ label: "Also agree", required: false },
|
|
421
|
+
] });
|
|
422
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
423
|
+
case 2:
|
|
424
|
+
result = _a.sent();
|
|
425
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
426
|
+
return [2 /*return*/];
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}); });
|
|
430
|
+
(0, bun_test_1.it)("publishes new version when checkbox label changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
431
|
+
var updated, result;
|
|
432
|
+
return __generator(this, function (_a) {
|
|
433
|
+
switch (_a.label) {
|
|
434
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({
|
|
435
|
+
terms: __assign(__assign({}, baseDef), { checkboxes: [{ label: "Agree", required: true }] }),
|
|
436
|
+
})];
|
|
437
|
+
case 1:
|
|
438
|
+
_a.sent();
|
|
439
|
+
updated = __assign(__assign({}, baseDef), { checkboxes: [{ label: "I Agree", required: true }] });
|
|
440
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
441
|
+
case 2:
|
|
442
|
+
result = _a.sent();
|
|
443
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
444
|
+
return [2 /*return*/];
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
}); });
|
|
448
|
+
(0, bun_test_1.it)("publishes new version when checkbox confirmationPrompt changes", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
449
|
+
var updated, result;
|
|
450
|
+
return __generator(this, function (_a) {
|
|
451
|
+
switch (_a.label) {
|
|
452
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({
|
|
453
|
+
terms: __assign(__assign({}, baseDef), { checkboxes: [{ confirmationPrompt: "Sure?", label: "Agree", required: true }] }),
|
|
454
|
+
})];
|
|
455
|
+
case 1:
|
|
456
|
+
_a.sent();
|
|
457
|
+
updated = __assign(__assign({}, baseDef), { checkboxes: [{ confirmationPrompt: "Are you sure?", label: "Agree", required: true }] });
|
|
458
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
|
|
459
|
+
case 2:
|
|
460
|
+
result = _a.sent();
|
|
461
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
462
|
+
return [2 /*return*/];
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
}); });
|
|
466
|
+
(0, bun_test_1.it)("leaves unchanged forms alone with checkboxes present", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
467
|
+
var withCheckboxes, result;
|
|
468
|
+
return __generator(this, function (_a) {
|
|
469
|
+
switch (_a.label) {
|
|
470
|
+
case 0:
|
|
471
|
+
withCheckboxes = __assign(__assign({}, baseDef), { checkboxes: [{ confirmationPrompt: "Sure?", label: "Agree", required: true }] });
|
|
472
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: withCheckboxes })];
|
|
473
|
+
case 1:
|
|
474
|
+
_a.sent();
|
|
475
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: withCheckboxes })];
|
|
476
|
+
case 2:
|
|
477
|
+
result = _a.sent();
|
|
478
|
+
(0, bun_test_1.expect)(result.unchanged).toEqual(["terms"]);
|
|
479
|
+
return [2 /*return*/];
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}); });
|
|
483
|
+
(0, bun_test_1.it)("dry run does not create new versions", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
484
|
+
var updated, result, forms;
|
|
485
|
+
return __generator(this, function (_a) {
|
|
486
|
+
switch (_a.label) {
|
|
487
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
|
|
488
|
+
case 1:
|
|
489
|
+
_a.sent();
|
|
490
|
+
updated = __assign(__assign({}, baseDef), { title: "Updated" });
|
|
491
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated }, { dryRun: true })];
|
|
492
|
+
case 2:
|
|
493
|
+
result = _a.sent();
|
|
494
|
+
(0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
|
|
495
|
+
return [4 /*yield*/, consentForm_1.ConsentForm.find({ slug: "terms" })];
|
|
496
|
+
case 3:
|
|
497
|
+
forms = _a.sent();
|
|
498
|
+
(0, bun_test_1.expect)(forms).toHaveLength(1); // No new version created
|
|
499
|
+
return [2 /*return*/];
|
|
500
|
+
}
|
|
501
|
+
});
|
|
502
|
+
}); });
|
|
503
|
+
(0, bun_test_1.it)("dry run does not deactivate forms", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
504
|
+
var result, privacy;
|
|
505
|
+
return __generator(this, function (_a) {
|
|
506
|
+
switch (_a.label) {
|
|
507
|
+
case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ privacy: __assign(__assign({}, baseDef), { title: "Privacy", type: "privacy" }), terms: baseDef })];
|
|
508
|
+
case 1:
|
|
509
|
+
_a.sent();
|
|
510
|
+
return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef }, { deactivateRemoved: true, dryRun: true })];
|
|
511
|
+
case 2:
|
|
512
|
+
result = _a.sent();
|
|
513
|
+
(0, bun_test_1.expect)(result.deactivated).toEqual(["privacy"]);
|
|
514
|
+
return [4 /*yield*/, consentForm_1.ConsentForm.findOne({ slug: "privacy" })];
|
|
515
|
+
case 3:
|
|
516
|
+
privacy = _a.sent();
|
|
517
|
+
(0, bun_test_1.expect)(privacy === null || privacy === void 0 ? void 0 : privacy.active).toBe(true); // Still active
|
|
518
|
+
return [2 /*return*/];
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
}); });
|
|
249
522
|
});
|
package/dist/tests/bunSetup.js
CHANGED
|
@@ -70,30 +70,35 @@ var mongoose_1 = __importDefault(require("mongoose"));
|
|
|
70
70
|
var winston_1 = __importDefault(require("winston"));
|
|
71
71
|
var expressServer_1 = require("../expressServer");
|
|
72
72
|
var logger_1 = require("../logger");
|
|
73
|
+
var shouldConnectToTestDb = process.env.BUN_TEST_DISABLE_DB !== "true";
|
|
73
74
|
// Connect to MongoDB once for all tests
|
|
74
|
-
|
|
75
|
-
return
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
});
|
|
75
|
+
if (shouldConnectToTestDb) {
|
|
76
|
+
(0, bun_test_1.beforeAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
77
|
+
return __generator(this, function (_a) {
|
|
78
|
+
switch (_a.label) {
|
|
79
|
+
case 0: return [4 /*yield*/, mongoose_1.default
|
|
80
|
+
.connect("mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000")
|
|
81
|
+
.catch(logger_1.logger.catch)];
|
|
82
|
+
case 1:
|
|
83
|
+
_a.sent();
|
|
84
|
+
return [2 /*return*/];
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}); });
|
|
88
|
+
}
|
|
86
89
|
// Close MongoDB connection after all tests
|
|
87
|
-
|
|
88
|
-
return
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
});
|
|
90
|
+
if (shouldConnectToTestDb) {
|
|
91
|
+
(0, bun_test_1.afterAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
92
|
+
return __generator(this, function (_a) {
|
|
93
|
+
switch (_a.label) {
|
|
94
|
+
case 0: return [4 /*yield*/, mongoose_1.default.connection.close()];
|
|
95
|
+
case 1:
|
|
96
|
+
_a.sent();
|
|
97
|
+
return [2 /*return*/];
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}); });
|
|
101
|
+
}
|
|
97
102
|
var logs = [];
|
|
98
103
|
var SHOW_ALL_LOGS = process.env.SHOW_ALL_TEST_LOGS === "true";
|
|
99
104
|
// Create a custom stream that captures logs
|
package/dist/tests.d.ts
CHANGED
|
@@ -71,9 +71,9 @@ export declare const RequiredModel: mongoose.Model<RequiredField, {}, {}, {}, mo
|
|
|
71
71
|
} & {
|
|
72
72
|
__v: number;
|
|
73
73
|
}, any>;
|
|
74
|
-
export declare
|
|
75
|
-
export declare
|
|
76
|
-
export declare
|
|
74
|
+
export declare const getBaseServer: () => Express;
|
|
75
|
+
export declare const authAsUser: (app: express.Application, type: "admin" | "notAdmin") => Promise<TestAgent>;
|
|
76
|
+
export declare const setupDb: () => Promise<(mongoose.Document<unknown, {}, User, {}, {}> & User & {
|
|
77
77
|
_id: mongoose.Types.ObjectId;
|
|
78
78
|
} & {
|
|
79
79
|
__v: number;
|
package/dist/tests.js
CHANGED
|
@@ -88,10 +88,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
88
88
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
89
89
|
};
|
|
90
90
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
91
|
-
exports.RequiredModel = exports.FoodModel = exports.StaffUserModel = exports.SuperUserModel = exports.UserModel = void 0;
|
|
92
|
-
exports.getBaseServer = getBaseServer;
|
|
93
|
-
exports.authAsUser = authAsUser;
|
|
94
|
-
exports.setupDb = setupDb;
|
|
91
|
+
exports.setupDb = exports.authAsUser = exports.getBaseServer = exports.RequiredModel = exports.FoodModel = exports.StaffUserModel = exports.SuperUserModel = exports.UserModel = void 0;
|
|
95
92
|
var express_1 = __importDefault(require("express"));
|
|
96
93
|
var mongoose_1 = __importStar(require("mongoose"));
|
|
97
94
|
var passport_local_mongoose_1 = __importDefault(require("passport-local-mongoose"));
|
|
@@ -189,7 +186,7 @@ var requiredSchema = new mongoose_1.Schema({
|
|
|
189
186
|
name: { description: "The name of the item", required: true, type: String },
|
|
190
187
|
});
|
|
191
188
|
exports.RequiredModel = (0, mongoose_1.model)("Required", requiredSchema);
|
|
192
|
-
function
|
|
189
|
+
var getBaseServer = function () {
|
|
193
190
|
var app = (0, express_1.default)();
|
|
194
191
|
app.set("query parser", function (str) { return qs_1.default.parse(str, { arrayLimit: 200 }); });
|
|
195
192
|
// Express 5 defaults to 'simple' query parser (Node querystring) which doesn't
|
|
@@ -211,82 +208,81 @@ function getBaseServer() {
|
|
|
211
208
|
});
|
|
212
209
|
app.use(express_1.default.json());
|
|
213
210
|
return app;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
});
|
|
211
|
+
};
|
|
212
|
+
exports.getBaseServer = getBaseServer;
|
|
213
|
+
var authAsUser = function (app, type) { return __awaiter(void 0, void 0, void 0, function () {
|
|
214
|
+
var email, password, agent, res;
|
|
215
|
+
return __generator(this, function (_a) {
|
|
216
|
+
switch (_a.label) {
|
|
217
|
+
case 0:
|
|
218
|
+
email = type === "admin" ? "admin@example.com" : "notAdmin@example.com";
|
|
219
|
+
password = type === "admin" ? "securePassword" : "password";
|
|
220
|
+
agent = supertest_1.default.agent(app);
|
|
221
|
+
return [4 /*yield*/, agent.post("/auth/login").send({ email: email, password: password }).expect(200)];
|
|
222
|
+
case 1:
|
|
223
|
+
res = _a.sent();
|
|
224
|
+
return [4 /*yield*/, agent.set("authorization", "Bearer ".concat(res.body.data.token))];
|
|
225
|
+
case 2:
|
|
226
|
+
_a.sent();
|
|
227
|
+
return [2 /*return*/, agent];
|
|
228
|
+
}
|
|
233
229
|
});
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
});
|
|
230
|
+
}); };
|
|
231
|
+
exports.authAsUser = authAsUser;
|
|
232
|
+
var setupDb = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
233
|
+
var _a, notAdmin, admin, adminOther, error_1;
|
|
234
|
+
return __generator(this, function (_b) {
|
|
235
|
+
switch (_b.label) {
|
|
236
|
+
case 0: return [4 /*yield*/, mongoose_1.default
|
|
237
|
+
.connect("mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000")
|
|
238
|
+
.catch(logger_1.logger.catch)];
|
|
239
|
+
case 1:
|
|
240
|
+
_b.sent();
|
|
241
|
+
process.env.REFRESH_TOKEN_SECRET = "refresh_secret";
|
|
242
|
+
process.env.TOKEN_SECRET = "secret";
|
|
243
|
+
process.env.TOKEN_EXPIRES_IN = "30m";
|
|
244
|
+
process.env.TOKEN_ISSUER = "example.com";
|
|
245
|
+
process.env.SESSION_SECRET = "session";
|
|
246
|
+
// Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
|
|
247
|
+
return [4 /*yield*/, Promise.all([exports.UserModel.deleteMany({}), exports.FoodModel.deleteMany({})]).catch(logger_1.logger.catch)];
|
|
248
|
+
case 2:
|
|
249
|
+
// Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
|
|
250
|
+
_b.sent();
|
|
251
|
+
_b.label = 3;
|
|
252
|
+
case 3:
|
|
253
|
+
_b.trys.push([3, 11, , 12]);
|
|
254
|
+
return [4 /*yield*/, Promise.all([
|
|
255
|
+
exports.UserModel.create({ email: "notAdmin@example.com", name: "Not Admin" }),
|
|
256
|
+
exports.UserModel.create({ admin: true, email: "admin@example.com", name: "Admin" }),
|
|
257
|
+
exports.UserModel.create({ admin: true, email: "admin+other@example.com", name: "Admin Other" }),
|
|
258
|
+
])];
|
|
259
|
+
case 4:
|
|
260
|
+
_a = __read.apply(void 0, [_b.sent(), 3]), notAdmin = _a[0], admin = _a[1], adminOther = _a[2];
|
|
261
|
+
return [4 /*yield*/, notAdmin.setPassword("password")];
|
|
262
|
+
case 5:
|
|
263
|
+
_b.sent();
|
|
264
|
+
return [4 /*yield*/, notAdmin.save()];
|
|
265
|
+
case 6:
|
|
266
|
+
_b.sent();
|
|
267
|
+
return [4 /*yield*/, admin.setPassword("securePassword")];
|
|
268
|
+
case 7:
|
|
269
|
+
_b.sent();
|
|
270
|
+
return [4 /*yield*/, admin.save()];
|
|
271
|
+
case 8:
|
|
272
|
+
_b.sent();
|
|
273
|
+
return [4 /*yield*/, adminOther.setPassword("otherPassword")];
|
|
274
|
+
case 9:
|
|
275
|
+
_b.sent();
|
|
276
|
+
return [4 /*yield*/, adminOther.save()];
|
|
277
|
+
case 10:
|
|
278
|
+
_b.sent();
|
|
279
|
+
return [2 /*return*/, [admin, notAdmin, adminOther]];
|
|
280
|
+
case 11:
|
|
281
|
+
error_1 = _b.sent();
|
|
282
|
+
logger_1.logger.error("Error setting up DB", error_1);
|
|
283
|
+
throw error_1;
|
|
284
|
+
case 12: return [2 /*return*/];
|
|
285
|
+
}
|
|
291
286
|
});
|
|
292
|
-
}
|
|
287
|
+
}); };
|
|
288
|
+
exports.setupDb = setupDb;
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare
|
|
1
|
+
export declare const isValidObjectId: (id: string) => boolean;
|
|
2
2
|
export declare const timeout: (ms: number) => Promise<NodeJS.Timeout>;
|
|
3
3
|
/**
|
|
4
4
|
* Ensure that all mongoose models are set to strict mode.
|
|
@@ -8,4 +8,4 @@ export declare const timeout: (ms: number) => Promise<NodeJS.Timeout>;
|
|
|
8
8
|
* @param ignoredModels - Array of model names to skip validation for
|
|
9
9
|
* @throws Error if any model is not set to strict mode or missing virtual settings
|
|
10
10
|
*/
|
|
11
|
-
export declare
|
|
11
|
+
export declare const checkModelsStrict: (ignoredModels?: string[]) => void;
|
package/dist/utils.js
CHANGED
|
@@ -80,14 +80,12 @@ var __values = (this && this.__values) || function(o) {
|
|
|
80
80
|
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
81
81
|
};
|
|
82
82
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
83
|
-
exports.timeout = void 0;
|
|
84
|
-
exports.isValidObjectId = isValidObjectId;
|
|
85
|
-
exports.checkModelsStrict = checkModelsStrict;
|
|
83
|
+
exports.checkModelsStrict = exports.timeout = exports.isValidObjectId = void 0;
|
|
86
84
|
var mongoose_1 = __importStar(require("mongoose"));
|
|
87
85
|
var logger_1 = require("./logger");
|
|
88
86
|
// A better version of mongoose's ObjectId.isValid,
|
|
89
87
|
// which falsely will say any 12 character string is valid.
|
|
90
|
-
function
|
|
88
|
+
var isValidObjectId = function (id) {
|
|
91
89
|
try {
|
|
92
90
|
return new mongoose_1.Types.ObjectId(id).toString() === id;
|
|
93
91
|
}
|
|
@@ -95,7 +93,8 @@ function isValidObjectId(id) {
|
|
|
95
93
|
logger_1.logger.error("Error validating object id ".concat(id, ": ").concat(error));
|
|
96
94
|
return false;
|
|
97
95
|
}
|
|
98
|
-
}
|
|
96
|
+
};
|
|
97
|
+
exports.isValidObjectId = isValidObjectId;
|
|
99
98
|
var timeout = function (ms) { return __awaiter(void 0, void 0, void 0, function () {
|
|
100
99
|
return __generator(this, function (_a) {
|
|
101
100
|
return [2 /*return*/, new Promise(function (resolve) { return setTimeout(resolve, ms); })];
|
|
@@ -110,7 +109,7 @@ exports.timeout = timeout;
|
|
|
110
109
|
* @param ignoredModels - Array of model names to skip validation for
|
|
111
110
|
* @throws Error if any model is not set to strict mode or missing virtual settings
|
|
112
111
|
*/
|
|
113
|
-
function
|
|
112
|
+
var checkModelsStrict = function (ignoredModels) {
|
|
114
113
|
var e_1, _a;
|
|
115
114
|
var _b, _c;
|
|
116
115
|
if (ignoredModels === void 0) { ignoredModels = []; }
|
|
@@ -140,4 +139,5 @@ function checkModelsStrict(ignoredModels) {
|
|
|
140
139
|
}
|
|
141
140
|
finally { if (e_1) throw e_1.error; }
|
|
142
141
|
}
|
|
143
|
-
}
|
|
142
|
+
};
|
|
143
|
+
exports.checkModelsStrict = checkModelsStrict;
|
package/package.json
CHANGED
|
@@ -100,8 +100,9 @@
|
|
|
100
100
|
"lint:unsafefix": "biome check --fix --unsafe ./src",
|
|
101
101
|
"test": "bun test --preload ./src/tests/bunSetup.ts --update-snapshots",
|
|
102
102
|
"test:ci": "bun test --preload ./src/tests/bunSetup.ts",
|
|
103
|
+
"test:coverage": "bun run ../scripts/check-coverage.ts",
|
|
103
104
|
"updateSnapshot": "bun test --update-snapshots"
|
|
104
105
|
},
|
|
105
106
|
"types": "dist/index.d.ts",
|
|
106
|
-
"version": "0.
|
|
107
|
+
"version": "0.11.0"
|
|
107
108
|
}
|