queue icon indicating copy to clipboard operation
queue copied to clipboard

Queue Plugin TestSuite Feature

Open skie opened this issue 3 weeks ago • 1 comments

Problem

Queue plugin lacks a TestSuite for testing queued jobs without connecting to a real queue backend. Developers need a way to:

  • Assert that jobs were queued
  • Inspect queued job data
  • Test queue-related code in isolation
  • Verify job options (delay, expires, priority, queue name, config)

Solution

Implement a TestSuite that captures queued jobs during tests, similar to how TestEmailTransport captures emails. The solution should:

  • Intercept jobs at the transport layer without modifying QueueManager
  • Provide assertion methods for common test scenarios
  • Support multiple queue configs and queue names
  • Capture all job metadata for comprehensive testing

Design

Core Components

  1. Custom Enqueue Transport (test:)

    • Intercepts messages at the transport layer
    • Captures job data without sending to real queue
    • Works with existing SimpleClient architecture
  2. TestQueueClient

    • Main utility class for accessing captured jobs
    • Provides replaceAllClients() method to enable test mode
    • Static methods for querying captured jobs by various criteria
  3. QueueTrait

    • Test trait for easy integration
    • Automatic setup/teardown via #[Before] and #[After] attributes
    • Assertion methods using PHPUnit constraints

Usage Pattern

use Cake\Queue\TestSuite\QueueTrait;

class MyTest extends TestCase
{
    use QueueTrait;

    public function testJobQueued(): void
    {
        QueueManager::push('MyJob', ['data' => 'value']);
        $this->assertJobQueued('MyJob');
        $this->assertJobQueuedWith('MyJob', ['data' => 'value']);
    }
}

skie avatar Dec 30 '25 18:12 skie