mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-02-06 13:33:11 +00:00
feat: implement integration testing foundation (Phase 1)
Complete implementation of Phase 1 foundation for n8n API integration tests. Establishes core utilities, fixtures, and infrastructure for testing all 17 n8n API handlers against real n8n instance. Changes: - Add integration test environment configuration to .env.example - Create comprehensive test utilities infrastructure: * credentials.ts: Environment-aware credential management (local .env vs CI secrets) * n8n-client.ts: Singleton API client wrapper with health checks * test-context.ts: Resource tracking and automatic cleanup * cleanup-helpers.ts: Multi-level cleanup strategies (orphaned, age-based, tag-based) * fixtures.ts: 6 pre-built workflow templates (webhook, HTTP, multi-node, error handling, AI, expressions) * factories.ts: Dynamic node/workflow builders with 15+ factory functions * webhook-workflows.ts: Webhook workflow configs and setup instructions - Add npm scripts: * test:integration:n8n: Run n8n API integration tests * test:cleanup:orphans: Clean up orphaned test resources - Create cleanup script for CI/manual use Documentation: - Add comprehensive integration testing plan (550 lines) - Add Phase 1 completion summary with lessons learned Key Features: - Automatic credential detection (CI vs local) - Multi-level cleanup (test, suite, CI, orphan) - 6 workflow fixtures covering common scenarios - 15+ factory functions for dynamic test data - Support for 4 HTTP methods (GET, POST, PUT, DELETE) via pre-activated webhook workflows - TypeScript-first with full type safety - Comprehensive error handling with helpful messages Total: ~1,520 lines of production-ready code + 650 lines of documentation Ready for Phase 2: Workflow creation tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
169
tests/integration/n8n-api/utils/credentials.ts
Normal file
169
tests/integration/n8n-api/utils/credentials.ts
Normal file
@@ -0,0 +1,169 @@
|
||||
/**
|
||||
* Integration Test Credentials Management
|
||||
*
|
||||
* Provides environment-aware credential loading for integration tests.
|
||||
* - Local development: Reads from .env file
|
||||
* - CI/GitHub Actions: Uses GitHub secrets from process.env
|
||||
*/
|
||||
|
||||
import dotenv from 'dotenv';
|
||||
import path from 'path';
|
||||
|
||||
// Load .env file for local development
|
||||
dotenv.config({ path: path.resolve(process.cwd(), '.env') });
|
||||
|
||||
export interface N8nTestCredentials {
|
||||
url: string;
|
||||
apiKey: string;
|
||||
webhookWorkflows: {
|
||||
get: string;
|
||||
post: string;
|
||||
put: string;
|
||||
delete: string;
|
||||
};
|
||||
cleanup: {
|
||||
enabled: boolean;
|
||||
tag: string;
|
||||
namePrefix: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get n8n credentials for integration tests
|
||||
*
|
||||
* Automatically detects environment (local vs CI) and loads
|
||||
* credentials from the appropriate source.
|
||||
*
|
||||
* @returns N8nTestCredentials
|
||||
* @throws Error if required credentials are missing
|
||||
*/
|
||||
export function getN8nCredentials(): N8nTestCredentials {
|
||||
if (process.env.CI) {
|
||||
// CI: Use GitHub secrets
|
||||
return {
|
||||
url: process.env.N8N_URL!,
|
||||
apiKey: process.env.N8N_API_KEY!,
|
||||
webhookWorkflows: {
|
||||
get: process.env.N8N_TEST_WEBHOOK_GET_ID!,
|
||||
post: process.env.N8N_TEST_WEBHOOK_POST_ID!,
|
||||
put: process.env.N8N_TEST_WEBHOOK_PUT_ID!,
|
||||
delete: process.env.N8N_TEST_WEBHOOK_DELETE_ID!
|
||||
},
|
||||
cleanup: {
|
||||
enabled: true,
|
||||
tag: 'mcp-integration-test',
|
||||
namePrefix: '[MCP-TEST]'
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// Local: Use .env file
|
||||
return {
|
||||
url: process.env.N8N_API_URL!,
|
||||
apiKey: process.env.N8N_API_KEY!,
|
||||
webhookWorkflows: {
|
||||
get: process.env.N8N_TEST_WEBHOOK_GET_ID || '',
|
||||
post: process.env.N8N_TEST_WEBHOOK_POST_ID || '',
|
||||
put: process.env.N8N_TEST_WEBHOOK_PUT_ID || '',
|
||||
delete: process.env.N8N_TEST_WEBHOOK_DELETE_ID || ''
|
||||
},
|
||||
cleanup: {
|
||||
enabled: process.env.N8N_TEST_CLEANUP_ENABLED !== 'false',
|
||||
tag: process.env.N8N_TEST_TAG || 'mcp-integration-test',
|
||||
namePrefix: process.env.N8N_TEST_NAME_PREFIX || '[MCP-TEST]'
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that required credentials are present
|
||||
*
|
||||
* @param creds - Credentials to validate
|
||||
* @throws Error if required credentials are missing
|
||||
*/
|
||||
export function validateCredentials(creds: N8nTestCredentials): void {
|
||||
const missing: string[] = [];
|
||||
|
||||
if (!creds.url) {
|
||||
missing.push(process.env.CI ? 'N8N_URL' : 'N8N_API_URL');
|
||||
}
|
||||
if (!creds.apiKey) {
|
||||
missing.push('N8N_API_KEY');
|
||||
}
|
||||
|
||||
if (missing.length > 0) {
|
||||
throw new Error(
|
||||
`Missing required n8n credentials: ${missing.join(', ')}\n\n` +
|
||||
`Please set the following environment variables:\n` +
|
||||
missing.map(v => ` ${v}`).join('\n') + '\n\n' +
|
||||
`See .env.example for configuration details.`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that webhook workflow IDs are configured
|
||||
*
|
||||
* @param creds - Credentials to validate
|
||||
* @throws Error with setup instructions if webhook workflows are missing
|
||||
*/
|
||||
export function validateWebhookWorkflows(creds: N8nTestCredentials): void {
|
||||
const missing: string[] = [];
|
||||
|
||||
if (!creds.webhookWorkflows.get) missing.push('GET');
|
||||
if (!creds.webhookWorkflows.post) missing.push('POST');
|
||||
if (!creds.webhookWorkflows.put) missing.push('PUT');
|
||||
if (!creds.webhookWorkflows.delete) missing.push('DELETE');
|
||||
|
||||
if (missing.length > 0) {
|
||||
const envVars = missing.map(m => `N8N_TEST_WEBHOOK_${m}_ID`);
|
||||
|
||||
throw new Error(
|
||||
`Missing webhook workflow IDs for HTTP methods: ${missing.join(', ')}\n\n` +
|
||||
`Webhook testing requires pre-activated workflows in n8n.\n` +
|
||||
`n8n API doesn't support workflow activation, so these must be created manually.\n\n` +
|
||||
`Setup Instructions:\n` +
|
||||
`1. Create ${missing.length} workflow(s) in your n8n instance\n` +
|
||||
`2. Each workflow should have a single Webhook node\n` +
|
||||
`3. Configure webhook paths:\n` +
|
||||
missing.map(m => ` - ${m}: mcp-test-${m.toLowerCase()}`).join('\n') + '\n' +
|
||||
`4. ACTIVATE each workflow in n8n UI\n` +
|
||||
`5. Set the following environment variables with workflow IDs:\n` +
|
||||
envVars.map(v => ` ${v}=<workflow-id>`).join('\n') + '\n\n' +
|
||||
`See docs/local/integration-testing-plan.md for detailed instructions.`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if credentials are configured (non-throwing version)
|
||||
*
|
||||
* @returns true if basic credentials are available
|
||||
*/
|
||||
export function hasCredentials(): boolean {
|
||||
try {
|
||||
const creds = getN8nCredentials();
|
||||
return !!(creds.url && creds.apiKey);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if webhook workflows are configured (non-throwing version)
|
||||
*
|
||||
* @returns true if all webhook workflow IDs are available
|
||||
*/
|
||||
export function hasWebhookWorkflows(): boolean {
|
||||
try {
|
||||
const creds = getN8nCredentials();
|
||||
return !!(
|
||||
creds.webhookWorkflows.get &&
|
||||
creds.webhookWorkflows.post &&
|
||||
creds.webhookWorkflows.put &&
|
||||
creds.webhookWorkflows.delete
|
||||
);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user