mirror of
https://github.com/xtr-dev/payload-automation.git
synced 2025-12-10 17:03:22 +00:00
Major Features: • Add persistent error tracking for timeout/network failures that bypasses PayloadCMS output limitations • Implement smart error classification (timeout, DNS, connection, network) with duration-based detection • Add comprehensive test infrastructure with MongoDB in-memory testing and enhanced mocking • Fix HTTP request handler error preservation with detailed context storage • Add independent execution tracking with success/failure status and duration metrics Technical Improvements: • Update JSONPath documentation to use correct $.trigger.doc syntax across all step types • Fix PayloadCMS job execution to use runByID instead of run() for reliable task processing • Add enhanced HTTP error handling that preserves outputs for 4xx/5xx status codes • Implement proper nock configuration with undici for Node.js 22 fetch interception • Add comprehensive unit tests for WorkflowExecutor with mocked PayloadCMS instances Developer Experience: • Add detailed error information in workflow context with URL, method, timeout, attempts • Update README with HTTP error handling patterns and enhanced error tracking examples • Add test helpers and setup infrastructure for reliable integration testing • Fix workflow step validation and JSONPath field descriptions Breaking Changes: None - fully backward compatible 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
import { getTestPayload, cleanDatabase } from './test-setup.js'
|
|
import { mockHttpBin, testFixtures } from './test-helpers.js'
|
|
|
|
describe('Workflow Trigger Test', () => {
|
|
|
|
beforeEach(async () => {
|
|
await cleanDatabase()
|
|
// Set up HTTP mocks
|
|
const expectedRequestData = {
|
|
message: 'Post created',
|
|
postId: expect.any(String), // MongoDB ObjectId
|
|
postTitle: 'Test post content for workflow trigger'
|
|
}
|
|
mockHttpBin.mockPost(expectedRequestData)
|
|
})
|
|
|
|
afterEach(async () => {
|
|
await cleanDatabase()
|
|
mockHttpBin.cleanup()
|
|
})
|
|
|
|
it('should create a workflow run when a post is created', async () => {
|
|
const payload = getTestPayload()
|
|
|
|
// Use test fixtures for consistent data
|
|
const testWorkflow = {
|
|
...testFixtures.basicWorkflow,
|
|
name: 'Test Post Creation Workflow',
|
|
description: 'Triggers when a post is created',
|
|
steps: [
|
|
{
|
|
...testFixtures.httpRequestStep(),
|
|
name: 'log-post',
|
|
body: {
|
|
message: 'Post created',
|
|
postId: '$.trigger.doc.id',
|
|
postTitle: '$.trigger.doc.content'
|
|
}
|
|
}
|
|
]
|
|
}
|
|
|
|
// Create a workflow with collection trigger
|
|
const workflow = await payload.create({
|
|
collection: 'workflows',
|
|
data: testWorkflow
|
|
})
|
|
|
|
expect(workflow).toBeDefined()
|
|
expect(workflow.id).toBeDefined()
|
|
|
|
// Create a post to trigger the workflow
|
|
const post = await payload.create({
|
|
collection: 'posts',
|
|
data: testFixtures.testPost
|
|
})
|
|
|
|
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)
|
|
|
|
// Check if workflow is an object or ID
|
|
const workflowRef = runs.docs[0].workflow
|
|
const workflowId = typeof workflowRef === 'object' && workflowRef !== null
|
|
? (workflowRef as any).id
|
|
: workflowRef
|
|
|
|
expect(workflowId).toBe(workflow.id) // Should reference the 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)
|
|
}) |