mirror of
https://github.com/xtr-dev/payload-automation.git
synced 2025-12-10 00:43:23 +00:00
## Critical Fixes Implemented: ### 1. Hook Execution Reliability (src/plugin/index.ts) - Replaced fragile global variable pattern with proper dependency injection - Added structured executor registry with initialization tracking - Implemented proper logging using PayloadCMS logger instead of console - Added graceful handling for executor unavailability scenarios ### 2. Error Handling & Workflow Run Tracking - Fixed error swallowing in hook execution - Added createFailedWorkflowRun() to track hook execution failures - Improved error categorization and user-friendly error messages - Enhanced workflow run status tracking with detailed context ### 3. Enhanced HTTP Step (src/steps/) - Complete rewrite of HTTP request handler with enterprise features: - Multiple authentication methods (Bearer, Basic Auth, API Key) - Configurable timeouts and retry logic with exponential backoff - Comprehensive error handling for different failure scenarios - Support for all HTTP methods with proper request/response parsing - Request duration tracking and detailed logging ### 4. User Experience Improvements - Added StatusCell component with visual status indicators - Created ErrorDisplay component with user-friendly error explanations - Added WorkflowExecutionStatus component for real-time execution monitoring - Enhanced collections with better error display and conditional fields ### 5. Comprehensive Testing Suite - Added hook-reliability.spec.ts: Tests executor availability and concurrent execution - Added error-scenarios.spec.ts: Tests timeout, network, validation, and HTTP errors - Added webhook-triggers.spec.ts: Tests webhook endpoints, conditions, and concurrent requests - Fixed existing test to work with enhanced HTTP step schema ## Technical Improvements: - Proper TypeScript interfaces for all new components - Safe serialization handling for circular references - Comprehensive logging with structured data - Modular component architecture with proper exports - Enhanced collection schemas with conditional field visibility ## Impact: - Eliminates silent workflow execution failures - Provides clear error visibility for users - Makes HTTP requests production-ready with auth and retry capabilities - Significantly improves debugging and monitoring experience - Adds comprehensive test coverage for reliability 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
130 lines
3.3 KiB
TypeScript
130 lines
3.3 KiB
TypeScript
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
|
import type { Payload } from 'payload'
|
|
import { getPayload } from 'payload'
|
|
import config from './payload.config'
|
|
|
|
describe('Workflow Trigger Test', () => {
|
|
let payload: Payload
|
|
|
|
beforeAll(async () => {
|
|
payload = await getPayload({ config: await config })
|
|
}, 60000)
|
|
|
|
afterAll(async () => {
|
|
if (!payload) return
|
|
|
|
try {
|
|
// Clear test data
|
|
const workflows = await payload.find({
|
|
collection: 'workflows',
|
|
limit: 100
|
|
})
|
|
|
|
for (const workflow of workflows.docs) {
|
|
await payload.delete({
|
|
collection: 'workflows',
|
|
id: workflow.id
|
|
})
|
|
}
|
|
|
|
const runs = await payload.find({
|
|
collection: 'workflow-runs',
|
|
limit: 100
|
|
})
|
|
|
|
for (const run of runs.docs) {
|
|
await payload.delete({
|
|
collection: 'workflow-runs',
|
|
id: run.id
|
|
})
|
|
}
|
|
|
|
const posts = await payload.find({
|
|
collection: 'posts',
|
|
limit: 100
|
|
})
|
|
|
|
for (const post of posts.docs) {
|
|
await payload.delete({
|
|
collection: 'posts',
|
|
id: post.id
|
|
})
|
|
}
|
|
} catch (error) {
|
|
console.warn('Cleanup failed:', error)
|
|
}
|
|
}, 30000)
|
|
|
|
it('should create a workflow run when a post is created', async () => {
|
|
// Create a workflow with collection trigger
|
|
const workflow = await payload.create({
|
|
collection: 'workflows',
|
|
data: {
|
|
name: 'Test Post Creation Workflow',
|
|
description: 'Triggers when a post is created',
|
|
triggers: [
|
|
{
|
|
type: 'collection-trigger',
|
|
collectionSlug: 'posts',
|
|
operation: 'create'
|
|
}
|
|
],
|
|
steps: [
|
|
{
|
|
name: 'log-post',
|
|
step: 'http-request-step',
|
|
url: 'https://httpbin.org/post',
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: {
|
|
message: 'Post created',
|
|
postId: '$.trigger.doc.id',
|
|
postTitle: '$.trigger.doc.content'
|
|
}
|
|
}
|
|
]
|
|
}
|
|
})
|
|
|
|
expect(workflow).toBeDefined()
|
|
expect(workflow.id).toBeDefined()
|
|
|
|
// Create a post to trigger the workflow
|
|
const post = await payload.create({
|
|
collection: 'posts',
|
|
data: {
|
|
content: 'This should trigger the workflow'
|
|
}
|
|
})
|
|
|
|
expect(post).toBeDefined()
|
|
expect(post.id).toBeDefined()
|
|
|
|
// Wait a bit for workflow to execute
|
|
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
|
|
// Check for workflow runs
|
|
const runs = await payload.find({
|
|
collection: 'workflow-runs',
|
|
where: {
|
|
workflow: {
|
|
equals: workflow.id
|
|
}
|
|
},
|
|
limit: 10
|
|
})
|
|
|
|
expect(runs.totalDocs).toBeGreaterThan(0)
|
|
expect(runs.docs[0].workflow).toBe(typeof workflow.id === 'object' ? workflow.id.toString() : workflow.id)
|
|
|
|
console.log('✅ Workflow run created successfully!')
|
|
console.log(`Run status: ${runs.docs[0].status}`)
|
|
console.log(`Run ID: ${runs.docs[0].id}`)
|
|
|
|
if (runs.docs[0].status === 'failed' && runs.docs[0].error) {
|
|
console.log(`Error: ${runs.docs[0].error}`)
|
|
}
|
|
}, 30000)
|
|
}) |