@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.
- package/bunfig.toml +1 -1
- package/dist/auth.test.js +408 -33
- package/dist/models/consentForm.js +2 -1
- package/dist/models/consentResponse.js +2 -1
- package/dist/models/versionConfig.js +2 -1
- package/dist/openApiBuilder.d.ts +18 -0
- package/dist/openApiBuilder.js +21 -0
- package/dist/openApiBuilder.test.js +16 -0
- package/dist/permissions.test.js +10 -43
- package/dist/populate.test.js +10 -42
- package/dist/syncConsents.test.js +2 -2
- package/dist/tests/bunSetup.js +33 -283
- 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 -264
- package/dist/transformers.test.js +14 -50
- package/package.json +18 -4
- package/src/__snapshots__/openApiBuilder.test.ts.snap +1 -0
- package/src/auth.test.ts +277 -29
- package/src/models/consentForm.ts +3 -4
- package/src/models/consentResponse.ts +6 -4
- package/src/models/versionConfig.ts +3 -4
- package/src/openApiBuilder.test.ts +9 -0
- package/src/openApiBuilder.ts +24 -0
- package/src/permissions.test.ts +8 -23
- package/src/populate.test.ts +7 -22
- package/src/syncConsents.test.ts +1 -1
- package/src/tests/bunSetup.ts +22 -249
- 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 -244
- 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
|
@@ -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
|
+
}
|
package/dist/tests.d.ts
CHANGED
|
@@ -1,81 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import type express from "express";
|
|
2
|
+
import type { Express } from "express";
|
|
3
3
|
import type TestAgent from "supertest/lib/agent";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
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.
|
|
92
|
-
var
|
|
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
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
192
|
-
|
|
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
|
|
63
|
+
var email, password;
|
|
216
64
|
return __generator(this, function (_a) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
|
234
|
-
|
|
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; } });
|