n8n-mcp
Version:
Integration between n8n workflow automation and Model Context Protocol (MCP)
240 lines • 8.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const workflow_diff_engine_1 = require("../services/workflow-diff-engine");
const logger_1 = require("../utils/logger");
const logger = new logger_1.Logger({ prefix: '[TestTransactionalDiff]' });
const testWorkflow = {
id: 'test-workflow-123',
name: 'Test Workflow',
active: false,
nodes: [
{
id: '1',
name: 'Webhook',
type: 'n8n-nodes-base.webhook',
typeVersion: 2,
position: [200, 300],
parameters: {
path: '/test',
method: 'GET'
}
}
],
connections: {},
settings: {
executionOrder: 'v1'
},
tags: []
};
async function testAddNodesAndConnect() {
logger.info('Test 1: Add two nodes and connect them in one operation');
const engine = new workflow_diff_engine_1.WorkflowDiffEngine();
const request = {
id: testWorkflow.id,
operations: [
{
type: 'addConnection',
source: 'Webhook',
target: 'Process Data'
},
{
type: 'addConnection',
source: 'Process Data',
target: 'Send Email'
},
{
type: 'addNode',
node: {
id: '2',
name: 'Process Data',
type: 'n8n-nodes-base.set',
typeVersion: 3,
position: [400, 300],
parameters: {
mode: 'manual',
fields: []
}
}
},
{
type: 'addNode',
node: {
id: '3',
name: 'Send Email',
type: 'n8n-nodes-base.emailSend',
typeVersion: 2.1,
position: [600, 300],
parameters: {
to: 'test@example.com',
subject: 'Test'
}
}
}
]
};
const result = await engine.applyDiff(testWorkflow, request);
if (result.success) {
logger.info('✅ Test passed! Operations applied successfully');
logger.info(`Message: ${result.message}`);
const workflow = result.workflow;
const hasProcessData = workflow.nodes.some((n) => n.name === 'Process Data');
const hasSendEmail = workflow.nodes.some((n) => n.name === 'Send Email');
if (hasProcessData && hasSendEmail) {
logger.info('✅ Both nodes were added');
}
else {
logger.error('❌ Nodes were not added correctly');
}
const webhookConnections = workflow.connections['Webhook'];
const processConnections = workflow.connections['Process Data'];
if (webhookConnections && processConnections) {
logger.info('✅ Connections were established');
}
else {
logger.error('❌ Connections were not established correctly');
}
}
else {
logger.error('❌ Test failed!');
logger.error('Errors:', result.errors);
}
}
async function testOperationLimit() {
logger.info('\nTest 2: Operation limit (max 5)');
const engine = new workflow_diff_engine_1.WorkflowDiffEngine();
const request = {
id: testWorkflow.id,
operations: [
{ type: 'addNode', node: { id: '101', name: 'Node1', type: 'n8n-nodes-base.set', typeVersion: 1, position: [400, 100], parameters: {} } },
{ type: 'addNode', node: { id: '102', name: 'Node2', type: 'n8n-nodes-base.set', typeVersion: 1, position: [400, 200], parameters: {} } },
{ type: 'addNode', node: { id: '103', name: 'Node3', type: 'n8n-nodes-base.set', typeVersion: 1, position: [400, 300], parameters: {} } },
{ type: 'addNode', node: { id: '104', name: 'Node4', type: 'n8n-nodes-base.set', typeVersion: 1, position: [400, 400], parameters: {} } },
{ type: 'addNode', node: { id: '105', name: 'Node5', type: 'n8n-nodes-base.set', typeVersion: 1, position: [400, 500], parameters: {} } },
{ type: 'addNode', node: { id: '106', name: 'Node6', type: 'n8n-nodes-base.set', typeVersion: 1, position: [400, 600], parameters: {} } }
]
};
const result = await engine.applyDiff(testWorkflow, request);
if (!result.success && result.errors?.[0]?.message.includes('Too many operations')) {
logger.info('✅ Operation limit enforced correctly');
}
else {
logger.error('❌ Operation limit not enforced');
}
}
async function testValidateOnly() {
logger.info('\nTest 3: Validate only mode');
const engine = new workflow_diff_engine_1.WorkflowDiffEngine();
const request = {
id: testWorkflow.id,
operations: [
{
type: 'addConnection',
source: 'Webhook',
target: 'HTTP Request'
},
{
type: 'addNode',
node: {
id: '4',
name: 'HTTP Request',
type: 'n8n-nodes-base.httpRequest',
typeVersion: 4.2,
position: [400, 300],
parameters: {
method: 'GET',
url: 'https://api.example.com'
}
}
},
{
type: 'updateSettings',
settings: {
saveDataErrorExecution: 'all'
}
}
],
validateOnly: true
};
const result = await engine.applyDiff(testWorkflow, request);
if (result.success) {
logger.info('✅ Validate-only mode works correctly');
logger.info(`Validation message: ${result.message}`);
if (testWorkflow.nodes.length === 1) {
logger.info('✅ Original workflow unchanged');
}
else {
logger.error('❌ Original workflow was modified in validate-only mode');
}
}
else {
logger.error('❌ Validate-only mode failed');
logger.error('Errors:', result.errors);
}
}
async function testMixedOperations() {
logger.info('\nTest 4: Mixed operations (update existing, add new, connect)');
const engine = new workflow_diff_engine_1.WorkflowDiffEngine();
const request = {
id: testWorkflow.id,
operations: [
{
type: 'updateNode',
nodeName: 'Webhook',
changes: {
'parameters.path': '/updated-path'
}
},
{
type: 'addNode',
node: {
id: '5',
name: 'Logger',
type: 'n8n-nodes-base.n8n',
typeVersion: 1,
position: [400, 300],
parameters: {
operation: 'log',
level: 'info'
}
}
},
{
type: 'addConnection',
source: 'Webhook',
target: 'Logger'
},
{
type: 'updateSettings',
settings: {
saveDataErrorExecution: 'all'
}
}
]
};
const result = await engine.applyDiff(testWorkflow, request);
if (result.success) {
logger.info('✅ Mixed operations applied successfully');
logger.info(`Message: ${result.message}`);
}
else {
logger.error('❌ Mixed operations failed');
logger.error('Errors:', result.errors);
}
}
async function runTests() {
logger.info('Starting transactional diff tests...\n');
try {
await testAddNodesAndConnect();
await testOperationLimit();
await testValidateOnly();
await testMixedOperations();
logger.info('\n✅ All tests completed!');
}
catch (error) {
logger.error('Test suite failed:', error);
}
}
if (require.main === module) {
runTests().catch(console.error);
}
//# sourceMappingURL=test-transactional-diff.js.map