@acmekit/test-utils 2.13.1

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 (62) hide show
  1. package/dist/acmekit-test-runner-utils/bootstrap-app.d.ts +10 -0
  2. package/dist/acmekit-test-runner-utils/bootstrap-app.d.ts.map +1 -0
  3. package/dist/acmekit-test-runner-utils/bootstrap-app.js +113 -0
  4. package/dist/acmekit-test-runner-utils/bootstrap-app.js.map +1 -0
  5. package/dist/acmekit-test-runner-utils/clear-instances.d.ts +8 -0
  6. package/dist/acmekit-test-runner-utils/clear-instances.d.ts.map +1 -0
  7. package/dist/acmekit-test-runner-utils/clear-instances.js +14 -0
  8. package/dist/acmekit-test-runner-utils/clear-instances.js.map +1 -0
  9. package/dist/acmekit-test-runner-utils/config.d.ts +5 -0
  10. package/dist/acmekit-test-runner-utils/config.d.ts.map +1 -0
  11. package/dist/acmekit-test-runner-utils/config.js +37 -0
  12. package/dist/acmekit-test-runner-utils/config.js.map +1 -0
  13. package/dist/acmekit-test-runner-utils/index.d.ts +6 -0
  14. package/dist/acmekit-test-runner-utils/index.d.ts.map +1 -0
  15. package/dist/acmekit-test-runner-utils/index.js +22 -0
  16. package/dist/acmekit-test-runner-utils/index.js.map +1 -0
  17. package/dist/acmekit-test-runner-utils/use-db.d.ts +15 -0
  18. package/dist/acmekit-test-runner-utils/use-db.d.ts.map +1 -0
  19. package/dist/acmekit-test-runner-utils/use-db.js +55 -0
  20. package/dist/acmekit-test-runner-utils/use-db.js.map +1 -0
  21. package/dist/acmekit-test-runner-utils/utils.d.ts +10 -0
  22. package/dist/acmekit-test-runner-utils/utils.d.ts.map +1 -0
  23. package/dist/acmekit-test-runner-utils/utils.js +25 -0
  24. package/dist/acmekit-test-runner-utils/utils.js.map +1 -0
  25. package/dist/acmekit-test-runner-utils/wait-workflow-executions.d.ts +9 -0
  26. package/dist/acmekit-test-runner-utils/wait-workflow-executions.d.ts.map +1 -0
  27. package/dist/acmekit-test-runner-utils/wait-workflow-executions.js +34 -0
  28. package/dist/acmekit-test-runner-utils/wait-workflow-executions.js.map +1 -0
  29. package/dist/acmekit-test-runner.d.ts +52 -0
  30. package/dist/acmekit-test-runner.d.ts.map +1 -0
  31. package/dist/acmekit-test-runner.js +272 -0
  32. package/dist/acmekit-test-runner.js.map +1 -0
  33. package/dist/database.d.ts +29 -0
  34. package/dist/database.d.ts.map +1 -0
  35. package/dist/database.js +245 -0
  36. package/dist/database.js.map +1 -0
  37. package/dist/events.d.ts +17 -0
  38. package/dist/events.d.ts.map +1 -0
  39. package/dist/events.js +161 -0
  40. package/dist/events.js.map +1 -0
  41. package/dist/index.d.ts +9 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +52 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/init-modules.d.ts +19 -0
  46. package/dist/init-modules.d.ts.map +1 -0
  47. package/dist/init-modules.js +47 -0
  48. package/dist/init-modules.js.map +1 -0
  49. package/dist/jest.d.ts +2 -0
  50. package/dist/jest.d.ts.map +1 -0
  51. package/dist/jest.js +24 -0
  52. package/dist/jest.js.map +1 -0
  53. package/dist/mock-event-bus-service.d.ts +9 -0
  54. package/dist/mock-event-bus-service.d.ts.map +1 -0
  55. package/dist/mock-event-bus-service.js +19 -0
  56. package/dist/mock-event-bus-service.js.map +1 -0
  57. package/dist/module-test-runner.d.ts +44 -0
  58. package/dist/module-test-runner.d.ts.map +1 -0
  59. package/dist/module-test-runner.js +297 -0
  60. package/dist/module-test-runner.js.map +1 -0
  61. package/dist/tsconfig.tsbuildinfo +1 -0
  62. package/package.json +52 -0
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.acmekitIntegrationTestRunner = acmekitIntegrationTestRunner;
4
+ const awilix_1 = require("@acmekit/framework/awilix");
5
+ const logger_1 = require("@acmekit/framework/logger");
6
+ const migrations_1 = require("@acmekit/framework/migrations");
7
+ const utils_1 = require("@acmekit/framework/utils");
8
+ const database_1 = require("./database");
9
+ const acmekit_test_runner_utils_1 = require("./acmekit-test-runner-utils");
10
+ const wait_workflow_executions_1 = require("./acmekit-test-runner-utils/wait-workflow-executions");
11
+ const ulid_1 = require("ulid");
12
+ const core_flows_1 = require("@acmekit/core-flows");
13
+ class AcmeKitTestRunner {
14
+ constructor(config) {
15
+ this.globalContainer = null;
16
+ this.apiUtils = null;
17
+ this.loadedApplication = null;
18
+ this.shutdown = async () => void 0;
19
+ this.isFirstTime = true;
20
+ this.hooks = {};
21
+ const tempName = parseInt(process.env.JEST_WORKER_ID || "1");
22
+ const moduleName = config.moduleName ?? (0, ulid_1.ulid)();
23
+ this.dbName =
24
+ config.dbName ??
25
+ `acmekit-${moduleName.toLowerCase()}-integration-${tempName}`;
26
+ this.schema = config.schema ?? "public";
27
+ this.cwd = config.cwd ?? config.acmekitConfigFile ?? process.cwd();
28
+ this.modulesConfigPath = config.acmekitConfigFile ?? this.cwd;
29
+ this.env = config.env ?? {};
30
+ this.debug = config.debug ?? false;
31
+ this.inApp = config.inApp ?? false;
32
+ this.disableAutoTeardown = config?.disableAutoTeardown ?? false;
33
+ this.dbUtils = (0, database_1.dbTestUtilFactory)();
34
+ this.dbConfig = {
35
+ dbName: this.dbName,
36
+ clientUrl: (0, database_1.getDatabaseURL)(this.dbName),
37
+ schema: this.schema,
38
+ debug: this.debug,
39
+ };
40
+ this.hooks = config.hooks ?? {};
41
+ this.setupProcessHandlers();
42
+ }
43
+ setupProcessHandlers() {
44
+ process.on("SIGTERM", async () => {
45
+ await this.cleanup();
46
+ process.exit(0);
47
+ });
48
+ process.on("SIGINT", async () => {
49
+ await this.cleanup();
50
+ process.exit(0);
51
+ });
52
+ }
53
+ createApiProxy() {
54
+ return new Proxy({}, {
55
+ get: (target, prop) => {
56
+ return this.apiUtils?.[prop];
57
+ },
58
+ });
59
+ }
60
+ createDbConnectionProxy() {
61
+ return new Proxy({}, {
62
+ get: (target, prop) => {
63
+ return this.dbUtils.pgConnection_?.[prop];
64
+ },
65
+ });
66
+ }
67
+ async initializeDatabase() {
68
+ try {
69
+ logger_1.logger.info(`Creating database ${this.dbName}`);
70
+ await this.dbUtils.create(this.dbName);
71
+ this.dbUtils.pgConnection_ = await (0, acmekit_test_runner_utils_1.initDb)();
72
+ }
73
+ catch (error) {
74
+ logger_1.logger.error(`Error initializing database: ${error?.message}`);
75
+ await this.cleanup();
76
+ throw error;
77
+ }
78
+ }
79
+ async setupApplication() {
80
+ const { container, AcmeKitAppLoader } = await import("@acmekit/framework");
81
+ const appLoader = new AcmeKitAppLoader({
82
+ acmekitConfigPath: this.modulesConfigPath,
83
+ cwd: this.cwd,
84
+ });
85
+ // Load plugins modules
86
+ const configModule = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
87
+ const plugins = await (0, utils_1.getResolvedPlugins)(this.cwd, configModule);
88
+ (0, utils_1.mergePluginModules)(configModule, plugins);
89
+ container.register({
90
+ [utils_1.ContainerRegistrationKeys.LOGGER]: (0, awilix_1.asValue)(logger_1.logger),
91
+ });
92
+ if (this.hooks?.beforeServerStart) {
93
+ await this.hooks.beforeServerStart(container);
94
+ }
95
+ await this.initializeDatabase();
96
+ const migrator = new migrations_1.Migrator({ container });
97
+ await migrator.ensureMigrationsTable();
98
+ logger_1.logger.info(`Migrating database with core migrations and links ${this.dbName}`);
99
+ await (0, acmekit_test_runner_utils_1.migrateDatabase)(appLoader);
100
+ await (0, acmekit_test_runner_utils_1.syncLinks)(appLoader, this.modulesConfigPath, container, logger_1.logger);
101
+ await (0, acmekit_test_runner_utils_1.clearInstances)();
102
+ this.loadedApplication = await appLoader.load();
103
+ try {
104
+ const { shutdown, container: appContainer, port, } = await (0, acmekit_test_runner_utils_1.startApp)({
105
+ cwd: this.modulesConfigPath,
106
+ env: this.env,
107
+ });
108
+ this.globalContainer = appContainer;
109
+ this.shutdown = async () => {
110
+ await shutdown();
111
+ if (this.apiUtils?.cancelToken?.source) {
112
+ this.apiUtils.cancelToken.source.cancel("Request canceled by shutdown");
113
+ }
114
+ };
115
+ const { default: axios } = (await import("axios"));
116
+ const cancelTokenSource = axios.CancelToken.source();
117
+ this.apiUtils = axios.create({
118
+ baseURL: `http://localhost:${port}`,
119
+ cancelToken: cancelTokenSource.token,
120
+ });
121
+ this.apiUtils.cancelToken = { source: cancelTokenSource };
122
+ }
123
+ catch (error) {
124
+ logger_1.logger.error(`Error starting the app: ${error?.message}`);
125
+ await this.cleanup();
126
+ throw error;
127
+ }
128
+ }
129
+ async cleanup() {
130
+ try {
131
+ process.removeAllListeners("SIGTERM");
132
+ process.removeAllListeners("SIGINT");
133
+ await this.dbUtils.shutdown(this.dbName);
134
+ await this.shutdown();
135
+ await (0, acmekit_test_runner_utils_1.clearInstances)();
136
+ if (this.apiUtils?.cancelToken?.source) {
137
+ this.apiUtils.cancelToken.source.cancel("Cleanup");
138
+ }
139
+ if (this.globalContainer?.dispose) {
140
+ await this.globalContainer.dispose();
141
+ }
142
+ this.apiUtils = null;
143
+ this.loadedApplication = null;
144
+ this.globalContainer = null;
145
+ if (global.gc) {
146
+ global.gc();
147
+ }
148
+ }
149
+ catch (error) {
150
+ logger_1.logger.error("Error during cleanup:", error?.message);
151
+ }
152
+ }
153
+ async beforeAll() {
154
+ try {
155
+ this.setupProcessHandlers();
156
+ await (0, acmekit_test_runner_utils_1.configLoaderOverride)(this.cwd, this.dbConfig);
157
+ (0, acmekit_test_runner_utils_1.applyEnvVarsToProcess)(this.env);
158
+ await this.setupApplication();
159
+ }
160
+ catch (error) {
161
+ await this.cleanup();
162
+ throw error;
163
+ }
164
+ }
165
+ async beforeEach() {
166
+ if (this.isFirstTime) {
167
+ this.isFirstTime = false;
168
+ return;
169
+ }
170
+ await this.afterEach();
171
+ const container = this.globalContainer;
172
+ const copiedContainer = (0, utils_1.createAcmeKitContainer)({}, container);
173
+ try {
174
+ const { AcmeKitAppLoader } = await import("@acmekit/framework");
175
+ const acmekitAppLoader = new AcmeKitAppLoader({
176
+ container: copiedContainer,
177
+ acmekitConfigPath: this.modulesConfigPath,
178
+ cwd: this.cwd,
179
+ });
180
+ await acmekitAppLoader.runModulesLoader();
181
+ await (0, core_flows_1.createDefaultsWorkflow)(copiedContainer).run();
182
+ }
183
+ catch (error) {
184
+ await copiedContainer.dispose?.();
185
+ logger_1.logger.error("Error running modules loaders:", error?.message);
186
+ throw error;
187
+ }
188
+ }
189
+ async afterEach() {
190
+ try {
191
+ await (0, wait_workflow_executions_1.waitWorkflowExecutions)(this.globalContainer);
192
+ if (!this.disableAutoTeardown) {
193
+ // Perform automatic teardown
194
+ await this.dbUtils.teardown({ schema: this.schema });
195
+ }
196
+ }
197
+ catch (error) {
198
+ logger_1.logger.error("Error tearing down database:", error?.message);
199
+ throw error;
200
+ }
201
+ }
202
+ getOptions() {
203
+ return {
204
+ api: this.createApiProxy(),
205
+ dbConnection: this.createDbConnectionProxy(),
206
+ getAcmeKitApp: () => this.loadedApplication,
207
+ getContainer: () => this.globalContainer,
208
+ dbConfig: {
209
+ dbName: this.dbName,
210
+ schema: this.schema,
211
+ clientUrl: this.dbConfig.clientUrl,
212
+ },
213
+ dbUtils: this.dbUtils,
214
+ utils: {
215
+ waitWorkflowExecutions: () => (0, wait_workflow_executions_1.waitWorkflowExecutions)(this.globalContainer),
216
+ },
217
+ };
218
+ }
219
+ }
220
+ function acmekitIntegrationTestRunner({ moduleName, dbName, acmekitConfigFile, schema = "public", env = {}, debug = false, inApp = false, testSuite, hooks, cwd, disableAutoTeardown, }) {
221
+ const runner = new AcmeKitTestRunner({
222
+ moduleName,
223
+ dbName,
224
+ acmekitConfigFile,
225
+ schema,
226
+ env,
227
+ debug,
228
+ inApp,
229
+ hooks,
230
+ cwd,
231
+ disableAutoTeardown,
232
+ });
233
+ return describe("", () => {
234
+ let testOptions;
235
+ beforeAll(async () => {
236
+ await runner.beforeAll();
237
+ testOptions = runner.getOptions();
238
+ });
239
+ beforeEach(async () => {
240
+ await runner.beforeEach();
241
+ });
242
+ afterEach(async () => {
243
+ await runner.afterEach();
244
+ });
245
+ afterAll(async () => {
246
+ // Run main cleanup
247
+ await runner.cleanup();
248
+ // Clean references to the test options
249
+ for (const key in testOptions) {
250
+ if (typeof testOptions[key] === "function") {
251
+ testOptions[key] = null;
252
+ }
253
+ else if (typeof testOptions[key] === "object" &&
254
+ testOptions[key] !== null) {
255
+ Object.keys(testOptions[key]).forEach((k) => {
256
+ testOptions[key][k] = null;
257
+ });
258
+ testOptions[key] = null;
259
+ }
260
+ }
261
+ // Encourage garbage collection
262
+ // @ts-ignore
263
+ testOptions = null;
264
+ if (global.gc) {
265
+ global.gc();
266
+ }
267
+ });
268
+ // Run test suite with options
269
+ testSuite(runner.getOptions());
270
+ });
271
+ }
272
+ //# sourceMappingURL=acmekit-test-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acmekit-test-runner.js","sourceRoot":"","sources":["../src/acmekit-test-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { MikroORM, Options, SqlEntityManager } from "@acmekit/framework/mikro-orm/postgresql";
2
+ export declare function getDatabaseURL(dbName?: string): string;
3
+ export declare function getMikroOrmConfig({ mikroOrmEntities, pathToMigrations, clientUrl, schema, }: {
4
+ mikroOrmEntities: any[];
5
+ pathToMigrations?: string;
6
+ clientUrl?: string;
7
+ schema?: string;
8
+ }): Options;
9
+ export interface TestDatabase {
10
+ mikroOrmEntities: any[];
11
+ pathToMigrations?: string;
12
+ schema?: string;
13
+ clientUrl?: string;
14
+ orm: MikroORM | null;
15
+ manager: SqlEntityManager | null;
16
+ setupDatabase(): Promise<void>;
17
+ clearDatabase(): Promise<void>;
18
+ getManager(): SqlEntityManager;
19
+ forkManager(): SqlEntityManager;
20
+ getOrm(): MikroORM;
21
+ }
22
+ export declare function getMikroOrmWrapper({ mikroOrmEntities, pathToMigrations, clientUrl, schema, }: {
23
+ mikroOrmEntities: any[];
24
+ pathToMigrations?: string;
25
+ clientUrl?: string;
26
+ schema?: string;
27
+ }): TestDatabase;
28
+ export declare const dbTestUtilFactory: () => any;
29
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,QAAQ,EACR,OAAO,EACP,gBAAgB,EACjB,MAAM,yCAAyC,CAAA;AAgBhD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAUtD;AAED,wBAAgB,iBAAiB,CAAC,EAChC,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,MAAM,GACP,EAAE;IACD,gBAAgB,EAAE,GAAG,EAAE,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,OAAO,CAiBV;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,GAAG,EAAE,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAEhC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,UAAU,IAAI,gBAAgB,CAAA;IAC9B,WAAW,IAAI,gBAAgB,CAAA;IAC/B,MAAM,IAAI,QAAQ,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,MAAM,GACP,EAAE;IACD,gBAAgB,EAAE,GAAG,EAAE,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,YAAY,CAiHf;AAED,eAAO,MAAM,iBAAiB,QAAO,GA0InC,CAAA"}
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dbTestUtilFactory = void 0;
4
+ exports.getDatabaseURL = getDatabaseURL;
5
+ exports.getMikroOrmConfig = getMikroOrmConfig;
6
+ exports.getMikroOrmWrapper = getMikroOrmWrapper;
7
+ const logger_1 = require("@acmekit/framework/logger");
8
+ const utils_1 = require("@acmekit/framework/utils");
9
+ const postgresql_1 = require("@acmekit/framework/mikro-orm/postgresql");
10
+ const pg_god_1 = require("pg-god");
11
+ const acmekit_test_runner_utils_1 = require("./acmekit-test-runner-utils");
12
+ const DB_HOST = process.env.DB_HOST ?? "localhost";
13
+ const DB_USERNAME = process.env.DB_USERNAME ?? "";
14
+ const DB_PASSWORD = process.env.DB_PASSWORD ?? "";
15
+ const DB_PORT = process.env.DB_PORT ?? "5432";
16
+ const pgGodCredentials = {
17
+ user: DB_USERNAME,
18
+ password: DB_PASSWORD,
19
+ host: DB_HOST,
20
+ port: parseInt(DB_PORT),
21
+ };
22
+ function getDatabaseURL(dbName) {
23
+ const DB_HOST = process.env.DB_HOST ?? "localhost";
24
+ const DB_USERNAME = process.env.DB_USERNAME ?? "postgres";
25
+ const DB_PASSWORD = process.env.DB_PASSWORD ?? "";
26
+ const DB_PORT = process.env.DB_PORT ?? "5432";
27
+ const DB_NAME = dbName ?? process.env.DB_TEMP_NAME;
28
+ return `postgres://${DB_USERNAME}${DB_PASSWORD ? `:${DB_PASSWORD}` : ""}@${DB_HOST}:${DB_PORT}/${DB_NAME}`;
29
+ }
30
+ function getMikroOrmConfig({ mikroOrmEntities, pathToMigrations, clientUrl, schema, }) {
31
+ const DB_URL = clientUrl ?? getDatabaseURL();
32
+ return (0, postgresql_1.defineConfig)({
33
+ clientUrl: DB_URL,
34
+ entities: Object.values(mikroOrmEntities),
35
+ schema: schema ?? process.env.MEDUSA_DB_SCHEMA,
36
+ debug: false,
37
+ pool: {
38
+ min: 2,
39
+ },
40
+ migrations: {
41
+ pathTs: pathToMigrations,
42
+ silent: true,
43
+ },
44
+ extensions: [utils_1.CustomDBMigrator],
45
+ });
46
+ }
47
+ function getMikroOrmWrapper({ mikroOrmEntities, pathToMigrations, clientUrl, schema, }) {
48
+ return {
49
+ mikroOrmEntities,
50
+ pathToMigrations,
51
+ clientUrl: clientUrl ?? getDatabaseURL(),
52
+ schema: schema ?? process.env.MEDUSA_DB_SCHEMA,
53
+ orm: null,
54
+ manager: null,
55
+ getManager() {
56
+ if (this.manager === null) {
57
+ throw new Error("manager entity not available");
58
+ }
59
+ return this.manager;
60
+ },
61
+ forkManager() {
62
+ if (this.manager === null) {
63
+ throw new Error("manager entity not available");
64
+ }
65
+ return this.manager.fork();
66
+ },
67
+ getOrm() {
68
+ if (this.orm === null) {
69
+ throw new Error("orm entity not available");
70
+ }
71
+ return this.orm;
72
+ },
73
+ async setupDatabase() {
74
+ const OrmConfig = getMikroOrmConfig({
75
+ mikroOrmEntities: this.mikroOrmEntities,
76
+ pathToMigrations: this.pathToMigrations,
77
+ clientUrl: this.clientUrl,
78
+ schema: this.schema,
79
+ });
80
+ try {
81
+ this.orm = await postgresql_1.MikroORM.init(OrmConfig);
82
+ this.manager = this.orm.em;
83
+ try {
84
+ await this.orm.getSchemaGenerator().ensureDatabase();
85
+ }
86
+ catch (err) {
87
+ logger_1.logger.error("Error ensuring database:", err);
88
+ throw err;
89
+ }
90
+ await this.manager?.execute(`CREATE SCHEMA IF NOT EXISTS "${this.schema ?? "public"}";`);
91
+ const pendingMigrations = await this.orm
92
+ .getMigrator()
93
+ .getPendingMigrations();
94
+ if (pendingMigrations && pendingMigrations.length > 0) {
95
+ await this.orm
96
+ .getMigrator()
97
+ .up({ migrations: pendingMigrations.map((m) => m.name) });
98
+ }
99
+ else {
100
+ await this.orm.schema.refreshDatabase();
101
+ }
102
+ }
103
+ catch (error) {
104
+ if (this.orm) {
105
+ try {
106
+ await this.orm.close();
107
+ }
108
+ catch (closeError) {
109
+ logger_1.logger.error("Error closing ORM:", closeError);
110
+ }
111
+ }
112
+ this.orm = null;
113
+ this.manager = null;
114
+ throw error;
115
+ }
116
+ },
117
+ async clearDatabase() {
118
+ if (this.orm === null) {
119
+ throw new Error("ORM not configured");
120
+ }
121
+ try {
122
+ await this.manager?.execute(`DROP SCHEMA IF EXISTS "${this.schema ?? "public"}" CASCADE;`);
123
+ await this.manager?.execute(`CREATE SCHEMA IF NOT EXISTS "${this.schema ?? "public"}";`);
124
+ const closePromise = this.orm.close();
125
+ await (0, acmekit_test_runner_utils_1.execOrTimeout)(closePromise);
126
+ }
127
+ catch (error) {
128
+ logger_1.logger.error("Error clearing database:", error);
129
+ try {
130
+ await this.orm?.close();
131
+ }
132
+ catch (closeError) {
133
+ logger_1.logger.error("Error during forced ORM close:", closeError);
134
+ }
135
+ throw error;
136
+ }
137
+ finally {
138
+ this.orm = null;
139
+ this.manager = null;
140
+ }
141
+ },
142
+ };
143
+ }
144
+ const dbTestUtilFactory = () => ({
145
+ pgConnection_: null,
146
+ create: async function (dbName) {
147
+ try {
148
+ await (0, pg_god_1.createDatabase)({ databaseName: dbName, errorIfExist: false }, pgGodCredentials);
149
+ }
150
+ catch (error) {
151
+ logger_1.logger.error("Error creating database:", error);
152
+ throw error;
153
+ }
154
+ },
155
+ teardown: async function ({ schema } = {}) {
156
+ if (!this.pgConnection_) {
157
+ return;
158
+ }
159
+ try {
160
+ const runRawQuery = this.pgConnection_.raw.bind(this.pgConnection_);
161
+ schema ??= "public";
162
+ const { rows: tableNames } = await runRawQuery(`SELECT table_name
163
+ FROM information_schema.tables
164
+ WHERE table_schema = '${schema}';`);
165
+ const skipIndexPartitionPrefix = "cat_";
166
+ const mainPartitionTables = ["index_data", "index_relation"];
167
+ let hasIndexTables = false;
168
+ const tablesToTruncate = [];
169
+ const allTablesToVerify = [];
170
+ for (const { table_name } of tableNames) {
171
+ if (mainPartitionTables.includes(table_name)) {
172
+ hasIndexTables = true;
173
+ }
174
+ if (table_name.startsWith(skipIndexPartitionPrefix) ||
175
+ mainPartitionTables.includes(table_name)) {
176
+ allTablesToVerify.push(table_name);
177
+ continue;
178
+ }
179
+ tablesToTruncate.push(`${schema}."${table_name}"`);
180
+ allTablesToVerify.push(table_name);
181
+ }
182
+ const allTablesToTruncase = [
183
+ ...tablesToTruncate,
184
+ ...(hasIndexTables ? mainPartitionTables : []),
185
+ ].join(", ");
186
+ if (allTablesToTruncase) {
187
+ await runRawQuery(`TRUNCATE ${allTablesToTruncase};`);
188
+ }
189
+ const verifyEmpty = async (maxRetries = 5) => {
190
+ for (let retry = 0; retry < maxRetries; retry++) {
191
+ const countQueries = allTablesToVerify.map((tableName) => `SELECT '${tableName}' as table_name, COUNT(*) as count FROM ${schema}."${tableName}"`);
192
+ const { rows: counts } = await runRawQuery(countQueries.join(" UNION ALL "));
193
+ const nonEmptyTables = counts.filter((row) => parseInt(row.count) > 0);
194
+ if (nonEmptyTables.length === 0) {
195
+ return true;
196
+ }
197
+ if (retry < maxRetries - 1) {
198
+ await new Promise((resolve) => setTimeout(resolve, 100));
199
+ }
200
+ else {
201
+ const tableList = nonEmptyTables
202
+ .map((t) => `${t.table_name}(${t.count})`)
203
+ .join(", ");
204
+ logger_1.logger.warn(`Some tables still contain data after truncate: ${tableList}`);
205
+ }
206
+ }
207
+ return false;
208
+ };
209
+ await verifyEmpty();
210
+ }
211
+ catch (error) {
212
+ logger_1.logger.error("Error during database teardown:", error);
213
+ throw error;
214
+ }
215
+ },
216
+ shutdown: async function (dbName) {
217
+ try {
218
+ const cleanupPromises = [];
219
+ if (this.pgConnection_?.context) {
220
+ cleanupPromises.push((0, acmekit_test_runner_utils_1.execOrTimeout)(this.pgConnection_.context.destroy()));
221
+ }
222
+ if (this.pgConnection_) {
223
+ cleanupPromises.push((0, acmekit_test_runner_utils_1.execOrTimeout)(this.pgConnection_.destroy()));
224
+ }
225
+ await Promise.all(cleanupPromises);
226
+ return await (0, pg_god_1.dropDatabase)({ databaseName: dbName, errorIfNonExist: false }, pgGodCredentials);
227
+ }
228
+ catch (error) {
229
+ logger_1.logger.error("Error during database shutdown:", error);
230
+ try {
231
+ await this.pgConnection_?.context?.destroy();
232
+ await this.pgConnection_?.destroy();
233
+ }
234
+ catch (cleanupError) {
235
+ logger_1.logger.error("Error during forced cleanup:", cleanupError);
236
+ }
237
+ throw error;
238
+ }
239
+ finally {
240
+ this.pgConnection_ = null;
241
+ }
242
+ },
243
+ });
244
+ exports.dbTestUtilFactory = dbTestUtilFactory;
245
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ type WaitSubscribersExecutionOptions = {
2
+ /** Timeout in milliseconds for waiting for the event. Defaults to 15000ms. */
3
+ timeout?: number;
4
+ /** Number of times the event should be triggered before resolving. Defaults to 1. */
5
+ triggerCount?: number;
6
+ };
7
+ /**
8
+ * Allows you to wait for all subscribers to execute for a given event.
9
+ * It ensures that concurrent waits for the same event are queued and executed sequentially.
10
+ *
11
+ * @param eventName - The name of the event to wait for.
12
+ * @param eventBus - The event bus instance.
13
+ * @param options - Options including timeout and triggerCount.
14
+ */
15
+ export declare const waitSubscribersExecution: (eventName: string | symbol, eventBus: any, options?: WaitSubscribersExecutionOptions) => Promise<any>;
16
+ export {};
17
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAMA,KAAK,+BAA+B,GAAG;IACrC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAyJD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GACnC,WAAW,MAAM,GAAG,MAAM,EAC1B,UAAU,GAAG,EACb,UAAU,+BAA+B,KACxC,OAAO,CAAC,GAAG,CAoCb,CAAA"}