@terreno/api 0.21.0 → 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.
Files changed (51) hide show
  1. package/bunfig.toml +1 -1
  2. package/dist/auth.test.js +408 -33
  3. package/dist/models/consentForm.js +2 -1
  4. package/dist/models/consentResponse.js +2 -1
  5. package/dist/models/versionConfig.js +2 -1
  6. package/dist/openApiBuilder.d.ts +18 -0
  7. package/dist/openApiBuilder.js +21 -0
  8. package/dist/openApiBuilder.test.js +16 -0
  9. package/dist/permissions.test.js +10 -43
  10. package/dist/populate.test.js +10 -42
  11. package/dist/syncConsents.test.js +2 -2
  12. package/dist/tests/bunSetup.js +33 -283
  13. package/dist/tests/createTestData.d.ts +9 -0
  14. package/dist/tests/createTestData.js +272 -0
  15. package/dist/tests/models.d.ts +71 -0
  16. package/dist/tests/models.js +134 -0
  17. package/dist/tests/mongoTestSetup.d.ts +7 -0
  18. package/dist/tests/mongoTestSetup.js +150 -0
  19. package/dist/tests/testEnv.d.ts +0 -0
  20. package/dist/tests/testEnv.js +6 -0
  21. package/dist/tests/testHelper.d.ts +22 -0
  22. package/dist/tests/testHelper.js +115 -0
  23. package/dist/tests/types.d.ts +29 -0
  24. package/dist/tests/types.js +2 -0
  25. package/dist/tests.d.ts +10 -78
  26. package/dist/tests.js +24 -264
  27. package/dist/transformers.test.js +14 -50
  28. package/package.json +18 -4
  29. package/src/__snapshots__/openApiBuilder.test.ts.snap +1 -0
  30. package/src/auth.test.ts +277 -29
  31. package/src/models/consentForm.ts +3 -4
  32. package/src/models/consentResponse.ts +6 -4
  33. package/src/models/versionConfig.ts +3 -4
  34. package/src/openApiBuilder.test.ts +9 -0
  35. package/src/openApiBuilder.ts +24 -0
  36. package/src/permissions.test.ts +8 -23
  37. package/src/populate.test.ts +7 -22
  38. package/src/syncConsents.test.ts +1 -1
  39. package/src/tests/bunSetup.ts +22 -249
  40. package/src/tests/createTestData.ts +176 -0
  41. package/src/tests/models.ts +164 -0
  42. package/src/tests/mongoTestSetup.ts +69 -0
  43. package/src/tests/testEnv.ts +4 -0
  44. package/src/tests/testHelper.ts +57 -0
  45. package/src/tests/types.ts +35 -0
  46. package/src/tests.ts +40 -244
  47. package/src/transformers.test.ts +11 -30
  48. package/tsconfig.typedoc.json +4 -0
  49. package/dist/tests/index.d.ts +0 -1
  50. package/dist/tests/index.js +0 -17
  51. package/src/tests/index.ts +0 -1
@@ -0,0 +1,115 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.loadTestData = exports.createTestData = exports.resetTestCollections = exports.setupTestData = exports.setupDb = exports.applyTestAuthEnv = void 0;
40
+ var test_1 = require("@terreno/test");
41
+ var logger_1 = require("../logger");
42
+ var createTestData_1 = require("./createTestData");
43
+ var models_1 = require("./models");
44
+ var mongoTestSetup_1 = require("./mongoTestSetup");
45
+ var defaultTestMongoUri = "mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000";
46
+ var applyTestAuthEnv = function () {
47
+ process.env.REFRESH_TOKEN_SECRET = "refresh_secret";
48
+ process.env.TOKEN_SECRET = "secret";
49
+ process.env.TOKEN_EXPIRES_IN = "30m";
50
+ process.env.TOKEN_ISSUER = "example.com";
51
+ process.env.SESSION_SECRET = "session";
52
+ };
53
+ exports.applyTestAuthEnv = applyTestAuthEnv;
54
+ var ensureConnected = function () { return __awaiter(void 0, void 0, void 0, function () {
55
+ return __generator(this, function (_a) {
56
+ switch (_a.label) {
57
+ case 0: return [4 /*yield*/, (0, test_1.ensureTestMongooseConnected)({
58
+ defaultUri: defaultTestMongoUri,
59
+ onConnectError: logger_1.logger.catch,
60
+ })];
61
+ case 1:
62
+ _a.sent();
63
+ (0, exports.applyTestAuthEnv)();
64
+ return [2 /*return*/];
65
+ }
66
+ });
67
+ }); };
68
+ /** Seeds only the standard users (legacy helper). */
69
+ var setupDb = function () { return __awaiter(void 0, void 0, void 0, function () {
70
+ var users, error_1;
71
+ return __generator(this, function (_a) {
72
+ switch (_a.label) {
73
+ case 0: return [4 /*yield*/, ensureConnected()];
74
+ case 1:
75
+ _a.sent();
76
+ return [4 /*yield*/, Promise.all([models_1.UserModel.deleteMany({}), models_1.FoodModel.deleteMany({})]).catch(logger_1.logger.catch)];
77
+ case 2:
78
+ _a.sent();
79
+ _a.label = 3;
80
+ case 3:
81
+ _a.trys.push([3, 5, , 6]);
82
+ return [4 /*yield*/, (0, createTestData_1.createTestUsers)()];
83
+ case 4:
84
+ users = _a.sent();
85
+ return [2 /*return*/, [users.admin, users.notAdmin, users.adminOther]];
86
+ case 5:
87
+ error_1 = _a.sent();
88
+ logger_1.logger.error("Error setting up DB", error_1);
89
+ throw error_1;
90
+ case 6: return [2 /*return*/];
91
+ }
92
+ });
93
+ }); };
94
+ exports.setupDb = setupDb;
95
+ /** Seeds users, foods, and required docs — the recommended API test baseline. */
96
+ var setupTestData = function () { return __awaiter(void 0, void 0, void 0, function () {
97
+ return __generator(this, function (_a) {
98
+ switch (_a.label) {
99
+ case 0: return [4 /*yield*/, ensureConnected()];
100
+ case 1:
101
+ _a.sent();
102
+ if (process.env.TERRENO_TEST_USE_FIXTURE_CACHE === "true") {
103
+ return [2 /*return*/, (0, mongoTestSetup_1.loadTestData)()];
104
+ }
105
+ return [2 /*return*/, (0, createTestData_1.createTestData)()];
106
+ }
107
+ });
108
+ }); };
109
+ exports.setupTestData = setupTestData;
110
+ /** Clears all API test collections without re-seeding. */
111
+ exports.resetTestCollections = createTestData_1.clearTestCollections;
112
+ var createTestData_2 = require("./createTestData");
113
+ Object.defineProperty(exports, "createTestData", { enumerable: true, get: function () { return createTestData_2.createTestData; } });
114
+ var mongoTestSetup_2 = require("./mongoTestSetup");
115
+ Object.defineProperty(exports, "loadTestData", { enumerable: true, get: function () { return mongoTestSetup_2.loadTestData; } });
@@ -0,0 +1,29 @@
1
+ import type { HydratedDocument } from "mongoose";
2
+ import type { Food, RequiredField, User } from "./models";
3
+ export interface TestUsers {
4
+ admin: HydratedDocument<User>;
5
+ adminOther: HydratedDocument<User>;
6
+ notAdmin: HydratedDocument<User>;
7
+ }
8
+ export interface TestFoods {
9
+ apple: HydratedDocument<Food>;
10
+ carrots: HydratedDocument<Food>;
11
+ pizza: HydratedDocument<Food>;
12
+ spinach: HydratedDocument<Food>;
13
+ }
14
+ export interface TestRequired {
15
+ sample: HydratedDocument<RequiredField>;
16
+ withAbout: HydratedDocument<RequiredField>;
17
+ }
18
+ /** Canonical API integration-test fixture graph. */
19
+ export interface TestData {
20
+ foods: TestFoods;
21
+ required: TestRequired;
22
+ users: TestUsers;
23
+ }
24
+ /** JSON-serializable snapshot stored alongside collection cache files. */
25
+ export interface CachedTestData {
26
+ foods: Record<keyof TestFoods, string>;
27
+ required: Record<keyof TestRequired, string>;
28
+ users: Record<keyof TestUsers, string>;
29
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/dist/tests.d.ts CHANGED
@@ -1,81 +1,13 @@
1
- import express, { type Express } from "express";
2
- import mongoose, { type Model, Schema } from "mongoose";
1
+ import type express from "express";
2
+ import type { Express } from "express";
3
3
  import type TestAgent from "supertest/lib/agent";
4
- export interface User {
5
- admin: boolean;
6
- name?: string;
7
- username: string;
8
- email: string;
9
- age?: number;
10
- disabled?: boolean;
11
- }
12
- export interface SuperUser extends User {
13
- superTitle: string;
14
- }
15
- export interface StaffUser extends User {
16
- department: string;
17
- }
18
- export interface FoodCategory {
19
- _id?: string;
20
- name: string;
21
- show: boolean;
22
- created: Date;
23
- updated: Date;
24
- }
25
- export interface Food {
26
- _id: string;
27
- name: string;
28
- calories: number;
29
- created: Date;
30
- ownerId: mongoose.Types.ObjectId | User;
31
- hidden?: boolean;
32
- source: {
33
- name: string;
34
- href?: string;
35
- dateAdded?: string;
36
- };
37
- tags: string[];
38
- eatenBy: [Schema.Types.ObjectId | User];
39
- lastEatenWith: {
40
- [name: string]: Date;
41
- };
42
- categories: FoodCategory[];
43
- expiration: string;
44
- likesIds: {
45
- userId: string;
46
- likes: boolean;
47
- }[];
48
- }
49
- export declare const UserModel: mongoose.Model<User, {}, {}, {}, mongoose.Document<unknown, {}, User, {}, {}> & User & {
50
- _id: mongoose.Types.ObjectId;
51
- } & {
52
- __v: number;
53
- }, any>;
54
- export declare const SuperUserModel: mongoose.Model<User & SuperUser, {}, {}, {}, mongoose.Document<unknown, {}, User & SuperUser, {}, {}> & User & SuperUser & {
55
- _id: mongoose.Types.ObjectId;
56
- } & {
57
- __v: number;
58
- }, any>;
59
- export declare const StaffUserModel: mongoose.Model<User & StaffUser, {}, {}, {}, mongoose.Document<unknown, {}, User & StaffUser, {}, {}> & User & StaffUser & {
60
- _id: mongoose.Types.ObjectId;
61
- } & {
62
- __v: number;
63
- }, any>;
64
- export declare const FoodModel: Model<Food>;
65
- interface RequiredField {
66
- name: string;
67
- about?: string;
68
- }
69
- export declare const RequiredModel: mongoose.Model<RequiredField, {}, {}, {}, mongoose.Document<unknown, {}, RequiredField, {}, {}> & RequiredField & {
70
- _id: mongoose.Types.ObjectId;
71
- } & {
72
- __v: number;
73
- }, any>;
4
+ import { createTestData } from "./tests/createTestData";
5
+ import { type Food, type FoodCategory, FoodModel, type RequiredField, RequiredModel, type StaffUser, StaffUserModel, type SuperUser, SuperUserModel, type User, UserModel } from "./tests/models";
6
+ import { loadTestDataFromCache, setupTestCache } from "./tests/mongoTestSetup";
7
+ import { setupDb, setupTestData } from "./tests/testHelper";
8
+ import type { TestData } from "./tests/types";
9
+ export type { Food, FoodCategory, RequiredField, StaffUser, SuperUser, TestData, User };
10
+ export { createTestData, FoodModel, loadTestDataFromCache, RequiredModel, StaffUserModel, SuperUserModel, setupDb, setupTestCache, setupTestData, UserModel, };
74
11
  export declare const getBaseServer: () => Express;
75
12
  export declare const authAsUser: (app: express.Application, type: "admin" | "notAdmin") => Promise<TestAgent>;
76
- export declare const setupDb: () => Promise<(mongoose.Document<unknown, {}, User, {}, {}> & User & {
77
- _id: mongoose.Types.ObjectId;
78
- } & {
79
- __v: number;
80
- })[]>;
81
- export {};
13
+ export { loadTestData } from "./tests/mongoTestSetup";
package/dist/tests.js CHANGED
@@ -1,37 +1,4 @@
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
- })();
35
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -68,245 +35,38 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
68
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
36
  }
70
37
  };
71
- var __read = (this && this.__read) || function (o, n) {
72
- var m = typeof Symbol === "function" && o[Symbol.iterator];
73
- if (!m) return o;
74
- var i = m.call(o), r, ar = [], e;
75
- try {
76
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
77
- }
78
- catch (error) { e = { error: error }; }
79
- finally {
80
- try {
81
- if (r && !r.done && (m = i["return"])) m.call(i);
82
- }
83
- finally { if (e) throw e.error; }
84
- }
85
- return ar;
86
- };
87
- var __importDefault = (this && this.__importDefault) || function (mod) {
88
- return (mod && mod.__esModule) ? mod : { "default": mod };
89
- };
90
38
  Object.defineProperty(exports, "__esModule", { value: true });
91
- exports.setupDb = exports.authAsUser = exports.getBaseServer = exports.RequiredModel = exports.FoodModel = exports.StaffUserModel = exports.SuperUserModel = exports.UserModel = void 0;
92
- var express_1 = __importDefault(require("express"));
93
- var mongoose_1 = __importStar(require("mongoose"));
94
- var passport_local_mongoose_1 = __importDefault(require("passport-local-mongoose"));
95
- var qs_1 = __importDefault(require("qs"));
96
- var supertest_1 = __importDefault(require("supertest"));
97
- var logger_1 = require("./logger");
39
+ exports.loadTestData = exports.authAsUser = exports.getBaseServer = exports.UserModel = exports.setupTestData = exports.setupTestCache = exports.setupDb = exports.SuperUserModel = exports.StaffUserModel = exports.RequiredModel = exports.loadTestDataFromCache = exports.FoodModel = exports.createTestData = void 0;
40
+ var test_1 = require("@terreno/test");
98
41
  var openApiCompat_1 = require("./openApiCompat");
99
- var plugins_1 = require("./plugins");
100
- var userSchema = new mongoose_1.Schema({
101
- admin: { default: false, description: "Whether the user has admin privileges", type: Boolean },
102
- age: { description: "The user's age", type: Number },
103
- name: { description: "The user's display name", type: String },
104
- username: { description: "The user's username", type: String },
105
- });
106
- userSchema.plugin(passport_local_mongoose_1.default, {
107
- attemptsField: "attempts",
108
- interval: process.env.NODE_ENV === "test" ? 1 : 100,
109
- limitAttempts: true,
110
- maxAttempts: 3,
111
- maxInterval: process.env.NODE_ENV === "test" ? 1 : 300000,
112
- usernameCaseInsensitive: true,
113
- usernameField: "email",
114
- });
115
- // userSchema.plugin(tokenPlugin);
116
- userSchema.plugin(plugins_1.createdUpdatedPlugin);
117
- userSchema.plugin(plugins_1.isDisabledPlugin);
118
- userSchema.methods.postCreate = function (body) {
119
- return __awaiter(this, void 0, void 0, function () {
120
- return __generator(this, function (_a) {
121
- this.age = body.age;
122
- return [2 /*return*/, this.save()];
123
- });
124
- });
125
- };
126
- exports.UserModel = (0, mongoose_1.model)("User", userSchema);
127
- var superUserSchema = new mongoose_1.Schema({
128
- superTitle: { description: "The super user's title", required: true, type: String },
129
- });
130
- exports.SuperUserModel = exports.UserModel.discriminator("SuperUser", superUserSchema);
131
- var staffUserSchema = new mongoose_1.Schema({
132
- department: {
133
- description: "The department the staff member belongs to",
134
- required: true,
135
- type: String,
136
- },
137
- });
138
- exports.StaffUserModel = exports.UserModel.discriminator("Staff", staffUserSchema);
139
- var foodCategorySchema = new mongoose_1.Schema({
140
- name: { description: "The name of the food category", type: String },
141
- show: { description: "Whether this category is visible", type: Boolean },
142
- }, { timestamps: { createdAt: "created", updatedAt: "updated" } });
143
- var likesSchema = new mongoose_1.Schema({
144
- likes: { description: "Whether the user liked the item", type: Boolean },
145
- userId: { description: "The user who liked the item", ref: "User", type: "ObjectId" },
146
- });
147
- var foodSchema = new mongoose_1.Schema({
148
- calories: { description: "Number of calories in the food", type: Number },
149
- categories: { description: "Categories this food belongs to", type: [foodCategorySchema] },
150
- created: { description: "When this food was created", type: Date },
151
- eatenBy: [
152
- {
153
- description: "Users who have eaten this food",
154
- ref: "User",
155
- required: true,
156
- type: mongoose_1.Schema.Types.ObjectId,
157
- },
158
- ],
159
- // biome-ignore lint/suspicious/noExplicitAny: DateOnly is a custom SchemaType not recognized by Mongoose's built-in type definitions
160
- expiration: { description: "Expiration date of the food", type: plugins_1.DateOnly },
161
- hidden: {
162
- default: false,
163
- description: "Whether this food is hidden from listings",
164
- type: Boolean,
165
- },
166
- lastEatenWith: {
167
- description: "Map of user names to dates they last ate this food with",
168
- of: Date,
169
- type: Map,
170
- },
171
- likesIds: { description: "User likes for this food", required: true, type: [likesSchema] },
172
- name: { description: "The name of the food", type: String },
173
- ownerId: { description: "The user who owns this food entry", ref: "User", type: "ObjectId" },
174
- source: {
175
- dateAdded: { description: "When the source was added", type: String },
176
- href: { description: "URL of the source", type: String },
177
- name: { description: "Name of the source", type: String },
178
- },
179
- tags: { description: "Tags associated with this food", type: [String] },
180
- }, { strict: "throw", toJSON: { virtuals: true }, toObject: { virtuals: true } });
181
- foodSchema.virtual("description").get(function () {
182
- return "".concat(this.name, " has ").concat(this.calories, " calories");
183
- });
184
- exports.FoodModel = (0, mongoose_1.model)("Food", foodSchema);
185
- var requiredSchema = new mongoose_1.Schema({
186
- about: { description: "Information about the item", type: String },
187
- name: { description: "The name of the item", required: true, type: String },
188
- });
189
- exports.RequiredModel = (0, mongoose_1.model)("Required", requiredSchema);
42
+ var createTestData_1 = require("./tests/createTestData");
43
+ Object.defineProperty(exports, "createTestData", { enumerable: true, get: function () { return createTestData_1.createTestData; } });
44
+ var models_1 = require("./tests/models");
45
+ Object.defineProperty(exports, "FoodModel", { enumerable: true, get: function () { return models_1.FoodModel; } });
46
+ Object.defineProperty(exports, "RequiredModel", { enumerable: true, get: function () { return models_1.RequiredModel; } });
47
+ Object.defineProperty(exports, "StaffUserModel", { enumerable: true, get: function () { return models_1.StaffUserModel; } });
48
+ Object.defineProperty(exports, "SuperUserModel", { enumerable: true, get: function () { return models_1.SuperUserModel; } });
49
+ Object.defineProperty(exports, "UserModel", { enumerable: true, get: function () { return models_1.UserModel; } });
50
+ var mongoTestSetup_1 = require("./tests/mongoTestSetup");
51
+ Object.defineProperty(exports, "loadTestDataFromCache", { enumerable: true, get: function () { return mongoTestSetup_1.loadTestDataFromCache; } });
52
+ Object.defineProperty(exports, "setupTestCache", { enumerable: true, get: function () { return mongoTestSetup_1.setupTestCache; } });
53
+ var testHelper_1 = require("./tests/testHelper");
54
+ Object.defineProperty(exports, "setupDb", { enumerable: true, get: function () { return testHelper_1.setupDb; } });
55
+ Object.defineProperty(exports, "setupTestData", { enumerable: true, get: function () { return testHelper_1.setupTestData; } });
190
56
  var getBaseServer = function () {
191
- var app = (0, express_1.default)();
192
- app.set("query parser", function (str) { return qs_1.default.parse(str, { arrayLimit: 200 }); });
193
- // Express 5 defaults to 'simple' query parser (Node querystring) which doesn't
194
- // support nested bracket notation like name[$regex]=Green. Use qs to match
195
- // what TerrenoApp.build() configures.
196
- app.set("query parser", function (str) { return qs_1.default.parse(str, { arrayLimit: 200 }); });
197
- // Record mount paths on layers for Express 5 → OpenAPI compat
198
- (0, openApiCompat_1.patchAppUse)(app);
199
- app.use(function (req, res, next) {
200
- res.header("Access-Control-Allow-Origin", "*");
201
- res.header("Access-Control-Allow-Headers", "*");
202
- // intercepts OPTIONS method
203
- if (req.method === "OPTIONS") {
204
- res.send(200);
205
- }
206
- else {
207
- next();
208
- }
57
+ return (0, test_1.getBaseServer)({
58
+ patchOpenApiCompat: openApiCompat_1.patchAppUse,
209
59
  });
210
- app.use(express_1.default.json());
211
- return app;
212
60
  };
213
61
  exports.getBaseServer = getBaseServer;
214
62
  var authAsUser = function (app, type) { return __awaiter(void 0, void 0, void 0, function () {
215
- var email, password, agent, res;
63
+ var email, password;
216
64
  return __generator(this, function (_a) {
217
- switch (_a.label) {
218
- case 0:
219
- email = type === "admin" ? "admin@example.com" : "notAdmin@example.com";
220
- password = type === "admin" ? "securePassword" : "password";
221
- agent = supertest_1.default.agent(app);
222
- return [4 /*yield*/, agent.post("/auth/login").send({ email: email, password: password }).expect(200)];
223
- case 1:
224
- res = _a.sent();
225
- return [4 /*yield*/, agent.set("authorization", "Bearer ".concat(res.body.data.token))];
226
- case 2:
227
- _a.sent();
228
- return [2 /*return*/, agent];
229
- }
65
+ email = type === "admin" ? "admin@example.com" : "notAdmin@example.com";
66
+ password = type === "admin" ? "securePassword" : "password";
67
+ return [2 /*return*/, (0, test_1.authAsUser)(app, { email: email, password: password })];
230
68
  });
231
69
  }); };
232
70
  exports.authAsUser = authAsUser;
233
- var defaultTestMongoUri = "mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000";
234
- /** Ensures Mongoose is connected without replacing an existing test connection (e.g. MongoMemoryServer from bunSetup). */
235
- var ensureTestMongooseConnected = function () { return __awaiter(void 0, void 0, void 0, function () {
236
- var uri;
237
- var _a;
238
- return __generator(this, function (_b) {
239
- switch (_b.label) {
240
- case 0:
241
- if (mongoose_1.default.connection.readyState === 1) {
242
- return [2 /*return*/];
243
- }
244
- if (!(mongoose_1.default.connection.readyState === 2)) return [3 /*break*/, 2];
245
- return [4 /*yield*/, mongoose_1.default.connection.asPromise()];
246
- case 1:
247
- _b.sent();
248
- return [2 /*return*/];
249
- case 2:
250
- uri = ((_a = process.env.TERRENO_TEST_MONGODB_URI) === null || _a === void 0 ? void 0 : _a.trim()) || defaultTestMongoUri;
251
- return [4 /*yield*/, mongoose_1.default.connect(uri).catch(logger_1.logger.catch)];
252
- case 3:
253
- _b.sent();
254
- return [2 /*return*/];
255
- }
256
- });
257
- }); };
258
- var setupDb = function () { return __awaiter(void 0, void 0, void 0, function () {
259
- var _a, notAdmin, admin, adminOther, error_1;
260
- return __generator(this, function (_b) {
261
- switch (_b.label) {
262
- case 0: return [4 /*yield*/, ensureTestMongooseConnected()];
263
- case 1:
264
- _b.sent();
265
- process.env.REFRESH_TOKEN_SECRET = "refresh_secret";
266
- process.env.TOKEN_SECRET = "secret";
267
- process.env.TOKEN_EXPIRES_IN = "30m";
268
- process.env.TOKEN_ISSUER = "example.com";
269
- process.env.SESSION_SECRET = "session";
270
- // Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
271
- return [4 /*yield*/, Promise.all([exports.UserModel.deleteMany({}), exports.FoodModel.deleteMany({})]).catch(logger_1.logger.catch)];
272
- case 2:
273
- // Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
274
- _b.sent();
275
- _b.label = 3;
276
- case 3:
277
- _b.trys.push([3, 11, , 12]);
278
- return [4 /*yield*/, Promise.all([
279
- exports.UserModel.create({ email: "notAdmin@example.com", name: "Not Admin" }),
280
- exports.UserModel.create({ admin: true, email: "admin@example.com", name: "Admin" }),
281
- exports.UserModel.create({ admin: true, email: "admin+other@example.com", name: "Admin Other" }),
282
- ])];
283
- case 4:
284
- _a = __read.apply(void 0, [_b.sent(), 3]), notAdmin = _a[0], admin = _a[1], adminOther = _a[2];
285
- return [4 /*yield*/, notAdmin.setPassword("password")];
286
- case 5:
287
- _b.sent();
288
- return [4 /*yield*/, notAdmin.save()];
289
- case 6:
290
- _b.sent();
291
- return [4 /*yield*/, admin.setPassword("securePassword")];
292
- case 7:
293
- _b.sent();
294
- return [4 /*yield*/, admin.save()];
295
- case 8:
296
- _b.sent();
297
- return [4 /*yield*/, adminOther.setPassword("otherPassword")];
298
- case 9:
299
- _b.sent();
300
- return [4 /*yield*/, adminOther.save()];
301
- case 10:
302
- _b.sent();
303
- return [2 /*return*/, [admin, notAdmin, adminOther]];
304
- case 11:
305
- error_1 = _b.sent();
306
- logger_1.logger.error("Error setting up DB", error_1);
307
- throw error_1;
308
- case 12: return [2 /*return*/];
309
- }
310
- });
311
- }); };
312
- exports.setupDb = setupDb;
71
+ var mongoTestSetup_2 = require("./tests/mongoTestSetup");
72
+ Object.defineProperty(exports, "loadTestData", { enumerable: true, get: function () { return mongoTestSetup_2.loadTestData; } });