@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.
- package/dist/build.tsbuildinfo +1 -0
- package/dist/db/projects.d.ts +10 -0
- package/dist/db/projects.js +73 -0
- package/dist/db/projects.js.map +1 -0
- package/dist/db/workflows.d.ts +24 -0
- package/dist/db/workflows.js +195 -0
- package/dist/db/workflows.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- 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/mocking.d.ts +3 -0
- package/dist/mocking.js +12 -0
- package/dist/mocking.js.map +1 -0
- package/dist/random.d.ts +25 -0
- package/dist/random.js +57 -0
- package/dist/random.js.map +1 -0
- package/dist/test-db.d.ts +10 -0
- package/dist/test-db.js +95 -0
- package/dist/test-db.js.map +1 -0
- package/dist/test-modules.d.ts +2 -0
- package/dist/test-modules.js +9 -0
- package/dist/test-modules.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Project, User, ProjectRelation } from '@n8n/db';
|
|
2
|
+
import type { AssignableProjectRole } from '@n8n/permissions';
|
|
3
|
+
export declare const linkUserToProject: (user: User, project: Project, role: AssignableProjectRole) => 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<AssignableProjectRole | undefined>;
|
|
10
|
+
export declare const getAllProjectRelations: ({ projectId, }: Partial<ProjectRelation>) => Promise<ProjectRelation[]>;
|
|
@@ -0,0 +1,73 @@
|
|
|
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 permissions_1 = require("@n8n/permissions");
|
|
8
|
+
const random_1 = require("../random");
|
|
9
|
+
const linkUserToProject = async (user, project, role) => {
|
|
10
|
+
const projectRelationRepository = di_1.Container.get(db_1.ProjectRelationRepository);
|
|
11
|
+
await projectRelationRepository.save(projectRelationRepository.create({
|
|
12
|
+
projectId: project.id,
|
|
13
|
+
userId: user.id,
|
|
14
|
+
role: { slug: role },
|
|
15
|
+
}));
|
|
16
|
+
};
|
|
17
|
+
exports.linkUserToProject = linkUserToProject;
|
|
18
|
+
const createTeamProject = async (name, adminUser) => {
|
|
19
|
+
const projectRepository = di_1.Container.get(db_1.ProjectRepository);
|
|
20
|
+
const project = await projectRepository.save(projectRepository.create({
|
|
21
|
+
name: name ?? (0, random_1.randomName)(),
|
|
22
|
+
type: 'team',
|
|
23
|
+
creatorId: adminUser?.id,
|
|
24
|
+
}));
|
|
25
|
+
if (adminUser) {
|
|
26
|
+
await (0, exports.linkUserToProject)(adminUser, project, 'project:admin');
|
|
27
|
+
}
|
|
28
|
+
return project;
|
|
29
|
+
};
|
|
30
|
+
exports.createTeamProject = createTeamProject;
|
|
31
|
+
async function getProjectByNameOrFail(name) {
|
|
32
|
+
return await di_1.Container.get(db_1.ProjectRepository).findOneOrFail({ where: { name } });
|
|
33
|
+
}
|
|
34
|
+
const getPersonalProject = async (user) => {
|
|
35
|
+
return await di_1.Container.get(db_1.ProjectRepository).findOneOrFail({
|
|
36
|
+
where: {
|
|
37
|
+
projectRelations: {
|
|
38
|
+
userId: user.id,
|
|
39
|
+
role: { slug: permissions_1.PROJECT_OWNER_ROLE_SLUG },
|
|
40
|
+
},
|
|
41
|
+
type: 'personal',
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
exports.getPersonalProject = getPersonalProject;
|
|
46
|
+
const findProject = async (id) => {
|
|
47
|
+
return await di_1.Container.get(db_1.ProjectRepository).findOneOrFail({
|
|
48
|
+
where: { id },
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
exports.findProject = findProject;
|
|
52
|
+
const getProjectRelations = async ({ projectId, userId, role, }) => {
|
|
53
|
+
return await di_1.Container.get(db_1.ProjectRelationRepository).find({
|
|
54
|
+
where: { projectId, userId, role },
|
|
55
|
+
relations: { role: true },
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
exports.getProjectRelations = getProjectRelations;
|
|
59
|
+
const getProjectRoleForUser = async (projectId, userId) => {
|
|
60
|
+
return (await di_1.Container.get(db_1.ProjectRelationRepository).findOne({
|
|
61
|
+
where: { projectId, userId },
|
|
62
|
+
relations: { role: true },
|
|
63
|
+
}))?.role?.slug;
|
|
64
|
+
};
|
|
65
|
+
exports.getProjectRoleForUser = getProjectRoleForUser;
|
|
66
|
+
const getAllProjectRelations = async ({ projectId, }) => {
|
|
67
|
+
return await di_1.Container.get(db_1.ProjectRelationRepository).find({
|
|
68
|
+
where: { projectId },
|
|
69
|
+
relations: { role: true },
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
exports.getAllProjectRelations = getAllProjectRelations;
|
|
73
|
+
//# 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,24 @@
|
|
|
1
|
+
import type { SharedWorkflow, IWorkflowDb, WorkflowPublishHistory, WorkflowHistory } 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 createManyActiveWorkflows(amount: number, attributes?: Partial<IWorkflowDb>, userOrProject?: User | Project): Promise<(IWorkflowDb & import("@n8n/db").WorkflowEntity)[]>;
|
|
10
|
+
export declare function shareWorkflowWithUsers(workflow: IWorkflowBase, users: User[]): Promise<(DeepPartial<SharedWorkflow> & SharedWorkflow)[]>;
|
|
11
|
+
export declare function shareWorkflowWithProjects(workflow: IWorkflowBase, projectsWithRole: Array<{
|
|
12
|
+
project: Project;
|
|
13
|
+
role?: WorkflowSharingRole;
|
|
14
|
+
}>): Promise<SharedWorkflow[]>;
|
|
15
|
+
export declare function getWorkflowSharing(workflow: IWorkflowBase): Promise<SharedWorkflow[]>;
|
|
16
|
+
export declare function createWorkflowWithTrigger(attributes?: Partial<IWorkflowDb>, userOrProject?: User | Project): Promise<IWorkflowDb & import("@n8n/db").WorkflowEntity>;
|
|
17
|
+
export declare function createWorkflowWithHistory(attributes?: Partial<IWorkflowDb>, userOrProject?: User | Project, withPublishHistory?: Partial<WorkflowPublishHistory>): Promise<IWorkflowDb & import("@n8n/db").WorkflowEntity>;
|
|
18
|
+
export declare function createWorkflowWithTriggerAndHistory(attributes?: Partial<IWorkflowDb>, userOrProject?: User | Project, withPublishHistory?: Partial<WorkflowPublishHistory>): Promise<IWorkflowDb & import("@n8n/db").WorkflowEntity>;
|
|
19
|
+
export declare function getAllWorkflows(): Promise<import("@n8n/db").WorkflowEntity[]>;
|
|
20
|
+
export declare function getAllSharedWorkflows(): Promise<SharedWorkflow[]>;
|
|
21
|
+
export declare const getWorkflowById: (id: string) => Promise<import("@n8n/db").WorkflowEntity | null>;
|
|
22
|
+
export declare function createWorkflowHistory(workflow: IWorkflowDb, userOrProject?: User | Project, withPublishHistory?: Partial<WorkflowPublishHistory>, overrides?: Partial<WorkflowHistory>): Promise<void>;
|
|
23
|
+
export declare function setActiveVersion(workflowId: string, versionId: string): Promise<void>;
|
|
24
|
+
export declare function createActiveWorkflow(attributes?: Partial<IWorkflowDb>, userOrProject?: User | Project): Promise<IWorkflowDb & import("@n8n/db").WorkflowEntity>;
|
|
@@ -0,0 +1,195 @@
|
|
|
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.createManyActiveWorkflows = createManyActiveWorkflows;
|
|
8
|
+
exports.shareWorkflowWithUsers = shareWorkflowWithUsers;
|
|
9
|
+
exports.shareWorkflowWithProjects = shareWorkflowWithProjects;
|
|
10
|
+
exports.getWorkflowSharing = getWorkflowSharing;
|
|
11
|
+
exports.createWorkflowWithTrigger = createWorkflowWithTrigger;
|
|
12
|
+
exports.createWorkflowWithHistory = createWorkflowWithHistory;
|
|
13
|
+
exports.createWorkflowWithTriggerAndHistory = createWorkflowWithTriggerAndHistory;
|
|
14
|
+
exports.getAllWorkflows = getAllWorkflows;
|
|
15
|
+
exports.getAllSharedWorkflows = getAllSharedWorkflows;
|
|
16
|
+
exports.createWorkflowHistory = createWorkflowHistory;
|
|
17
|
+
exports.setActiveVersion = setActiveVersion;
|
|
18
|
+
exports.createActiveWorkflow = createActiveWorkflow;
|
|
19
|
+
const db_1 = require("@n8n/db");
|
|
20
|
+
const di_1 = require("@n8n/di");
|
|
21
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
22
|
+
const uuid_1 = require("uuid");
|
|
23
|
+
function newWorkflow(attributes = {}) {
|
|
24
|
+
const { active, isArchived, name, nodes, connections, versionId, settings } = attributes;
|
|
25
|
+
const workflowEntity = di_1.Container.get(db_1.WorkflowRepository).create({
|
|
26
|
+
active: active ?? false,
|
|
27
|
+
isArchived: isArchived ?? false,
|
|
28
|
+
name: name ?? 'test workflow',
|
|
29
|
+
nodes: nodes ?? [
|
|
30
|
+
{
|
|
31
|
+
id: 'uuid-1234',
|
|
32
|
+
name: 'Schedule Trigger',
|
|
33
|
+
parameters: {},
|
|
34
|
+
position: [-20, 260],
|
|
35
|
+
type: 'n8n-nodes-base.scheduleTrigger',
|
|
36
|
+
typeVersion: 1,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
connections: connections ?? {},
|
|
40
|
+
versionId: versionId ?? (0, uuid_1.v4)(),
|
|
41
|
+
settings: settings ?? {},
|
|
42
|
+
...attributes,
|
|
43
|
+
});
|
|
44
|
+
return workflowEntity;
|
|
45
|
+
}
|
|
46
|
+
async function createWorkflow(attributes = {}, userOrProject) {
|
|
47
|
+
const workflow = await di_1.Container.get(db_1.WorkflowRepository).save(newWorkflow(attributes));
|
|
48
|
+
if (userOrProject instanceof db_1.User) {
|
|
49
|
+
const user = userOrProject;
|
|
50
|
+
const project = await di_1.Container.get(db_1.ProjectRepository).getPersonalProjectForUserOrFail(user.id);
|
|
51
|
+
await di_1.Container.get(db_1.SharedWorkflowRepository).save(di_1.Container.get(db_1.SharedWorkflowRepository).create({
|
|
52
|
+
project,
|
|
53
|
+
workflow,
|
|
54
|
+
role: 'workflow:owner',
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
if (userOrProject instanceof db_1.Project) {
|
|
58
|
+
const project = userOrProject;
|
|
59
|
+
await di_1.Container.get(db_1.SharedWorkflowRepository).save(di_1.Container.get(db_1.SharedWorkflowRepository).create({
|
|
60
|
+
project,
|
|
61
|
+
workflow,
|
|
62
|
+
role: 'workflow:owner',
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
return workflow;
|
|
66
|
+
}
|
|
67
|
+
async function createManyWorkflows(amount, attributes = {}, user) {
|
|
68
|
+
const workflowRequests = [...Array(amount)].map(async (_) => await createWorkflow(attributes, user));
|
|
69
|
+
return await Promise.all(workflowRequests);
|
|
70
|
+
}
|
|
71
|
+
async function createManyActiveWorkflows(amount, attributes = {}, userOrProject) {
|
|
72
|
+
const workflowRequests = [...Array(amount)].map(async (_) => await createActiveWorkflow(attributes, userOrProject));
|
|
73
|
+
return await Promise.all(workflowRequests);
|
|
74
|
+
}
|
|
75
|
+
async function shareWorkflowWithUsers(workflow, users) {
|
|
76
|
+
const sharedWorkflows = await Promise.all(users.map(async (user) => {
|
|
77
|
+
const project = await di_1.Container.get(db_1.ProjectRepository).getPersonalProjectForUserOrFail(user.id);
|
|
78
|
+
return {
|
|
79
|
+
projectId: project.id,
|
|
80
|
+
workflowId: workflow.id,
|
|
81
|
+
role: 'workflow:editor',
|
|
82
|
+
};
|
|
83
|
+
}));
|
|
84
|
+
return await di_1.Container.get(db_1.SharedWorkflowRepository).save(sharedWorkflows);
|
|
85
|
+
}
|
|
86
|
+
async function shareWorkflowWithProjects(workflow, projectsWithRole) {
|
|
87
|
+
const newSharedWorkflow = await Promise.all(projectsWithRole.map(async ({ project, role }) => {
|
|
88
|
+
return di_1.Container.get(db_1.SharedWorkflowRepository).create({
|
|
89
|
+
workflowId: workflow.id,
|
|
90
|
+
role: role ?? 'workflow:editor',
|
|
91
|
+
projectId: project.id,
|
|
92
|
+
});
|
|
93
|
+
}));
|
|
94
|
+
return await di_1.Container.get(db_1.SharedWorkflowRepository).save(newSharedWorkflow);
|
|
95
|
+
}
|
|
96
|
+
async function getWorkflowSharing(workflow) {
|
|
97
|
+
return await di_1.Container.get(db_1.SharedWorkflowRepository).find({
|
|
98
|
+
where: { workflowId: workflow.id },
|
|
99
|
+
relations: { project: true },
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async function createWorkflowWithTrigger(attributes = {}, userOrProject) {
|
|
103
|
+
const workflow = await createWorkflow({
|
|
104
|
+
nodes: [
|
|
105
|
+
{
|
|
106
|
+
id: 'uuid-1',
|
|
107
|
+
parameters: {},
|
|
108
|
+
name: 'Start',
|
|
109
|
+
type: 'n8n-nodes-base.manualTrigger',
|
|
110
|
+
typeVersion: 1,
|
|
111
|
+
position: [240, 300],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: 'uuid-2',
|
|
115
|
+
parameters: { triggerTimes: { item: [{ mode: 'everyMinute' }] } },
|
|
116
|
+
name: 'Cron',
|
|
117
|
+
type: 'n8n-nodes-base.cron',
|
|
118
|
+
typeVersion: 1,
|
|
119
|
+
position: [500, 300],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'uuid-3',
|
|
123
|
+
parameters: { options: {} },
|
|
124
|
+
name: 'Set',
|
|
125
|
+
type: 'n8n-nodes-base.set',
|
|
126
|
+
typeVersion: 1,
|
|
127
|
+
position: [780, 300],
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
connections: {
|
|
131
|
+
Cron: { main: [[{ node: 'Set', type: n8n_workflow_1.NodeConnectionTypes.Main, index: 0 }]] },
|
|
132
|
+
},
|
|
133
|
+
...attributes,
|
|
134
|
+
}, userOrProject);
|
|
135
|
+
return workflow;
|
|
136
|
+
}
|
|
137
|
+
async function createWorkflowWithHistory(attributes = {}, userOrProject, withPublishHistory) {
|
|
138
|
+
const workflow = await createWorkflow(attributes, userOrProject);
|
|
139
|
+
await createWorkflowHistory(workflow, userOrProject, withPublishHistory);
|
|
140
|
+
return workflow;
|
|
141
|
+
}
|
|
142
|
+
async function createWorkflowWithTriggerAndHistory(attributes = {}, userOrProject, withPublishHistory) {
|
|
143
|
+
const workflow = await createWorkflowWithTrigger(attributes, userOrProject);
|
|
144
|
+
await createWorkflowHistory(workflow, userOrProject, withPublishHistory);
|
|
145
|
+
return workflow;
|
|
146
|
+
}
|
|
147
|
+
async function getAllWorkflows() {
|
|
148
|
+
return await di_1.Container.get(db_1.WorkflowRepository).find();
|
|
149
|
+
}
|
|
150
|
+
async function getAllSharedWorkflows() {
|
|
151
|
+
return await di_1.Container.get(db_1.SharedWorkflowRepository).find();
|
|
152
|
+
}
|
|
153
|
+
const getWorkflowById = async (id) => await di_1.Container.get(db_1.WorkflowRepository).findOneBy({ id });
|
|
154
|
+
exports.getWorkflowById = getWorkflowById;
|
|
155
|
+
async function createWorkflowHistory(workflow, userOrProject, withPublishHistory, overrides = {}) {
|
|
156
|
+
const authors = userOrProject instanceof db_1.User
|
|
157
|
+
? userOrProject.firstName && userOrProject.lastName
|
|
158
|
+
? `${userOrProject.firstName} ${userOrProject.lastName}`
|
|
159
|
+
: 'Test User'
|
|
160
|
+
: 'Test User';
|
|
161
|
+
await di_1.Container.get(db_1.WorkflowHistoryRepository).insert({
|
|
162
|
+
workflowId: workflow.id,
|
|
163
|
+
versionId: workflow.versionId,
|
|
164
|
+
nodes: workflow.nodes,
|
|
165
|
+
connections: workflow.connections,
|
|
166
|
+
authors,
|
|
167
|
+
autosaved: false,
|
|
168
|
+
...overrides,
|
|
169
|
+
});
|
|
170
|
+
if (withPublishHistory) {
|
|
171
|
+
await new Promise((res) => setTimeout(res, 1));
|
|
172
|
+
await di_1.Container.get(db_1.WorkflowPublishHistoryRepository).insert({
|
|
173
|
+
workflowId: workflow.id,
|
|
174
|
+
versionId: workflow.versionId,
|
|
175
|
+
event: 'activated',
|
|
176
|
+
userId: userOrProject instanceof db_1.User ? userOrProject.id : undefined,
|
|
177
|
+
...withPublishHistory,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function setActiveVersion(workflowId, versionId) {
|
|
182
|
+
await di_1.Container.get(db_1.WorkflowRepository)
|
|
183
|
+
.createQueryBuilder()
|
|
184
|
+
.update()
|
|
185
|
+
.set({ activeVersionId: versionId })
|
|
186
|
+
.where('id = :workflowId', { workflowId })
|
|
187
|
+
.execute();
|
|
188
|
+
}
|
|
189
|
+
async function createActiveWorkflow(attributes = {}, userOrProject) {
|
|
190
|
+
const workflow = await createWorkflowWithTriggerAndHistory({ active: true, ...attributes }, userOrProject, {});
|
|
191
|
+
await setActiveVersion(workflow.id, workflow.versionId);
|
|
192
|
+
workflow.activeVersionId = workflow.versionId;
|
|
193
|
+
return workflow;
|
|
194
|
+
}
|
|
195
|
+
//# 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
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Logger } from '@n8n/backend-common';
|
|
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';
|
|
9
|
+
export * from './migration-test-helpers';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.testModules = exports.testDb = exports.mockLogger = void 0;
|
|
40
|
+
const jest_mock_extended_1 = require("jest-mock-extended");
|
|
41
|
+
const mockLogger = () => (0, jest_mock_extended_1.mock)({ scoped: jest.fn().mockReturnValue((0, jest_mock_extended_1.mock)()) });
|
|
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);
|
|
49
|
+
__exportStar(require("./migration-test-helpers"), exports);
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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;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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"}
|
|
@@ -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;
|
package/dist/mocking.js
ADDED
|
@@ -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"}
|
package/dist/random.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ICredentialDataDecryptedObject } from 'n8n-workflow';
|
|
2
|
+
export type CredentialPayload = {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
data: ICredentialDataDecryptedObject;
|
|
6
|
+
isManaged?: boolean;
|
|
7
|
+
isGlobal?: boolean;
|
|
8
|
+
isResolvable?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const randomApiKey: () => string;
|
|
11
|
+
export declare const chooseRandomly: <T>(array: T[]) => T;
|
|
12
|
+
export declare const randomValidPassword: () => string;
|
|
13
|
+
export declare const randomInvalidPassword: () => string;
|
|
14
|
+
export declare const randomName: () => string;
|
|
15
|
+
export declare const randomEmail: () => string;
|
|
16
|
+
export declare const randomCredentialPayload: ({ isManaged, isGlobal, isResolvable, type, }?: {
|
|
17
|
+
isManaged?: boolean;
|
|
18
|
+
isGlobal?: boolean;
|
|
19
|
+
isResolvable?: boolean;
|
|
20
|
+
type?: string;
|
|
21
|
+
}) => CredentialPayload;
|
|
22
|
+
export declare const randomCredentialPayloadWithOauthTokenData: ({ isManaged, }?: {
|
|
23
|
+
isManaged?: boolean;
|
|
24
|
+
}) => CredentialPayload;
|
|
25
|
+
export declare const uniqueId: () => string;
|
package/dist/random.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
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, isGlobal, isResolvable, type, } = {}) => {
|
|
35
|
+
const payload = {
|
|
36
|
+
name: (0, exports.randomName)(),
|
|
37
|
+
type: type ?? 'githubApi',
|
|
38
|
+
data: { accessToken: (0, n8n_workflow_1.randomString)(6, 16) },
|
|
39
|
+
isManaged,
|
|
40
|
+
};
|
|
41
|
+
if (isGlobal !== undefined)
|
|
42
|
+
payload.isGlobal = isGlobal;
|
|
43
|
+
if (isResolvable !== undefined)
|
|
44
|
+
payload.isResolvable = isResolvable;
|
|
45
|
+
return payload;
|
|
46
|
+
};
|
|
47
|
+
exports.randomCredentialPayload = randomCredentialPayload;
|
|
48
|
+
const randomCredentialPayloadWithOauthTokenData = ({ isManaged = false, } = {}) => ({
|
|
49
|
+
name: (0, exports.randomName)(),
|
|
50
|
+
type: (0, exports.randomName)(),
|
|
51
|
+
data: { accessToken: (0, n8n_workflow_1.randomString)(6, 16), oauthTokenData: { access_token: (0, n8n_workflow_1.randomString)(6, 16) } },
|
|
52
|
+
isManaged,
|
|
53
|
+
});
|
|
54
|
+
exports.randomCredentialPayloadWithOauthTokenData = randomCredentialPayloadWithOauthTokenData;
|
|
55
|
+
const uniqueId = () => (0, uuid_1.v4)();
|
|
56
|
+
exports.uniqueId = uniqueId;
|
|
57
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../src/random.ts"],"names":[],"mappings":"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"}
|
|
@@ -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' | 'DataTable' | 'DataTableColumn' | 'ChatHubSession' | 'ChatHubMessage' | 'ChatHubAgent' | 'OAuthClient' | 'AuthorizationCode' | 'AccessToken' | 'RefreshToken' | 'UserConsent' | 'DynamicCredentialEntry' | 'DynamicCredentialResolver';
|
|
9
|
+
export declare function truncate(entities: EntityName[]): Promise<void>;
|
|
10
|
+
export {};
|