n8n/packages/cli/test/integration/commands/update/workflow.test.ts
Tomi Turtiainen a4757cf009
chore: Initial V2 changes (#22553)
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: yehorkardash <yehor.kardash@n8n.io>
Co-authored-by: Daria <daria.staferova@n8n.io>
Co-authored-by: Svetoslav Dekov <svetoslav.dekov@n8n.io>
Co-authored-by: Nikhil Kuriakose <nikhilkuria@gmail.com>
Co-authored-by: Charlie Kolb <charlie@n8n.io>
2025-12-01 20:44:59 +02:00

129 lines
3.4 KiB
TypeScript

import {
mockInstance,
testDb,
createWorkflowWithTriggerAndHistory,
createManyActiveWorkflows,
getAllWorkflows,
} from '@n8n/backend-test-utils';
import { WorkflowRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { UpdateWorkflowCommand } from '@/commands/update/workflow';
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
import { setupTestCommand } from '@test-integration/utils/test-command';
mockInstance(LoadNodesAndCredentials);
const command = setupTestCommand(UpdateWorkflowCommand);
beforeEach(async () => {
await testDb.truncate(['WorkflowEntity', 'WorkflowHistory']);
});
test('update:workflow does not publish when trying to publish all workflows', async () => {
//
// ARRANGE
//
const workflows = await Promise.all([
createWorkflowWithTriggerAndHistory({}),
createWorkflowWithTriggerAndHistory({}),
]);
//
// ACT
//
await command.run(['--all', '--active=true']);
//
// ASSERT
//
// Verify workflows were NOT published (publishing all is no longer supported)
const workflowRepo = Container.get(WorkflowRepository);
const workflow1 = await workflowRepo.findOneBy({ id: workflows[0].id });
const workflow2 = await workflowRepo.findOneBy({ id: workflows[1].id });
expect(workflow1?.activeVersionId).toBeNull();
expect(workflow2?.activeVersionId).toBeNull();
});
test('update:workflow can unpublish all workflows', async () => {
//
// ARRANGE
//
const workflows = await createManyActiveWorkflows(2);
// Verify activeVersionId is set
const workflowRepo = Container.get(WorkflowRepository);
let workflow1 = await workflowRepo.findOneBy({ id: workflows[0].id });
let workflow2 = await workflowRepo.findOneBy({ id: workflows[1].id });
expect(workflow1?.activeVersionId).toBe(workflows[0].versionId);
expect(workflow2?.activeVersionId).toBe(workflows[1].versionId);
//
// ACT
//
await command.run(['--all', '--active=false']);
//
// ASSERT
//
// Verify activeVersionId is cleared
workflow1 = await workflowRepo.findOne({
where: { id: workflows[0].id },
relations: ['activeVersion'],
});
workflow2 = await workflowRepo.findOne({
where: { id: workflows[1].id },
relations: ['activeVersion'],
});
expect(workflow1?.activeVersionId).toBeNull();
expect(workflow1?.activeVersion).toBeNull();
expect(workflow2?.activeVersionId).toBeNull();
expect(workflow2?.activeVersion).toBeNull();
});
test('update:workflow publishes current version when --active=true (backwards compatibility)', async () => {
//
// ARRANGE
//
const workflow = await createWorkflowWithTriggerAndHistory();
//
// ACT
//
await command.run([`--id=${workflow.id}`, '--active=true']);
//
// ASSERT
//
// Verify workflow was published with current version
const workflowRepo = Container.get(WorkflowRepository);
const updatedWorkflow = await workflowRepo.findOneBy({ id: workflow.id });
expect(updatedWorkflow?.activeVersionId).toBe(workflow.versionId);
expect(updatedWorkflow?.active).toBe(true);
});
test('update:workflow can unpublish a specific workflow', async () => {
//
// ARRANGE
//
const workflows = (await createManyActiveWorkflows(2)).sort((wf1, wf2) =>
wf1.id.localeCompare(wf2.id),
);
//
// ACT
//
await command.run([`--id=${workflows[0].id}`, '--active=false']);
//
// ASSERT
//
const after = (await getAllWorkflows()).sort((wf1, wf2) => wf1.id.localeCompare(wf2.id));
expect(after).toMatchObject([
{ activeVersionId: null },
{ activeVersionId: workflows[1].versionId },
]);
});