push($payload1); $queue->push($payload2); assert($queue->size() === 2, "❌ Queue size should be 2"); // High priority should come first $poppedPayload = $queue->pop(); assert($poppedPayload !== null, "❌ Should pop a payload"); assert($poppedPayload->job instanceof TestCommand, "❌ Should be TestCommand"); assert($poppedPayload->priority->equals(QueuePriority::high()), "❌ Should be high priority"); echo "βœ… Basic priority queue operations work correctly\n\n"; // Test 2: Priority Ordering echo "2️⃣ Testing Priority Ordering...\n"; $queue->clear(); $criticalPayload = JobPayload::create(new TestCommand('critical', 'urgent'), QueuePriority::critical()); $normalPayload = JobPayload::create(new TestCommand('normal', 'regular'), QueuePriority::normal()); $lowPayload = JobPayload::create(new TestCommand('low', 'background'), QueuePriority::low()); // Push in random order $queue->push($normalPayload); $queue->push($lowPayload); $queue->push($criticalPayload); // Should pop in priority order: critical, normal, low $first = $queue->pop(); $second = $queue->pop(); $third = $queue->pop(); assert($first !== null && $first->priority->equals(QueuePriority::critical()), "❌ First should be critical priority"); assert($second !== null && $second->priority->equals(QueuePriority::normal()), "❌ Second should be normal priority"); assert($third !== null && $third->priority->equals(QueuePriority::low()), "❌ Third should be low priority"); echo "βœ… Priority ordering works correctly\n\n"; // Test 3: Delayed Jobs echo "3️⃣ Testing Delayed Jobs...\n"; $queue->clear(); $immediatePayload = JobPayload::create(new TestCommand('immediate', 'now')); $delayedPayload = JobPayload::create( new TestCommand('delayed', 'later'), QueuePriority::normal(), Duration::fromSeconds(3600) // 1 hour delay ); $queue->push($delayedPayload); $queue->push($immediatePayload); // Should only get immediate job $popped = $queue->pop(); assert($popped !== null, "❌ Should pop immediate job"); assert($popped->job->action === 'now', "❌ Should be immediate job"); // Delayed job should still be in queue but not poppable yet assert($queue->size() === 1, "❌ Should have 1 delayed job remaining"); $delayedCount = $redisQueue->getScheduledCount(); assert($delayedCount === 1, "❌ Should have 1 scheduled job"); echo "βœ… Delayed jobs work correctly\n\n"; // Test 4: Peek Operations echo "4️⃣ Testing Peek Operations...\n"; $queue->clear(); $peekPayload = JobPayload::create(new TestCommand('peek', 'test')); $queue->push($peekPayload); $originalSize = $queue->size(); $peeked = $queue->peek(); assert($peeked !== null, "❌ Should peek a payload"); assert($peeked->job->action === 'test', "❌ Peeked job should have correct data"); assert($queue->size() === $originalSize, "❌ Queue size should not change after peek"); echo "βœ… Peek operations work correctly\n\n"; // Test 5: Queue Statistics echo "5️⃣ Testing Queue Statistics...\n"; $queue->clear(); $payload1 = JobPayload::create(new TestCommand('stats-1', 'test'), QueuePriority::high()); $payload2 = JobPayload::create(new TestCommand('stats-2', 'test'), QueuePriority::normal()); $queue->push($payload1); $queue->push($payload2); $stats = $queue->getStats(); assert($stats['total_size'] === 2, "❌ Stats should show correct total size"); assert($stats['priority_queue_size'] === 2, "❌ Stats should show correct priority queue size"); assert($stats['delayed_queue_size'] === 0, "❌ Stats should show no delayed jobs"); assert(isset($stats['priority_breakdown']), "❌ Stats should include priority breakdown"); echo "βœ… Queue statistics work correctly\n\n"; // Test 6: Clear Operations echo "6️⃣ Testing Clear Operations...\n"; $queue->clear(); $payload1 = JobPayload::create(new TestCommand('clear-1', 'test')); $payload2 = JobPayload::create(new TestCommand('clear-2', 'test')); $delayedPayload = JobPayload::create( new TestCommand('clear-delayed', 'test'), QueuePriority::normal(), Duration::fromSeconds(3600) ); $queue->push($payload1); $queue->push($payload2); $queue->push($delayedPayload); assert($queue->size() === 3, "❌ Should have 3 jobs before clear"); $clearedCount = $queue->clear(); assert($clearedCount === 3, "❌ Should report 3 jobs cleared"); assert($queue->size() === 0, "❌ Queue should be empty after clear"); echo "βœ… Clear operations work correctly\n\n"; // Test 7: Empty Queue Handling echo "7️⃣ Testing Empty Queue Handling...\n"; $queue->clear(); assert($queue->size() === 0, "❌ Queue should be empty"); $nullPayload = $queue->pop(); assert($nullPayload === null, "❌ Popping from empty queue should return null"); $nullPeek = $queue->peek(); assert($nullPeek === null, "❌ Peeking empty queue should return null"); echo "βœ… Empty queue handling works correctly\n\n"; echo "πŸŽ‰ ALL REDIS QUEUE TESTS PASSED!\n"; echo "✨ RedisQueue with priority support is ready for production use!\n";