FilesystemTransportTest.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. namespace Test\Michel\PQueue;
  3. use DateTimeImmutable;
  4. use Michel\UniTester\TestCase;
  5. use Michel\PQueue\Transport\FilesystemTransport;
  6. use Michel\PQueue\Transport\Envelope;
  7. use Michel\PQueue\Transport\Message\Message;
  8. class FilesystemTransportTest extends TestCase
  9. {
  10. private string $testDir;
  11. protected function setUp(): void
  12. {
  13. $this->testDir = sys_get_temp_dir() . '/pqueue_test_' . uniqid('', true);
  14. if (is_dir($this->testDir)) {
  15. $this->removeDirectory($this->testDir);
  16. }
  17. mkdir($this->testDir);
  18. }
  19. protected function tearDown(): void
  20. {
  21. $this->removeDirectory($this->testDir);
  22. }
  23. private function removeDirectory($dir)
  24. {
  25. if (!is_dir($dir)) {
  26. return;
  27. }
  28. $files = array_diff(scandir($dir), ['.', '..']);
  29. foreach ($files as $file) {
  30. (is_dir("$dir/$file")) ? $this->removeDirectory("$dir/$file") : unlink("$dir/$file");
  31. }
  32. rmdir($dir);
  33. }
  34. protected function execute(): void
  35. {
  36. $this->testSendAndGetNext();
  37. $this->testSuccess();
  38. $this->testRetry();
  39. $this->testFailed();
  40. }
  41. private function cleanDir()
  42. {
  43. $files = glob($this->testDir . '/*');
  44. foreach ($files as $file) {
  45. if (is_file($file)) unlink($file);
  46. }
  47. }
  48. public function testSendAndGetNext()
  49. {
  50. $this->cleanDir();
  51. $transport = new FilesystemTransport($this->testDir);
  52. $envelope = new Envelope('test_body', true, 0);
  53. $transport->send($envelope);
  54. $messages = iterator_to_array($transport->getNextAvailableMessages());
  55. $this->assertCount(1, $messages);
  56. $this->assertInstanceOf(Message::class, $messages[0]);
  57. $this->assertEquals('test_body', $messages[0]->getEnvelope()->getBody());
  58. }
  59. public function testSuccess()
  60. {
  61. $this->cleanDir();
  62. $transport = new FilesystemTransport($this->testDir);
  63. $envelope = new Envelope('test_body', true, 0);
  64. $transport->send($envelope);
  65. $messages = iterator_to_array($transport->getNextAvailableMessages());
  66. $message = $messages[0];
  67. $transport->success($message);
  68. $messages = iterator_to_array($transport->getNextAvailableMessages());
  69. $this->assertCount(0, $messages);
  70. }
  71. public function testRetry()
  72. {
  73. $this->cleanDir();
  74. $transport = new FilesystemTransport($this->testDir);
  75. $envelope = new Envelope('test_body', true, 0);
  76. $transport->send($envelope);
  77. $messages = iterator_to_array($transport->getNextAvailableMessages());
  78. $message = $messages[0];
  79. $availableAt = (new DateTimeImmutable())->modify('+1 minute');
  80. $transport->retry($message, 'error', $availableAt);
  81. // Should not be available immediately
  82. $messages = iterator_to_array($transport->getNextAvailableMessages());
  83. $this->assertCount(0, $messages);
  84. }
  85. public function testFailed()
  86. {
  87. $this->cleanDir();
  88. $transport = new FilesystemTransport($this->testDir);
  89. $envelope = new Envelope('test_body', true, 0);
  90. $transport->send($envelope);
  91. $messages = iterator_to_array($transport->getNextAvailableMessages());
  92. $message = $messages[0];
  93. $transport->failed($message, 'fatal error');
  94. // Should be moved to failed file, so not available
  95. $messages = iterator_to_array($transport->getNextAvailableMessages());
  96. $this->assertCount(0, $messages);
  97. // Verify failed file exists
  98. $failedFiles = glob($this->testDir . '/*.failed');
  99. $this->assertCount(1, $failedFiles);
  100. }
  101. }