UNPKG

n8n-mcp

Version:

Integration between n8n workflow automation and Model Context Protocol (MCP)

136 lines 6.47 kB
#!/usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const dotenv_1 = require("dotenv"); const logger_1 = require("../utils/logger"); const n8n_validation_1 = require("../services/n8n-validation"); (0, dotenv_1.config)(); function testCleanWorkflowFunctions() { logger_1.logger.info('Testing Issue #45 Fix: cleanWorkflowForUpdate should not add default settings\n'); logger_1.logger.info('=== Test 1: cleanWorkflowForUpdate without settings ==='); const workflowWithoutSettings = { id: 'test-123', name: 'Test Workflow', nodes: [], connections: {}, active: false, createdAt: '2024-01-01T00:00:00.000Z', updatedAt: '2024-01-01T00:00:00.000Z', versionId: 'version-123' }; const cleanedUpdate = (0, n8n_validation_1.cleanWorkflowForUpdate)(workflowWithoutSettings); if ('settings' in cleanedUpdate) { logger_1.logger.error('❌ FAIL: cleanWorkflowForUpdate added settings when it should not have'); logger_1.logger.error(' Found settings:', JSON.stringify(cleanedUpdate.settings)); } else { logger_1.logger.info('✅ PASS: cleanWorkflowForUpdate did not add settings'); } logger_1.logger.info('\n=== Test 2: cleanWorkflowForUpdate with existing settings ==='); const workflowWithSettings = { ...workflowWithoutSettings, settings: { executionOrder: 'v1', saveDataErrorExecution: 'none', saveDataSuccessExecution: 'none', saveManualExecutions: false, saveExecutionProgress: false } }; const cleanedUpdate2 = (0, n8n_validation_1.cleanWorkflowForUpdate)(workflowWithSettings); if ('settings' in cleanedUpdate2) { const settingsMatch = JSON.stringify(cleanedUpdate2.settings) === JSON.stringify(workflowWithSettings.settings); if (settingsMatch) { logger_1.logger.info('✅ PASS: cleanWorkflowForUpdate preserved existing settings without modification'); } else { logger_1.logger.error('❌ FAIL: cleanWorkflowForUpdate modified existing settings'); logger_1.logger.error(' Original:', JSON.stringify(workflowWithSettings.settings)); logger_1.logger.error(' Cleaned:', JSON.stringify(cleanedUpdate2.settings)); } } else { logger_1.logger.error('❌ FAIL: cleanWorkflowForUpdate removed existing settings'); } logger_1.logger.info('\n=== Test 3: cleanWorkflowForUpdate with partial settings ==='); const workflowWithPartialSettings = { ...workflowWithoutSettings, settings: { executionOrder: 'v1' } }; const cleanedUpdate3 = (0, n8n_validation_1.cleanWorkflowForUpdate)(workflowWithPartialSettings); if ('settings' in cleanedUpdate3) { const settingsKeys = cleanedUpdate3.settings ? Object.keys(cleanedUpdate3.settings) : []; const hasOnlyExecutionOrder = settingsKeys.length === 1 && cleanedUpdate3.settings?.executionOrder === 'v1'; if (hasOnlyExecutionOrder) { logger_1.logger.info('✅ PASS: cleanWorkflowForUpdate preserved partial settings without adding defaults'); } else { logger_1.logger.error('❌ FAIL: cleanWorkflowForUpdate added default properties to partial settings'); logger_1.logger.error(' Original keys:', Object.keys(workflowWithPartialSettings.settings || {})); logger_1.logger.error(' Cleaned keys:', settingsKeys); } } else { logger_1.logger.error('❌ FAIL: cleanWorkflowForUpdate removed partial settings'); } logger_1.logger.info('\n=== Test 4: cleanWorkflowForCreate should add default settings ==='); const newWorkflow = { name: 'New Workflow', nodes: [], connections: {} }; const cleanedCreate = (0, n8n_validation_1.cleanWorkflowForCreate)(newWorkflow); if ('settings' in cleanedCreate && cleanedCreate.settings) { const hasDefaults = cleanedCreate.settings.executionOrder === 'v1' && cleanedCreate.settings.saveDataErrorExecution === 'all' && cleanedCreate.settings.saveDataSuccessExecution === 'all' && cleanedCreate.settings.saveManualExecutions === true && cleanedCreate.settings.saveExecutionProgress === true; if (hasDefaults) { logger_1.logger.info('✅ PASS: cleanWorkflowForCreate correctly adds default settings'); } else { logger_1.logger.error('❌ FAIL: cleanWorkflowForCreate added settings but not with correct defaults'); logger_1.logger.error(' Settings:', JSON.stringify(cleanedCreate.settings)); } } else { logger_1.logger.error('❌ FAIL: cleanWorkflowForCreate did not add default settings'); } logger_1.logger.info('\n=== Test 5: cleanWorkflowForUpdate removes read-only fields ==='); const workflowWithReadOnly = { ...workflowWithoutSettings, staticData: { some: 'data' }, pinData: { node1: 'data' }, tags: ['tag1', 'tag2'], isArchived: true, usedCredentials: ['cred1'], sharedWithProjects: ['proj1'], triggerCount: 5, shared: true, active: true }; const cleanedReadOnly = (0, n8n_validation_1.cleanWorkflowForUpdate)(workflowWithReadOnly); const removedFields = [ 'id', 'createdAt', 'updatedAt', 'versionId', 'meta', 'staticData', 'pinData', 'tags', 'isArchived', 'usedCredentials', 'sharedWithProjects', 'triggerCount', 'shared', 'active' ]; const hasRemovedFields = removedFields.some(field => field in cleanedReadOnly); if (!hasRemovedFields) { logger_1.logger.info('✅ PASS: cleanWorkflowForUpdate correctly removed all read-only fields'); } else { const foundFields = removedFields.filter(field => field in cleanedReadOnly); logger_1.logger.error('❌ FAIL: cleanWorkflowForUpdate did not remove these fields:', foundFields); } logger_1.logger.info('\n=== Test Summary ==='); logger_1.logger.info('All tests completed. The fix ensures that cleanWorkflowForUpdate only removes fields'); logger_1.logger.info('without adding default settings, preventing the n8n API validation error.'); } testCleanWorkflowFunctions(); //# sourceMappingURL=test-issue-45-fix.js.map