@terreno/api 0.20.2 → 0.22.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/.ai/guidelines/core.md +71 -0
- package/.ai/skills/mongoose-schema-safety/SKILL.md +143 -0
- package/README.md +54 -1
- package/bunfig.toml +1 -1
- package/dist/__tests__/versionCheckPlugin.test.js +29 -7
- package/dist/actions.openApi.test.js +13 -11
- package/dist/api.js +98 -11
- package/dist/api.query.test.js +31 -1
- package/dist/api.test.js +211 -0
- package/dist/auth.test.js +418 -43
- package/dist/betterAuth.d.ts +1 -1
- package/dist/consentApp.test.js +1 -0
- package/dist/example.js +4 -4
- package/dist/expressServer.d.ts +0 -22
- package/dist/expressServer.js +1 -125
- package/dist/expressServer.test.js +90 -91
- package/dist/githubAuth.test.js +22 -22
- package/dist/logger.d.ts +154 -0
- package/dist/logger.js +445 -26
- package/dist/logger.test.js +435 -0
- package/dist/middleware.d.ts +7 -0
- package/dist/middleware.js +58 -1
- package/dist/middleware.test.js +159 -0
- package/dist/models/consentForm.js +2 -1
- package/dist/models/consentResponse.js +2 -1
- package/dist/models/versionConfig.js +2 -1
- package/dist/openApi.test.js +10 -17
- package/dist/openApiBuilder.d.ts +18 -0
- package/dist/openApiBuilder.js +21 -0
- package/dist/openApiBuilder.test.js +34 -10
- package/dist/permissions.test.js +10 -43
- package/dist/populate.test.js +10 -42
- package/dist/realtime/changeStreamWatcher.d.ts +4 -4
- package/dist/realtime/changeStreamWatcher.js +2 -4
- package/dist/realtime/queryMatcher.d.ts +1 -1
- package/dist/realtime/queryMatcher.js +39 -14
- package/dist/realtime/types.d.ts +3 -3
- package/dist/requestContext.d.ts +61 -0
- package/dist/requestContext.js +74 -0
- package/dist/secretProviders.test.js +335 -0
- package/dist/syncConsents.test.js +2 -2
- package/dist/terrenoApp.d.ts +27 -15
- package/dist/terrenoApp.js +24 -14
- package/dist/terrenoApp.test.js +52 -0
- package/dist/tests/bunSetup.js +66 -262
- package/dist/tests/createTestData.d.ts +9 -0
- package/dist/tests/createTestData.js +272 -0
- package/dist/tests/models.d.ts +71 -0
- package/dist/tests/models.js +134 -0
- package/dist/tests/mongoTestSetup.d.ts +7 -0
- package/dist/tests/mongoTestSetup.js +150 -0
- package/dist/tests/testEnv.d.ts +0 -0
- package/dist/tests/testEnv.js +6 -0
- package/dist/tests/testHelper.d.ts +22 -0
- package/dist/tests/testHelper.js +115 -0
- package/dist/tests/types.d.ts +29 -0
- package/dist/tests/types.js +2 -0
- package/dist/tests.d.ts +10 -78
- package/dist/tests.js +24 -241
- package/dist/transformers.test.js +14 -50
- package/package.json +18 -4
- package/src/__snapshots__/openApiBuilder.test.ts.snap +1 -0
- package/src/__tests__/versionCheckPlugin.test.ts +43 -15
- package/src/actions.openApi.test.ts +12 -10
- package/src/api.query.test.ts +24 -1
- package/src/api.test.ts +169 -0
- package/src/api.ts +71 -0
- package/src/auth.test.ts +287 -39
- package/src/betterAuth.ts +1 -1
- package/src/consentApp.test.ts +1 -0
- package/src/example.ts +4 -4
- package/src/expressServer.test.ts +82 -85
- package/src/expressServer.ts +1 -213
- package/src/githubAuth.test.ts +22 -22
- package/src/logger.test.ts +466 -1
- package/src/logger.ts +477 -14
- package/src/middleware.test.ts +74 -2
- package/src/middleware.ts +57 -0
- package/src/models/consentForm.ts +3 -4
- package/src/models/consentResponse.ts +6 -4
- package/src/models/versionConfig.ts +3 -4
- package/src/openApi.test.ts +10 -17
- package/src/openApiBuilder.test.ts +27 -10
- package/src/openApiBuilder.ts +24 -0
- package/src/permissions.test.ts +8 -23
- package/src/populate.test.ts +7 -22
- package/src/realtime/changeStreamWatcher.ts +15 -10
- package/src/realtime/queryMatcher.ts +54 -27
- package/src/realtime/types.ts +4 -4
- package/src/requestContext.ts +86 -0
- package/src/secretProviders.test.ts +219 -1
- package/src/syncConsents.test.ts +1 -1
- package/src/terrenoApp.test.ts +38 -0
- package/src/terrenoApp.ts +37 -15
- package/src/tests/bunSetup.ts +22 -236
- package/src/tests/createTestData.ts +176 -0
- package/src/tests/models.ts +164 -0
- package/src/tests/mongoTestSetup.ts +69 -0
- package/src/tests/testEnv.ts +4 -0
- package/src/tests/testHelper.ts +57 -0
- package/src/tests/types.ts +35 -0
- package/src/tests.ts +40 -231
- package/src/transformers.test.ts +11 -30
- package/tsconfig.typedoc.json +4 -0
- package/dist/tests/index.d.ts +0 -1
- package/dist/tests/index.js +0 -17
- package/src/tests/index.ts +0 -1
package/dist/tests/bunSetup.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
36
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
37
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -35,269 +68,40 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
68
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
69
|
}
|
|
37
70
|
};
|
|
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 __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
55
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
56
|
-
if (ar || !(i in from)) {
|
|
57
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
58
|
-
ar[i] = from[i];
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
62
|
-
};
|
|
63
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
64
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
65
|
-
};
|
|
66
71
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
|
-
|
|
68
|
-
var
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
var
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
// Close MongoDB connection after all tests
|
|
91
|
-
if (shouldConnectToTestDb) {
|
|
92
|
-
(0, bun_test_1.afterAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
93
|
-
return __generator(this, function (_a) {
|
|
94
|
-
switch (_a.label) {
|
|
95
|
-
case 0: return [4 /*yield*/, mongoose_1.default.connection.close()];
|
|
96
|
-
case 1:
|
|
97
|
-
_a.sent();
|
|
98
|
-
return [2 /*return*/];
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}); });
|
|
102
|
-
}
|
|
103
|
-
var logs = [];
|
|
104
|
-
var SHOW_ALL_LOGS = process.env.SHOW_ALL_TEST_LOGS === "true";
|
|
105
|
-
// Create a custom stream that captures logs
|
|
106
|
-
var logStream = new node_stream_1.Writable({
|
|
107
|
-
write: function (chunk, _encoding, callback) {
|
|
108
|
-
logs.push(chunk.toString());
|
|
109
|
-
if (SHOW_ALL_LOGS) {
|
|
110
|
-
process.stdout.write(chunk);
|
|
111
|
-
}
|
|
112
|
-
callback();
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
// Silence both winston loggers by replacing all transports with our capturing stream
|
|
116
|
-
var silentTransport = new winston_1.default.transports.Stream({
|
|
117
|
-
format: winston_1.default.format.simple(),
|
|
118
|
-
stream: logStream,
|
|
119
|
-
});
|
|
120
|
-
// Clear and silence the default winston logger
|
|
121
|
-
winston_1.default.clear();
|
|
122
|
-
winston_1.default.add(silentTransport);
|
|
123
|
-
// Clear and silence the custom winstonLogger
|
|
124
|
-
logger_1.winstonLogger.clear();
|
|
125
|
-
logger_1.winstonLogger.add(silentTransport);
|
|
126
|
-
// Capture and silence console methods
|
|
127
|
-
var originalConsole = {
|
|
128
|
-
debug: console.debug,
|
|
129
|
-
error: console.error,
|
|
130
|
-
info: console.info,
|
|
131
|
-
// biome-ignore lint/suspicious/noConsole: We keep the original reference.
|
|
132
|
-
log: console.log,
|
|
133
|
-
warn: console.warn,
|
|
134
|
-
};
|
|
135
|
-
var captureConsoleMethod = function (method) {
|
|
136
|
-
console[method] = function () {
|
|
137
|
-
var args = [];
|
|
138
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
139
|
-
args[_i] = arguments[_i];
|
|
140
|
-
}
|
|
141
|
-
var logMessage = "[console.".concat(method, "] ").concat(args.map(function (arg) { return (typeof arg === "object" ? JSON.stringify(arg) : String(arg)); }).join(" "));
|
|
142
|
-
logs.push(logMessage);
|
|
143
|
-
if (SHOW_ALL_LOGS) {
|
|
144
|
-
originalConsole[method].apply(originalConsole, __spreadArray([], __read(args), false));
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
};
|
|
148
|
-
captureConsoleMethod("log");
|
|
149
|
-
captureConsoleMethod("info");
|
|
150
|
-
captureConsoleMethod("warn");
|
|
151
|
-
captureConsoleMethod("error");
|
|
152
|
-
captureConsoleMethod("debug");
|
|
153
|
-
// Setup before each test
|
|
154
|
-
(0, bun_test_1.beforeEach)(function () {
|
|
155
|
-
process.env.TOKEN_SECRET = "secret";
|
|
156
|
-
process.env.TOKEN_ISSUER = "terreno-api.test";
|
|
157
|
-
process.env.SESSION_SECRET = "sessionSecret";
|
|
158
|
-
process.env.REFRESH_TOKEN_SECRET = "refreshTokenSecret";
|
|
159
|
-
(0, expressServer_1.setupEnvironment)();
|
|
160
|
-
// Re-silence loggers after setupEnvironment which may reconfigure them
|
|
161
|
-
winston_1.default.clear();
|
|
162
|
-
winston_1.default.add(silentTransport);
|
|
163
|
-
logger_1.winstonLogger.clear();
|
|
164
|
-
logger_1.winstonLogger.add(silentTransport);
|
|
165
|
-
logs = [];
|
|
166
|
-
});
|
|
167
|
-
// Clear logs after each test
|
|
168
|
-
(0, bun_test_1.afterEach)(function () {
|
|
169
|
-
logs = [];
|
|
170
|
-
});
|
|
171
|
-
// Mock @sentry/bun module
|
|
172
|
-
bun_test_1.mock.module("@sentry/bun", function () {
|
|
173
|
-
var mockFn = function () { return (0, bun_test_1.mock)(function () { }); };
|
|
174
|
-
// Mock Scope
|
|
175
|
-
var mockScope = {
|
|
176
|
-
addBreadcrumb: mockFn(),
|
|
177
|
-
clear: mockFn(),
|
|
178
|
-
getSpan: mockFn(),
|
|
179
|
-
setContext: mockFn(),
|
|
180
|
-
setFingerprint: mockFn(),
|
|
181
|
-
setLevel: mockFn(),
|
|
182
|
-
setSpan: mockFn(),
|
|
183
|
-
setTag: mockFn(),
|
|
184
|
-
setTags: mockFn(),
|
|
185
|
-
setTransactionName: mockFn(),
|
|
186
|
-
setUser: mockFn(),
|
|
187
|
-
};
|
|
188
|
-
// Mock Hub
|
|
189
|
-
var mockClient = {
|
|
190
|
-
captureException: mockFn(),
|
|
191
|
-
captureMessage: mockFn(),
|
|
192
|
-
close: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
|
|
193
|
-
flush: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
|
|
194
|
-
getOptions: (0, bun_test_1.mock)(function () { return ({}); }),
|
|
195
|
-
};
|
|
196
|
-
var mockHub = {
|
|
197
|
-
addBreadcrumb: mockFn(),
|
|
198
|
-
captureException: mockFn(),
|
|
199
|
-
captureMessage: mockFn(),
|
|
200
|
-
configureScope: mockFn(),
|
|
201
|
-
getClient: (0, bun_test_1.mock)(function () { return mockClient; }),
|
|
202
|
-
getScope: (0, bun_test_1.mock)(function () { return mockScope; }),
|
|
203
|
-
popScope: mockFn(),
|
|
204
|
-
pushScope: mockFn(),
|
|
205
|
-
setContext: mockFn(),
|
|
206
|
-
setTag: mockFn(),
|
|
207
|
-
setTags: mockFn(),
|
|
208
|
-
setUser: mockFn(),
|
|
209
|
-
withScope: mockFn(),
|
|
210
|
-
};
|
|
211
|
-
var mockSpan = {
|
|
212
|
-
finish: mockFn(),
|
|
213
|
-
setData: mockFn(),
|
|
214
|
-
setStatus: mockFn(),
|
|
215
|
-
setTag: mockFn(),
|
|
216
|
-
startChild: mockFn(),
|
|
217
|
-
toTraceparent: (0, bun_test_1.mock)(function () { return "mock-trace-parent"; }),
|
|
218
|
-
};
|
|
219
|
-
mockSpan.startChild = (0, bun_test_1.mock)(function () { return mockSpan; });
|
|
220
|
-
var mockTransaction = {
|
|
221
|
-
finish: mockFn(),
|
|
222
|
-
setData: mockFn(),
|
|
223
|
-
setName: mockFn(),
|
|
224
|
-
setStatus: mockFn(),
|
|
225
|
-
setTag: mockFn(),
|
|
226
|
-
startChild: (0, bun_test_1.mock)(function () { return mockSpan; }),
|
|
227
|
-
toTraceparent: (0, bun_test_1.mock)(function () { return "mock-trace-parent"; }),
|
|
228
|
-
};
|
|
229
|
-
return {
|
|
230
|
-
addBreadcrumb: mockFn(),
|
|
231
|
-
captureException: mockFn(),
|
|
232
|
-
captureMessage: mockFn(),
|
|
233
|
-
clearScope: mockFn(),
|
|
234
|
-
close: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
|
|
235
|
-
configureScope: mockFn(),
|
|
236
|
-
default: {
|
|
237
|
-
addBreadcrumb: mockFn(),
|
|
238
|
-
captureException: mockFn(),
|
|
239
|
-
captureMessage: mockFn(),
|
|
240
|
-
clearScope: mockFn(),
|
|
241
|
-
close: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
|
|
242
|
-
configureScope: mockFn(),
|
|
243
|
-
flush: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
|
|
244
|
-
getClient: (0, bun_test_1.mock)(function () { return mockClient; }),
|
|
245
|
-
getCurrentHub: (0, bun_test_1.mock)(function () { return mockHub; }),
|
|
246
|
-
getCurrentScope: (0, bun_test_1.mock)(function () { return mockScope; }),
|
|
247
|
-
Handlers: {
|
|
248
|
-
errorHandler: (0, bun_test_1.mock)(function () { return function (err, _req, _res, next) { return next(err); }; }),
|
|
249
|
-
requestHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
|
|
250
|
-
tracingHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
|
|
251
|
-
},
|
|
252
|
-
init: mockFn(),
|
|
253
|
-
isInitialized: (0, bun_test_1.mock)(function () { return true; }),
|
|
254
|
-
popScope: mockFn(),
|
|
255
|
-
pushScope: mockFn(),
|
|
256
|
-
Severity: {
|
|
257
|
-
Debug: "debug",
|
|
258
|
-
Error: "error",
|
|
259
|
-
Fatal: "fatal",
|
|
260
|
-
Info: "info",
|
|
261
|
-
Warning: "warning",
|
|
262
|
-
},
|
|
263
|
-
setContext: mockFn(),
|
|
264
|
-
setFingerprint: mockFn(),
|
|
265
|
-
setLevel: mockFn(),
|
|
266
|
-
setTag: mockFn(),
|
|
267
|
-
setTags: mockFn(),
|
|
268
|
-
setUser: mockFn(),
|
|
269
|
-
setupExpressErrorHandler: mockFn(),
|
|
270
|
-
startTransaction: (0, bun_test_1.mock)(function () { return mockTransaction; }),
|
|
271
|
-
withScope: (0, bun_test_1.mock)(function (callback) { return callback(mockScope); }),
|
|
72
|
+
var test_1 = require("@terreno/test");
|
|
73
|
+
var useFixtureCache = process.env.TERRENO_TEST_USE_FIXTURE_CACHE === "true";
|
|
74
|
+
if (useFixtureCache) {
|
|
75
|
+
(0, test_1.registerBackendPreload)({
|
|
76
|
+
connectMongoInBeforeAll: true,
|
|
77
|
+
loadTestDataFromCache: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
78
|
+
var loadTestDataFromCache;
|
|
79
|
+
return __generator(this, function (_a) {
|
|
80
|
+
switch (_a.label) {
|
|
81
|
+
case 0: return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("./mongoTestSetup")); })];
|
|
82
|
+
case 1:
|
|
83
|
+
loadTestDataFromCache = (_a.sent()).loadTestDataFromCache;
|
|
84
|
+
return [4 /*yield*/, loadTestDataFromCache()];
|
|
85
|
+
case 2:
|
|
86
|
+
_a.sent();
|
|
87
|
+
return [2 /*return*/];
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}); },
|
|
91
|
+
mongo: {
|
|
92
|
+
baseDatabaseName: "terrenoTest_base",
|
|
93
|
+
useReplSet: true,
|
|
272
94
|
},
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
getCurrentHub: (0, bun_test_1.mock)(function () { return mockHub; }),
|
|
276
|
-
getCurrentScope: (0, bun_test_1.mock)(function () { return mockScope; }),
|
|
277
|
-
Handlers: {
|
|
278
|
-
errorHandler: (0, bun_test_1.mock)(function () { return function (err, _req, _res, next) { return next(err); }; }),
|
|
279
|
-
requestHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
|
|
280
|
-
tracingHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
|
|
95
|
+
testEnv: {
|
|
96
|
+
tokenIssuer: "terreno-api.test",
|
|
281
97
|
},
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
Fatal: "fatal",
|
|
290
|
-
Info: "info",
|
|
291
|
-
Warning: "warning",
|
|
98
|
+
useTransactions: true,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
(0, test_1.registerSimpleMongoPreload)({
|
|
103
|
+
testEnv: {
|
|
104
|
+
tokenIssuer: "terreno-api.test",
|
|
292
105
|
},
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
setLevel: mockFn(),
|
|
296
|
-
setTag: mockFn(),
|
|
297
|
-
setTags: mockFn(),
|
|
298
|
-
setUser: mockFn(),
|
|
299
|
-
setupExpressErrorHandler: mockFn(),
|
|
300
|
-
startTransaction: (0, bun_test_1.mock)(function () { return mockTransaction; }),
|
|
301
|
-
withScope: (0, bun_test_1.mock)(function (callback) { return callback(mockScope); }),
|
|
302
|
-
};
|
|
303
|
-
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CachedTestData, TestData, TestFoods, TestRequired, TestUsers } from "./types";
|
|
2
|
+
export declare const clearTestCollections: () => Promise<void>;
|
|
3
|
+
export declare const createTestUsers: () => Promise<TestUsers>;
|
|
4
|
+
export declare const createStandardFoods: (users: TestUsers) => Promise<TestFoods>;
|
|
5
|
+
export declare const createRequiredFixtures: () => Promise<TestRequired>;
|
|
6
|
+
/** Builds the standard Terreno API test database (users, foods, required docs). */
|
|
7
|
+
export declare const createTestData: () => Promise<TestData>;
|
|
8
|
+
export declare const toCachedTestData: (testData: TestData) => CachedTestData;
|
|
9
|
+
export declare const loadTestDataFromDocuments: (cached: CachedTestData) => Promise<TestData>;
|
|
@@ -0,0 +1,272 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.loadTestDataFromDocuments = exports.toCachedTestData = exports.createTestData = exports.createRequiredFixtures = exports.createStandardFoods = exports.createTestUsers = exports.clearTestCollections = void 0;
|
|
56
|
+
var logger_1 = require("../logger");
|
|
57
|
+
var models_1 = require("./models");
|
|
58
|
+
var setPassword = function (user, password) { return __awaiter(void 0, void 0, void 0, function () {
|
|
59
|
+
return __generator(this, function (_a) {
|
|
60
|
+
switch (_a.label) {
|
|
61
|
+
case 0: return [4 /*yield*/, user.setPassword(password)];
|
|
62
|
+
case 1:
|
|
63
|
+
_a.sent();
|
|
64
|
+
return [4 /*yield*/, user.save()];
|
|
65
|
+
case 2:
|
|
66
|
+
_a.sent();
|
|
67
|
+
return [2 /*return*/];
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}); };
|
|
71
|
+
var clearTestCollections = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
72
|
+
return __generator(this, function (_a) {
|
|
73
|
+
switch (_a.label) {
|
|
74
|
+
case 0: return [4 /*yield*/, Promise.all([
|
|
75
|
+
models_1.UserModel.deleteMany({}),
|
|
76
|
+
models_1.FoodModel.deleteMany({}),
|
|
77
|
+
models_1.RequiredModel.deleteMany({}),
|
|
78
|
+
]).catch(logger_1.logger.catch)];
|
|
79
|
+
case 1:
|
|
80
|
+
_a.sent();
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}); };
|
|
85
|
+
exports.clearTestCollections = clearTestCollections;
|
|
86
|
+
var createTestUsers = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
87
|
+
var _a, notAdmin, admin, adminOther;
|
|
88
|
+
return __generator(this, function (_b) {
|
|
89
|
+
switch (_b.label) {
|
|
90
|
+
case 0: return [4 /*yield*/, Promise.all([
|
|
91
|
+
models_1.UserModel.create({ email: "notAdmin@example.com", name: "Not Admin" }),
|
|
92
|
+
models_1.UserModel.create({ admin: true, email: "admin@example.com", name: "Admin" }),
|
|
93
|
+
models_1.UserModel.create({ admin: true, email: "admin+other@example.com", name: "Admin Other" }),
|
|
94
|
+
])];
|
|
95
|
+
case 1:
|
|
96
|
+
_a = __read.apply(void 0, [_b.sent(), 3]), notAdmin = _a[0], admin = _a[1], adminOther = _a[2];
|
|
97
|
+
return [4 /*yield*/, Promise.all([
|
|
98
|
+
setPassword(notAdmin, "password"),
|
|
99
|
+
setPassword(admin, "securePassword"),
|
|
100
|
+
setPassword(adminOther, "otherPassword"),
|
|
101
|
+
])];
|
|
102
|
+
case 2:
|
|
103
|
+
_b.sent();
|
|
104
|
+
return [2 /*return*/, { admin: admin, adminOther: adminOther, notAdmin: notAdmin }];
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}); };
|
|
108
|
+
exports.createTestUsers = createTestUsers;
|
|
109
|
+
var createStandardFoods = function (users) { return __awaiter(void 0, void 0, void 0, function () {
|
|
110
|
+
var admin, adminOther, notAdmin, _a, spinach, apple, carrots, pizza;
|
|
111
|
+
return __generator(this, function (_b) {
|
|
112
|
+
switch (_b.label) {
|
|
113
|
+
case 0:
|
|
114
|
+
admin = users.admin, adminOther = users.adminOther, notAdmin = users.notAdmin;
|
|
115
|
+
return [4 /*yield*/, Promise.all([
|
|
116
|
+
models_1.FoodModel.create({
|
|
117
|
+
calories: 1,
|
|
118
|
+
categories: [{ name: "Vegetables", show: true }],
|
|
119
|
+
created: new Date("2021-12-03T00:00:20.000Z"),
|
|
120
|
+
eatenBy: [admin._id],
|
|
121
|
+
expiration: "2026-12-31",
|
|
122
|
+
hidden: false,
|
|
123
|
+
lastEatenWith: {
|
|
124
|
+
dressing: new Date("2021-12-03T19:00:30.000Z"),
|
|
125
|
+
},
|
|
126
|
+
likesIds: [
|
|
127
|
+
{ likes: true, userId: admin._id },
|
|
128
|
+
{ likes: false, userId: notAdmin._id },
|
|
129
|
+
],
|
|
130
|
+
name: "Spinach",
|
|
131
|
+
ownerId: notAdmin._id,
|
|
132
|
+
source: {
|
|
133
|
+
dateAdded: "2023-12-13T12:30:00.000Z",
|
|
134
|
+
href: "https://www.example.com/spinach",
|
|
135
|
+
name: "Brand",
|
|
136
|
+
},
|
|
137
|
+
tags: ["healthy"],
|
|
138
|
+
}),
|
|
139
|
+
models_1.FoodModel.create({
|
|
140
|
+
calories: 100,
|
|
141
|
+
created: new Date("2021-12-03T00:00:30.000Z"),
|
|
142
|
+
expiration: "2026-12-31",
|
|
143
|
+
hidden: true,
|
|
144
|
+
likesIds: [{ likes: true, userId: admin._id }],
|
|
145
|
+
name: "Apple",
|
|
146
|
+
ownerId: admin._id,
|
|
147
|
+
source: { name: "Orchard" },
|
|
148
|
+
tags: ["healthy"],
|
|
149
|
+
}),
|
|
150
|
+
models_1.FoodModel.create({
|
|
151
|
+
calories: 100,
|
|
152
|
+
created: new Date("2021-12-03T00:00:00.000Z"),
|
|
153
|
+
eatenBy: [admin._id, notAdmin._id],
|
|
154
|
+
expiration: "2026-12-31",
|
|
155
|
+
hidden: false,
|
|
156
|
+
likesIds: [{ likes: false, userId: notAdmin._id }],
|
|
157
|
+
name: "Carrots",
|
|
158
|
+
ownerId: admin._id,
|
|
159
|
+
source: { name: "Farm" },
|
|
160
|
+
tags: ["vegetable"],
|
|
161
|
+
}),
|
|
162
|
+
models_1.FoodModel.create({
|
|
163
|
+
calories: 800,
|
|
164
|
+
created: new Date("2022-01-01T00:00:00.000Z"),
|
|
165
|
+
expiration: "2026-12-31",
|
|
166
|
+
hidden: false,
|
|
167
|
+
likesIds: [{ likes: true, userId: adminOther._id }],
|
|
168
|
+
name: "Pizza",
|
|
169
|
+
ownerId: adminOther._id,
|
|
170
|
+
source: { name: "Pizzeria" },
|
|
171
|
+
tags: ["comfort"],
|
|
172
|
+
}),
|
|
173
|
+
])];
|
|
174
|
+
case 1:
|
|
175
|
+
_a = __read.apply(void 0, [_b.sent(), 4]), spinach = _a[0], apple = _a[1], carrots = _a[2], pizza = _a[3];
|
|
176
|
+
return [2 /*return*/, { apple: apple, carrots: carrots, pizza: pizza, spinach: spinach }];
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}); };
|
|
180
|
+
exports.createStandardFoods = createStandardFoods;
|
|
181
|
+
var createRequiredFixtures = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
182
|
+
var _a, sample, withAbout;
|
|
183
|
+
return __generator(this, function (_b) {
|
|
184
|
+
switch (_b.label) {
|
|
185
|
+
case 0: return [4 /*yield*/, Promise.all([
|
|
186
|
+
models_1.RequiredModel.create({ name: "Sample Required" }),
|
|
187
|
+
models_1.RequiredModel.create({ about: "Optional about text", name: "Required With About" }),
|
|
188
|
+
])];
|
|
189
|
+
case 1:
|
|
190
|
+
_a = __read.apply(void 0, [_b.sent(), 2]), sample = _a[0], withAbout = _a[1];
|
|
191
|
+
return [2 /*return*/, { sample: sample, withAbout: withAbout }];
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}); };
|
|
195
|
+
exports.createRequiredFixtures = createRequiredFixtures;
|
|
196
|
+
/** Builds the standard Terreno API test database (users, foods, required docs). */
|
|
197
|
+
var createTestData = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
198
|
+
var users, _a, foods, required;
|
|
199
|
+
return __generator(this, function (_b) {
|
|
200
|
+
switch (_b.label) {
|
|
201
|
+
case 0: return [4 /*yield*/, (0, exports.clearTestCollections)()];
|
|
202
|
+
case 1:
|
|
203
|
+
_b.sent();
|
|
204
|
+
return [4 /*yield*/, (0, exports.createTestUsers)()];
|
|
205
|
+
case 2:
|
|
206
|
+
users = _b.sent();
|
|
207
|
+
return [4 /*yield*/, Promise.all([
|
|
208
|
+
(0, exports.createStandardFoods)(users),
|
|
209
|
+
(0, exports.createRequiredFixtures)(),
|
|
210
|
+
])];
|
|
211
|
+
case 3:
|
|
212
|
+
_a = __read.apply(void 0, [_b.sent(), 2]), foods = _a[0], required = _a[1];
|
|
213
|
+
return [2 /*return*/, { foods: foods, required: required, users: users }];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}); };
|
|
217
|
+
exports.createTestData = createTestData;
|
|
218
|
+
var toCachedTestData = function (testData) { return ({
|
|
219
|
+
foods: {
|
|
220
|
+
apple: testData.foods.apple.id,
|
|
221
|
+
carrots: testData.foods.carrots.id,
|
|
222
|
+
pizza: testData.foods.pizza.id,
|
|
223
|
+
spinach: testData.foods.spinach.id,
|
|
224
|
+
},
|
|
225
|
+
required: {
|
|
226
|
+
sample: testData.required.sample.id,
|
|
227
|
+
withAbout: testData.required.withAbout.id,
|
|
228
|
+
},
|
|
229
|
+
users: {
|
|
230
|
+
admin: testData.users.admin.id,
|
|
231
|
+
adminOther: testData.users.adminOther.id,
|
|
232
|
+
notAdmin: testData.users.notAdmin.id,
|
|
233
|
+
},
|
|
234
|
+
}); };
|
|
235
|
+
exports.toCachedTestData = toCachedTestData;
|
|
236
|
+
var loadTestDataFromDocuments = function (cached) { return __awaiter(void 0, void 0, void 0, function () {
|
|
237
|
+
var _a, admin, notAdmin, adminOther, spinach, apple, carrots, pizza, sample, withAbout;
|
|
238
|
+
return __generator(this, function (_b) {
|
|
239
|
+
switch (_b.label) {
|
|
240
|
+
case 0: return [4 /*yield*/, Promise.all([
|
|
241
|
+
models_1.UserModel.findById(cached.users.admin),
|
|
242
|
+
models_1.UserModel.findById(cached.users.notAdmin),
|
|
243
|
+
models_1.UserModel.findById(cached.users.adminOther),
|
|
244
|
+
models_1.FoodModel.findById(cached.foods.spinach),
|
|
245
|
+
models_1.FoodModel.findById(cached.foods.apple),
|
|
246
|
+
models_1.FoodModel.findById(cached.foods.carrots),
|
|
247
|
+
models_1.FoodModel.findById(cached.foods.pizza),
|
|
248
|
+
models_1.RequiredModel.findById(cached.required.sample),
|
|
249
|
+
models_1.RequiredModel.findById(cached.required.withAbout),
|
|
250
|
+
])];
|
|
251
|
+
case 1:
|
|
252
|
+
_a = __read.apply(void 0, [_b.sent(), 9]), admin = _a[0], notAdmin = _a[1], adminOther = _a[2], spinach = _a[3], apple = _a[4], carrots = _a[5], pizza = _a[6], sample = _a[7], withAbout = _a[8];
|
|
253
|
+
if (!admin ||
|
|
254
|
+
!notAdmin ||
|
|
255
|
+
!adminOther ||
|
|
256
|
+
!spinach ||
|
|
257
|
+
!apple ||
|
|
258
|
+
!carrots ||
|
|
259
|
+
!pizza ||
|
|
260
|
+
!sample ||
|
|
261
|
+
!withAbout) {
|
|
262
|
+
throw new Error("[createTestData] Cached test data references missing documents");
|
|
263
|
+
}
|
|
264
|
+
return [2 /*return*/, {
|
|
265
|
+
foods: { apple: apple, carrots: carrots, pizza: pizza, spinach: spinach },
|
|
266
|
+
required: { sample: sample, withAbout: withAbout },
|
|
267
|
+
users: { admin: admin, adminOther: adminOther, notAdmin: notAdmin },
|
|
268
|
+
}];
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}); };
|
|
272
|
+
exports.loadTestDataFromDocuments = loadTestDataFromDocuments;
|