| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?php
- namespace Test\Michel\PQueue;
- use DateTimeImmutable;
- use Michel\UniTester\TestCase;
- use Michel\PQueue\Transport\FilesystemTransport;
- use Michel\PQueue\Transport\Envelope;
- use Michel\PQueue\Transport\Message\Message;
- class FilesystemTransportTest extends TestCase
- {
- private string $testDir;
- protected function setUp(): void
- {
- $this->testDir = sys_get_temp_dir() . '/pqueue_test_' . uniqid('', true);
- if (is_dir($this->testDir)) {
- $this->removeDirectory($this->testDir);
- }
- mkdir($this->testDir);
- }
- protected function tearDown(): void
- {
- $this->removeDirectory($this->testDir);
- }
- private function removeDirectory($dir)
- {
- if (!is_dir($dir)) {
- return;
- }
- $files = array_diff(scandir($dir), ['.', '..']);
- foreach ($files as $file) {
- (is_dir("$dir/$file")) ? $this->removeDirectory("$dir/$file") : unlink("$dir/$file");
- }
- rmdir($dir);
- }
- protected function execute(): void
- {
- $this->testSendAndGetNext();
- $this->testSuccess();
- $this->testRetry();
- $this->testFailed();
- }
- private function cleanDir()
- {
- $files = glob($this->testDir . '/*');
- foreach ($files as $file) {
- if (is_file($file)) unlink($file);
- }
- }
- public function testSendAndGetNext()
- {
- $this->cleanDir();
- $transport = new FilesystemTransport($this->testDir);
- $envelope = new Envelope('test_body', true, 0);
- $transport->send($envelope);
- $messages = iterator_to_array($transport->getNextAvailableMessages());
- $this->assertCount(1, $messages);
- $this->assertInstanceOf(Message::class, $messages[0]);
- $this->assertEquals('test_body', $messages[0]->getEnvelope()->getBody());
- }
- public function testSuccess()
- {
- $this->cleanDir();
- $transport = new FilesystemTransport($this->testDir);
- $envelope = new Envelope('test_body', true, 0);
- $transport->send($envelope);
- $messages = iterator_to_array($transport->getNextAvailableMessages());
- $message = $messages[0];
- $transport->success($message);
- $messages = iterator_to_array($transport->getNextAvailableMessages());
- $this->assertCount(0, $messages);
- }
- public function testRetry()
- {
- $this->cleanDir();
- $transport = new FilesystemTransport($this->testDir);
- $envelope = new Envelope('test_body', true, 0);
- $transport->send($envelope);
- $messages = iterator_to_array($transport->getNextAvailableMessages());
- $message = $messages[0];
- $availableAt = (new DateTimeImmutable())->modify('+1 minute');
- $transport->retry($message, 'error', $availableAt);
- // Should not be available immediately
- $messages = iterator_to_array($transport->getNextAvailableMessages());
- $this->assertCount(0, $messages);
- }
- public function testFailed()
- {
- $this->cleanDir();
- $transport = new FilesystemTransport($this->testDir);
- $envelope = new Envelope('test_body', true, 0);
- $transport->send($envelope);
- $messages = iterator_to_array($transport->getNextAvailableMessages());
- $message = $messages[0];
- $transport->failed($message, 'fatal error');
- // Should be moved to failed file, so not available
- $messages = iterator_to_array($transport->getNextAvailableMessages());
- $this->assertCount(0, $messages);
- // Verify failed file exists
- $failedFiles = glob($this->testDir . '/*.failed');
- $this->assertCount(1, $failedFiles);
- }
- }
|