@terreno/api 0.0.11 → 0.0.13
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/CLAUDE.md +107 -0
- package/biome.jsonc +1 -1
- package/bunfig.toml +3 -2
- package/dist/api.arrayOperations.test.d.ts +1 -0
- package/dist/api.arrayOperations.test.js +868 -0
- package/dist/api.d.ts +3 -14
- package/dist/api.errors.test.d.ts +1 -0
- package/dist/api.errors.test.js +175 -0
- package/dist/api.hooks.test.d.ts +1 -0
- package/dist/api.hooks.test.js +891 -0
- package/dist/api.js +44 -68
- package/dist/api.query.test.d.ts +1 -0
- package/dist/api.query.test.js +805 -0
- package/dist/api.test.js +691 -1678
- package/dist/auth.test.js +135 -0
- package/dist/expressServer.test.d.ts +1 -0
- package/dist/expressServer.test.js +669 -0
- package/dist/notifiers/slackNotifier.d.ts +2 -1
- package/dist/notifiers/slackNotifier.js +20 -13
- package/dist/permissions.d.ts +1 -1
- package/dist/permissions.js +17 -25
- package/dist/permissions.test.js +57 -0
- package/dist/populate.test.js +52 -0
- package/dist/tests.d.ts +9 -27
- package/dist/utils.test.js +235 -7
- package/package.json +3 -2
- package/src/api.arrayOperations.test.ts +690 -0
- package/src/api.errors.test.ts +156 -0
- package/src/api.hooks.test.ts +704 -0
- package/src/api.query.test.ts +538 -0
- package/src/api.test.ts +510 -1301
- package/src/api.ts +19 -61
- package/src/auth.test.ts +72 -0
- package/src/expressServer.test.ts +579 -0
- package/src/notifiers/slackNotifier.ts +28 -17
- package/src/permissions.test.ts +70 -1
- package/src/permissions.ts +4 -14
- package/src/populate.test.ts +58 -0
- package/src/utils.test.ts +214 -9
|
@@ -0,0 +1,891 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
39
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
40
|
+
if (!m) return o;
|
|
41
|
+
var i = m.call(o), r, ar = [], e;
|
|
42
|
+
try {
|
|
43
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
44
|
+
}
|
|
45
|
+
catch (error) { e = { error: error }; }
|
|
46
|
+
finally {
|
|
47
|
+
try {
|
|
48
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
49
|
+
}
|
|
50
|
+
finally { if (e) throw e.error; }
|
|
51
|
+
}
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
55
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
56
|
+
};
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
var bun_test_1 = require("bun:test");
|
|
59
|
+
var supertest_1 = __importDefault(require("supertest"));
|
|
60
|
+
var api_1 = require("./api");
|
|
61
|
+
var auth_1 = require("./auth");
|
|
62
|
+
var errors_1 = require("./errors");
|
|
63
|
+
var permissions_1 = require("./permissions");
|
|
64
|
+
var tests_1 = require("./tests");
|
|
65
|
+
(0, bun_test_1.describe)("pre and post hooks", function () {
|
|
66
|
+
var server;
|
|
67
|
+
var app;
|
|
68
|
+
var agent;
|
|
69
|
+
(0, bun_test_1.beforeEach)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
70
|
+
return __generator(this, function (_a) {
|
|
71
|
+
switch (_a.label) {
|
|
72
|
+
case 0: return [4 /*yield*/, (0, tests_1.setupDb)()];
|
|
73
|
+
case 1:
|
|
74
|
+
_a.sent();
|
|
75
|
+
app = (0, tests_1.getBaseServer)();
|
|
76
|
+
(0, auth_1.setupAuth)(app, tests_1.UserModel);
|
|
77
|
+
(0, auth_1.addAuthRoutes)(app, tests_1.UserModel);
|
|
78
|
+
return [4 /*yield*/, (0, tests_1.authAsUser)(app, "notAdmin")];
|
|
79
|
+
case 2:
|
|
80
|
+
agent = _a.sent();
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}); });
|
|
85
|
+
(0, bun_test_1.it)("pre hooks change data", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
86
|
+
var deleteCalled, res, broccoli;
|
|
87
|
+
return __generator(this, function (_a) {
|
|
88
|
+
switch (_a.label) {
|
|
89
|
+
case 0:
|
|
90
|
+
deleteCalled = false;
|
|
91
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
92
|
+
allowAnonymous: true,
|
|
93
|
+
permissions: {
|
|
94
|
+
create: [permissions_1.Permissions.IsAny],
|
|
95
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
96
|
+
list: [permissions_1.Permissions.IsAny],
|
|
97
|
+
read: [permissions_1.Permissions.IsAny],
|
|
98
|
+
update: [permissions_1.Permissions.IsAny],
|
|
99
|
+
},
|
|
100
|
+
preCreate: function (data) {
|
|
101
|
+
data.calories = 14;
|
|
102
|
+
return data;
|
|
103
|
+
},
|
|
104
|
+
preDelete: function (data) {
|
|
105
|
+
deleteCalled = true;
|
|
106
|
+
return data;
|
|
107
|
+
},
|
|
108
|
+
preUpdate: function (data) {
|
|
109
|
+
data.calories = 15;
|
|
110
|
+
return data;
|
|
111
|
+
},
|
|
112
|
+
}));
|
|
113
|
+
server = (0, supertest_1.default)(app);
|
|
114
|
+
return [4 /*yield*/, server
|
|
115
|
+
.post("/food")
|
|
116
|
+
.send({
|
|
117
|
+
calories: 15,
|
|
118
|
+
name: "Broccoli",
|
|
119
|
+
})
|
|
120
|
+
.expect(201)];
|
|
121
|
+
case 1:
|
|
122
|
+
res = _a.sent();
|
|
123
|
+
return [4 /*yield*/, tests_1.FoodModel.findById(res.body.data._id)];
|
|
124
|
+
case 2:
|
|
125
|
+
broccoli = _a.sent();
|
|
126
|
+
if (!broccoli) {
|
|
127
|
+
throw new Error("Broccoli was not created");
|
|
128
|
+
}
|
|
129
|
+
(0, bun_test_1.expect)(broccoli.name).toBe("Broccoli");
|
|
130
|
+
// Overwritten by the pre create hook
|
|
131
|
+
(0, bun_test_1.expect)(broccoli.calories).toBe(14);
|
|
132
|
+
return [4 /*yield*/, server
|
|
133
|
+
.patch("/food/".concat(broccoli._id))
|
|
134
|
+
.send({
|
|
135
|
+
name: "Broccoli2",
|
|
136
|
+
})
|
|
137
|
+
.expect(200)];
|
|
138
|
+
case 3:
|
|
139
|
+
res = _a.sent();
|
|
140
|
+
(0, bun_test_1.expect)(res.body.data.name).toBe("Broccoli2");
|
|
141
|
+
// Updated by the pre update hook
|
|
142
|
+
(0, bun_test_1.expect)(res.body.data.calories).toBe(15);
|
|
143
|
+
return [4 /*yield*/, agent.delete("/food/".concat(broccoli._id)).expect(204)];
|
|
144
|
+
case 4:
|
|
145
|
+
_a.sent();
|
|
146
|
+
(0, bun_test_1.expect)(deleteCalled).toBe(true);
|
|
147
|
+
return [2 /*return*/];
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}); });
|
|
151
|
+
(0, bun_test_1.it)("pre hooks return null", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
152
|
+
var notAdmin, spinach, res, broccoli;
|
|
153
|
+
return __generator(this, function (_a) {
|
|
154
|
+
switch (_a.label) {
|
|
155
|
+
case 0: return [4 /*yield*/, tests_1.UserModel.findOne({
|
|
156
|
+
email: "notAdmin@example.com",
|
|
157
|
+
})];
|
|
158
|
+
case 1:
|
|
159
|
+
notAdmin = _a.sent();
|
|
160
|
+
return [4 /*yield*/, tests_1.FoodModel.create({
|
|
161
|
+
calories: 1,
|
|
162
|
+
created: new Date("2021-12-03T00:00:20.000Z"),
|
|
163
|
+
hidden: false,
|
|
164
|
+
name: "Spinach",
|
|
165
|
+
ownerId: notAdmin._id,
|
|
166
|
+
source: {
|
|
167
|
+
name: "Brand",
|
|
168
|
+
},
|
|
169
|
+
})];
|
|
170
|
+
case 2:
|
|
171
|
+
spinach = _a.sent();
|
|
172
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
173
|
+
allowAnonymous: true,
|
|
174
|
+
permissions: {
|
|
175
|
+
create: [permissions_1.Permissions.IsAny],
|
|
176
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
177
|
+
list: [permissions_1.Permissions.IsAny],
|
|
178
|
+
read: [permissions_1.Permissions.IsAny],
|
|
179
|
+
update: [permissions_1.Permissions.IsAny],
|
|
180
|
+
},
|
|
181
|
+
preCreate: function () { return null; },
|
|
182
|
+
preDelete: function () { return null; },
|
|
183
|
+
preUpdate: function () { return null; },
|
|
184
|
+
}));
|
|
185
|
+
server = (0, supertest_1.default)(app);
|
|
186
|
+
return [4 /*yield*/, server
|
|
187
|
+
.post("/food")
|
|
188
|
+
.send({
|
|
189
|
+
calories: 15,
|
|
190
|
+
name: "Broccoli",
|
|
191
|
+
})
|
|
192
|
+
.expect(403)];
|
|
193
|
+
case 3:
|
|
194
|
+
res = _a.sent();
|
|
195
|
+
return [4 /*yield*/, tests_1.FoodModel.findById(res.body._id)];
|
|
196
|
+
case 4:
|
|
197
|
+
broccoli = _a.sent();
|
|
198
|
+
(0, bun_test_1.expect)(broccoli).toBeNull();
|
|
199
|
+
return [4 /*yield*/, server
|
|
200
|
+
.patch("/food/".concat(spinach._id))
|
|
201
|
+
.send({
|
|
202
|
+
name: "Broccoli",
|
|
203
|
+
})
|
|
204
|
+
.expect(403)];
|
|
205
|
+
case 5:
|
|
206
|
+
_a.sent();
|
|
207
|
+
return [4 /*yield*/, server.delete("/food/".concat(spinach._id)).expect(403)];
|
|
208
|
+
case 6:
|
|
209
|
+
_a.sent();
|
|
210
|
+
return [2 /*return*/];
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}); });
|
|
214
|
+
(0, bun_test_1.it)("post hooks succeed", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
215
|
+
var deleteCalled, res, broccoli;
|
|
216
|
+
return __generator(this, function (_a) {
|
|
217
|
+
switch (_a.label) {
|
|
218
|
+
case 0:
|
|
219
|
+
deleteCalled = false;
|
|
220
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
221
|
+
allowAnonymous: true,
|
|
222
|
+
permissions: {
|
|
223
|
+
create: [permissions_1.Permissions.IsAny],
|
|
224
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
225
|
+
list: [permissions_1.Permissions.IsAny],
|
|
226
|
+
read: [permissions_1.Permissions.IsAny],
|
|
227
|
+
update: [permissions_1.Permissions.IsAny],
|
|
228
|
+
},
|
|
229
|
+
postCreate: function (data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
230
|
+
return __generator(this, function (_a) {
|
|
231
|
+
switch (_a.label) {
|
|
232
|
+
case 0:
|
|
233
|
+
data.calories = 14;
|
|
234
|
+
return [4 /*yield*/, data.save()];
|
|
235
|
+
case 1:
|
|
236
|
+
_a.sent();
|
|
237
|
+
return [2 /*return*/, data];
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}); },
|
|
241
|
+
postDelete: function (data) {
|
|
242
|
+
deleteCalled = true;
|
|
243
|
+
return data;
|
|
244
|
+
},
|
|
245
|
+
postUpdate: function (data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
246
|
+
return __generator(this, function (_a) {
|
|
247
|
+
switch (_a.label) {
|
|
248
|
+
case 0:
|
|
249
|
+
data.calories = 15;
|
|
250
|
+
return [4 /*yield*/, data.save()];
|
|
251
|
+
case 1:
|
|
252
|
+
_a.sent();
|
|
253
|
+
return [2 /*return*/, data];
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}); },
|
|
257
|
+
}));
|
|
258
|
+
server = (0, supertest_1.default)(app);
|
|
259
|
+
return [4 /*yield*/, server
|
|
260
|
+
.post("/food")
|
|
261
|
+
.send({
|
|
262
|
+
calories: 15,
|
|
263
|
+
name: "Broccoli",
|
|
264
|
+
})
|
|
265
|
+
.expect(201)];
|
|
266
|
+
case 1:
|
|
267
|
+
res = _a.sent();
|
|
268
|
+
return [4 /*yield*/, tests_1.FoodModel.findById(res.body.data._id)];
|
|
269
|
+
case 2:
|
|
270
|
+
broccoli = _a.sent();
|
|
271
|
+
if (!broccoli) {
|
|
272
|
+
throw new Error("Broccoli was not created");
|
|
273
|
+
}
|
|
274
|
+
(0, bun_test_1.expect)(broccoli.name).toBe("Broccoli");
|
|
275
|
+
// Overwritten by the pre create hook
|
|
276
|
+
(0, bun_test_1.expect)(broccoli.calories).toBe(14);
|
|
277
|
+
return [4 /*yield*/, server
|
|
278
|
+
.patch("/food/".concat(broccoli._id))
|
|
279
|
+
.send({
|
|
280
|
+
name: "Broccoli2",
|
|
281
|
+
})
|
|
282
|
+
.expect(200)];
|
|
283
|
+
case 3:
|
|
284
|
+
res = _a.sent();
|
|
285
|
+
return [4 /*yield*/, tests_1.FoodModel.findById(res.body.data._id)];
|
|
286
|
+
case 4:
|
|
287
|
+
broccoli = _a.sent();
|
|
288
|
+
if (!broccoli) {
|
|
289
|
+
throw new Error("Broccoli was not update");
|
|
290
|
+
}
|
|
291
|
+
(0, bun_test_1.expect)(broccoli.name).toBe("Broccoli2");
|
|
292
|
+
// Updated by the post update hook
|
|
293
|
+
(0, bun_test_1.expect)(broccoli.calories).toBe(15);
|
|
294
|
+
return [4 /*yield*/, agent.delete("/food/".concat(broccoli._id)).expect(204)];
|
|
295
|
+
case 5:
|
|
296
|
+
_a.sent();
|
|
297
|
+
(0, bun_test_1.expect)(deleteCalled).toBe(true);
|
|
298
|
+
return [2 /*return*/];
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
}); });
|
|
302
|
+
(0, bun_test_1.it)("preCreate hook preserves disableExternalErrorTracking on APIError", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
303
|
+
var res;
|
|
304
|
+
return __generator(this, function (_a) {
|
|
305
|
+
switch (_a.label) {
|
|
306
|
+
case 0:
|
|
307
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
308
|
+
allowAnonymous: true,
|
|
309
|
+
permissions: {
|
|
310
|
+
create: [permissions_1.Permissions.IsAny],
|
|
311
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
312
|
+
list: [permissions_1.Permissions.IsAny],
|
|
313
|
+
read: [permissions_1.Permissions.IsAny],
|
|
314
|
+
update: [permissions_1.Permissions.IsAny],
|
|
315
|
+
},
|
|
316
|
+
preCreate: function () {
|
|
317
|
+
throw new errors_1.APIError({
|
|
318
|
+
disableExternalErrorTracking: true,
|
|
319
|
+
status: 400,
|
|
320
|
+
title: "Custom preCreate error",
|
|
321
|
+
});
|
|
322
|
+
},
|
|
323
|
+
}));
|
|
324
|
+
server = (0, supertest_1.default)(app);
|
|
325
|
+
return [4 /*yield*/, server
|
|
326
|
+
.post("/food")
|
|
327
|
+
.send({
|
|
328
|
+
calories: 15,
|
|
329
|
+
name: "Broccoli",
|
|
330
|
+
})
|
|
331
|
+
.expect(400)];
|
|
332
|
+
case 1:
|
|
333
|
+
res = _a.sent();
|
|
334
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Custom preCreate error");
|
|
335
|
+
(0, bun_test_1.expect)(res.body.disableExternalErrorTracking).toBe(true);
|
|
336
|
+
return [2 /*return*/];
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}); });
|
|
340
|
+
(0, bun_test_1.it)("preCreate hook preserves disableExternalErrorTracking on non-APIError", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
341
|
+
var res;
|
|
342
|
+
return __generator(this, function (_a) {
|
|
343
|
+
switch (_a.label) {
|
|
344
|
+
case 0:
|
|
345
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
346
|
+
allowAnonymous: true,
|
|
347
|
+
permissions: {
|
|
348
|
+
create: [permissions_1.Permissions.IsAny],
|
|
349
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
350
|
+
list: [permissions_1.Permissions.IsAny],
|
|
351
|
+
read: [permissions_1.Permissions.IsAny],
|
|
352
|
+
update: [permissions_1.Permissions.IsAny],
|
|
353
|
+
},
|
|
354
|
+
preCreate: function () {
|
|
355
|
+
var error = new Error("Some custom error");
|
|
356
|
+
error.disableExternalErrorTracking = true;
|
|
357
|
+
throw error;
|
|
358
|
+
},
|
|
359
|
+
}));
|
|
360
|
+
server = (0, supertest_1.default)(app);
|
|
361
|
+
return [4 /*yield*/, server
|
|
362
|
+
.post("/food")
|
|
363
|
+
.send({
|
|
364
|
+
calories: 15,
|
|
365
|
+
name: "Broccoli",
|
|
366
|
+
})
|
|
367
|
+
.expect(400)];
|
|
368
|
+
case 1:
|
|
369
|
+
res = _a.sent();
|
|
370
|
+
(0, bun_test_1.expect)(res.body.title).toContain("preCreate hook error");
|
|
371
|
+
(0, bun_test_1.expect)(res.body.disableExternalErrorTracking).toBe(true);
|
|
372
|
+
return [2 /*return*/];
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}); });
|
|
376
|
+
(0, bun_test_1.it)("preUpdate hook preserves disableExternalErrorTracking on APIError", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
377
|
+
var notAdmin, spinach, res;
|
|
378
|
+
return __generator(this, function (_a) {
|
|
379
|
+
switch (_a.label) {
|
|
380
|
+
case 0: return [4 /*yield*/, tests_1.UserModel.findOne({
|
|
381
|
+
email: "notAdmin@example.com",
|
|
382
|
+
})];
|
|
383
|
+
case 1:
|
|
384
|
+
notAdmin = _a.sent();
|
|
385
|
+
return [4 /*yield*/, tests_1.FoodModel.create({
|
|
386
|
+
calories: 1,
|
|
387
|
+
created: new Date("2021-12-03T00:00:20.000Z"),
|
|
388
|
+
hidden: false,
|
|
389
|
+
name: "Spinach",
|
|
390
|
+
ownerId: notAdmin._id,
|
|
391
|
+
source: {
|
|
392
|
+
name: "Brand",
|
|
393
|
+
},
|
|
394
|
+
})];
|
|
395
|
+
case 2:
|
|
396
|
+
spinach = _a.sent();
|
|
397
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
398
|
+
allowAnonymous: true,
|
|
399
|
+
permissions: {
|
|
400
|
+
create: [permissions_1.Permissions.IsAny],
|
|
401
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
402
|
+
list: [permissions_1.Permissions.IsAny],
|
|
403
|
+
read: [permissions_1.Permissions.IsAny],
|
|
404
|
+
update: [permissions_1.Permissions.IsAny],
|
|
405
|
+
},
|
|
406
|
+
preUpdate: function () {
|
|
407
|
+
throw new errors_1.APIError({
|
|
408
|
+
disableExternalErrorTracking: true,
|
|
409
|
+
status: 400,
|
|
410
|
+
title: "Custom preUpdate error",
|
|
411
|
+
});
|
|
412
|
+
},
|
|
413
|
+
}));
|
|
414
|
+
server = (0, supertest_1.default)(app);
|
|
415
|
+
return [4 /*yield*/, server
|
|
416
|
+
.patch("/food/".concat(spinach._id))
|
|
417
|
+
.send({
|
|
418
|
+
name: "Broccoli",
|
|
419
|
+
})
|
|
420
|
+
.expect(400)];
|
|
421
|
+
case 3:
|
|
422
|
+
res = _a.sent();
|
|
423
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Custom preUpdate error");
|
|
424
|
+
(0, bun_test_1.expect)(res.body.disableExternalErrorTracking).toBe(true);
|
|
425
|
+
return [2 /*return*/];
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
}); });
|
|
429
|
+
(0, bun_test_1.it)("preUpdate hook preserves disableExternalErrorTracking on non-APIError", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
430
|
+
var notAdmin, spinach, res;
|
|
431
|
+
return __generator(this, function (_a) {
|
|
432
|
+
switch (_a.label) {
|
|
433
|
+
case 0: return [4 /*yield*/, tests_1.UserModel.findOne({
|
|
434
|
+
email: "notAdmin@example.com",
|
|
435
|
+
})];
|
|
436
|
+
case 1:
|
|
437
|
+
notAdmin = _a.sent();
|
|
438
|
+
return [4 /*yield*/, tests_1.FoodModel.create({
|
|
439
|
+
calories: 1,
|
|
440
|
+
created: new Date("2021-12-03T00:00:20.000Z"),
|
|
441
|
+
hidden: false,
|
|
442
|
+
name: "Spinach",
|
|
443
|
+
ownerId: notAdmin._id,
|
|
444
|
+
source: {
|
|
445
|
+
name: "Brand",
|
|
446
|
+
},
|
|
447
|
+
})];
|
|
448
|
+
case 2:
|
|
449
|
+
spinach = _a.sent();
|
|
450
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
451
|
+
allowAnonymous: true,
|
|
452
|
+
permissions: {
|
|
453
|
+
create: [permissions_1.Permissions.IsAny],
|
|
454
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
455
|
+
list: [permissions_1.Permissions.IsAny],
|
|
456
|
+
read: [permissions_1.Permissions.IsAny],
|
|
457
|
+
update: [permissions_1.Permissions.IsAny],
|
|
458
|
+
},
|
|
459
|
+
preUpdate: function () {
|
|
460
|
+
var error = new Error("Some custom error");
|
|
461
|
+
error.disableExternalErrorTracking = true;
|
|
462
|
+
throw error;
|
|
463
|
+
},
|
|
464
|
+
}));
|
|
465
|
+
server = (0, supertest_1.default)(app);
|
|
466
|
+
return [4 /*yield*/, server
|
|
467
|
+
.patch("/food/".concat(spinach._id))
|
|
468
|
+
.send({
|
|
469
|
+
name: "Broccoli",
|
|
470
|
+
})
|
|
471
|
+
.expect(400)];
|
|
472
|
+
case 3:
|
|
473
|
+
res = _a.sent();
|
|
474
|
+
(0, bun_test_1.expect)(res.body.title).toContain("preUpdate hook error");
|
|
475
|
+
(0, bun_test_1.expect)(res.body.disableExternalErrorTracking).toBe(true);
|
|
476
|
+
return [2 /*return*/];
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
}); });
|
|
480
|
+
(0, bun_test_1.it)("preDelete hook preserves disableExternalErrorTracking on non-APIError", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
481
|
+
var notAdmin, spinach, res;
|
|
482
|
+
return __generator(this, function (_a) {
|
|
483
|
+
switch (_a.label) {
|
|
484
|
+
case 0: return [4 /*yield*/, tests_1.UserModel.findOne({
|
|
485
|
+
email: "notAdmin@example.com",
|
|
486
|
+
})];
|
|
487
|
+
case 1:
|
|
488
|
+
notAdmin = _a.sent();
|
|
489
|
+
return [4 /*yield*/, tests_1.FoodModel.create({
|
|
490
|
+
calories: 1,
|
|
491
|
+
created: new Date("2021-12-03T00:00:20.000Z"),
|
|
492
|
+
hidden: false,
|
|
493
|
+
name: "Spinach",
|
|
494
|
+
ownerId: notAdmin._id,
|
|
495
|
+
source: {
|
|
496
|
+
name: "Brand",
|
|
497
|
+
},
|
|
498
|
+
})];
|
|
499
|
+
case 2:
|
|
500
|
+
spinach = _a.sent();
|
|
501
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
502
|
+
allowAnonymous: true,
|
|
503
|
+
permissions: {
|
|
504
|
+
create: [permissions_1.Permissions.IsAny],
|
|
505
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
506
|
+
list: [permissions_1.Permissions.IsAny],
|
|
507
|
+
read: [permissions_1.Permissions.IsAny],
|
|
508
|
+
update: [permissions_1.Permissions.IsAny],
|
|
509
|
+
},
|
|
510
|
+
preDelete: function () {
|
|
511
|
+
var error = new Error("Some custom error");
|
|
512
|
+
error.disableExternalErrorTracking = true;
|
|
513
|
+
throw error;
|
|
514
|
+
},
|
|
515
|
+
}));
|
|
516
|
+
server = (0, supertest_1.default)(app);
|
|
517
|
+
return [4 /*yield*/, agent.delete("/food/".concat(spinach._id)).expect(403)];
|
|
518
|
+
case 3:
|
|
519
|
+
res = _a.sent();
|
|
520
|
+
(0, bun_test_1.expect)(res.body.title).toContain("preDelete hook error");
|
|
521
|
+
(0, bun_test_1.expect)(res.body.disableExternalErrorTracking).toBe(true);
|
|
522
|
+
return [2 /*return*/];
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
}); });
|
|
526
|
+
});
|
|
527
|
+
(0, bun_test_1.describe)("hook error handling", function () {
|
|
528
|
+
var server;
|
|
529
|
+
var app;
|
|
530
|
+
var admin;
|
|
531
|
+
var agent;
|
|
532
|
+
var spinach;
|
|
533
|
+
(0, bun_test_1.beforeEach)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
534
|
+
var _a;
|
|
535
|
+
return __generator(this, function (_b) {
|
|
536
|
+
switch (_b.label) {
|
|
537
|
+
case 0: return [4 /*yield*/, (0, tests_1.setupDb)()];
|
|
538
|
+
case 1:
|
|
539
|
+
_a = __read.apply(void 0, [_b.sent(), 1]), admin = _a[0];
|
|
540
|
+
return [4 /*yield*/, tests_1.FoodModel.create({
|
|
541
|
+
calories: 1,
|
|
542
|
+
created: new Date("2021-12-03T00:00:20.000Z"),
|
|
543
|
+
hidden: false,
|
|
544
|
+
name: "Spinach",
|
|
545
|
+
ownerId: admin._id,
|
|
546
|
+
source: {
|
|
547
|
+
name: "Brand",
|
|
548
|
+
},
|
|
549
|
+
})];
|
|
550
|
+
case 2:
|
|
551
|
+
spinach = _b.sent();
|
|
552
|
+
app = (0, tests_1.getBaseServer)();
|
|
553
|
+
(0, auth_1.setupAuth)(app, tests_1.UserModel);
|
|
554
|
+
(0, auth_1.addAuthRoutes)(app, tests_1.UserModel);
|
|
555
|
+
return [2 /*return*/];
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
}); });
|
|
559
|
+
(0, bun_test_1.it)("preCreate returning undefined throws error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
560
|
+
var res;
|
|
561
|
+
return __generator(this, function (_a) {
|
|
562
|
+
switch (_a.label) {
|
|
563
|
+
case 0:
|
|
564
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
565
|
+
allowAnonymous: true,
|
|
566
|
+
permissions: {
|
|
567
|
+
create: [permissions_1.Permissions.IsAny],
|
|
568
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
569
|
+
list: [permissions_1.Permissions.IsAny],
|
|
570
|
+
read: [permissions_1.Permissions.IsAny],
|
|
571
|
+
update: [permissions_1.Permissions.IsAny],
|
|
572
|
+
},
|
|
573
|
+
preCreate: function () { return undefined; },
|
|
574
|
+
}));
|
|
575
|
+
server = (0, supertest_1.default)(app);
|
|
576
|
+
return [4 /*yield*/, server.post("/food").send({ calories: 15, name: "Broccoli" }).expect(403)];
|
|
577
|
+
case 1:
|
|
578
|
+
res = _a.sent();
|
|
579
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Create not allowed");
|
|
580
|
+
(0, bun_test_1.expect)(res.body.detail).toBe("A body must be returned from preCreate");
|
|
581
|
+
return [2 /*return*/];
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
}); });
|
|
585
|
+
(0, bun_test_1.it)("preUpdate returning undefined throws error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
586
|
+
var res;
|
|
587
|
+
return __generator(this, function (_a) {
|
|
588
|
+
switch (_a.label) {
|
|
589
|
+
case 0:
|
|
590
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
591
|
+
allowAnonymous: true,
|
|
592
|
+
permissions: {
|
|
593
|
+
create: [permissions_1.Permissions.IsAny],
|
|
594
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
595
|
+
list: [permissions_1.Permissions.IsAny],
|
|
596
|
+
read: [permissions_1.Permissions.IsAny],
|
|
597
|
+
update: [permissions_1.Permissions.IsAny],
|
|
598
|
+
},
|
|
599
|
+
preUpdate: function () { return undefined; },
|
|
600
|
+
}));
|
|
601
|
+
server = (0, supertest_1.default)(app);
|
|
602
|
+
return [4 /*yield*/, server.patch("/food/".concat(spinach._id)).send({ name: "Kale" }).expect(403)];
|
|
603
|
+
case 1:
|
|
604
|
+
res = _a.sent();
|
|
605
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Update not allowed");
|
|
606
|
+
(0, bun_test_1.expect)(res.body.detail).toBe("A body must be returned from preUpdate");
|
|
607
|
+
return [2 /*return*/];
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
}); });
|
|
611
|
+
(0, bun_test_1.it)("preDelete returning undefined throws error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
612
|
+
var res;
|
|
613
|
+
return __generator(this, function (_a) {
|
|
614
|
+
switch (_a.label) {
|
|
615
|
+
case 0:
|
|
616
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
617
|
+
allowAnonymous: true,
|
|
618
|
+
permissions: {
|
|
619
|
+
create: [permissions_1.Permissions.IsAny],
|
|
620
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
621
|
+
list: [permissions_1.Permissions.IsAny],
|
|
622
|
+
read: [permissions_1.Permissions.IsAny],
|
|
623
|
+
update: [permissions_1.Permissions.IsAny],
|
|
624
|
+
},
|
|
625
|
+
preDelete: function () { return undefined; },
|
|
626
|
+
}));
|
|
627
|
+
server = (0, supertest_1.default)(app);
|
|
628
|
+
return [4 /*yield*/, (0, tests_1.authAsUser)(app, "notAdmin")];
|
|
629
|
+
case 1:
|
|
630
|
+
agent = _a.sent();
|
|
631
|
+
return [4 /*yield*/, agent.delete("/food/".concat(spinach._id)).expect(403)];
|
|
632
|
+
case 2:
|
|
633
|
+
res = _a.sent();
|
|
634
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Delete not allowed");
|
|
635
|
+
(0, bun_test_1.expect)(res.body.detail).toBe("A body must be returned from preDelete");
|
|
636
|
+
return [2 /*return*/];
|
|
637
|
+
}
|
|
638
|
+
});
|
|
639
|
+
}); });
|
|
640
|
+
(0, bun_test_1.it)("postCreate hook error is handled", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
641
|
+
var res;
|
|
642
|
+
return __generator(this, function (_a) {
|
|
643
|
+
switch (_a.label) {
|
|
644
|
+
case 0:
|
|
645
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
646
|
+
allowAnonymous: true,
|
|
647
|
+
permissions: {
|
|
648
|
+
create: [permissions_1.Permissions.IsAny],
|
|
649
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
650
|
+
list: [permissions_1.Permissions.IsAny],
|
|
651
|
+
read: [permissions_1.Permissions.IsAny],
|
|
652
|
+
update: [permissions_1.Permissions.IsAny],
|
|
653
|
+
},
|
|
654
|
+
postCreate: function () {
|
|
655
|
+
throw new Error("postCreate failed");
|
|
656
|
+
},
|
|
657
|
+
}));
|
|
658
|
+
server = (0, supertest_1.default)(app);
|
|
659
|
+
return [4 /*yield*/, server.post("/food").send({ calories: 15, name: "Broccoli" }).expect(400)];
|
|
660
|
+
case 1:
|
|
661
|
+
res = _a.sent();
|
|
662
|
+
(0, bun_test_1.expect)(res.body.title).toContain("postCreate hook error");
|
|
663
|
+
return [2 /*return*/];
|
|
664
|
+
}
|
|
665
|
+
});
|
|
666
|
+
}); });
|
|
667
|
+
(0, bun_test_1.it)("postUpdate hook error is handled", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
668
|
+
var res;
|
|
669
|
+
return __generator(this, function (_a) {
|
|
670
|
+
switch (_a.label) {
|
|
671
|
+
case 0:
|
|
672
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
673
|
+
allowAnonymous: true,
|
|
674
|
+
permissions: {
|
|
675
|
+
create: [permissions_1.Permissions.IsAny],
|
|
676
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
677
|
+
list: [permissions_1.Permissions.IsAny],
|
|
678
|
+
read: [permissions_1.Permissions.IsAny],
|
|
679
|
+
update: [permissions_1.Permissions.IsAny],
|
|
680
|
+
},
|
|
681
|
+
postUpdate: function () {
|
|
682
|
+
throw new Error("postUpdate failed");
|
|
683
|
+
},
|
|
684
|
+
}));
|
|
685
|
+
server = (0, supertest_1.default)(app);
|
|
686
|
+
return [4 /*yield*/, server.patch("/food/".concat(spinach._id)).send({ name: "Kale" }).expect(400)];
|
|
687
|
+
case 1:
|
|
688
|
+
res = _a.sent();
|
|
689
|
+
(0, bun_test_1.expect)(res.body.title).toContain("postUpdate hook error");
|
|
690
|
+
return [2 /*return*/];
|
|
691
|
+
}
|
|
692
|
+
});
|
|
693
|
+
}); });
|
|
694
|
+
(0, bun_test_1.it)("postDelete hook error is handled", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
695
|
+
var res;
|
|
696
|
+
return __generator(this, function (_a) {
|
|
697
|
+
switch (_a.label) {
|
|
698
|
+
case 0:
|
|
699
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
700
|
+
allowAnonymous: true,
|
|
701
|
+
permissions: {
|
|
702
|
+
create: [permissions_1.Permissions.IsAny],
|
|
703
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
704
|
+
list: [permissions_1.Permissions.IsAny],
|
|
705
|
+
read: [permissions_1.Permissions.IsAny],
|
|
706
|
+
update: [permissions_1.Permissions.IsAny],
|
|
707
|
+
},
|
|
708
|
+
postDelete: function () {
|
|
709
|
+
throw new Error("postDelete failed");
|
|
710
|
+
},
|
|
711
|
+
}));
|
|
712
|
+
server = (0, supertest_1.default)(app);
|
|
713
|
+
return [4 /*yield*/, (0, tests_1.authAsUser)(app, "notAdmin")];
|
|
714
|
+
case 1:
|
|
715
|
+
agent = _a.sent();
|
|
716
|
+
return [4 /*yield*/, agent.delete("/food/".concat(spinach._id)).expect(400)];
|
|
717
|
+
case 2:
|
|
718
|
+
res = _a.sent();
|
|
719
|
+
(0, bun_test_1.expect)(res.body.title).toContain("postDelete hook error");
|
|
720
|
+
return [2 /*return*/];
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
}); });
|
|
724
|
+
(0, bun_test_1.it)("preUpdate returning null throws error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
725
|
+
var res;
|
|
726
|
+
return __generator(this, function (_a) {
|
|
727
|
+
switch (_a.label) {
|
|
728
|
+
case 0:
|
|
729
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
730
|
+
allowAnonymous: true,
|
|
731
|
+
permissions: {
|
|
732
|
+
create: [permissions_1.Permissions.IsAny],
|
|
733
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
734
|
+
list: [permissions_1.Permissions.IsAny],
|
|
735
|
+
read: [permissions_1.Permissions.IsAny],
|
|
736
|
+
update: [permissions_1.Permissions.IsAny],
|
|
737
|
+
},
|
|
738
|
+
preUpdate: function () { return null; },
|
|
739
|
+
}));
|
|
740
|
+
server = (0, supertest_1.default)(app);
|
|
741
|
+
return [4 /*yield*/, server.patch("/food/".concat(spinach._id)).send({ name: "Kale" }).expect(403)];
|
|
742
|
+
case 1:
|
|
743
|
+
res = _a.sent();
|
|
744
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Update not allowed");
|
|
745
|
+
return [2 /*return*/];
|
|
746
|
+
}
|
|
747
|
+
});
|
|
748
|
+
}); });
|
|
749
|
+
(0, bun_test_1.it)("preDelete returning null throws error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
750
|
+
var res;
|
|
751
|
+
return __generator(this, function (_a) {
|
|
752
|
+
switch (_a.label) {
|
|
753
|
+
case 0:
|
|
754
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
755
|
+
allowAnonymous: true,
|
|
756
|
+
permissions: {
|
|
757
|
+
create: [permissions_1.Permissions.IsAny],
|
|
758
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
759
|
+
list: [permissions_1.Permissions.IsAny],
|
|
760
|
+
read: [permissions_1.Permissions.IsAny],
|
|
761
|
+
update: [permissions_1.Permissions.IsAny],
|
|
762
|
+
},
|
|
763
|
+
preDelete: function () { return null; },
|
|
764
|
+
}));
|
|
765
|
+
server = (0, supertest_1.default)(app);
|
|
766
|
+
return [4 /*yield*/, (0, tests_1.authAsUser)(app, "notAdmin")];
|
|
767
|
+
case 1:
|
|
768
|
+
agent = _a.sent();
|
|
769
|
+
return [4 /*yield*/, agent.delete("/food/".concat(spinach._id)).expect(403)];
|
|
770
|
+
case 2:
|
|
771
|
+
res = _a.sent();
|
|
772
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Delete not allowed");
|
|
773
|
+
return [2 /*return*/];
|
|
774
|
+
}
|
|
775
|
+
});
|
|
776
|
+
}); });
|
|
777
|
+
(0, bun_test_1.it)("preCreate returning null throws error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
778
|
+
var res;
|
|
779
|
+
return __generator(this, function (_a) {
|
|
780
|
+
switch (_a.label) {
|
|
781
|
+
case 0:
|
|
782
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
783
|
+
allowAnonymous: true,
|
|
784
|
+
permissions: {
|
|
785
|
+
create: [permissions_1.Permissions.IsAny],
|
|
786
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
787
|
+
list: [permissions_1.Permissions.IsAny],
|
|
788
|
+
read: [permissions_1.Permissions.IsAny],
|
|
789
|
+
update: [permissions_1.Permissions.IsAny],
|
|
790
|
+
},
|
|
791
|
+
preCreate: function () { return null; },
|
|
792
|
+
}));
|
|
793
|
+
server = (0, supertest_1.default)(app);
|
|
794
|
+
return [4 /*yield*/, server.post("/food").send({ calories: 15, name: "Broccoli" }).expect(403)];
|
|
795
|
+
case 1:
|
|
796
|
+
res = _a.sent();
|
|
797
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Create not allowed");
|
|
798
|
+
return [2 /*return*/];
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
}); });
|
|
802
|
+
(0, bun_test_1.it)("preCreate error is handled", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
803
|
+
var res;
|
|
804
|
+
return __generator(this, function (_a) {
|
|
805
|
+
switch (_a.label) {
|
|
806
|
+
case 0:
|
|
807
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
808
|
+
allowAnonymous: true,
|
|
809
|
+
permissions: {
|
|
810
|
+
create: [permissions_1.Permissions.IsAny],
|
|
811
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
812
|
+
list: [permissions_1.Permissions.IsAny],
|
|
813
|
+
read: [permissions_1.Permissions.IsAny],
|
|
814
|
+
update: [permissions_1.Permissions.IsAny],
|
|
815
|
+
},
|
|
816
|
+
preCreate: function () {
|
|
817
|
+
throw new Error("preCreate failed");
|
|
818
|
+
},
|
|
819
|
+
}));
|
|
820
|
+
server = (0, supertest_1.default)(app);
|
|
821
|
+
return [4 /*yield*/, server.post("/food").send({ calories: 15, name: "Broccoli" }).expect(400)];
|
|
822
|
+
case 1:
|
|
823
|
+
res = _a.sent();
|
|
824
|
+
(0, bun_test_1.expect)(res.body.title).toContain("preCreate hook error");
|
|
825
|
+
return [2 /*return*/];
|
|
826
|
+
}
|
|
827
|
+
});
|
|
828
|
+
}); });
|
|
829
|
+
(0, bun_test_1.it)("preUpdate error is handled", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
830
|
+
var res;
|
|
831
|
+
return __generator(this, function (_a) {
|
|
832
|
+
switch (_a.label) {
|
|
833
|
+
case 0:
|
|
834
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
835
|
+
allowAnonymous: true,
|
|
836
|
+
permissions: {
|
|
837
|
+
create: [permissions_1.Permissions.IsAny],
|
|
838
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
839
|
+
list: [permissions_1.Permissions.IsAny],
|
|
840
|
+
read: [permissions_1.Permissions.IsAny],
|
|
841
|
+
update: [permissions_1.Permissions.IsAny],
|
|
842
|
+
},
|
|
843
|
+
preUpdate: function () {
|
|
844
|
+
throw new Error("preUpdate failed");
|
|
845
|
+
},
|
|
846
|
+
}));
|
|
847
|
+
server = (0, supertest_1.default)(app);
|
|
848
|
+
return [4 /*yield*/, server.patch("/food/".concat(spinach._id)).send({ name: "Kale" }).expect(400)];
|
|
849
|
+
case 1:
|
|
850
|
+
res = _a.sent();
|
|
851
|
+
(0, bun_test_1.expect)(res.body.title).toContain("preUpdate hook error");
|
|
852
|
+
return [2 /*return*/];
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
}); });
|
|
856
|
+
(0, bun_test_1.it)("preDelete hook throwing APIError is re-thrown", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
857
|
+
var res;
|
|
858
|
+
return __generator(this, function (_a) {
|
|
859
|
+
switch (_a.label) {
|
|
860
|
+
case 0:
|
|
861
|
+
app.use("/food", (0, api_1.modelRouter)(tests_1.FoodModel, {
|
|
862
|
+
allowAnonymous: true,
|
|
863
|
+
permissions: {
|
|
864
|
+
create: [permissions_1.Permissions.IsAny],
|
|
865
|
+
delete: [permissions_1.Permissions.IsAny],
|
|
866
|
+
list: [permissions_1.Permissions.IsAny],
|
|
867
|
+
read: [permissions_1.Permissions.IsAny],
|
|
868
|
+
update: [permissions_1.Permissions.IsAny],
|
|
869
|
+
},
|
|
870
|
+
preDelete: function () {
|
|
871
|
+
throw new errors_1.APIError({
|
|
872
|
+
disableExternalErrorTracking: true,
|
|
873
|
+
status: 400,
|
|
874
|
+
title: "Custom preDelete APIError",
|
|
875
|
+
});
|
|
876
|
+
},
|
|
877
|
+
}));
|
|
878
|
+
server = (0, supertest_1.default)(app);
|
|
879
|
+
return [4 /*yield*/, (0, tests_1.authAsUser)(app, "notAdmin")];
|
|
880
|
+
case 1:
|
|
881
|
+
agent = _a.sent();
|
|
882
|
+
return [4 /*yield*/, agent.delete("/food/".concat(spinach._id)).expect(400)];
|
|
883
|
+
case 2:
|
|
884
|
+
res = _a.sent();
|
|
885
|
+
(0, bun_test_1.expect)(res.body.title).toBe("Custom preDelete APIError");
|
|
886
|
+
(0, bun_test_1.expect)(res.body.disableExternalErrorTracking).toBe(true);
|
|
887
|
+
return [2 /*return*/];
|
|
888
|
+
}
|
|
889
|
+
});
|
|
890
|
+
}); });
|
|
891
|
+
});
|