@atom8n/backend-test-utils 1.2.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.
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBootstrapDBOptions = exports.testDbPrefix = void 0;
4
+ exports.init = init;
5
+ exports.isReady = isReady;
6
+ exports.terminate = terminate;
7
+ exports.truncate = truncate;
8
+ const config_1 = require("@n8n/config");
9
+ const db_1 = require("@n8n/db");
10
+ const di_1 = require("@n8n/di");
11
+ const typeorm_1 = require("@n8n/typeorm");
12
+ const n8n_workflow_1 = require("n8n-workflow");
13
+ exports.testDbPrefix = 'n8n_test_';
14
+ let isInitialized = false;
15
+ const getBootstrapDBOptions = (dbType) => {
16
+ const globalConfig = di_1.Container.get(config_1.GlobalConfig);
17
+ const type = dbType === 'postgresdb' ? 'postgres' : 'mysql';
18
+ return {
19
+ type,
20
+ ...di_1.Container.get(db_1.DbConnectionOptions).getOverrides(dbType),
21
+ database: type,
22
+ entityPrefix: globalConfig.database.tablePrefix,
23
+ schema: dbType === 'postgresdb' ? globalConfig.database.postgresdb.schema : undefined,
24
+ };
25
+ };
26
+ exports.getBootstrapDBOptions = getBootstrapDBOptions;
27
+ async function init() {
28
+ if (isInitialized)
29
+ return;
30
+ const globalConfig = di_1.Container.get(config_1.GlobalConfig);
31
+ const dbType = globalConfig.database.type;
32
+ const testDbName = `${exports.testDbPrefix}${(0, n8n_workflow_1.randomString)(6, 10).toLowerCase()}_${Date.now()}`;
33
+ if (dbType === 'postgresdb') {
34
+ const bootstrapPostgres = await new typeorm_1.DataSource((0, exports.getBootstrapDBOptions)('postgresdb')).initialize();
35
+ await bootstrapPostgres.query(`CREATE DATABASE ${testDbName}`);
36
+ await bootstrapPostgres.destroy();
37
+ globalConfig.database.postgresdb.database = testDbName;
38
+ }
39
+ else if (dbType === 'mysqldb' || dbType === 'mariadb') {
40
+ const bootstrapMysql = await new typeorm_1.DataSource((0, exports.getBootstrapDBOptions)('mysqldb')).initialize();
41
+ await bootstrapMysql.query(`CREATE DATABASE ${testDbName} DEFAULT CHARACTER SET utf8mb4`);
42
+ await bootstrapMysql.destroy();
43
+ globalConfig.database.mysqldb.database = testDbName;
44
+ }
45
+ const dbConnection = di_1.Container.get(db_1.DbConnection);
46
+ await dbConnection.init();
47
+ await dbConnection.migrate();
48
+ await di_1.Container.get(db_1.AuthRolesService).init();
49
+ isInitialized = true;
50
+ }
51
+ function isReady() {
52
+ const { connectionState } = di_1.Container.get(db_1.DbConnection);
53
+ return connectionState.connected && connectionState.migrated;
54
+ }
55
+ async function terminate() {
56
+ const dbConnection = di_1.Container.get(db_1.DbConnection);
57
+ await dbConnection.close();
58
+ dbConnection.connectionState.connected = false;
59
+ isInitialized = false;
60
+ }
61
+ async function truncate(entities) {
62
+ const connection = di_1.Container.get(typeorm_1.DataSource);
63
+ const dbType = connection.options.type;
64
+ if (dbType === 'mysql' || dbType === 'mariadb') {
65
+ await connection.query('SET FOREIGN_KEY_CHECKS=0');
66
+ }
67
+ try {
68
+ const junctionTablesToClean = new Set();
69
+ for (const name of entities) {
70
+ try {
71
+ const metadata = connection.getMetadata(name);
72
+ for (const relation of metadata.manyToManyRelations) {
73
+ if (relation.junctionEntityMetadata) {
74
+ const junctionTableName = relation.junctionEntityMetadata.tablePath;
75
+ junctionTablesToClean.add(junctionTableName);
76
+ }
77
+ }
78
+ }
79
+ catch (error) {
80
+ }
81
+ }
82
+ for (const tableName of junctionTablesToClean) {
83
+ await connection.query(`DELETE FROM ${tableName}`);
84
+ }
85
+ for (const name of entities) {
86
+ await connection.getRepository(name).delete({});
87
+ }
88
+ }
89
+ finally {
90
+ if (dbType === 'mysql' || dbType === 'mariadb') {
91
+ await connection.query('SET FOREIGN_KEY_CHECKS=1');
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=test-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-db.js","sourceRoot":"","sources":["../src/test-db.ts"],"names":[],"mappings":";;;AA6BA,oBA8BC;AAED,0BAGC;AAKD,8BAKC;AAuBD,4BA0CC;AA3ID,wCAA2C;AAE3C,gCAA8E;AAC9E,gCAAoC;AAEpC,0CAAwD;AACxD,+CAA4C;AAE/B,QAAA,YAAY,GAAG,WAAW,CAAC;AACxC,IAAI,aAAa,GAAG,KAAK,CAAC;AAKnB,MAAM,qBAAqB,GAAG,CAAC,MAAgC,EAAqB,EAAE;IAC5F,MAAM,YAAY,GAAG,cAAS,CAAC,GAAG,CAAC,qBAAY,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,OAAO;QACN,IAAI;QACJ,GAAG,cAAS,CAAC,GAAG,CAAC,wBAAmB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;QAC1D,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW;QAC/C,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KACrF,CAAC;AACH,CAAC,CAAC;AAVW,QAAA,qBAAqB,yBAUhC;AAKK,KAAK,UAAU,IAAI;IACzB,IAAI,aAAa;QAAE,OAAO;IAE1B,MAAM,YAAY,GAAG,cAAS,CAAC,GAAG,CAAC,qBAAY,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1C,MAAM,UAAU,GAAG,GAAG,oBAAY,GAAG,IAAA,2BAAY,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAEvF,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,iBAAiB,GAAG,MAAM,IAAI,oBAAU,CAC7C,IAAA,6BAAqB,EAAC,YAAY,CAAC,CACnC,CAAC,UAAU,EAAE,CAAC;QACf,MAAM,iBAAiB,CAAC,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;QAC/D,MAAM,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAElC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC;IACxD,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,cAAc,GAAG,MAAM,IAAI,oBAAU,CAAC,IAAA,6BAAqB,EAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAC3F,MAAM,cAAc,CAAC,KAAK,CAAC,mBAAmB,UAAU,gCAAgC,CAAC,CAAC;QAC1F,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;QAE/B,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC;IACrD,CAAC;IAED,MAAM,YAAY,GAAG,cAAS,CAAC,GAAG,CAAC,iBAAY,CAAC,CAAC;IACjD,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;IAE7B,MAAM,cAAS,CAAC,GAAG,CAAC,qBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;IAE7C,aAAa,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,SAAgB,OAAO;IACtB,MAAM,EAAE,eAAe,EAAE,GAAG,cAAS,CAAC,GAAG,CAAC,iBAAY,CAAC,CAAC;IACxD,OAAO,eAAe,CAAC,SAAS,IAAI,eAAe,CAAC,QAAQ,CAAC;AAC9D,CAAC;AAKM,KAAK,UAAU,SAAS;IAC9B,MAAM,YAAY,GAAG,cAAS,CAAC,GAAG,CAAC,iBAAY,CAAC,CAAC;IACjD,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC3B,YAAY,CAAC,eAAe,CAAC,SAAS,GAAG,KAAK,CAAC;IAC/C,aAAa,GAAG,KAAK,CAAC;AACvB,CAAC;AAuBM,KAAK,UAAU,QAAQ,CAAC,QAAsB;IACpD,MAAM,UAAU,GAAG,cAAS,CAAC,GAAG,CAAC,oBAAU,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;IAGvC,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC;QAEJ,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAC;QAGhD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9C,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;oBACrD,IAAI,QAAQ,CAAC,sBAAsB,EAAE,CAAC;wBACrC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,sBAAsB,CAAC,SAAS,CAAC;wBACpE,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;oBAC9C,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;YAEjB,CAAC;QACF,CAAC;QAGD,KAAK,MAAM,SAAS,IAAI,qBAAqB,EAAE,CAAC;YAC/C,MAAM,UAAU,CAAC,KAAK,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;YAAS,CAAC;QAEV,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChD,MAAM,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ModuleName } from '@n8n/backend-common';
2
+ export declare function loadModules(moduleNames: ModuleName[]): Promise<void>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadModules = loadModules;
4
+ const backend_common_1 = require("@n8n/backend-common");
5
+ const di_1 = require("@n8n/di");
6
+ async function loadModules(moduleNames) {
7
+ await di_1.Container.get(backend_common_1.ModuleRegistry).loadModules(moduleNames);
8
+ }
9
+ //# sourceMappingURL=test-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-modules.js","sourceRoot":"","sources":["../src/test-modules.ts"],"names":[],"mappings":";;AAIA,kCAEC;AAND,wDAAqD;AAErD,gCAAoC;AAE7B,KAAK,UAAU,WAAW,CAAC,WAAyB;IAC1D,MAAM,cAAS,CAAC,GAAG,CAAC,+BAAc,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AAC9D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@atom8n/backend-test-utils",
3
+ "version": "1.2.0",
4
+ "scripts": {
5
+ "clean": "rimraf dist .turbo",
6
+ "dev": "pnpm watch",
7
+ "typecheck": "tsc --noEmit",
8
+ "build": "tsc -p tsconfig.build.json",
9
+ "format": "biome format --write .",
10
+ "format:check": "biome ci .",
11
+ "lint": "eslint . --quiet",
12
+ "lint:fix": "eslint . --fix",
13
+ "watch": "tsc -p tsconfig.build.json --watch",
14
+ "test": "echo \"WARNING: no test specified\" && exit 0",
15
+ "test:dev": "echo \"WARNING: no test specified\" && exit 0"
16
+ },
17
+ "main": "dist/index.js",
18
+ "module": "src/index.ts",
19
+ "types": "dist/index.d.ts",
20
+ "files": [
21
+ "dist/**/*"
22
+ ],
23
+ "dependencies": {
24
+ "@atom8n/backend-common": "1.2.0",
25
+ "@atom8n/config": "2.1.0",
26
+ "@atom8n/constants": "0.15.0",
27
+ "@atom8n/db": "1.2.0",
28
+ "@atom8n/di": "0.10.0",
29
+ "@atom8n/permissions": "0.45.0",
30
+ "@n8n/typeorm": "catalog:",
31
+ "jest-mock-extended": "^3.0.4",
32
+ "@atom8n/n8n-workflow": "2.2.0",
33
+ "reflect-metadata": "catalog:",
34
+ "uuid": "catalog:"
35
+ },
36
+ "devDependencies": {
37
+ "@atom8n/typescript-config": "1.3.0"
38
+ }
39
+ }