medusa-test-utils 1.1.45 → 2.0.0-rc-20241003153304
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/dist/database.d.ts +2 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +100 -146
- package/dist/database.js.map +1 -1
- package/dist/events.d.ts +3 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +41 -0
- package/dist/events.js.map +1 -0
- package/dist/id-map.d.ts +3 -2
- package/dist/id-map.d.ts.map +1 -0
- package/dist/id-map.js +8 -11
- package/dist/id-map.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -7
- package/dist/index.js.map +1 -1
- package/dist/init-modules.d.ts +2 -1
- package/dist/init-modules.d.ts.map +1 -0
- package/dist/init-modules.js +39 -97
- package/dist/init-modules.js.map +1 -1
- package/dist/jest.d.ts +1 -0
- package/dist/jest.d.ts.map +1 -0
- package/dist/jest.js +15 -64
- package/dist/jest.js.map +1 -1
- package/dist/medusa-test-runner-utils/bootstrap-app.d.ts +10 -5
- package/dist/medusa-test-runner-utils/bootstrap-app.d.ts.map +1 -0
- package/dist/medusa-test-runner-utils/bootstrap-app.js +53 -147
- package/dist/medusa-test-runner-utils/bootstrap-app.js.map +1 -1
- package/dist/medusa-test-runner-utils/clear-instances.d.ts +8 -0
- package/dist/medusa-test-runner-utils/clear-instances.d.ts.map +1 -0
- package/dist/medusa-test-runner-utils/clear-instances.js +14 -0
- package/dist/medusa-test-runner-utils/clear-instances.js.map +1 -0
- package/dist/medusa-test-runner-utils/config.d.ts +5 -0
- package/dist/medusa-test-runner-utils/config.d.ts.map +1 -0
- package/dist/medusa-test-runner-utils/config.js +28 -0
- package/dist/medusa-test-runner-utils/config.js.map +1 -0
- package/dist/medusa-test-runner-utils/index.d.ts +6 -0
- package/dist/medusa-test-runner-utils/index.d.ts.map +1 -0
- package/dist/medusa-test-runner-utils/index.js +22 -0
- package/dist/medusa-test-runner-utils/index.js.map +1 -0
- package/dist/medusa-test-runner-utils/use-db.d.ts +15 -12
- package/dist/medusa-test-runner-utils/use-db.d.ts.map +1 -0
- package/dist/medusa-test-runner-utils/use-db.js +51 -143
- package/dist/medusa-test-runner-utils/use-db.js.map +1 -1
- package/dist/medusa-test-runner-utils/utils.d.ts +2 -0
- package/dist/medusa-test-runner-utils/utils.d.ts.map +1 -0
- package/dist/medusa-test-runner-utils/utils.js +10 -0
- package/dist/medusa-test-runner-utils/utils.js.map +1 -0
- package/dist/medusa-test-runner.d.ts +16 -6
- package/dist/medusa-test-runner.d.ts.map +1 -0
- package/dist/medusa-test-runner.js +123 -343
- package/dist/medusa-test-runner.js.map +1 -1
- package/dist/mock-event-bus-service.d.ts +5 -4
- package/dist/mock-event-bus-service.d.ts.map +1 -0
- package/dist/mock-event-bus-service.js +13 -51
- package/dist/mock-event-bus-service.js.map +1 -1
- package/dist/module-test-runner.d.ts +4 -2
- package/dist/module-test-runner.d.ts.map +1 -0
- package/dist/module-test-runner.js +117 -132
- package/dist/module-test-runner.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +28 -39
- package/dist/mock-manager.d.ts +0 -9
- package/dist/mock-manager.js +0 -30
- package/dist/mock-manager.js.map +0 -1
- package/dist/mock-repository.d.ts +0 -51
- package/dist/mock-repository.js +0 -193
- package/dist/mock-repository.js.map +0 -1
@@ -1,364 +1,144 @@
|
|
1
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;
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "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 __values = (this && this.__values) || function(o) {
|
39
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
40
|
-
if (m) return m.call(o);
|
41
|
-
if (o && typeof o.length === "number") return {
|
42
|
-
next: function () {
|
43
|
-
if (o && i >= o.length) o = void 0;
|
44
|
-
return { value: o && o[i++], done: !o };
|
45
|
-
}
|
46
|
-
};
|
47
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
48
|
-
};
|
49
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
50
|
-
exports.medusaIntegrationTestRunner =
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
user: DB_USERNAME,
|
62
|
-
password: DB_PASSWORD,
|
63
|
-
host: DB_HOST,
|
64
|
-
};
|
65
|
-
var dbTestUtilFactory = function () { return ({
|
66
|
-
db_: null,
|
67
|
-
pgConnection_: null,
|
68
|
-
clear: function () {
|
69
|
-
var _a;
|
70
|
-
return __awaiter(this, void 0, void 0, function () {
|
71
|
-
return __generator(this, function (_b) {
|
72
|
-
(_a = this.db_) === null || _a === void 0 ? void 0 : _a.synchronize(true);
|
73
|
-
return [2 /*return*/];
|
74
|
-
});
|
75
|
-
});
|
76
|
-
},
|
77
|
-
create: function (dbName) {
|
78
|
-
return __awaiter(this, void 0, void 0, function () {
|
79
|
-
return __generator(this, function (_a) {
|
80
|
-
switch (_a.label) {
|
81
|
-
case 0: return [4 /*yield*/, (0, pg_god_1.createDatabase)({ databaseName: dbName }, pgGodCredentials)];
|
82
|
-
case 1:
|
83
|
-
_a.sent();
|
84
|
-
return [2 /*return*/];
|
85
|
-
}
|
86
|
-
});
|
87
|
-
});
|
88
|
-
},
|
89
|
-
teardown: function (_a) {
|
90
|
-
var _b = _a === void 0 ? {} : _a, forceDelete = _b.forceDelete, schema = _b.schema;
|
91
|
-
return __awaiter(this, void 0, void 0, function () {
|
92
|
-
var manager, tableNames, tableNames_1, tableNames_1_1, table_name, e_1_1;
|
93
|
-
var e_1, _c;
|
94
|
-
return __generator(this, function (_d) {
|
95
|
-
switch (_d.label) {
|
96
|
-
case 0:
|
97
|
-
forceDelete !== null && forceDelete !== void 0 ? forceDelete : (forceDelete = []);
|
98
|
-
if (!this.db_) {
|
99
|
-
return [2 /*return*/];
|
100
|
-
}
|
101
|
-
manager = this.db_.manager;
|
102
|
-
schema !== null && schema !== void 0 ? schema : (schema = "public");
|
103
|
-
return [4 /*yield*/, manager.query("SET session_replication_role = 'replica';")];
|
104
|
-
case 1:
|
105
|
-
_d.sent();
|
106
|
-
return [4 /*yield*/, manager.query("SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = '".concat(schema, "';"))];
|
107
|
-
case 2:
|
108
|
-
tableNames = _d.sent();
|
109
|
-
_d.label = 3;
|
110
|
-
case 3:
|
111
|
-
_d.trys.push([3, 8, 9, 10]);
|
112
|
-
tableNames_1 = __values(tableNames), tableNames_1_1 = tableNames_1.next();
|
113
|
-
_d.label = 4;
|
114
|
-
case 4:
|
115
|
-
if (!!tableNames_1_1.done) return [3 /*break*/, 7];
|
116
|
-
table_name = tableNames_1_1.value.table_name;
|
117
|
-
return [4 /*yield*/, manager.query("DELETE\n FROM ".concat(schema, ".\"").concat(table_name, "\";"))];
|
118
|
-
case 5:
|
119
|
-
_d.sent();
|
120
|
-
_d.label = 6;
|
121
|
-
case 6:
|
122
|
-
tableNames_1_1 = tableNames_1.next();
|
123
|
-
return [3 /*break*/, 4];
|
124
|
-
case 7: return [3 /*break*/, 10];
|
125
|
-
case 8:
|
126
|
-
e_1_1 = _d.sent();
|
127
|
-
e_1 = { error: e_1_1 };
|
128
|
-
return [3 /*break*/, 10];
|
129
|
-
case 9:
|
130
|
-
try {
|
131
|
-
if (tableNames_1_1 && !tableNames_1_1.done && (_c = tableNames_1.return)) _c.call(tableNames_1);
|
132
|
-
}
|
133
|
-
finally { if (e_1) throw e_1.error; }
|
134
|
-
return [7 /*endfinally*/];
|
135
|
-
case 10: return [4 /*yield*/, manager.query("SET session_replication_role = 'origin';")];
|
136
|
-
case 11:
|
137
|
-
_d.sent();
|
138
|
-
return [2 /*return*/];
|
139
|
-
}
|
140
|
-
});
|
141
|
-
});
|
142
|
-
},
|
143
|
-
shutdown: function (dbName) {
|
144
|
-
var _a, _b, _c, _d;
|
145
|
-
return __awaiter(this, void 0, void 0, function () {
|
146
|
-
return __generator(this, function (_e) {
|
147
|
-
switch (_e.label) {
|
148
|
-
case 0: return [4 /*yield*/, ((_a = this.db_) === null || _a === void 0 ? void 0 : _a.destroy())];
|
149
|
-
case 1:
|
150
|
-
_e.sent();
|
151
|
-
return [4 /*yield*/, ((_c = (_b = this.pgConnection_) === null || _b === void 0 ? void 0 : _b.context) === null || _c === void 0 ? void 0 : _c.destroy())];
|
152
|
-
case 2:
|
153
|
-
_e.sent();
|
154
|
-
return [4 /*yield*/, ((_d = this.pgConnection_) === null || _d === void 0 ? void 0 : _d.destroy())];
|
155
|
-
case 3:
|
156
|
-
_e.sent();
|
157
|
-
return [4 /*yield*/, (0, pg_god_1.dropDatabase)({ databaseName: dbName, errorIfNonExist: false }, pgGodCredentials)];
|
158
|
-
case 4: return [2 /*return*/, _e.sent()];
|
159
|
-
}
|
160
|
-
});
|
161
|
-
});
|
162
|
-
},
|
163
|
-
}); };
|
164
|
-
function medusaIntegrationTestRunner(_a) {
|
165
|
-
var _this = this;
|
166
|
-
var moduleName = _a.moduleName, dbName = _a.dbName, _b = _a.schema, schema = _b === void 0 ? "public" : _b, _c = _a.env, env = _c === void 0 ? {} : _c, _d = _a.force_modules_migration, force_modules_migration = _d === void 0 ? false : _d, _e = _a.debug, debug = _e === void 0 ? false : _e, testSuite = _a.testSuite;
|
167
|
-
var tempName = parseInt(process.env.JEST_WORKER_ID || "1");
|
168
|
-
moduleName = moduleName !== null && moduleName !== void 0 ? moduleName : Math.random().toString(36).substring(7);
|
169
|
-
dbName !== null && dbName !== void 0 ? dbName : (dbName = "medusa-".concat(moduleName.toLowerCase(), "-integration-").concat(tempName));
|
170
|
-
var dbConfig = {
|
171
|
-
dbName: dbName,
|
3
|
+
exports.medusaIntegrationTestRunner = medusaIntegrationTestRunner;
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
5
|
+
const awilix_1 = require("awilix");
|
6
|
+
const database_1 = require("./database");
|
7
|
+
const medusa_test_runner_utils_1 = require("./medusa-test-runner-utils");
|
8
|
+
function medusaIntegrationTestRunner({ moduleName, dbName, medusaConfigFile, schema = "public", env = {}, debug = false, inApp = false, testSuite, }) {
|
9
|
+
const tempName = parseInt(process.env.JEST_WORKER_ID || "1");
|
10
|
+
moduleName = moduleName ?? Math.random().toString(36).substring(7);
|
11
|
+
dbName ??= `medusa-${moduleName.toLowerCase()}-integration-${tempName}`;
|
12
|
+
let dbConfig = {
|
13
|
+
dbName,
|
172
14
|
clientUrl: (0, database_1.getDatabaseURL)(dbName),
|
173
|
-
schema
|
174
|
-
debug
|
15
|
+
schema,
|
16
|
+
debug,
|
175
17
|
};
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
},
|
184
|
-
idle_in_transaction_session_timeout: 20000,
|
185
|
-
};
|
186
|
-
return config;
|
187
|
-
};
|
188
|
-
var cwd = process.cwd();
|
189
|
-
var shutdown = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
190
|
-
return [2 /*return*/, void 0];
|
191
|
-
}); }); };
|
192
|
-
var dbUtils = dbTestUtilFactory();
|
193
|
-
var container;
|
194
|
-
var apiUtils;
|
195
|
-
var options = {
|
196
|
-
dbUtils: dbUtils,
|
18
|
+
const cwd = medusaConfigFile ?? process.cwd();
|
19
|
+
let shutdown = async () => void 0;
|
20
|
+
const dbUtils = (0, database_1.dbTestUtilFactory)();
|
21
|
+
let globalContainer;
|
22
|
+
let apiUtils;
|
23
|
+
let loadedApplication;
|
24
|
+
let options = {
|
197
25
|
api: new Proxy({}, {
|
198
|
-
get:
|
26
|
+
get: (target, prop) => {
|
199
27
|
return apiUtils[prop];
|
200
28
|
},
|
201
29
|
}),
|
202
30
|
dbConnection: new Proxy({}, {
|
203
|
-
get:
|
204
|
-
return dbUtils.
|
31
|
+
get: (target, prop) => {
|
32
|
+
return dbUtils.pgConnection_[prop];
|
205
33
|
},
|
206
34
|
}),
|
207
|
-
|
35
|
+
getMedusaApp: () => loadedApplication,
|
36
|
+
getContainer: () => globalContainer,
|
37
|
+
dbConfig: {
|
38
|
+
dbName,
|
39
|
+
schema,
|
40
|
+
clientUrl: dbConfig.clientUrl,
|
41
|
+
},
|
42
|
+
dbUtils,
|
208
43
|
};
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
_d.sent();
|
218
|
-
_d.label = 2;
|
219
|
-
case 2:
|
220
|
-
_d.trys.push([2, 4, , 5]);
|
221
|
-
return [4 /*yield*/, (0, use_db_1.initDb)({
|
222
|
-
cwd: cwd,
|
223
|
-
env: env,
|
224
|
-
force_modules_migration: force_modules_migration,
|
225
|
-
database_extra: {},
|
226
|
-
dbUrl: dbConfig.clientUrl,
|
227
|
-
dbSchema: dbConfig.schema,
|
228
|
-
})];
|
229
|
-
case 3:
|
230
|
-
_a = _d.sent(), dbDataSource = _a.dbDataSource, pgConnection = _a.pgConnection;
|
231
|
-
dataSourceRes = dbDataSource;
|
232
|
-
pgConnectionRes = pgConnection;
|
233
|
-
return [3 /*break*/, 5];
|
234
|
-
case 4:
|
235
|
-
error_1 = _d.sent();
|
236
|
-
console.error("Error initializing database", error_1 === null || error_1 === void 0 ? void 0 : error_1.message);
|
237
|
-
throw error_1;
|
238
|
-
case 5:
|
239
|
-
dbUtils.db_ = dataSourceRes;
|
240
|
-
dbUtils.pgConnection_ = pgConnectionRes;
|
241
|
-
_d.label = 6;
|
242
|
-
case 6:
|
243
|
-
_d.trys.push([6, 8, , 9]);
|
244
|
-
return [4 /*yield*/, (0, bootstrap_app_1.startBootstrapApp)({
|
245
|
-
cwd: cwd,
|
246
|
-
env: env,
|
247
|
-
})];
|
248
|
-
case 7:
|
249
|
-
_b = _d.sent(), _c = _b.shutdown, shutdown_1 = _c === void 0 ? function () { return void 0; } : _c, container_1 = _b.container, port = _b.port;
|
250
|
-
containerRes = container_1;
|
251
|
-
serverShutdownRes = shutdown_1;
|
252
|
-
portRes = port;
|
253
|
-
return [3 /*break*/, 9];
|
254
|
-
case 8:
|
255
|
-
error_2 = _d.sent();
|
256
|
-
console.error("Error starting the app", error_2 === null || error_2 === void 0 ? void 0 : error_2.message);
|
257
|
-
throw error_2;
|
258
|
-
case 9:
|
259
|
-
cancelTokenSource = axios.CancelToken.source();
|
260
|
-
container = containerRes;
|
261
|
-
shutdown = function () { return __awaiter(_this, void 0, void 0, function () {
|
262
|
-
return __generator(this, function (_a) {
|
263
|
-
switch (_a.label) {
|
264
|
-
case 0: return [4 /*yield*/, serverShutdownRes()];
|
265
|
-
case 1:
|
266
|
-
_a.sent();
|
267
|
-
cancelTokenSource.cancel("Request canceled by shutdown");
|
268
|
-
return [2 /*return*/];
|
269
|
-
}
|
270
|
-
});
|
271
|
-
}); };
|
272
|
-
apiUtils = axios.create({
|
273
|
-
baseURL: "http://localhost:".concat(portRes),
|
274
|
-
cancelToken: cancelTokenSource.token,
|
275
|
-
});
|
276
|
-
return [2 /*return*/];
|
277
|
-
}
|
278
|
-
});
|
279
|
-
}); };
|
280
|
-
var beforeEach_ = function () { return __awaiter(_this, void 0, void 0, function () {
|
281
|
-
var container, copiedContainer, defaultLoader, error_3, medusaAppLoaderRunner, error_4;
|
282
|
-
return __generator(this, function (_a) {
|
283
|
-
switch (_a.label) {
|
284
|
-
case 0:
|
285
|
-
// The beforeAll already run everything, so lets not re run the loaders for the first iteration
|
286
|
-
if (isFirstTime) {
|
287
|
-
isFirstTime = false;
|
288
|
-
return [2 /*return*/];
|
289
|
-
}
|
290
|
-
container = options.getContainer();
|
291
|
-
copiedContainer = (0, utils_1.createMedusaContainer)({}, container);
|
292
|
-
if (!(process.env.MEDUSA_FF_MEDUSA_V2 != "true")) return [3 /*break*/, 4];
|
293
|
-
_a.label = 1;
|
294
|
-
case 1:
|
295
|
-
_a.trys.push([1, 3, , 4]);
|
296
|
-
defaultLoader = require("@medusajs/medusa/dist/loaders/defaults").default;
|
297
|
-
return [4 /*yield*/, defaultLoader({
|
298
|
-
container: copiedContainer,
|
299
|
-
})];
|
300
|
-
case 2:
|
301
|
-
_a.sent();
|
302
|
-
return [3 /*break*/, 4];
|
303
|
-
case 3:
|
304
|
-
error_3 = _a.sent();
|
305
|
-
console.error("Error runner medusa loaders", error_3 === null || error_3 === void 0 ? void 0 : error_3.message);
|
306
|
-
throw error_3;
|
307
|
-
case 4:
|
308
|
-
_a.trys.push([4, 6, , 7]);
|
309
|
-
medusaAppLoaderRunner = require("@medusajs/medusa/dist/loaders/medusa-app").runModulesLoader;
|
310
|
-
return [4 /*yield*/, medusaAppLoaderRunner({
|
311
|
-
container: copiedContainer,
|
312
|
-
configModule: container.resolve("configModule"),
|
313
|
-
})];
|
314
|
-
case 5:
|
315
|
-
_a.sent();
|
316
|
-
return [3 /*break*/, 7];
|
317
|
-
case 6:
|
318
|
-
error_4 = _a.sent();
|
319
|
-
console.error("Error runner modules loaders", error_4 === null || error_4 === void 0 ? void 0 : error_4.message);
|
320
|
-
throw error_4;
|
321
|
-
case 7: return [2 /*return*/];
|
322
|
-
}
|
44
|
+
let isFirstTime = true;
|
45
|
+
const beforeAll_ = async () => {
|
46
|
+
await (0, medusa_test_runner_utils_1.configLoaderOverride)(cwd, dbConfig);
|
47
|
+
(0, medusa_test_runner_utils_1.applyEnvVarsToProcess)(env);
|
48
|
+
const { logger, container, MedusaAppLoader } = await import("@medusajs/framework");
|
49
|
+
const appLoader = new MedusaAppLoader();
|
50
|
+
container.register({
|
51
|
+
[utils_1.ContainerRegistrationKeys.LOGGER]: (0, awilix_1.asValue)(logger),
|
323
52
|
});
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
53
|
+
try {
|
54
|
+
console.log(`Creating database ${dbName}`);
|
55
|
+
await dbUtils.create(dbName);
|
56
|
+
dbUtils.pgConnection_ = await (0, medusa_test_runner_utils_1.initDb)();
|
57
|
+
}
|
58
|
+
catch (error) {
|
59
|
+
console.error("Error initializing database", error?.message);
|
60
|
+
throw error;
|
61
|
+
}
|
62
|
+
console.log(`Migrating database with core migrations and links ${dbName}`);
|
63
|
+
await (0, medusa_test_runner_utils_1.migrateDatabase)(appLoader);
|
64
|
+
await (0, medusa_test_runner_utils_1.syncLinks)(appLoader, cwd, container);
|
65
|
+
await (0, medusa_test_runner_utils_1.clearInstances)();
|
66
|
+
let containerRes = container;
|
67
|
+
let serverShutdownRes;
|
68
|
+
let portRes;
|
69
|
+
loadedApplication = await appLoader.load();
|
70
|
+
try {
|
71
|
+
const { shutdown = () => void 0, container: appContainer, port, } = await (0, medusa_test_runner_utils_1.startApp)({
|
72
|
+
cwd,
|
73
|
+
env,
|
74
|
+
});
|
75
|
+
containerRes = appContainer;
|
76
|
+
serverShutdownRes = shutdown;
|
77
|
+
portRes = port;
|
78
|
+
}
|
79
|
+
catch (error) {
|
80
|
+
console.error("Error starting the app", error?.message);
|
81
|
+
throw error;
|
82
|
+
}
|
83
|
+
/**
|
84
|
+
* Run application migrations and sync links when inside
|
85
|
+
* an application
|
86
|
+
*/
|
87
|
+
if (inApp) {
|
88
|
+
console.log(`Migrating database with core migrations and links ${dbName}`);
|
89
|
+
await (0, medusa_test_runner_utils_1.migrateDatabase)(appLoader);
|
90
|
+
await (0, medusa_test_runner_utils_1.syncLinks)(appLoader, cwd, containerRes);
|
91
|
+
}
|
92
|
+
const { default: axios } = (await import("axios"));
|
93
|
+
const cancelTokenSource = axios.CancelToken.source();
|
94
|
+
globalContainer = containerRes;
|
95
|
+
shutdown = async () => {
|
96
|
+
await serverShutdownRes();
|
97
|
+
cancelTokenSource.cancel("Request canceled by shutdown");
|
98
|
+
};
|
99
|
+
apiUtils = axios.create({
|
100
|
+
baseURL: `http://localhost:${portRes}`,
|
101
|
+
cancelToken: cancelTokenSource.token,
|
341
102
|
});
|
342
|
-
}
|
343
|
-
|
103
|
+
};
|
104
|
+
const beforeEach_ = async () => {
|
105
|
+
// The beforeAll already run everything, so lets not re run the loaders for the first iteration
|
106
|
+
if (isFirstTime) {
|
107
|
+
isFirstTime = false;
|
108
|
+
return;
|
109
|
+
}
|
110
|
+
const container = options.getContainer();
|
111
|
+
const copiedContainer = (0, utils_1.createMedusaContainer)({}, container);
|
112
|
+
try {
|
113
|
+
const { MedusaAppLoader } = await import("@medusajs/framework");
|
114
|
+
const medusaAppLoader = new MedusaAppLoader({
|
115
|
+
container: copiedContainer,
|
116
|
+
});
|
117
|
+
await medusaAppLoader.runModulesLoader();
|
118
|
+
}
|
119
|
+
catch (error) {
|
120
|
+
console.error("Error runner modules loaders", error?.message);
|
121
|
+
throw error;
|
122
|
+
}
|
123
|
+
};
|
124
|
+
const afterEach_ = async () => {
|
125
|
+
try {
|
126
|
+
await dbUtils.teardown({ schema });
|
127
|
+
}
|
128
|
+
catch (error) {
|
129
|
+
console.error("Error tearing down database:", error?.message);
|
130
|
+
throw error;
|
131
|
+
}
|
132
|
+
};
|
133
|
+
return describe("", () => {
|
344
134
|
beforeAll(beforeAll_);
|
345
135
|
beforeEach(beforeEach_);
|
346
136
|
afterEach(afterEach_);
|
347
|
-
afterAll(
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
case 1:
|
352
|
-
_a.sent();
|
353
|
-
return [4 /*yield*/, shutdown()];
|
354
|
-
case 2:
|
355
|
-
_a.sent();
|
356
|
-
return [2 /*return*/];
|
357
|
-
}
|
358
|
-
});
|
359
|
-
}); });
|
137
|
+
afterAll(async () => {
|
138
|
+
await dbUtils.shutdown(dbName);
|
139
|
+
await shutdown();
|
140
|
+
});
|
360
141
|
testSuite(options);
|
361
142
|
});
|
362
143
|
}
|
363
|
-
exports.medusaIntegrationTestRunner = medusaIntegrationTestRunner;
|
364
144
|
//# sourceMappingURL=medusa-test-runner.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"medusa-test-runner.js","sourceRoot":"","sources":["../src/medusa-test-runner.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"medusa-test-runner.js","sourceRoot":"","sources":["../src/medusa-test-runner.ts"],"names":[],"mappings":"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"}
|
@@ -1,8 +1,9 @@
|
|
1
|
-
import {
|
1
|
+
import { EventBusTypes, IEventBusModuleService, Message, Subscriber } from "@medusajs/framework/types";
|
2
2
|
export default class EventBusService implements IEventBusModuleService {
|
3
|
-
emit<T>(
|
4
|
-
emit<T>(data: EmitData<T>[]): Promise<void>;
|
5
|
-
emit<T>(data: Message<T>[]): Promise<void>;
|
3
|
+
emit<T>(data: Message<T> | Message<T>[], options: Record<string, unknown>): Promise<void>;
|
6
4
|
subscribe(event: string | symbol, subscriber: Subscriber): this;
|
7
5
|
unsubscribe(event: string | symbol, subscriber: Subscriber, context?: EventBusTypes.SubscriberContext): this;
|
6
|
+
releaseGroupedEvents(eventGroupId: string): Promise<void>;
|
7
|
+
clearGroupedEvents(eventGroupId: string): Promise<void>;
|
8
8
|
}
|
9
|
+
//# sourceMappingURL=mock-event-bus-service.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mock-event-bus-service.d.ts","sourceRoot":"","sources":["../src/mock-event-bus-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,OAAO,EACP,UAAU,EACX,MAAM,2BAA2B,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,sBAAsB;IAC9D,IAAI,CAAC,CAAC,EACV,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC;IAEhB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAI/D,WAAW,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,aAAa,CAAC,iBAAiB,GACxC,IAAI;IAIP,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxD"}
|
@@ -1,57 +1,19 @@
|
|
1
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;
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
EventBusService.prototype.emit = function (eventOrData, data, options) {
|
43
|
-
if (options === void 0) { options = {}; }
|
44
|
-
return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
|
45
|
-
return [2 /*return*/];
|
46
|
-
}); });
|
47
|
-
};
|
48
|
-
EventBusService.prototype.subscribe = function (event, subscriber) {
|
3
|
+
class EventBusService {
|
4
|
+
async emit(data, options) { }
|
5
|
+
subscribe(event, subscriber) {
|
49
6
|
return this;
|
50
|
-
}
|
51
|
-
|
7
|
+
}
|
8
|
+
unsubscribe(event, subscriber, context) {
|
52
9
|
return this;
|
53
|
-
}
|
54
|
-
|
55
|
-
|
10
|
+
}
|
11
|
+
releaseGroupedEvents(eventGroupId) {
|
12
|
+
return Promise.resolve();
|
13
|
+
}
|
14
|
+
clearGroupedEvents(eventGroupId) {
|
15
|
+
return Promise.resolve();
|
16
|
+
}
|
17
|
+
}
|
56
18
|
exports.default = EventBusService;
|
57
19
|
//# sourceMappingURL=mock-event-bus-service.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mock-event-bus-service.js","sourceRoot":"","sources":["../src/mock-event-bus-service.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"mock-event-bus-service.js","sourceRoot":"","sources":["../src/mock-event-bus-service.ts"],"names":[],"mappings":";;AAOA,MAAqB,eAAe;IAClC,KAAK,CAAC,IAAI,CACR,IAA+B,EAC/B,OAAgC,IAChB,CAAC;IAEnB,SAAS,CAAC,KAAsB,EAAE,UAAsB;QACtD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,WAAW,CACT,KAAsB,EACtB,UAAsB,EACtB,OAAyC;QAEzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,oBAAoB,CAAC,YAAoB;QACvC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,kBAAkB,CAAC,YAAoB;QACrC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;CACF;AAzBD,kCAyBC"}
|