n8n/packages/cli/test/integration/executions.controller.test.ts

107 lines
3.5 KiB
TypeScript

import type { User } from '@db/entities/User';
import { createSuccessfulExecution, getAllExecutions } from './shared/db/executions';
import { createMember, createOwner } from './shared/db/users';
import { createWorkflow, shareWorkflowWithUsers } from './shared/db/workflows';
import * as testDb from './shared/testDb';
import { setupTestServer } from './shared/utils';
import { mockInstance } from '../shared/mocking';
import { ConcurrencyControlService } from '@/concurrency/concurrency-control.service';
import { WaitTracker } from '@/WaitTracker';
import { createTeamProject, linkUserToProject } from './shared/db/projects';
mockInstance(WaitTracker);
mockInstance(ConcurrencyControlService, { isEnabled: false });
const testServer = setupTestServer({ endpointGroups: ['executions'] });
let owner: User;
let member: User;
const saveExecution = async ({ belongingTo }: { belongingTo: User }) => {
const workflow = await createWorkflow({}, belongingTo);
return await createSuccessfulExecution(workflow);
};
beforeEach(async () => {
await testDb.truncate(['Execution', 'Workflow', 'SharedWorkflow']);
testServer.license.reset();
owner = await createOwner();
member = await createMember();
});
describe('GET /executions', () => {
test('only returns executions of shared workflows if sharing is enabled', async () => {
const workflow = await createWorkflow({}, owner);
await shareWorkflowWithUsers(workflow, [member]);
await createSuccessfulExecution(workflow);
const response1 = await testServer.authAgentFor(member).get('/executions').expect(200);
expect(response1.body.data.count).toBe(0);
testServer.license.enable('feat:sharing');
const response2 = await testServer.authAgentFor(member).get('/executions').expect(200);
expect(response2.body.data.count).toBe(1);
});
});
describe('GET /executions/:id', () => {
test('project viewers can view executions for workflows in the project', async () => {
// if sharing is not enabled, we're only returning the executions of
// personal workflows
testServer.license.enable('feat:sharing');
const teamProject = await createTeamProject();
await linkUserToProject(member, teamProject, 'project:viewer');
const workflow = await createWorkflow({}, teamProject);
const execution = await createSuccessfulExecution(workflow);
const response = await testServer.authAgentFor(member).get(`/executions/${execution.id}`);
expect(response.statusCode).toBe(200);
expect(response.body.data).toBeDefined();
});
test('only returns executions of shared workflows if sharing is enabled', async () => {
const workflow = await createWorkflow({}, owner);
await shareWorkflowWithUsers(workflow, [member]);
const execution = await createSuccessfulExecution(workflow);
await testServer.authAgentFor(member).get(`/executions/${execution.id}`).expect(404);
testServer.license.enable('feat:sharing');
const response = await testServer
.authAgentFor(member)
.get(`/executions/${execution.id}`)
.expect(200);
expect(response.body.data.id).toBe(execution.id);
});
});
describe('POST /executions/delete', () => {
test('should hard-delete an execution', async () => {
await saveExecution({ belongingTo: owner });
const response = await testServer.authAgentFor(owner).get('/executions').expect(200);
expect(response.body.data.count).toBe(1);
const [execution] = response.body.data.results;
await testServer
.authAgentFor(owner)
.post('/executions/delete')
.send({ ids: [execution.id] })
.expect(200);
const executions = await getAllExecutions();
expect(executions).toHaveLength(0);
});
});