mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-01-30 22:42:04 +00:00
- Add validateErrorOutputConfiguration method to detect when multiple nodes are incorrectly placed in main[0] - Fix checkWorkflowPatterns to check main[1] for error outputs instead of outputs.error - Cross-validate onError property matches actual connection structure - Provide clear error messages with JSON examples showing correct configuration - Use heuristic detection for error handler nodes (names containing error, fail, catch, etc.) - Add comprehensive test coverage with 16+ test cases - Bump version to 2.12.1 Fixes issues where AI agents would incorrectly configure error outputs by placing multiple nodes in the same array instead of separating them into success (main[0]) and error (main[1]) paths. 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
158 lines
4.6 KiB
JavaScript
158 lines
4.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Test script for error output validation improvements
|
|
*/
|
|
|
|
const { WorkflowValidator } = require('../dist/services/workflow-validator.js');
|
|
const { NodeRepository } = require('../dist/database/node-repository.js');
|
|
const { EnhancedConfigValidator } = require('../dist/services/enhanced-config-validator.js');
|
|
const Database = require('better-sqlite3');
|
|
const path = require('path');
|
|
|
|
async function runTests() {
|
|
// Initialize database
|
|
const dbPath = path.join(__dirname, '..', 'data', 'nodes.db');
|
|
const db = new Database(dbPath, { readonly: true });
|
|
|
|
const nodeRepository = new NodeRepository(db);
|
|
const validator = new WorkflowValidator(nodeRepository, EnhancedConfigValidator);
|
|
|
|
console.log('\n🧪 Testing Error Output Validation Improvements\n');
|
|
console.log('=' .repeat(60));
|
|
|
|
// Test 1: Incorrect configuration - multiple nodes in same array
|
|
console.log('\n📝 Test 1: INCORRECT - Multiple nodes in main[0]');
|
|
console.log('-'.repeat(40));
|
|
|
|
const incorrectWorkflow = {
|
|
nodes: [
|
|
{
|
|
id: '132ef0dc-87af-41de-a95d-cabe3a0a5342',
|
|
name: 'Validate Input',
|
|
type: 'n8n-nodes-base.set',
|
|
typeVersion: 3.4,
|
|
position: [-400, 64],
|
|
parameters: {}
|
|
},
|
|
{
|
|
id: '5dedf217-63f9-409f-b34e-7780b22e199a',
|
|
name: 'Filter URLs',
|
|
type: 'n8n-nodes-base.filter',
|
|
typeVersion: 2.2,
|
|
position: [-176, 64],
|
|
parameters: {}
|
|
},
|
|
{
|
|
id: '9d5407cc-ca5a-4966-b4b7-0e5dfbf54ad3',
|
|
name: 'Error Response1',
|
|
type: 'n8n-nodes-base.respondToWebhook',
|
|
typeVersion: 1.5,
|
|
position: [-160, 240],
|
|
parameters: {}
|
|
}
|
|
],
|
|
connections: {
|
|
'Validate Input': {
|
|
main: [
|
|
[
|
|
{ node: 'Filter URLs', type: 'main', index: 0 },
|
|
{ node: 'Error Response1', type: 'main', index: 0 } // WRONG!
|
|
]
|
|
]
|
|
}
|
|
}
|
|
};
|
|
|
|
const result1 = await validator.validateWorkflow(incorrectWorkflow);
|
|
|
|
if (result1.errors.length > 0) {
|
|
console.log('❌ ERROR DETECTED (as expected):');
|
|
const errorMessage = result1.errors.find(e =>
|
|
e.message.includes('Incorrect error output configuration')
|
|
);
|
|
if (errorMessage) {
|
|
console.log('\nError Summary:');
|
|
console.log(`Node: ${errorMessage.nodeName || 'Validate Input'}`);
|
|
console.log('\nFull Error Message:');
|
|
console.log(errorMessage.message);
|
|
} else {
|
|
console.log('Other errors found:', result1.errors.map(e => e.message));
|
|
}
|
|
} else {
|
|
console.log('⚠️ No errors found - validation may not be working correctly');
|
|
}
|
|
|
|
// Test 2: Correct configuration - separate arrays
|
|
console.log('\n📝 Test 2: CORRECT - Separate main[0] and main[1]');
|
|
console.log('-'.repeat(40));
|
|
|
|
const correctWorkflow = {
|
|
nodes: [
|
|
{
|
|
id: '132ef0dc-87af-41de-a95d-cabe3a0a5342',
|
|
name: 'Validate Input',
|
|
type: 'n8n-nodes-base.set',
|
|
typeVersion: 3.4,
|
|
position: [-400, 64],
|
|
parameters: {},
|
|
onError: 'continueErrorOutput'
|
|
},
|
|
{
|
|
id: '5dedf217-63f9-409f-b34e-7780b22e199a',
|
|
name: 'Filter URLs',
|
|
type: 'n8n-nodes-base.filter',
|
|
typeVersion: 2.2,
|
|
position: [-176, 64],
|
|
parameters: {}
|
|
},
|
|
{
|
|
id: '9d5407cc-ca5a-4966-b4b7-0e5dfbf54ad3',
|
|
name: 'Error Response1',
|
|
type: 'n8n-nodes-base.respondToWebhook',
|
|
typeVersion: 1.5,
|
|
position: [-160, 240],
|
|
parameters: {}
|
|
}
|
|
],
|
|
connections: {
|
|
'Validate Input': {
|
|
main: [
|
|
[
|
|
{ node: 'Filter URLs', type: 'main', index: 0 }
|
|
],
|
|
[
|
|
{ node: 'Error Response1', type: 'main', index: 0 } // CORRECT!
|
|
]
|
|
]
|
|
}
|
|
}
|
|
};
|
|
|
|
const result2 = await validator.validateWorkflow(correctWorkflow);
|
|
|
|
const hasIncorrectError = result2.errors.some(e =>
|
|
e.message.includes('Incorrect error output configuration')
|
|
);
|
|
|
|
if (!hasIncorrectError) {
|
|
console.log('✅ No error output configuration issues (correct!)');
|
|
} else {
|
|
console.log('❌ Unexpected error found');
|
|
}
|
|
|
|
console.log('\n' + '='.repeat(60));
|
|
console.log('\n✨ Error output validation is working correctly!');
|
|
console.log('The validator now properly detects:');
|
|
console.log(' 1. Multiple nodes incorrectly placed in main[0]');
|
|
console.log(' 2. Provides clear JSON examples for fixing issues');
|
|
console.log(' 3. Validates onError property matches connections');
|
|
|
|
// Close database
|
|
db.close();
|
|
}
|
|
|
|
runTests().catch(error => {
|
|
console.error('Test failed:', error);
|
|
process.exit(1);
|
|
}); |