@n8n/backend-test-utils 0.18.0 → 0.20.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/dist/build.tsbuildinfo +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/migration-test-helpers.d.ts +19 -0
- package/dist/migration-test-helpers.js +80 -0
- package/dist/migration-test-helpers.js.map +1 -0
- package/dist/test-db.d.ts +1 -1
- package/dist/test-db.js.map +1 -1
- package/package.json +10 -10
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -46,4 +46,5 @@ exports.testModules = __importStar(require("./test-modules"));
|
|
|
46
46
|
__exportStar(require("./db/workflows"), exports);
|
|
47
47
|
__exportStar(require("./db/projects"), exports);
|
|
48
48
|
__exportStar(require("./mocking"), exports);
|
|
49
|
+
__exportStar(require("./migration-test-helpers"), exports);
|
|
49
50
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2DAA0C;AAEnC,MAAM,UAAU,GAAG,GAAW,EAAE,CACtC,IAAA,yBAAI,EAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAA,yBAAI,GAAU,CAAC,EAAE,CAAC,CAAC;AADxD,QAAA,UAAU,cAC8C;AAErE,2CAAyB;AACzB,oDAAoC;AACpC,8DAA8C;AAC9C,iDAA+B;AAC/B,gDAA8B;AAC9B,4CAA0B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2DAA0C;AAEnC,MAAM,UAAU,GAAG,GAAW,EAAE,CACtC,IAAA,yBAAI,EAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAA,yBAAI,GAAU,CAAC,EAAE,CAAC,CAAC;AADxD,QAAA,UAAU,cAC8C;AAErE,2CAAyB;AACzB,oDAAoC;AACpC,8DAA8C;AAC9C,iDAA+B;AAC/B,gDAA8B;AAC9B,4CAA0B;AAC1B,2DAAyC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DatabaseType } from '@n8n/db';
|
|
2
|
+
import { DataSource, type QueryRunner } from '@n8n/typeorm';
|
|
3
|
+
export interface TestMigrationContext {
|
|
4
|
+
queryRunner: QueryRunner;
|
|
5
|
+
tablePrefix: string;
|
|
6
|
+
dbType: DatabaseType;
|
|
7
|
+
isMysql: boolean;
|
|
8
|
+
isSqlite: boolean;
|
|
9
|
+
isPostgres: boolean;
|
|
10
|
+
escape: {
|
|
11
|
+
columnName(name: string): string;
|
|
12
|
+
tableName(name: string): string;
|
|
13
|
+
indexName(name: string): string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function createTestMigrationContext(dataSource: DataSource): TestMigrationContext;
|
|
17
|
+
export declare function initDbUpToMigration(beforeMigrationName: string): Promise<void>;
|
|
18
|
+
export declare function undoLastSingleMigration(): Promise<void>;
|
|
19
|
+
export declare function runSingleMigration(migrationName: string): Promise<void>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTestMigrationContext = createTestMigrationContext;
|
|
4
|
+
exports.initDbUpToMigration = initDbUpToMigration;
|
|
5
|
+
exports.undoLastSingleMigration = undoLastSingleMigration;
|
|
6
|
+
exports.runSingleMigration = runSingleMigration;
|
|
7
|
+
const config_1 = require("@n8n/config");
|
|
8
|
+
const db_1 = require("@n8n/db");
|
|
9
|
+
const di_1 = require("@n8n/di");
|
|
10
|
+
const typeorm_1 = require("@n8n/typeorm");
|
|
11
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
12
|
+
async function reinitializeDataConnection() {
|
|
13
|
+
const dbConnection = di_1.Container.get(db_1.DbConnection);
|
|
14
|
+
await dbConnection.close();
|
|
15
|
+
await dbConnection.init();
|
|
16
|
+
}
|
|
17
|
+
function createTestMigrationContext(dataSource) {
|
|
18
|
+
const globalConfig = di_1.Container.get(config_1.GlobalConfig);
|
|
19
|
+
const dbType = globalConfig.database.type;
|
|
20
|
+
const tablePrefix = globalConfig.database.tablePrefix;
|
|
21
|
+
const queryRunner = dataSource.createQueryRunner();
|
|
22
|
+
return {
|
|
23
|
+
queryRunner,
|
|
24
|
+
tablePrefix,
|
|
25
|
+
dbType,
|
|
26
|
+
isMysql: ['mariadb', 'mysqldb'].includes(dbType),
|
|
27
|
+
isSqlite: dbType === 'sqlite',
|
|
28
|
+
isPostgres: dbType === 'postgresdb',
|
|
29
|
+
escape: {
|
|
30
|
+
columnName: (name) => queryRunner.connection.driver.escape(name),
|
|
31
|
+
tableName: (name) => queryRunner.connection.driver.escape(`${tablePrefix}${name}`),
|
|
32
|
+
indexName: (name) => queryRunner.connection.driver.escape(`IDX_${tablePrefix}${name}`),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async function initDbUpToMigration(beforeMigrationName) {
|
|
37
|
+
const dataSource = di_1.Container.get(typeorm_1.DataSource);
|
|
38
|
+
if (!Array.isArray(dataSource.options.migrations)) {
|
|
39
|
+
throw new n8n_workflow_1.UnexpectedError('Database migrations are not an array');
|
|
40
|
+
}
|
|
41
|
+
const allMigrations = dataSource.options.migrations;
|
|
42
|
+
const targetIndex = allMigrations.findIndex((m) => m.name === beforeMigrationName);
|
|
43
|
+
if (targetIndex === -1) {
|
|
44
|
+
throw new n8n_workflow_1.UnexpectedError(`Migration "${beforeMigrationName}" not found`);
|
|
45
|
+
}
|
|
46
|
+
const migrationsToRun = allMigrations.slice(0, targetIndex);
|
|
47
|
+
dataSource.options.migrations = migrationsToRun;
|
|
48
|
+
try {
|
|
49
|
+
await reinitializeDataConnection();
|
|
50
|
+
await di_1.Container.get(db_1.DbConnection).migrate();
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
dataSource.options.migrations = allMigrations;
|
|
54
|
+
await reinitializeDataConnection();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function undoLastSingleMigration() {
|
|
58
|
+
const dataSource = di_1.Container.get(typeorm_1.DataSource);
|
|
59
|
+
await dataSource.undoLastMigration({
|
|
60
|
+
transaction: 'each',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async function runSingleMigration(migrationName) {
|
|
64
|
+
const dataSource = di_1.Container.get(typeorm_1.DataSource);
|
|
65
|
+
const allMigrations = dataSource.options.migrations;
|
|
66
|
+
const migration = allMigrations.find((m) => m.name === migrationName);
|
|
67
|
+
if (!migration) {
|
|
68
|
+
throw new n8n_workflow_1.UnexpectedError(`Migration "${migrationName}" not found`);
|
|
69
|
+
}
|
|
70
|
+
dataSource.options.migrations = [migration];
|
|
71
|
+
try {
|
|
72
|
+
await reinitializeDataConnection();
|
|
73
|
+
await di_1.Container.get(db_1.DbConnection).migrate();
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
dataSource.options.migrations = allMigrations;
|
|
77
|
+
await reinitializeDataConnection();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=migration-test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-test-helpers.js","sourceRoot":"","sources":["../src/migration-test-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/test-db.d.ts
CHANGED
|
@@ -5,6 +5,6 @@ export declare const getBootstrapDBOptions: (dbType: "postgresdb" | "mysqldb") =
|
|
|
5
5
|
export declare function init(): Promise<void>;
|
|
6
6
|
export declare function isReady(): boolean;
|
|
7
7
|
export declare function terminate(): Promise<void>;
|
|
8
|
-
type EntityName = keyof typeof entities | 'InsightsRaw' | 'InsightsByPeriod' | 'InsightsMetadata' | 'DataTable' | 'DataTableColumn';
|
|
8
|
+
type EntityName = keyof typeof entities | 'InsightsRaw' | 'InsightsByPeriod' | 'InsightsMetadata' | 'DataTable' | 'DataTableColumn' | 'ChatHubSession' | 'ChatHubMessage';
|
|
9
9
|
export declare function truncate(entities: EntityName[]): Promise<void>;
|
|
10
10
|
export {};
|
package/dist/test-db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-db.js","sourceRoot":"","sources":["../src/test-db.ts"],"names":[],"mappings":";;;AA6BA,oBA8BC;AAED,0BAGC;AAKD,8BAKC;
|
|
1
|
+
{"version":3,"file":"test-db.js","sourceRoot":"","sources":["../src/test-db.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@n8n/backend-test-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "src/index.ts",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist/**/*",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
9
|
+
"LICENSE.md",
|
|
10
|
+
"LICENSE_EE.md"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@n8n/typeorm": "0.3.20-
|
|
13
|
+
"@n8n/typeorm": "0.3.20-14",
|
|
14
14
|
"jest-mock-extended": "^3.0.4",
|
|
15
15
|
"reflect-metadata": "0.2.2",
|
|
16
16
|
"uuid": "10.0.0",
|
|
17
|
-
"@n8n/config": "^1.
|
|
17
|
+
"@n8n/config": "^1.59.0",
|
|
18
18
|
"@n8n/constants": "^0.13.0",
|
|
19
|
-
"@n8n/backend-common": "^0.
|
|
20
|
-
"@n8n/db": "^0.
|
|
21
|
-
"@n8n/
|
|
22
|
-
"n8n
|
|
23
|
-
"
|
|
19
|
+
"@n8n/backend-common": "^0.27.0",
|
|
20
|
+
"@n8n/db": "^0.28.0",
|
|
21
|
+
"@n8n/di": "^0.9.0",
|
|
22
|
+
"@n8n/permissions": "^0.40.0",
|
|
23
|
+
"n8n-workflow": "^1.114.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@n8n/typescript-config": "1.3.0"
|