
N8n Trigger Testing Strategies
- 106 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
n8n-trigger-testing-strategies is a Claude Code skill for testing & qa.
About
n8n-trigger-testing-strategies is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted development.
- n8n-trigger-testing-strategies
- Testing & QA
- AI-coding skill
N8n Trigger Testing Strategies by the numbers
- 106 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #977 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-trigger-testing-strategiesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 106 |
|---|---|
| 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 trigger testing strategies.
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-trigger-testing-strategies is a claude code skill for testing & qa.
What you get
Structured output aligned to n8n-trigger-testing-strategies: n8n-trigger-testing-strategies, Testing & QA.
Files
n8n Trigger Testing Strategies
<default_to_action> When testing n8n triggers: 1. IDENTIFY trigger type (webhook, schedule, polling, event) 2. TEST with various valid payloads 3. VERIFY authentication and authorization 4. CHECK error handling for invalid inputs 5. MEASURE response time and reliability
Quick Trigger Checklist:
- Trigger activates workflow correctly
- Payload parsed and validated
- Authentication enforced (if configured)
- Error responses are informative
- Response time is acceptable
Critical Success Factors:
- Test edge cases (empty payloads, large payloads)
- Verify idempotency where needed
- Check timeout handling
- Monitor for missed triggers
</default_to_action>
Quick Reference Card
n8n Trigger Types
| Type | Use Case | Testing Focus |
|---|---|---|
| Webhook | External HTTP calls | Payloads, auth, methods |
| Schedule | Timed execution | Cron accuracy, timezone |
| Polling | Check for changes | Interval, deduplication |
| Event | Service events | Event handling, filtering |
Common Webhook Configurations
| Setting | Options | Impact |
|---|---|---|
| HTTP Method | GET, POST, PUT, DELETE | Request handling |
| Authentication | None, Basic, Header | Security |
| Response Mode | Immediately, Last Node, Custom | Response timing |
| Path | Custom URL path | Endpoint identification |
---
Webhook Testing
Basic Webhook Test
// Test webhook with various payloads
async function testWebhook(webhookUrl: string): Promise<WebhookTestResult> {
const testPayloads = [
// Valid JSON
{ type: 'json', data: { event: 'test', timestamp: Date.now() } },
// Empty object
{ type: 'empty', data: {} },
// Large payload
{ type: 'large', data: { items: Array(1000).fill({ id: 1, name: 'test' }) } },
// Nested data
{ type: 'nested', data: { level1: { level2: { level3: { value: 'deep' } } } } },
// Special characters
{ type: 'special', data: { text: 'Hello <script>alert("xss")</script>' } }
];
const results: PayloadTestResult[] = [];
for (const payload of testPayloads) {
const startTime = Date.now();
try {
const response = await fetch(webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload.data)
});
results.push({
payloadType: payload.type,
success: response.ok,
status: response.status,
responseTime: Date.now() - startTime,
responseBody: await response.text()
});
} catch (error) {
results.push({
payloadType: payload.type,
success: false,
error: error.message
});
}
}
return { webhookUrl, results };
}HTTP Method Testing
// Test all HTTP methods
async function testWebhookMethods(webhookUrl: string): Promise<MethodTestResult[]> {
const methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];
const results: MethodTestResult[] = [];
for (const method of methods) {
try {
const response = await fetch(webhookUrl, {
method,
headers: { 'Content-Type': 'application/json' },
body: ['GET', 'HEAD', 'OPTIONS'].includes(method) ? undefined : '{}'
});
results.push({
method,
allowed: response.ok || response.status !== 405,
status: response.status,
statusText: response.statusText
});
} catch (error) {
results.push({
method,
allowed: false,
error: error.message
});
}
}
return results;
}Authentication Testing
// Test webhook authentication
async function testWebhookAuth(webhookUrl: string, authConfig: AuthConfig): Promise<AuthTestResult> {
const scenarios = [
// No auth
{ name: 'no-auth', headers: {} },
// Invalid auth
{ name: 'invalid-auth', headers: { 'Authorization': 'Bearer invalid-token' } },
// Valid auth
{ name: 'valid-auth', headers: { 'Authorization': `Bearer ${authConfig.token}` } },
// Expired auth
{ name: 'expired-auth', headers: { 'Authorization': `Bearer ${authConfig.expiredToken}` } }
];
const results: AuthScenarioResult[] = [];
for (const scenario of scenarios) {
const response = await fetch(webhookUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...scenario.headers
},
body: '{}'
});
results.push({
scenario: scenario.name,
status: response.status,
authenticated: response.ok,
errorMessage: response.ok ? null : await response.text()
});
}
return {
authRequired: !results.find(r => r.scenario === 'no-auth')?.authenticated,
invalidRejected: !results.find(r => r.scenario === 'invalid-auth')?.authenticated,
validAccepted: results.find(r => r.scenario === 'valid-auth')?.authenticated,
results
};
}---
Schedule Testing
Cron Expression Validation
// Validate cron expression
function validateCronExpression(expression: string): CronValidationResult {
const parts = expression.trim().split(/\s+/);
if (parts.length < 5 || parts.length > 6) {
return {
valid: false,
error: `Expected 5-6 parts, got ${parts.length}`
};
}
const [minute, hour, dayOfMonth, month, dayOfWeek, year] = parts;
const validations = [
{ field: 'minute', value: minute, range: [0, 59] },
{ field: 'hour', value: hour, range: [0, 23] },
{ field: 'dayOfMonth', value: dayOfMonth, range: [1, 31] },
{ field: 'month', value: month, range: [1, 12] },
{ field: 'dayOfWeek', value: dayOfWeek, range: [0, 7] }
];
for (const v of validations) {
const result = validateCronField(v.value, v.range);
if (!result.valid) {
return { valid: false, error: `Invalid ${v.field}: ${result.error}` };
}
}
return {
valid: true,
description: describeCronExpression(expression),
nextExecutions: getNextCronExecutions(expression, 5)
};
}
// Get human-readable description
function describeCronExpression(expression: string): string {
// Common patterns
const patterns: Record<string, string> = {
'* * * * *': 'Every minute',
'*/5 * * * *': 'Every 5 minutes',
'0 * * * *': 'Every hour',
'0 0 * * *': 'Every day at midnight',
'0 9 * * 1-5': 'Weekdays at 9:00 AM',
'0 0 1 * *': 'First day of every month',
'0 0 * * 0': 'Every Sunday at midnight'
};
return patterns[expression] || 'Custom schedule';
}
// Calculate next execution times
function getNextCronExecutions(expression: string, count: number): Date[] {
const executions: Date[] = [];
let current = new Date();
// Simple implementation - use cron-parser library in production
for (let i = 0; i < count; i++) {
const next = calculateNextCronExecution(expression, current);
executions.push(next);
current = new Date(next.getTime() + 60000); // Move past this execution
}
return executions;
}Schedule Reliability Testing
// Test schedule trigger reliability
async function testScheduleReliability(triggerId: string, testDuration: number): Promise<ScheduleTestResult> {
const startTime = Date.now();
const expectedExecutions: Date[] = [];
const actualExecutions: Date[] = [];
// Calculate expected execution times
const cronExpression = await getTriggerCronExpression(triggerId);
let checkTime = new Date(startTime);
while (checkTime.getTime() < startTime + testDuration) {
const nextExec = calculateNextCronExecution(cronExpression, checkTime);
if (nextExec.getTime() < startTime + testDuration) {
expectedExecutions.push(nextExec);
}
checkTime = new Date(nextExec.getTime() + 60000);
}
// Monitor actual executions
const executionListener = onExecutionStart(triggerId, (exec) => {
actualExecutions.push(new Date(exec.startedAt));
});
// Wait for test duration
await sleep(testDuration);
executionListener.stop();
// Compare expected vs actual
const comparison = compareExecutions(expectedExecutions, actualExecutions);
return {
testDuration,
expectedCount: expectedExecutions.length,
actualCount: actualExecutions.length,
missedExecutions: comparison.missed,
extraExecutions: comparison.extra,
timingAccuracy: comparison.timingAccuracy,
reliability: (actualExecutions.length / expectedExecutions.length) * 100
};
}---
Polling Trigger Testing
// Test polling trigger behavior
async function testPollingTrigger(triggerId: string, testConfig: PollingTestConfig): Promise<PollingTestResult> {
const { interval, testDuration, simulateDataChanges } = testConfig;
const pollEvents: PollEvent[] = [];
const triggeredExecutions: Execution[] = [];
// Monitor polling events
const pollListener = onPoll(triggerId, (event) => {
pollEvents.push({
timestamp: new Date(),
dataFound: event.hasNewData,
itemCount: event.items?.length || 0
});
});
// Monitor triggered executions
const execListener = onExecutionStart(triggerId, (exec) => {
triggeredExecutions.push(exec);
});
// Optionally simulate data changes
if (simulateDataChanges) {
for (const change of simulateDataChanges) {
setTimeout(() => {
injectTestData(triggerId, change.data);
}, change.at);
}
}
// Wait for test duration
await sleep(testDuration);
pollListener.stop();
execListener.stop();
// Analyze results
const expectedPolls = Math.floor(testDuration / interval);
const actualPolls = pollEvents.length;
return {
interval,
testDuration,
expectedPolls,
actualPolls,
pollAccuracy: (actualPolls / expectedPolls) * 100,
averageInterval: calculateAverageInterval(pollEvents),
executionsTriggered: triggeredExecutions.length,
deduplicationWorking: checkDeduplication(triggeredExecutions),
pollEvents
};
}
// Check if deduplication is working
function checkDeduplication(executions: Execution[]): boolean {
const processedIds = new Set();
for (const exec of executions) {
const itemIds = exec.data?.resultData?.runData?.Trigger?.[0]?.data?.main?.[0]
?.map(item => item.json?.id);
if (itemIds) {
for (const id of itemIds) {
if (processedIds.has(id)) {
return false; // Duplicate found
}
processedIds.add(id);
}
}
}
return true;
}---
Event Trigger Testing
// Test event-driven triggers
async function testEventTrigger(triggerId: string, eventConfig: EventTestConfig): Promise<EventTestResult> {
const { eventType, testEvents, timeout } = eventConfig;
const results: EventResult[] = [];
for (const testEvent of testEvents) {
// Emit test event
const startTime = Date.now();
await emitTestEvent(eventType, testEvent.payload);
// Wait for trigger
try {
const execution = await waitForTrigger(triggerId, timeout);
results.push({
eventType: testEvent.type,
triggered: true,
latency: Date.now() - startTime,
payloadReceived: execution.data?.inputData
});
} catch (error) {
results.push({
eventType: testEvent.type,
triggered: false,
error: error.message
});
}
}
return {
eventType,
testsRun: testEvents.length,
triggered: results.filter(r => r.triggered).length,
averageLatency: average(results.filter(r => r.triggered).map(r => r.latency)),
results
};
}---
Trigger Response Testing
// Test trigger response modes
async function testTriggerResponses(webhookUrl: string): Promise<ResponseTestResult> {
// Test immediate response
const immediateStart = Date.now();
const immediateResponse = await fetch(webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: '{"test": "immediate"}'
});
const immediateTime = Date.now() - immediateStart;
// Test with workflow execution
const workflowStart = Date.now();
const workflowResponse = await fetch(`${webhookUrl}?waitForResponse=true`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: '{"test": "workflow"}'
});
const workflowTime = Date.now() - workflowStart;
return {
immediateResponse: {
status: immediateResponse.status,
time: immediateTime,
body: await immediateResponse.text()
},
workflowResponse: {
status: workflowResponse.status,
time: workflowTime,
body: await workflowResponse.text()
},
responseMode: workflowTime > immediateTime + 100 ? 'workflow' : 'immediate'
};
}---
Test Scenarios
Webhook Scenarios:
- name: Valid JSON POST
method: POST
payload: {"event": "test"}
expected: 200 OK
- name: Invalid JSON
method: POST
payload: "not valid json"
expected: 400 Bad Request
- name: Missing auth
method: POST
headers: {}
expected: 401 Unauthorized
- name: Large payload
method: POST
payload: [10MB of data]
expected: 413 Payload Too Large
Schedule Scenarios:
- name: Every 5 minutes
cron: "*/5 * * * *"
verify: 12 executions per hour
- name: Weekdays at 9 AM
cron: "0 9 * * 1-5"
verify: 5 executions per week
Polling Scenarios:
- name: 1 minute interval
interval: 60000
verify: ~60 polls per hour
- name: Deduplication
interval: 60000
inject_duplicate: true
verify: No duplicate processing---
Related Skills
- n8n-workflow-testing-fundamentals
- n8n-integration-testing-patterns
- n8n-security-testing
---
Remember
n8n triggers are the entry points to workflows. Testing requires:
- Webhook: Payload handling, auth, HTTP methods
- Schedule: Cron accuracy, timezone handling
- Polling: Interval accuracy, deduplication
- Event: Event handling, filtering
Key patterns: Test with various payloads (valid, invalid, edge cases). Verify authentication enforcement. Check response times and reliability over time.
# =============================================================================
# AQE Skill Evaluation Test Suite: n8n Trigger Testing Strategies v1.0.0
# =============================================================================
#
# Comprehensive evaluation suite for n8n trigger testing strategies.
# Tests webhook validation, schedule trigger testing, event-based triggers,
# polling strategies, and trigger failure handling.
#
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
# Validator: .claude/skills/n8n-trigger-testing-strategies/scripts/validate-config.json
#
# Coverage:
# - Webhook payload validation
# - Schedule/cron trigger testing
# - Event-based trigger validation
# - Polling configuration
# - Trigger failure scenarios
# - Trigger execution reliability
#
# =============================================================================
skill: n8n-trigger-testing-strategies
version: 1.0.0
description: >
Comprehensive evaluation suite for n8n trigger testing strategies.
Tests webhook triggers, schedule triggers with cron validation, event-based
triggers, polling mechanisms, and trigger reliability under failure conditions.
# =============================================================================
# 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-trigger-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:
TRIGGER_TESTING: "true"
WEBHOOK_SIMULATION: "true"
# =============================================================================
# TEST CASES
# =============================================================================
test_cases:
# ---------------------------------------------------------------------------
# CATEGORY: Webhook Trigger Testing
# ---------------------------------------------------------------------------
- id: tc001_webhook_endpoint_creation
description: "Validate webhook endpoint is created and accessible"
category: webhooks
priority: critical
input:
webhook_config:
method: POST
path: "/api/webhooks/user-events"
auth_required: false
response_code: 200
test_payload:
event: "user.created"
user_id: 123
timestamp: "2025-02-02T10:00:00Z"
validation:
- endpoint_created: true
- endpoint_accessible: true
- accepts_payload: true
context:
trigger_type: "webhook"
expected_output:
must_contain:
- "webhook"
- "created"
- "accessible"
- "endpoint"
must_not_contain:
- "failed"
severity_classification: critical
finding_count:
max: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
timeout_ms: 30000
- id: tc002_webhook_payload_validation
description: "Validate webhook payload processing"
category: webhooks
priority: critical
input:
webhook_payload:
event: "order.completed"
order_id: 456
amount: 99.99
items:
- product_id: 1
quantity: 2
validation_schema:
required_fields: ["event", "order_id", "amount"]
type_checks:
order_id: integer
amount: number
test_results:
- valid_payload: true
- extra_fields_ignored: true
- required_fields_present: true
context:
validation_mode: strict
expected_output:
must_contain:
- "payload"
- "valid"
- "processed"
must_not_contain:
- "invalid"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
- id: tc003_webhook_authentication
description: "Test webhook authentication/authorization"
category: webhooks
priority: critical
input:
auth_config:
type: "signature"
algorithm: "HMAC-SHA256"
secret: "webhook_secret_key"
test_cases:
- request: "with valid signature"
signature_valid: true
status: 200
- request: "with invalid signature"
signature_valid: false
status: 403
- request: "without signature"
has_signature: false
status: 403
context:
security: "required"
expected_output:
must_contain:
- "authentication"
- "webhook"
- "validated"
must_not_contain:
- "unsigned"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
# ---------------------------------------------------------------------------
# CATEGORY: Schedule/Cron Trigger Testing
# ---------------------------------------------------------------------------
- id: tc004_cron_expression_validation
description: "Validate cron expression syntax and scheduling"
category: schedules
priority: critical
input:
cron_expressions:
- expression: "0 9 * * MON-FRI"
description: "9 AM weekdays"
valid: true
next_run: "Monday 9:00 AM"
- expression: "*/15 * * * *"
description: "Every 15 minutes"
valid: true
- expression: "0 0 1 * *"
description: "First of month at midnight"
valid: true
- expression: "* * * * * *"
description: "Invalid - 6 fields"
valid: false
context:
timezone: "UTC"
expected_output:
must_contain:
- "cron"
- "valid"
- "expression"
must_not_contain:
- "all valid"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
- id: tc005_schedule_execution_timing
description: "Verify schedule trigger executes at correct times"
category: schedules
priority: critical
input:
schedule_config:
cron: "0 9 * * MON-FRI"
timezone: "America/New_York"
execution_history:
- date: "2025-02-03T14:00:00Z"
description: "Monday 9 AM ET"
executed: true
- date: "2025-02-04T14:00:00Z"
description: "Tuesday 9 AM ET"
executed: true
- date: "2025-02-08T14:00:00Z"
description: "Saturday (not scheduled)"
executed: false
context:
requirement: "execute_on_schedule"
expected_output:
must_contain:
- "schedule"
- "executed"
- "timing"
- "correct"
must_not_contain:
- "missed"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
# ---------------------------------------------------------------------------
# CATEGORY: Event-Based Triggers
# ---------------------------------------------------------------------------
- id: tc006_event_trigger_configuration
description: "Validate event-based trigger configuration"
category: events
priority: high
input:
event_config:
type: "event"
events:
- event_type: "user.created"
filter: "country=US"
- event_type: "order.completed"
filter: "amount > 100"
validation:
- event_types_valid: true
- filters_parseable: true
- event_handlers_defined: true
context:
event_system: "kafka"
expected_output:
must_contain:
- "event"
- "trigger"
- "configured"
must_not_contain:
- "invalid"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Polling Strategies
# ---------------------------------------------------------------------------
- id: tc007_polling_configuration
description: "Validate polling trigger configuration"
category: polling
priority: high
input:
polling_config:
type: "polling"
interval_seconds: 300 # 5 minutes
timeout_seconds: 30
max_results: 1000
polling_strategy:
method: "query_parameter"
query_param: "last_run"
increment_by: "updated_at"
context:
use_case: "monitor_external_api"
expected_output:
must_contain:
- "polling"
- "interval"
- "configured"
must_not_contain:
- "invalid"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.75
- id: tc008_polling_performance_optimization
description: "Verify polling doesn't cause excessive API calls"
category: polling
priority: high
input:
scenario: "Poll API every 5 minutes"
monitoring:
- interval_seconds: 300
calls_per_day: 288
calls_expected: 288
status: "optimal"
- interval_seconds: 60
calls_per_day: 1440
calls_expected_max: 600
status: "too_frequent"
rate_limits:
api_quota: "1000 calls/hour"
current_usage: "480 calls/hour"
context:
optimization: "reduce_api_calls"
expected_output:
must_contain:
- "polling"
- "optimized"
- "interval"
must_not_contain:
- "excessive"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Trigger Failure and Recovery
# ---------------------------------------------------------------------------
- id: tc009_trigger_failure_handling
description: "Test trigger failure scenarios and recovery"
category: reliability
priority: critical
input:
failure_scenarios:
- scenario: "Webhook server temporarily down"
error: "Connection refused"
recovery_strategy: "retry"
max_retries: 3
status: "recovered"
- scenario: "Invalid payload received"
error: "Validation error"
recovery_strategy: "log and skip"
status: "handled"
- scenario: "Schedule missed due to maintenance"
error: "System unavailable"
recovery_strategy: "skip and continue"
status: "handled"
context:
resilience_required: true
expected_output:
must_contain:
- "failure"
- "handled"
- "recovery"
must_not_contain:
- "unhandled"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
- id: tc010_trigger_monitoring_alerts
description: "Verify trigger monitoring and alerting"
category: reliability
priority: high
input:
monitoring_checks:
- metric: "Webhook response time"
threshold: 5000
current: 3200
status: healthy
- metric: "Schedule execution rate"
threshold: 95
current: 100
status: healthy
- metric: "Event processing latency"
threshold: 1000
current: 1500
status: alert
alerting_configured:
- on_failures: true
- on_latency: true
- on_quota_exceeded: true
context:
monitoring: "enabled"
expected_output:
must_contain:
- "monitoring"
- "alert"
- "latency"
must_not_contain:
- "not monitored"
severity_classification: medium
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-trigger-test"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: >
n8n trigger testing strategies including webhook endpoint creation and
authentication, payload validation, cron expression validation, schedule
execution timing, event-based triggers, polling configuration and
optimization, trigger failure handling and recovery, and monitoring/alerting.
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-trigger-testing-strategies/output.json",
"title": "N8N Trigger Testing Strategies Skill Output Schema",
"description": "Schema for n8n-trigger-testing-strategies skill output. Validates webhook, schedule, and event trigger testing patterns.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "n8n-trigger-testing-strategies"
},
"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", "triggerTests", "triggerAnalysis"],
"properties": {
"summary": {
"type": "string",
"minLength": 20,
"maxLength": 2000
},
"triggerTests": {
"type": "array",
"items": {
"$ref": "#/$defs/triggerTest"
},
"maxItems": 200
},
"triggerAnalysis": {
"$ref": "#/$defs/triggerAnalysis"
},
"workflowValidation": {
"$ref": "#/$defs/workflowValidation"
},
"webhookTests": {
"type": "array",
"items": {
"$ref": "#/$defs/webhookTest"
}
},
"scheduleTests": {
"type": "array",
"items": {
"$ref": "#/$defs/scheduleTest"
}
},
"eventTests": {
"type": "array",
"items": {
"$ref": "#/$defs/eventTest"
}
},
"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": {
"triggerTest": {
"type": "object",
"required": ["id", "triggerType", "testType", "status"],
"properties": {
"id": {
"type": "string",
"pattern": "^TRIG-\\d{3,6}$"
},
"name": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 1000
},
"triggerType": {
"type": "string",
"enum": ["webhook", "schedule", "manual", "polling", "event", "cron"]
},
"testType": {
"type": "string",
"enum": ["unit", "integration", "e2e", "load", "security"]
},
"status": {
"type": "string",
"enum": ["passed", "failed", "skipped", "pending", "error"]
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"]
},
"nodeName": {
"type": "string"
},
"testPayload": {
"type": "object",
"description": "Sample payload for trigger test"
},
"expectedBehavior": {
"type": "string"
},
"assertions": {
"type": "array",
"items": {
"$ref": "#/$defs/assertion"
}
},
"executionTimeMs": {
"type": "integer",
"minimum": 0
}
}
},
"triggerAnalysis": {
"type": "object",
"required": ["totalTriggers", "triggerTypes"],
"properties": {
"totalTriggers": { "type": "integer", "minimum": 0 },
"webhookCount": { "type": "integer", "minimum": 0 },
"scheduleCount": { "type": "integer", "minimum": 0 },
"eventCount": { "type": "integer", "minimum": 0 },
"pollingCount": { "type": "integer", "minimum": 0 },
"triggerTypes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": { "type": "string" },
"count": { "type": "integer" },
"coverage": { "type": "number", "minimum": 0, "maximum": 100 }
}
}
},
"overallCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"riskAreas": { "type": "array", "items": { "type": "string" } }
}
},
"workflowValidation": {
"type": "object",
"required": ["workflowId", "valid"],
"properties": {
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"valid": { "type": "boolean" },
"triggerCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"activeTriggers": { "type": "integer", "minimum": 0 },
"disabledTriggers": { "type": "integer", "minimum": 0 },
"overallScore": { "type": "number", "minimum": 0, "maximum": 100 },
"grade": { "type": "string", "pattern": "^[A-F][+-]?$" }
}
},
"webhookTest": {
"type": "object",
"required": ["webhookPath", "httpMethod"],
"properties": {
"webhookPath": { "type": "string" },
"httpMethod": { "type": "string", "enum": ["GET", "POST", "PUT", "DELETE", "PATCH"] },
"authentication": { "type": "string", "enum": ["none", "basic", "header", "jwt"] },
"payloadValidation": { "type": "boolean" },
"responseFormat": { "type": "string" },
"testScenarios": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"payload": { "type": "object" },
"expectedStatus": { "type": "integer" },
"passed": { "type": "boolean" }
}
}
}
}
},
"scheduleTest": {
"type": "object",
"required": ["cronExpression"],
"properties": {
"cronExpression": { "type": "string" },
"timezone": { "type": "string" },
"frequency": { "type": "string" },
"nextExecutions": { "type": "array", "items": { "type": "string", "format": "date-time" } },
"boundaryTests": {
"type": "array",
"items": {
"type": "object",
"properties": {
"scenario": { "type": "string" },
"passed": { "type": "boolean" }
}
}
}
}
},
"eventTest": {
"type": "object",
"required": ["eventType", "eventSource"],
"properties": {
"eventType": { "type": "string" },
"eventSource": { "type": "string" },
"eventPayload": { "type": "object" },
"handlerVerified": { "type": "boolean" },
"propagationTested": { "type": "boolean" }
}
},
"assertion": {
"type": "object",
"required": ["type"],
"properties": {
"type": { "type": "string", "enum": ["triggered", "not-triggered", "payload-match", "timing", "error-handling"] },
"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"] },
"triggerType": { "type": "string" }
}
},
"metrics": {
"type": "object",
"properties": {
"totalTriggerTests": { "type": "integer", "minimum": 0 },
"passedTests": { "type": "integer", "minimum": 0 },
"failedTests": { "type": "integer", "minimum": 0 },
"triggerCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"webhookCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"scheduleCoverage": { "type": "number", "minimum": 0, "maximum": 100 }
}
},
"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-trigger-testing-strategies",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.summary",
"output.triggerTests",
"output.triggerAnalysis"
],
"requiredNonEmptyFields": [],
"mustContainTerms": [
"trigger",
"n8n"
],
"mustNotContainTerms": [
"TODO",
"FIXME"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}
Related skills
FAQ
What does n8n-trigger-testing-strategies do?
n8n-trigger-testing-strategies is a Claude Code skill for testing & qa.
When should I use n8n-trigger-testing-strategies?
When you need to helps with testing & qa tasks., or when n8n-trigger-testing-strategies is a claude code skill for testing & qa.
What are the main capabilities?
n8n-trigger-testing-strategies; Testing & QA; AI-coding skill.