SQLiteTransportTest.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace Test\Michel\PQueue;
  3. use DateTimeImmutable;
  4. use Michel\UniTester\TestCase;
  5. use Michel\PQueue\Transport\SQLiteTransport;
  6. use Michel\PQueue\Transport\Envelope;
  7. use Michel\PQueue\Transport\Message\Message;
  8. class SQLiteTransportTest extends TestCase
  9. {
  10. private string $dbPath;
  11. protected function setUp(): void
  12. {
  13. $this->dbPath = sys_get_temp_dir() . '/pqueue_test_' . uniqid('', true) . '.sqlite';
  14. }
  15. protected function tearDown(): void
  16. {
  17. if (file_exists($this->dbPath)) {
  18. unlink($this->dbPath);
  19. }
  20. }
  21. protected function execute(): void
  22. {
  23. $this->testSendAndGetNext();
  24. $this->testSuccess();
  25. $this->testRetry();
  26. $this->testFailed();
  27. }
  28. private function cleanDb()
  29. {
  30. $db = new \SQLite3($this->dbPath);
  31. $db->exec('DELETE FROM pqueue_messages');
  32. $db->close();
  33. }
  34. public function testSendAndGetNext()
  35. {
  36. $transport = new SQLiteTransport($this->dbPath);
  37. $envelope = new Envelope('test_body', true, 0);
  38. $transport->send($envelope);
  39. $messages = iterator_to_array($transport->getNextAvailableMessages());
  40. $this->assertCount(1, $messages);
  41. $this->assertInstanceOf(Message::class, $messages[0]);
  42. $this->assertEquals('test_body', $messages[0]->getEnvelope()->getBody());
  43. }
  44. public function testSuccess()
  45. {
  46. $this->cleanDb();
  47. $transport = new SQLiteTransport($this->dbPath);
  48. $envelope = new Envelope('test_body', true, 0);
  49. $transport->send($envelope);
  50. $messages = iterator_to_array($transport->getNextAvailableMessages());
  51. $message = $messages[0];
  52. $transport->success($message);
  53. $messages = iterator_to_array($transport->getNextAvailableMessages());
  54. $this->assertCount(0, $messages);
  55. }
  56. public function testRetry()
  57. {
  58. $this->cleanDb();
  59. $transport = new SQLiteTransport($this->dbPath);
  60. $envelope = new Envelope('test_body', true, 0);
  61. $transport->send($envelope);
  62. $messages = iterator_to_array($transport->getNextAvailableMessages());
  63. $message = $messages[0];
  64. $availableAt = (new DateTimeImmutable())->modify('+1 minute');
  65. $transport->retry($message, 'error', $availableAt);
  66. // Should not be available immediately
  67. $messages = iterator_to_array($transport->getNextAvailableMessages());
  68. $this->assertCount(0, $messages);
  69. }
  70. public function testFailed()
  71. {
  72. $this->cleanDb();
  73. $transport = new SQLiteTransport($this->dbPath);
  74. $envelope = new Envelope('test_body', true, 0);
  75. $transport->send($envelope);
  76. $messages = iterator_to_array($transport->getNextAvailableMessages());
  77. $message = $messages[0];
  78. $transport->failed($message, 'fatal error');
  79. // Should not be available in pending/retry
  80. $messages = iterator_to_array($transport->getNextAvailableMessages());
  81. $this->assertCount(0, $messages);
  82. }
  83. }