mirror of
https://github.com/xtr-dev/payload-automation.git
synced 2025-12-10 00:43:23 +00:00
Implement independent error storage system and comprehensive improvements
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>
This commit is contained in:
113
dev/condition-fix.spec.ts
Normal file
113
dev/condition-fix.spec.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||
import { getTestPayload, cleanDatabase } from './test-setup.js'
|
||||
|
||||
describe('Workflow Condition Fix Test', () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
await cleanDatabase()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
await cleanDatabase()
|
||||
})
|
||||
|
||||
it('should correctly evaluate trigger conditions with $.trigger.doc path', async () => {
|
||||
const payload = getTestPayload()
|
||||
|
||||
// Create a workflow with a condition using the correct JSONPath
|
||||
const workflow = await payload.create({
|
||||
collection: 'workflows',
|
||||
data: {
|
||||
name: 'Test Condition Evaluation',
|
||||
description: 'Tests that $.trigger.doc.content conditions work',
|
||||
triggers: [
|
||||
{
|
||||
type: 'collection-trigger',
|
||||
collectionSlug: 'posts',
|
||||
operation: 'create',
|
||||
condition: '$.trigger.doc.content == "TRIGGER_ME"'
|
||||
}
|
||||
],
|
||||
steps: [
|
||||
{
|
||||
name: 'audit-step',
|
||||
step: 'create-document',
|
||||
collectionSlug: 'auditLog',
|
||||
data: {
|
||||
post: '$.trigger.doc.id',
|
||||
message: 'Condition was met and workflow triggered'
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
console.log('Created workflow with condition: $.trigger.doc.content == "TRIGGER_ME"')
|
||||
|
||||
// Create a post that SHOULD NOT trigger
|
||||
const post1 = await payload.create({
|
||||
collection: 'posts',
|
||||
data: {
|
||||
content: 'This should not trigger'
|
||||
}
|
||||
})
|
||||
|
||||
// Create a post that SHOULD trigger
|
||||
const post2 = await payload.create({
|
||||
collection: 'posts',
|
||||
data: {
|
||||
content: 'TRIGGER_ME'
|
||||
}
|
||||
})
|
||||
|
||||
// Wait for workflow execution
|
||||
await new Promise(resolve => setTimeout(resolve, 5000))
|
||||
|
||||
// Check workflow runs - should have exactly 1
|
||||
const runs = await payload.find({
|
||||
collection: 'workflow-runs',
|
||||
where: {
|
||||
workflow: {
|
||||
equals: workflow.id
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
console.log(`Found ${runs.totalDocs} workflow runs`)
|
||||
if (runs.totalDocs > 0) {
|
||||
console.log('Run statuses:', runs.docs.map(r => r.status))
|
||||
}
|
||||
|
||||
// Should have exactly 1 run for the matching condition
|
||||
expect(runs.totalDocs).toBe(1)
|
||||
|
||||
// Check audit logs - should only have one for post2
|
||||
const auditLogs = await payload.find({
|
||||
collection: 'auditLog',
|
||||
where: {
|
||||
post: {
|
||||
equals: post2.id
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
if (runs.docs[0].status === 'completed') {
|
||||
expect(auditLogs.totalDocs).toBe(1)
|
||||
expect(auditLogs.docs[0].message).toBe('Condition was met and workflow triggered')
|
||||
}
|
||||
|
||||
// Verify no audit log for the first post
|
||||
const noAuditLogs = await payload.find({
|
||||
collection: 'auditLog',
|
||||
where: {
|
||||
post: {
|
||||
equals: post1.id
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
expect(noAuditLogs.totalDocs).toBe(0)
|
||||
|
||||
console.log('✅ Condition evaluation working with $.trigger.doc path!')
|
||||
}, 30000)
|
||||
})
|
||||
Reference in New Issue
Block a user