
N8n Integration Testing Patterns
- 101 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
n8n-integration-testing-patterns is a Claude Code skill for testing & qa.
About
n8n-integration-testing-patterns is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted development.
- n8n-integration-testing-patterns
- Testing & QA
- AI-coding skill
N8n Integration Testing Patterns by the numbers
- 101 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #998 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill n8n-integration-testing-patternsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 101 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
How do I helps with testing & qa tasks.?
Helps with testing & qa tasks.
Who is it for?
Best when you're working on testing & qa and need structured help with n8n integration testing patterns.
Skip if: Teams with no testing & qa needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with testing & qa tasks., or when n8n-integration-testing-patterns is a claude code skill for testing & qa.
What you get
Structured output aligned to n8n-integration-testing-patterns: n8n-integration-testing-patterns, Testing & QA.
Files
n8n Integration Testing Patterns
<default_to_action> When testing n8n integrations: 1. VERIFY connectivity and authentication 2. TEST all configured operations 3. VALIDATE API response handling 4. CHECK rate limit behavior 5. CONFIRM error handling works
Quick Integration Checklist:
- Credentials valid and not expired
- API permissions sufficient for operations
- Rate limits understood and respected
- Error responses properly handled
- Data formats match API expectations
Critical Success Factors:
- Test in isolation before workflow integration
- Verify OAuth token refresh works
- Check API version compatibility
- Monitor rate limit headers
</default_to_action>
Quick Reference Card
Common n8n Integrations
| Category | Services | Auth Type |
|---|---|---|
| Communication | Slack, Teams, Discord | OAuth2, Webhook |
| Data Storage | Google Sheets, Airtable | OAuth2, API Key |
| CRM | Salesforce, HubSpot | OAuth2 |
| Dev Tools | GitHub, Jira, Linear | OAuth2, API Key |
| Marketing | Mailchimp, SendGrid | API Key |
Authentication Types
| Type | Setup | Refresh |
|---|---|---|
| OAuth2 | User authorization flow | Automatic token refresh |
| API Key | Manual key entry | Manual rotation |
| Basic Auth | Username/password | No refresh needed |
| Header Auth | Custom header | Manual rotation |
---
Connectivity Testing
// Test integration connectivity
async function testIntegrationConnectivity(nodeName: string): Promise<ConnectivityResult> {
const node = await getNodeConfig(nodeName);
// Check credential exists
if (!node.credentials) {
return { connected: false, error: 'No credentials configured' };
}
// Test based on integration type
switch (getIntegrationType(node.type)) {
case 'slack':
return await testSlackConnectivity(node.credentials);
case 'google-sheets':
return await testGoogleSheetsConnectivity(node.credentials);
case 'jira':
return await testJiraConnectivity(node.credentials);
case 'github':
return await testGitHubConnectivity(node.credentials);
default:
return await testGenericAPIConnectivity(node);
}
}
// Slack connectivity test
async function testSlackConnectivity(credentials: any): Promise<ConnectivityResult> {
try {
const response = await fetch('https://slack.com/api/auth.test', {
headers: { 'Authorization': `Bearer ${credentials.accessToken}` }
});
const data = await response.json();
return {
connected: data.ok,
workspace: data.team,
user: data.user,
scopes: data.response_metadata?.scopes || []
};
} catch (error) {
return { connected: false, error: error.message };
}
}
// Google Sheets connectivity test
async function testGoogleSheetsConnectivity(credentials: any): Promise<ConnectivityResult> {
try {
const response = await fetch('https://www.googleapis.com/drive/v3/about?fields=user', {
headers: { 'Authorization': `Bearer ${credentials.accessToken}` }
});
if (response.status === 401) {
// Try refresh
const refreshed = await refreshOAuthToken(credentials);
if (refreshed) {
return testGoogleSheetsConnectivity({ ...credentials, accessToken: refreshed });
}
return { connected: false, error: 'Token expired, refresh failed' };
}
const data = await response.json();
return { connected: true, user: data.user };
} catch (error) {
return { connected: false, error: error.message };
}
}---
API Operation Testing
// Test integration operations
async function testIntegrationOperations(nodeName: string): Promise<OperationResult[]> {
const node = await getNodeConfig(nodeName);
const operations = getNodeOperations(node.type);
const results: OperationResult[] = [];
for (const operation of operations) {
const testData = generateTestData(node.type, operation);
try {
const startTime = Date.now();
const response = await executeOperation(node, operation, testData);
results.push({
operation,
success: true,
responseTime: Date.now() - startTime,
responseStatus: response.status,
dataValid: validateResponseData(response.data, operation)
});
} catch (error) {
results.push({
operation,
success: false,
error: error.message,
errorType: classifyError(error)
});
}
}
return results;
}
// Generate test data for operations
function generateTestData(nodeType: string, operation: string): any {
const testDataMap = {
'slack': {
'postMessage': {
channel: 'C123456',
text: 'Test message from n8n integration test'
},
'uploadFile': {
channels: 'C123456',
content: 'Test file content',
filename: 'test.txt'
}
},
'google-sheets': {
'appendData': {
spreadsheetId: 'test-spreadsheet-id',
range: 'Sheet1!A:Z',
values: [['Test', 'Data', new Date().toISOString()]]
},
'readRows': {
spreadsheetId: 'test-spreadsheet-id',
range: 'Sheet1!A1:Z10'
}
},
'jira': {
'createIssue': {
project: 'TEST',
issueType: 'Task',
summary: 'Test issue from n8n',
description: 'Created by integration test'
},
'updateIssue': {
issueKey: 'TEST-1',
fields: { summary: 'Updated by n8n test' }
}
}
};
return testDataMap[nodeType]?.[operation] || {};
}---
Authentication Testing
OAuth2 Flow Testing
// Test OAuth2 authentication
async function testOAuth2Authentication(credentials: any): Promise<OAuth2Result> {
const result: OAuth2Result = {
tokenValid: false,
refreshWorking: false,
scopes: [],
expiresIn: 0
};
// Test current token
const tokenTest = await testAccessToken(credentials.accessToken);
result.tokenValid = tokenTest.valid;
result.scopes = tokenTest.scopes;
// Check expiration
if (credentials.expiresAt) {
result.expiresIn = new Date(credentials.expiresAt).getTime() - Date.now();
result.expiresSoon = result.expiresIn < 3600000; // Less than 1 hour
}
// Test refresh token
if (credentials.refreshToken) {
try {
const newToken = await refreshOAuthToken(credentials);
result.refreshWorking = !!newToken;
} catch (error) {
result.refreshError = error.message;
}
}
return result;
}
// Test required scopes
async function testRequiredScopes(credentials: any, requiredScopes: string[]): Promise<ScopeResult> {
const currentScopes = await getTokenScopes(credentials.accessToken);
const missingScopes = requiredScopes.filter(s => !currentScopes.includes(s));
return {
hasAllScopes: missingScopes.length === 0,
currentScopes,
missingScopes,
recommendation: missingScopes.length > 0
? `Re-authorize with scopes: ${missingScopes.join(', ')}`
: null
};
}API Key Testing
// Test API key validity
async function testAPIKey(integration: string, apiKey: string): Promise<APIKeyResult> {
const endpoints = {
'sendgrid': 'https://api.sendgrid.com/v3/user/profile',
'mailchimp': 'https://us1.api.mailchimp.com/3.0/ping',
'airtable': 'https://api.airtable.com/v0/meta/whoami'
};
const endpoint = endpoints[integration];
if (!endpoint) {
return { valid: false, error: 'Unknown integration' };
}
try {
const response = await fetch(endpoint, {
headers: { 'Authorization': `Bearer ${apiKey}` }
});
return {
valid: response.status === 200,
status: response.status,
rateLimit: extractRateLimitInfo(response.headers)
};
} catch (error) {
return { valid: false, error: error.message };
}
}---
Rate Limit Testing
// Test rate limit handling
async function testRateLimits(nodeName: string, requestCount: number): Promise<RateLimitResult> {
const results: RequestResult[] = [];
let rateLimitHit = false;
let retryAfter = 0;
for (let i = 0; i < requestCount; i++) {
const startTime = Date.now();
const response = await makeRequest(nodeName);
results.push({
requestNumber: i + 1,
status: response.status,
responseTime: Date.now() - startTime,
rateLimitRemaining: response.headers['x-ratelimit-remaining'],
rateLimitLimit: response.headers['x-ratelimit-limit']
});
if (response.status === 429) {
rateLimitHit = true;
retryAfter = parseInt(response.headers['retry-after'] || '60');
break;
}
// Small delay between requests
await sleep(100);
}
return {
requestsMade: results.length,
rateLimitHit,
retryAfter,
results,
recommendation: rateLimitHit
? `Implement exponential backoff, retry after ${retryAfter}s`
: 'Rate limit not reached, consider increasing request count for thorough testing'
};
}
// Extract rate limit info from headers
function extractRateLimitInfo(headers: Headers): RateLimitInfo {
return {
limit: headers.get('x-ratelimit-limit'),
remaining: headers.get('x-ratelimit-remaining'),
reset: headers.get('x-ratelimit-reset'),
retryAfter: headers.get('retry-after')
};
}---
Error Handling Testing
// Test error scenarios
async function testErrorScenarios(nodeName: string): Promise<ErrorTestResult[]> {
const scenarios = [
{ name: 'Invalid credentials', modify: { credentials: null } },
{ name: 'Invalid endpoint', modify: { url: 'https://invalid.example.com' } },
{ name: 'Timeout', modify: { timeout: 1 } },
{ name: 'Invalid data', modify: { data: { invalid: true } } },
{ name: 'Not found', modify: { resourceId: 'nonexistent-123' } },
{ name: 'Permission denied', modify: { scope: 'read-only' } }
];
const results: ErrorTestResult[] = [];
for (const scenario of scenarios) {
try {
const response = await executeWithModification(nodeName, scenario.modify);
results.push({
scenario: scenario.name,
errorHandled: response.status >= 400,
errorCode: response.status,
errorMessage: response.data?.error?.message,
retried: response.metadata?.retryCount > 0
});
} catch (error) {
results.push({
scenario: scenario.name,
errorHandled: true,
exceptionThrown: true,
errorType: error.constructor.name,
errorMessage: error.message
});
}
}
return results;
}
// Classify error types
function classifyError(error: any): string {
if (error.status === 401 || error.status === 403) return 'authentication';
if (error.status === 404) return 'not-found';
if (error.status === 429) return 'rate-limit';
if (error.status >= 500) return 'server-error';
if (error.code === 'ETIMEDOUT') return 'timeout';
if (error.code === 'ECONNREFUSED') return 'connection';
return 'unknown';
}---
Integration-Specific Patterns
Slack Integration
const slackTestPatterns = {
// Test message posting
testPostMessage: async (credentials) => {
return await fetch('https://slack.com/api/chat.postMessage', {
method: 'POST',
headers: {
'Authorization': `Bearer ${credentials.accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
channel: 'C123456',
text: 'Integration test message'
})
});
},
// Test file upload
testFileUpload: async (credentials) => {
const formData = new FormData();
formData.append('channels', 'C123456');
formData.append('content', 'Test file content');
formData.append('filename', 'test.txt');
return await fetch('https://slack.com/api/files.upload', {
method: 'POST',
headers: { 'Authorization': `Bearer ${credentials.accessToken}` },
body: formData
});
},
// Validate required scopes
requiredScopes: ['chat:write', 'files:write', 'channels:read']
};Google Sheets Integration
const googleSheetsTestPatterns = {
// Test read operation
testReadRows: async (credentials, spreadsheetId) => {
return await fetch(
`https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/Sheet1!A1:Z10`,
{ headers: { 'Authorization': `Bearer ${credentials.accessToken}` } }
);
},
// Test append operation
testAppendRow: async (credentials, spreadsheetId, values) => {
return await fetch(
`https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/Sheet1!A:Z:append?valueInputOption=USER_ENTERED`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${credentials.accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ values: [values] })
}
);
},
// Required scopes
requiredScopes: ['https://www.googleapis.com/auth/spreadsheets']
};---
Test Report Template
# Integration Test Report
## Summary
| Integration | Status | Auth | Operations | Errors |
|-------------|--------|------|------------|--------|
| Slack | PASS | OK | 4/4 | 0 |
| Google Sheets | WARN | Expiring | 3/3 | 0 |
| Jira | FAIL | OK | 2/4 | 2 |
## Authentication Status
- Slack: OAuth2 valid, expires in 28 days
- Google Sheets: OAuth2 expires in 2 hours - REFRESH RECOMMENDED
- Jira: API Key valid
## Rate Limit Status
| Integration | Limit | Used | Remaining |
|-------------|-------|------|-----------|
| Slack | 50/min | 12 | 38 |
| Google Sheets | 100/min | 45 | 55 |
| Jira | 100/min | 8 | 92 |
## Failed Operations
### Jira: Transition Issue
- Error: Invalid transition for current state
- Fix: Check workflow transitions in Jira
## Recommendations
1. Refresh Google Sheets OAuth token before expiration
2. Fix Jira workflow transition logic---
Related Skills
- n8n-workflow-testing-fundamentals
- n8n-security-testing
- api-testing-patterns
---
Remember
n8n integrates with 400+ services, each with unique authentication, rate limits, and API quirks. Testing requires:
- Connectivity verification
- Authentication validation (OAuth refresh, API key expiry)
- Operation testing with realistic data
- Rate limit awareness
- Error handling verification
With Agents: Use n8n-integration-test for comprehensive integration testing. Coordinate with n8n-workflow-executor to test integrations in context.
# =============================================================================
# AQE Skill Evaluation Test Suite: n8n Integration Testing Patterns v1.0.0
# =============================================================================
#
# Comprehensive evaluation suite for n8n integration testing patterns.
# Tests API contract validation, authentication testing, rate limiting,
# response handling, and cross-service data consistency.
#
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
# Validator: .claude/skills/n8n-integration-testing-patterns/scripts/validate-config.json
#
# Coverage:
# - API contract validation (request/response schemas)
# - Authentication and authorization testing
# - Rate limiting and throttling
# - Error response handling
# - Cross-service data consistency
# - Integration scenario testing
#
# =============================================================================
skill: n8n-integration-testing-patterns
version: 1.0.0
description: >
Comprehensive evaluation suite for n8n integration testing patterns.
Tests API contract validation, authentication flows, rate limit handling,
error responses, and cross-service data consistency for reliable
n8n workflow integrations.
# =============================================================================
# Multi-Model Configuration
# =============================================================================
models_to_test:
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
# =============================================================================
# MCP Integration Configuration
# =============================================================================
mcp_integration:
enabled: true
namespace: skill-validation
query_patterns: true
track_outcomes: true
store_patterns: true
share_learning: true
update_quality_gate: true
target_agents:
- qe-learning-coordinator
- qe-queen-coordinator
- n8n-integration-test
# =============================================================================
# ReasoningBank Learning Configuration
# =============================================================================
learning:
store_success_patterns: true
store_failure_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
cross_model_comparison: true
# =============================================================================
# Result Format Configuration
# =============================================================================
result_format:
json_output: true
markdown_report: true
include_raw_output: false
include_timing: true
include_token_usage: true
# =============================================================================
# Environment Setup
# =============================================================================
setup:
required_tools:
- jq
environment_variables:
INTEGRATION_TESTING: "true"
MOCK_EXTERNAL_SERVICES: "true"
# =============================================================================
# TEST CASES
# =============================================================================
test_cases:
# ---------------------------------------------------------------------------
# CATEGORY: API Contract Validation
# ---------------------------------------------------------------------------
- id: tc001_request_schema_validation
description: "Validate outgoing request matches API contract"
category: contracts
priority: critical
input:
api_endpoint: "https://api.example.com/users"
contract:
method: POST
request_schema:
type: object
required: ["name", "email"]
properties:
name: { type: string }
email: { type: string, format: email }
age: { type: integer, minimum: 0 }
actual_request:
method: POST
body:
name: "John Doe"
email: "john@example.com"
age: 30
context:
validation_mode: strict
expected_output:
must_contain:
- "contract"
- "valid"
- "schema"
- "matches"
must_not_contain:
- "violation"
severity_classification: info
finding_count:
max: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
timeout_ms: 30000
- id: tc002_response_schema_validation
description: "Validate API response matches contract"
category: contracts
priority: critical
input:
api_endpoint: "https://api.example.com/users/123"
contract:
response_schema:
type: object
required: ["id", "name", "email", "created_at"]
properties:
id: { type: integer }
name: { type: string }
email: { type: string, format: email }
created_at: { type: string, format: date-time }
actual_response:
id: 123
name: "John Doe"
email: "john@example.com"
created_at: "2025-02-02T10:00:00Z"
context:
validation: "strict_schema"
expected_output:
must_contain:
- "response"
- "valid"
- "schema"
must_not_contain:
- "missing"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc003_contract_violation_detection
description: "Detect API contract violations"
category: contracts
priority: critical
input:
expected_contract:
response_fields:
- name: "id"
type: integer
- name: "status"
type: string
enum: ["active", "inactive"]
actual_response:
id: 123
status: "unknown" # Violates enum
extra_field: "not_in_contract"
issues_detected:
- contract_violation: "status value not in enum"
- missing_field: false
context:
strictness: "enforce_contract"
expected_output:
must_contain:
- "violation"
- "contract"
- "detected"
must_not_contain:
- "valid"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.85
# ---------------------------------------------------------------------------
# CATEGORY: Authentication Testing
# ---------------------------------------------------------------------------
- id: tc004_api_key_authentication
description: "Test API key authentication flow"
category: authentication
priority: critical
input:
auth_type: "API Key"
test_cases:
- request: "with valid API key"
headers:
Authorization: "Bearer valid_key_12345"
expected: 200
status: passing
- request: "with invalid API key"
headers:
Authorization: "Bearer invalid_key"
expected: 401
status: passing
- request: "without API key"
headers: {}
expected: 401
status: passing
context:
standard: "Bearer token"
expected_output:
must_contain:
- "authentication"
- "API key"
- "tested"
- "401"
must_not_contain:
- "failed"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
- id: tc005_oauth_flow_validation
description: "Validate OAuth 2.0 authentication flow"
category: authentication
priority: critical
input:
oauth_config:
grant_type: "authorization_code"
scopes: ["read:user", "write:repo"]
token_endpoint: "https://api.github.com/login/oauth/access_token"
flow_validation:
- step: "Authorization request"
status: valid
- step: "Token exchange"
status: valid
- step: "Refresh token"
status: valid
context:
provider: "GitHub"
expected_output:
must_contain:
- "OAuth"
- "flow"
- "valid"
- "authorization"
must_not_contain:
- "invalid"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
# ---------------------------------------------------------------------------
# CATEGORY: Rate Limiting and Throttling
# ---------------------------------------------------------------------------
- id: tc006_rate_limit_handling
description: "Test rate limit detection and handling"
category: rate_limiting
priority: high
input:
rate_limit_config:
requests_per_minute: 60
burst_limit: 10
test_scenario:
- requests: 55
response: 200
status: "within_limit"
- requests: 65
response: 429
status: "rate_limited"
- requests_burst: 12
response: 429
status: "burst_exceeded"
context:
recovery: "retry_after_header"
expected_output:
must_contain:
- "rate"
- "limit"
- "429"
- "handled"
must_not_contain:
- "failed"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc007_exponential_backoff_retry
description: "Verify exponential backoff retry strategy"
category: rate_limiting
priority: high
input:
retry_strategy:
max_retries: 3
initial_delay_ms: 100
backoff_multiplier: 2
max_delay_ms: 10000
execution:
- attempt: 1
delay_ms: 100
status: fail
- attempt: 2
delay_ms: 200
status: fail
- attempt: 3
delay_ms: 400
status: success
context:
strategy: "exponential_backoff"
expected_output:
must_contain:
- "backoff"
- "retry"
- "exponential"
must_not_contain:
- "failed"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Error Handling
# ---------------------------------------------------------------------------
- id: tc008_http_error_responses
description: "Handle various HTTP error responses"
category: error_handling
priority: critical
input:
error_cases:
- status_code: 400
error: "Bad Request"
handling: "validate input and retry"
- status_code: 401
error: "Unauthorized"
handling: "refresh credentials"
- status_code: 403
error: "Forbidden"
handling: "log and skip"
- status_code: 429
error: "Too Many Requests"
handling: "wait and retry"
- status_code: 500
error: "Server Error"
handling: "retry with backoff"
- status_code: 503
error: "Service Unavailable"
handling: "retry later"
context:
all_handled: true
expected_output:
must_contain:
- "error"
- "handling"
- "responses"
must_not_contain:
- "unhandled"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
# ---------------------------------------------------------------------------
# CATEGORY: Cross-Service Data Consistency
# ---------------------------------------------------------------------------
- id: tc009_data_sync_validation
description: "Verify data consistency across services"
category: consistency
priority: high
input:
services:
- name: "User Service"
user_id: 123
email: "user@example.com"
updated_at: "2025-02-02T10:00:00Z"
- name: "Profile Service"
user_id: 123
email: "user@example.com"
updated_at: "2025-02-02T10:00:00Z"
- name: "Notification Service"
user_id: 123
email: "user@example.com"
updated_at: "2025-02-02T10:00:00Z"
consistency_check: "data_matches"
context:
requirement: "all_services_synchronized"
expected_output:
must_contain:
- "consistency"
- "data"
- "synchronized"
must_not_contain:
- "mismatch"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc010_integration_scenario_e2e
description: "End-to-end integration scenario test"
category: integration
priority: high
input:
scenario: "User signup flow"
steps:
- step: 1
action: "User registers"
service: "Auth Service"
status: "success"
- step: 2
action: "Profile created"
service: "Profile Service"
status: "success"
- step: 3
action: "Welcome email sent"
service: "Email Service"
status: "success"
- step: 4
action: "Analytics recorded"
service: "Analytics Service"
status: "success"
overall_status: "passed"
context:
end_to_end: true
expected_output:
must_contain:
- "integration"
- "scenario"
- "passed"
- "e2e"
must_not_contain:
- "failed"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.75
# =============================================================================
# SUCCESS CRITERIA
# =============================================================================
success_criteria:
pass_rate: 0.85
critical_pass_rate: 1.0
avg_reasoning_quality: 0.75
max_execution_time_ms: 300000
cross_model_variance: 0.15
# =============================================================================
# METADATA
# =============================================================================
metadata:
author: "n8n-integration-test"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: >
n8n integration testing patterns including API contract validation
(request/response schemas), authentication testing (API keys, OAuth),
rate limiting and exponential backoff retry, HTTP error handling,
data consistency across services, and end-to-end integration scenarios.
10 test cases with 85% pass rate and 100% critical pass rate.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://agentic-qe.dev/schemas/skills/n8n-integration-testing-patterns/output.json",
"title": "N8N Integration Testing Patterns Skill Output Schema",
"description": "Schema for n8n-integration-testing-patterns skill output. Validates service integration, API connectivity, and workflow integration testing.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "n8n-integration-testing-patterns"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"const": 3
},
"output": {
"type": "object",
"required": ["summary", "integrationTests", "serviceConnections"],
"properties": {
"summary": {
"type": "string",
"minLength": 20,
"maxLength": 2000
},
"integrationTests": {
"type": "array",
"items": {
"$ref": "#/$defs/integrationTest"
},
"maxItems": 300
},
"serviceConnections": {
"type": "array",
"items": {
"$ref": "#/$defs/serviceConnection"
},
"maxItems": 100
},
"workflowValidation": {
"$ref": "#/$defs/workflowValidation"
},
"mockConfigurations": {
"type": "array",
"items": {
"$ref": "#/$defs/mockConfig"
},
"description": "Mock service configurations for testing"
},
"contractTests": {
"type": "array",
"items": {
"$ref": "#/$defs/contractTest"
},
"description": "API contract tests"
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 50
},
"metrics": {
"$ref": "#/$defs/metrics"
}
}
},
"metadata": {
"$ref": "#/$defs/metadata"
},
"validation": {
"$ref": "#/$defs/validationResult"
},
"learning": {
"$ref": "#/$defs/learningData"
}
},
"$defs": {
"integrationTest": {
"type": "object",
"required": ["id", "name", "testType", "status"],
"properties": {
"id": {
"type": "string",
"pattern": "^INT-\\d{3,6}$"
},
"name": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 1000
},
"testType": {
"type": "string",
"enum": ["api", "webhook", "database", "file", "queue", "external-service", "e2e"]
},
"status": {
"type": "string",
"enum": ["passed", "failed", "skipped", "pending", "error"]
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"]
},
"nodes": {
"type": "array",
"items": { "type": "string" },
"description": "Nodes involved in this integration test"
},
"services": {
"type": "array",
"items": { "type": "string" },
"description": "External services tested"
},
"assertions": {
"type": "array",
"items": {
"$ref": "#/$defs/assertion"
}
},
"setup": {
"type": "string",
"description": "Test setup requirements"
},
"teardown": {
"type": "string",
"description": "Test teardown steps"
},
"executionTimeMs": {
"type": "integer",
"minimum": 0
}
}
},
"serviceConnection": {
"type": "object",
"required": ["serviceName", "connectionStatus"],
"properties": {
"serviceName": {
"type": "string"
},
"serviceType": {
"type": "string",
"enum": ["api", "database", "storage", "email", "messaging", "payment", "crm", "other"]
},
"connectionStatus": {
"type": "string",
"enum": ["connected", "disconnected", "error", "timeout", "auth-failed"]
},
"credentialId": {
"type": "string"
},
"healthCheck": {
"type": "object",
"properties": {
"passed": { "type": "boolean" },
"responseTimeMs": { "type": "integer" },
"lastChecked": { "type": "string", "format": "date-time" }
}
},
"usedInNodes": {
"type": "array",
"items": { "type": "string" }
}
}
},
"workflowValidation": {
"type": "object",
"required": ["workflowId", "valid"],
"properties": {
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"valid": { "type": "boolean" },
"integrationCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"externalDependencies": { "type": "integer", "minimum": 0 },
"mockedServices": { "type": "integer", "minimum": 0 },
"overallScore": { "type": "number", "minimum": 0, "maximum": 100 },
"grade": { "type": "string", "pattern": "^[A-F][+-]?$" }
}
},
"mockConfig": {
"type": "object",
"required": ["serviceName", "mockType"],
"properties": {
"serviceName": { "type": "string" },
"mockType": {
"type": "string",
"enum": ["stub", "spy", "mock", "fake", "fixture"]
},
"responses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"request": { "type": "object" },
"response": { "type": "object" },
"statusCode": { "type": "integer" }
}
}
}
}
},
"contractTest": {
"type": "object",
"required": ["consumer", "provider"],
"properties": {
"consumer": { "type": "string" },
"provider": { "type": "string" },
"interactions": { "type": "integer", "minimum": 0 },
"verified": { "type": "boolean" },
"breakingChanges": { "type": "array", "items": { "type": "string" } }
}
},
"assertion": {
"type": "object",
"required": ["type", "expected"],
"properties": {
"type": {
"type": "string",
"enum": ["status", "body", "headers", "timing", "count", "schema"]
},
"path": { "type": "string" },
"expected": {},
"actual": {},
"passed": { "type": "boolean" }
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": { "type": "string", "pattern": "^REC-\\d{3,6}$" },
"title": { "type": "string", "maxLength": 200 },
"description": { "type": "string", "maxLength": 2000 },
"priority": { "type": "string", "enum": ["critical", "high", "medium", "low"] },
"category": { "type": "string", "enum": ["coverage", "reliability", "performance", "security", "maintainability"] }
}
},
"metrics": {
"type": "object",
"properties": {
"totalIntegrationTests": { "type": "integer", "minimum": 0 },
"passedTests": { "type": "integer", "minimum": 0 },
"failedTests": { "type": "integer", "minimum": 0 },
"skippedTests": { "type": "integer", "minimum": 0 },
"integrationCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"servicesConnected": { "type": "integer", "minimum": 0 },
"servicesFailed": { "type": "integer", "minimum": 0 }
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": { "type": "integer", "minimum": 0 },
"toolsUsed": { "type": "array", "items": { "type": "string" } },
"agentId": { "type": "string", "pattern": "^qe-[a-z][a-z0-9-]*$" },
"n8nVersion": { "type": "string" }
}
},
"validationResult": {
"type": "object",
"properties": {
"schemaValid": { "type": "boolean" },
"contentValid": { "type": "boolean" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"learningData": {
"type": "object",
"properties": {
"patternsDetected": { "type": "array", "items": { "type": "string" } },
"reward": { "type": "number", "minimum": 0, "maximum": 1 }
}
}
}
}
{
"skillName": "n8n-integration-testing-patterns",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.summary",
"output.integrationTests",
"output.serviceConnections"
],
"requiredNonEmptyFields": [],
"mustContainTerms": [
"integration",
"n8n"
],
"mustNotContainTerms": [
"TODO",
"FIXME"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}
Related skills
FAQ
What does n8n-integration-testing-patterns do?
n8n-integration-testing-patterns is a Claude Code skill for testing & qa.
When should I use n8n-integration-testing-patterns?
When you need to helps with testing & qa tasks., or when n8n-integration-testing-patterns is a claude code skill for testing & qa.
What are the main capabilities?
n8n-integration-testing-patterns; Testing & QA; AI-coding skill.