@n8n/backend-test-utils 0.3.0 → 0.5.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,10 @@
1
+ import type { Project, User, ProjectRelation } from '@n8n/db';
2
+ import type { ProjectRole } from '@n8n/permissions';
3
+ export declare const linkUserToProject: (user: User, project: Project, role: ProjectRole) => Promise<void>;
4
+ export declare const createTeamProject: (name?: string, adminUser?: User) => Promise<Project>;
5
+ export declare function getProjectByNameOrFail(name: string): Promise<Project>;
6
+ export declare const getPersonalProject: (user: User) => Promise<Project>;
7
+ export declare const findProject: (id: string) => Promise<Project>;
8
+ export declare const getProjectRelations: ({ projectId, userId, role, }: Partial<ProjectRelation>) => Promise<ProjectRelation[]>;
9
+ export declare const getProjectRoleForUser: (projectId: string, userId: string) => Promise<ProjectRole | undefined>;
10
+ export declare const getAllProjectRelations: ({ projectId, }: Partial<ProjectRelation>) => Promise<ProjectRelation[]>;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAllProjectRelations = exports.getProjectRoleForUser = exports.getProjectRelations = exports.findProject = exports.getPersonalProject = exports.createTeamProject = exports.linkUserToProject = void 0;
4
+ exports.getProjectByNameOrFail = getProjectByNameOrFail;
5
+ const db_1 = require("@n8n/db");
6
+ const di_1 = require("@n8n/di");
7
+ const random_1 = require("../random");
8
+ const linkUserToProject = async (user, project, role) => {
9
+ const projectRelationRepository = di_1.Container.get(db_1.ProjectRelationRepository);
10
+ await projectRelationRepository.save(projectRelationRepository.create({
11
+ projectId: project.id,
12
+ userId: user.id,
13
+ role,
14
+ }));
15
+ };
16
+ exports.linkUserToProject = linkUserToProject;
17
+ const createTeamProject = async (name, adminUser) => {
18
+ const projectRepository = di_1.Container.get(db_1.ProjectRepository);
19
+ const project = await projectRepository.save(projectRepository.create({
20
+ name: name ?? (0, random_1.randomName)(),
21
+ type: 'team',
22
+ }));
23
+ if (adminUser) {
24
+ await (0, exports.linkUserToProject)(adminUser, project, 'project:admin');
25
+ }
26
+ return project;
27
+ };
28
+ exports.createTeamProject = createTeamProject;
29
+ async function getProjectByNameOrFail(name) {
30
+ return await di_1.Container.get(db_1.ProjectRepository).findOneOrFail({ where: { name } });
31
+ }
32
+ const getPersonalProject = async (user) => {
33
+ return await di_1.Container.get(db_1.ProjectRepository).findOneOrFail({
34
+ where: {
35
+ projectRelations: {
36
+ userId: user.id,
37
+ role: 'project:personalOwner',
38
+ },
39
+ type: 'personal',
40
+ },
41
+ });
42
+ };
43
+ exports.getPersonalProject = getPersonalProject;
44
+ const findProject = async (id) => {
45
+ return await di_1.Container.get(db_1.ProjectRepository).findOneOrFail({
46
+ where: { id },
47
+ });
48
+ };
49
+ exports.findProject = findProject;
50
+ const getProjectRelations = async ({ projectId, userId, role, }) => {
51
+ return await di_1.Container.get(db_1.ProjectRelationRepository).find({
52
+ where: { projectId, userId, role },
53
+ });
54
+ };
55
+ exports.getProjectRelations = getProjectRelations;
56
+ const getProjectRoleForUser = async (projectId, userId) => {
57
+ return (await di_1.Container.get(db_1.ProjectRelationRepository).findOne({
58
+ select: ['role'],
59
+ where: { projectId, userId },
60
+ }))?.role;
61
+ };
62
+ exports.getProjectRoleForUser = getProjectRoleForUser;
63
+ const getAllProjectRelations = async ({ projectId, }) => {
64
+ return await di_1.Container.get(db_1.ProjectRelationRepository).find({
65
+ where: { projectId },
66
+ });
67
+ };
68
+ exports.getAllProjectRelations = getAllProjectRelations;
69
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/db/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { SharedWorkflow, IWorkflowDb } from '@n8n/db';
2
+ import { Project, User } from '@n8n/db';
3
+ import type { WorkflowSharingRole } from '@n8n/permissions';
4
+ import type { DeepPartial } from '@n8n/typeorm';
5
+ import type { IWorkflowBase } from 'n8n-workflow';
6
+ export declare function newWorkflow(attributes?: Partial<IWorkflowDb>): IWorkflowDb;
7
+ export declare function createWorkflow(attributes?: Partial<IWorkflowDb>, userOrProject?: User | Project): Promise<IWorkflowDb & import("@n8n/db").WorkflowEntity>;
8
+ export declare function createManyWorkflows(amount: number, attributes?: Partial<IWorkflowDb>, user?: User): Promise<(IWorkflowDb & import("@n8n/db").WorkflowEntity)[]>;
9
+ export declare function shareWorkflowWithUsers(workflow: IWorkflowBase, users: User[]): Promise<(DeepPartial<SharedWorkflow> & SharedWorkflow)[]>;
10
+ export declare function shareWorkflowWithProjects(workflow: IWorkflowBase, projectsWithRole: Array<{
11
+ project: Project;
12
+ role?: WorkflowSharingRole;
13
+ }>): Promise<SharedWorkflow[]>;
14
+ export declare function getWorkflowSharing(workflow: IWorkflowBase): Promise<SharedWorkflow[]>;
15
+ export declare function createWorkflowWithTrigger(attributes?: Partial<IWorkflowDb>, user?: User): Promise<IWorkflowDb & import("@n8n/db").WorkflowEntity>;
16
+ export declare function getAllWorkflows(): Promise<import("@n8n/db").WorkflowEntity[]>;
17
+ export declare function getAllSharedWorkflows(): Promise<SharedWorkflow[]>;
18
+ export declare const getWorkflowById: (id: string) => Promise<import("@n8n/db").WorkflowEntity | null>;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getWorkflowById = void 0;
4
+ exports.newWorkflow = newWorkflow;
5
+ exports.createWorkflow = createWorkflow;
6
+ exports.createManyWorkflows = createManyWorkflows;
7
+ exports.shareWorkflowWithUsers = shareWorkflowWithUsers;
8
+ exports.shareWorkflowWithProjects = shareWorkflowWithProjects;
9
+ exports.getWorkflowSharing = getWorkflowSharing;
10
+ exports.createWorkflowWithTrigger = createWorkflowWithTrigger;
11
+ exports.getAllWorkflows = getAllWorkflows;
12
+ exports.getAllSharedWorkflows = getAllSharedWorkflows;
13
+ const db_1 = require("@n8n/db");
14
+ const di_1 = require("@n8n/di");
15
+ const n8n_workflow_1 = require("n8n-workflow");
16
+ const uuid_1 = require("uuid");
17
+ function newWorkflow(attributes = {}) {
18
+ const { active, isArchived, name, nodes, connections, versionId, settings } = attributes;
19
+ const workflowEntity = di_1.Container.get(db_1.WorkflowRepository).create({
20
+ active: active ?? false,
21
+ isArchived: isArchived ?? false,
22
+ name: name ?? 'test workflow',
23
+ nodes: nodes ?? [
24
+ {
25
+ id: 'uuid-1234',
26
+ name: 'Schedule Trigger',
27
+ parameters: {},
28
+ position: [-20, 260],
29
+ type: 'n8n-nodes-base.scheduleTrigger',
30
+ typeVersion: 1,
31
+ },
32
+ ],
33
+ connections: connections ?? {},
34
+ versionId: versionId ?? (0, uuid_1.v4)(),
35
+ settings: settings ?? {},
36
+ ...attributes,
37
+ });
38
+ return workflowEntity;
39
+ }
40
+ async function createWorkflow(attributes = {}, userOrProject) {
41
+ const workflow = await di_1.Container.get(db_1.WorkflowRepository).save(newWorkflow(attributes));
42
+ if (userOrProject instanceof db_1.User) {
43
+ const user = userOrProject;
44
+ const project = await di_1.Container.get(db_1.ProjectRepository).getPersonalProjectForUserOrFail(user.id);
45
+ await di_1.Container.get(db_1.SharedWorkflowRepository).save(di_1.Container.get(db_1.SharedWorkflowRepository).create({
46
+ project,
47
+ workflow,
48
+ role: 'workflow:owner',
49
+ }));
50
+ }
51
+ if (userOrProject instanceof db_1.Project) {
52
+ const project = userOrProject;
53
+ await di_1.Container.get(db_1.SharedWorkflowRepository).save(di_1.Container.get(db_1.SharedWorkflowRepository).create({
54
+ project,
55
+ workflow,
56
+ role: 'workflow:owner',
57
+ }));
58
+ }
59
+ return workflow;
60
+ }
61
+ async function createManyWorkflows(amount, attributes = {}, user) {
62
+ const workflowRequests = [...Array(amount)].map(async (_) => await createWorkflow(attributes, user));
63
+ return await Promise.all(workflowRequests);
64
+ }
65
+ async function shareWorkflowWithUsers(workflow, users) {
66
+ const sharedWorkflows = await Promise.all(users.map(async (user) => {
67
+ const project = await di_1.Container.get(db_1.ProjectRepository).getPersonalProjectForUserOrFail(user.id);
68
+ return {
69
+ projectId: project.id,
70
+ workflowId: workflow.id,
71
+ role: 'workflow:editor',
72
+ };
73
+ }));
74
+ return await di_1.Container.get(db_1.SharedWorkflowRepository).save(sharedWorkflows);
75
+ }
76
+ async function shareWorkflowWithProjects(workflow, projectsWithRole) {
77
+ const newSharedWorkflow = await Promise.all(projectsWithRole.map(async ({ project, role }) => {
78
+ return di_1.Container.get(db_1.SharedWorkflowRepository).create({
79
+ workflowId: workflow.id,
80
+ role: role ?? 'workflow:editor',
81
+ projectId: project.id,
82
+ });
83
+ }));
84
+ return await di_1.Container.get(db_1.SharedWorkflowRepository).save(newSharedWorkflow);
85
+ }
86
+ async function getWorkflowSharing(workflow) {
87
+ return await di_1.Container.get(db_1.SharedWorkflowRepository).find({
88
+ where: { workflowId: workflow.id },
89
+ relations: { project: true },
90
+ });
91
+ }
92
+ async function createWorkflowWithTrigger(attributes = {}, user) {
93
+ const workflow = await createWorkflow({
94
+ nodes: [
95
+ {
96
+ id: 'uuid-1',
97
+ parameters: {},
98
+ name: 'Start',
99
+ type: 'n8n-nodes-base.start',
100
+ typeVersion: 1,
101
+ position: [240, 300],
102
+ },
103
+ {
104
+ id: 'uuid-2',
105
+ parameters: { triggerTimes: { item: [{ mode: 'everyMinute' }] } },
106
+ name: 'Cron',
107
+ type: 'n8n-nodes-base.cron',
108
+ typeVersion: 1,
109
+ position: [500, 300],
110
+ },
111
+ {
112
+ id: 'uuid-3',
113
+ parameters: { options: {} },
114
+ name: 'Set',
115
+ type: 'n8n-nodes-base.set',
116
+ typeVersion: 1,
117
+ position: [780, 300],
118
+ },
119
+ ],
120
+ connections: {
121
+ Cron: { main: [[{ node: 'Set', type: n8n_workflow_1.NodeConnectionTypes.Main, index: 0 }]] },
122
+ },
123
+ ...attributes,
124
+ }, user);
125
+ return workflow;
126
+ }
127
+ async function getAllWorkflows() {
128
+ return await di_1.Container.get(db_1.WorkflowRepository).find();
129
+ }
130
+ async function getAllSharedWorkflows() {
131
+ return await di_1.Container.get(db_1.SharedWorkflowRepository).find();
132
+ }
133
+ const getWorkflowById = async (id) => await di_1.Container.get(db_1.WorkflowRepository).findOneBy({ id });
134
+ exports.getWorkflowById = getWorkflowById;
135
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/db/workflows.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,8 @@
1
1
  import type { Logger } from '@n8n/backend-common';
2
2
  export declare const mockLogger: () => Logger;
3
+ export * from './random';
4
+ export * as testDb from './test-db';
5
+ export * as testModules from './test-modules';
6
+ export * from './db/workflows';
7
+ export * from './db/projects';
8
+ export * from './mocking';
package/dist/index.js CHANGED
@@ -1,7 +1,49 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
2
38
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mockLogger = void 0;
39
+ exports.testModules = exports.testDb = exports.mockLogger = void 0;
4
40
  const jest_mock_extended_1 = require("jest-mock-extended");
5
41
  const mockLogger = () => (0, jest_mock_extended_1.mock)({ scoped: jest.fn().mockReturnValue((0, jest_mock_extended_1.mock)()) });
6
42
  exports.mockLogger = mockLogger;
43
+ __exportStar(require("./random"), exports);
44
+ exports.testDb = __importStar(require("./test-db"));
45
+ exports.testModules = __importStar(require("./test-modules"));
46
+ __exportStar(require("./db/workflows"), exports);
47
+ __exportStar(require("./db/projects"), exports);
48
+ __exportStar(require("./mocking"), exports);
7
49
  //# 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"}
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"}
@@ -0,0 +1,3 @@
1
+ import { type Constructable } from '@n8n/di';
2
+ import type { DeepPartial } from 'ts-essentials';
3
+ export declare const mockInstance: <T>(serviceClass: Constructable<T>, data?: DeepPartial<T> | undefined) => { [K in keyof T]: T[K] extends (...args: infer A) => infer B ? import("jest-mock-extended").CalledWithMock<B, A> : T[K]; } & T;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mockInstance = void 0;
4
+ const di_1 = require("@n8n/di");
5
+ const jest_mock_extended_1 = require("jest-mock-extended");
6
+ const mockInstance = (serviceClass, data = undefined) => {
7
+ const instance = (0, jest_mock_extended_1.mock)(data);
8
+ di_1.Container.set(serviceClass, instance);
9
+ return instance;
10
+ };
11
+ exports.mockInstance = mockInstance;
12
+ //# sourceMappingURL=mocking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocking.js","sourceRoot":"","sources":["../src/mocking.ts"],"names":[],"mappings":";;;AAAA,gCAAwD;AACxD,2DAA0C;AAGnC,MAAM,YAAY,GAAG,CAC3B,YAA8B,EAC9B,OAAmC,SAAS,EAC3C,EAAE;IACH,MAAM,QAAQ,GAAG,IAAA,yBAAI,EAAI,IAAI,CAAC,CAAC;IAC/B,cAAS,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACtC,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAPW,QAAA,YAAY,gBAOvB"}
@@ -0,0 +1,20 @@
1
+ import type { ICredentialDataDecryptedObject } from 'n8n-workflow';
2
+ export type CredentialPayload = {
3
+ name: string;
4
+ type: string;
5
+ data: ICredentialDataDecryptedObject;
6
+ isManaged?: boolean;
7
+ };
8
+ export declare const randomApiKey: () => string;
9
+ export declare const chooseRandomly: <T>(array: T[]) => T;
10
+ export declare const randomValidPassword: () => string;
11
+ export declare const randomInvalidPassword: () => string;
12
+ export declare const randomName: () => string;
13
+ export declare const randomEmail: () => string;
14
+ export declare const randomCredentialPayload: ({ isManaged, }?: {
15
+ isManaged?: boolean;
16
+ }) => CredentialPayload;
17
+ export declare const randomCredentialPayloadWithOauthTokenData: ({ isManaged, }?: {
18
+ isManaged?: boolean;
19
+ }) => CredentialPayload;
20
+ export declare const uniqueId: () => string;
package/dist/random.js ADDED
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uniqueId = exports.randomCredentialPayloadWithOauthTokenData = exports.randomCredentialPayload = exports.randomEmail = exports.randomName = exports.randomInvalidPassword = exports.randomValidPassword = exports.chooseRandomly = exports.randomApiKey = void 0;
4
+ const constants_1 = require("@n8n/constants");
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ const uuid_1 = require("uuid");
7
+ const randomApiKey = () => `n8n_api_${(0, n8n_workflow_1.randomString)(40)}`;
8
+ exports.randomApiKey = randomApiKey;
9
+ const chooseRandomly = (array) => array[(0, n8n_workflow_1.randomInt)(array.length)];
10
+ exports.chooseRandomly = chooseRandomly;
11
+ const randomUppercaseLetter = () => (0, exports.chooseRandomly)(n8n_workflow_1.UPPERCASE_LETTERS.split(''));
12
+ const randomValidPassword = () => (0, n8n_workflow_1.randomString)(constants_1.MIN_PASSWORD_CHAR_LENGTH, constants_1.MAX_PASSWORD_CHAR_LENGTH - 2) +
13
+ randomUppercaseLetter() +
14
+ (0, n8n_workflow_1.randomInt)(10);
15
+ exports.randomValidPassword = randomValidPassword;
16
+ const randomInvalidPassword = () => (0, exports.chooseRandomly)([
17
+ (0, n8n_workflow_1.randomString)(1, constants_1.MIN_PASSWORD_CHAR_LENGTH - 1),
18
+ (0, n8n_workflow_1.randomString)(constants_1.MAX_PASSWORD_CHAR_LENGTH + 2, constants_1.MAX_PASSWORD_CHAR_LENGTH + 100),
19
+ 'abcdefgh',
20
+ 'abcdefg1',
21
+ 'abcdefgA',
22
+ 'abcdefA',
23
+ 'abcdef1',
24
+ 'abcdeA1',
25
+ 'abcdefg',
26
+ ]);
27
+ exports.randomInvalidPassword = randomInvalidPassword;
28
+ const POPULAR_TOP_LEVEL_DOMAINS = ['com', 'org', 'net', 'io', 'edu'];
29
+ const randomTopLevelDomain = () => (0, exports.chooseRandomly)(POPULAR_TOP_LEVEL_DOMAINS);
30
+ const randomName = () => (0, n8n_workflow_1.randomString)(4, 8).toLowerCase();
31
+ exports.randomName = randomName;
32
+ const randomEmail = () => `${(0, exports.randomName)()}@${(0, exports.randomName)()}.${randomTopLevelDomain()}`;
33
+ exports.randomEmail = randomEmail;
34
+ const randomCredentialPayload = ({ isManaged = false, } = {}) => ({
35
+ name: (0, exports.randomName)(),
36
+ type: (0, exports.randomName)(),
37
+ data: { accessToken: (0, n8n_workflow_1.randomString)(6, 16) },
38
+ isManaged,
39
+ });
40
+ exports.randomCredentialPayload = randomCredentialPayload;
41
+ const randomCredentialPayloadWithOauthTokenData = ({ isManaged = false, } = {}) => ({
42
+ name: (0, exports.randomName)(),
43
+ type: (0, exports.randomName)(),
44
+ data: { accessToken: (0, n8n_workflow_1.randomString)(6, 16), oauthTokenData: { access_token: (0, n8n_workflow_1.randomString)(6, 16) } },
45
+ isManaged,
46
+ });
47
+ exports.randomCredentialPayloadWithOauthTokenData = randomCredentialPayloadWithOauthTokenData;
48
+ const uniqueId = () => (0, uuid_1.v4)();
49
+ exports.uniqueId = uniqueId;
50
+ //# sourceMappingURL=random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.js","sourceRoot":"","sources":["../src/random.ts"],"names":[],"mappings":";;;AAAA,8CAAoF;AACpF,+CAA0E;AAE1E,+BAAkC;AAS3B,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,WAAW,IAAA,2BAAY,EAAC,EAAE,CAAC,EAAE,CAAC;AAAnD,QAAA,YAAY,gBAAuC;AAEzD,MAAM,cAAc,GAAG,CAAI,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAA,wBAAS,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAAnE,QAAA,cAAc,kBAAqD;AAEhF,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,IAAA,sBAAc,EAAC,gCAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzE,MAAM,mBAAmB,GAAG,GAAG,EAAE,CACvC,IAAA,2BAAY,EAAC,oCAAwB,EAAE,oCAAwB,GAAG,CAAC,CAAC;IACpE,qBAAqB,EAAE;IACvB,IAAA,wBAAS,EAAC,EAAE,CAAC,CAAC;AAHF,QAAA,mBAAmB,uBAGjB;AAER,MAAM,qBAAqB,GAAG,GAAG,EAAE,CACzC,IAAA,sBAAc,EAAC;IACd,IAAA,2BAAY,EAAC,CAAC,EAAE,oCAAwB,GAAG,CAAC,CAAC;IAC7C,IAAA,2BAAY,EAAC,oCAAwB,GAAG,CAAC,EAAE,oCAAwB,GAAG,GAAG,CAAC;IAC1E,UAAU;IACV,UAAU;IACV,UAAU;IACV,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACT,CAAC,CAAC;AAXS,QAAA,qBAAqB,yBAW9B;AAEJ,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAErE,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,IAAA,sBAAc,EAAC,yBAAyB,CAAC,CAAC;AAEtE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAA,2BAAY,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAApD,QAAA,UAAU,cAA0C;AAE1D,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,GAAG,IAAA,kBAAU,GAAE,IAAI,IAAA,kBAAU,GAAE,IAAI,oBAAoB,EAAE,EAAE,CAAC;AAAhF,QAAA,WAAW,eAAqE;AAEtF,MAAM,uBAAuB,GAAG,CAAC,EACvC,SAAS,GAAG,KAAK,MACW,EAAE,EAAqB,EAAE,CAAC,CAAC;IACvD,IAAI,EAAE,IAAA,kBAAU,GAAE;IAClB,IAAI,EAAE,IAAA,kBAAU,GAAE;IAClB,IAAI,EAAE,EAAE,WAAW,EAAE,IAAA,2BAAY,EAAC,CAAC,EAAE,EAAE,CAAC,EAAE;IAC1C,SAAS;CACT,CAAC,CAAC;AAPU,QAAA,uBAAuB,2BAOjC;AAEI,MAAM,yCAAyC,GAAG,CAAC,EACzD,SAAS,GAAG,KAAK,MACW,EAAE,EAAqB,EAAE,CAAC,CAAC;IACvD,IAAI,EAAE,IAAA,kBAAU,GAAE;IAClB,IAAI,EAAE,IAAA,kBAAU,GAAE;IAClB,IAAI,EAAE,EAAE,WAAW,EAAE,IAAA,2BAAY,EAAC,CAAC,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,IAAA,2BAAY,EAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;IACjG,SAAS;CACT,CAAC,CAAC;AAPU,QAAA,yCAAyC,6CAOnD;AAEI,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAA,SAAI,GAAE,CAAC;AAAxB,QAAA,QAAQ,YAAgB"}
@@ -0,0 +1,10 @@
1
+ import type { entities } from '@n8n/db';
2
+ import type { DataSourceOptions } from '@n8n/typeorm';
3
+ export declare const testDbPrefix = "n8n_test_";
4
+ export declare const getBootstrapDBOptions: (dbType: "postgresdb" | "mysqldb") => DataSourceOptions;
5
+ export declare function init(): Promise<void>;
6
+ export declare function isReady(): boolean;
7
+ export declare function terminate(): Promise<void>;
8
+ type EntityName = keyof typeof entities | 'InsightsRaw' | 'InsightsByPeriod' | 'InsightsMetadata';
9
+ export declare function truncate(entities: EntityName[]): Promise<void>;
10
+ export {};
@@ -0,0 +1,61 @@
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
+ const getBootstrapDBOptions = (dbType) => {
15
+ const globalConfig = di_1.Container.get(config_1.GlobalConfig);
16
+ const type = dbType === 'postgresdb' ? 'postgres' : 'mysql';
17
+ return {
18
+ type,
19
+ ...di_1.Container.get(db_1.DbConnectionOptions).getOverrides(dbType),
20
+ database: type,
21
+ entityPrefix: globalConfig.database.tablePrefix,
22
+ schema: dbType === 'postgresdb' ? globalConfig.database.postgresdb.schema : undefined,
23
+ };
24
+ };
25
+ exports.getBootstrapDBOptions = getBootstrapDBOptions;
26
+ async function init() {
27
+ const globalConfig = di_1.Container.get(config_1.GlobalConfig);
28
+ const dbType = globalConfig.database.type;
29
+ const testDbName = `${exports.testDbPrefix}${(0, n8n_workflow_1.randomString)(6, 10).toLowerCase()}_${Date.now()}`;
30
+ if (dbType === 'postgresdb') {
31
+ const bootstrapPostgres = await new typeorm_1.DataSource((0, exports.getBootstrapDBOptions)('postgresdb')).initialize();
32
+ await bootstrapPostgres.query(`CREATE DATABASE ${testDbName}`);
33
+ await bootstrapPostgres.destroy();
34
+ globalConfig.database.postgresdb.database = testDbName;
35
+ }
36
+ else if (dbType === 'mysqldb' || dbType === 'mariadb') {
37
+ const bootstrapMysql = await new typeorm_1.DataSource((0, exports.getBootstrapDBOptions)('mysqldb')).initialize();
38
+ await bootstrapMysql.query(`CREATE DATABASE ${testDbName} DEFAULT CHARACTER SET utf8mb4`);
39
+ await bootstrapMysql.destroy();
40
+ globalConfig.database.mysqldb.database = testDbName;
41
+ }
42
+ const dbConnection = di_1.Container.get(db_1.DbConnection);
43
+ await dbConnection.init();
44
+ await dbConnection.migrate();
45
+ }
46
+ function isReady() {
47
+ const { connectionState } = di_1.Container.get(db_1.DbConnection);
48
+ return connectionState.connected && connectionState.migrated;
49
+ }
50
+ async function terminate() {
51
+ const dbConnection = di_1.Container.get(db_1.DbConnection);
52
+ await dbConnection.close();
53
+ dbConnection.connectionState.connected = false;
54
+ }
55
+ async function truncate(entities) {
56
+ const connection = di_1.Container.get(typeorm_1.DataSource);
57
+ for (const name of entities) {
58
+ await connection.getRepository(name).delete({});
59
+ }
60
+ }
61
+ //# sourceMappingURL=test-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-db.js","sourceRoot":"","sources":["../src/test-db.ts"],"names":[],"mappings":"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"}
@@ -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 CHANGED
@@ -1,21 +1,29 @@
1
1
  {
2
2
  "name": "@n8n/backend-test-utils",
3
- "version": "0.3.0",
3
+ "version": "0.5.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
- "LICENSE.md",
10
- "LICENSE_EE.md"
9
+ "LICENSE_EE.md",
10
+ "LICENSE.md"
11
11
  ],
12
12
  "dependencies": {
13
+ "@n8n/typeorm": "0.3.20-12",
13
14
  "jest-mock-extended": "^3.0.4",
14
15
  "reflect-metadata": "0.2.2",
15
- "@n8n/backend-common": "^0.10.0"
16
+ "uuid": "10.0.0",
17
+ "@n8n/backend-common": "^0.12.0",
18
+ "@n8n/constants": "^0.9.0",
19
+ "@n8n/di": "^0.8.0",
20
+ "@n8n/config": "^1.45.0",
21
+ "@n8n/permissions": "^0.30.0",
22
+ "@n8n/db": "^0.13.0",
23
+ "n8n-workflow": "^1.99.0"
16
24
  },
17
25
  "devDependencies": {
18
- "@n8n/typescript-config": "1.2.0"
26
+ "@n8n/typescript-config": "1.3.0"
19
27
  },
20
28
  "license": "SEE LICENSE IN LICENSE.md",
21
29
  "homepage": "https://n8n.io",
@@ -34,7 +42,7 @@
34
42
  "build": "tsc -p tsconfig.build.json",
35
43
  "format": "biome format --write .",
36
44
  "format:check": "biome ci .",
37
- "lint": "eslint .",
45
+ "lint": "eslint . --quiet",
38
46
  "lintfix": "eslint . --fix",
39
47
  "watch": "tsc -p tsconfig.build.json --watch",
40
48
  "test": "jest",