diff --git a/tests/MessageQueue/Handler/CreateDumpHandlerTest.php b/tests/MessageQueue/Handler/CreateDumpHandlerTest.php new file mode 100644 index 0000000..45a296a --- /dev/null +++ b/tests/MessageQueue/Handler/CreateDumpHandlerTest.php @@ -0,0 +1,46 @@ +createMock(DumpJobStatusService::class); + $status->expects(self::once())->method('markRunning')->with('job-1'); + $status->expects(self::never())->method('markFailed'); + $logger = new RecordingLogger(); + + (new CreateDumpHandler($this->createMock(DumpService::class), $status, $logger))(new CreateDumpMessage('job-1')); + + self::assertCount(1, $logger->records); + self::assertSame('info', $logger->records[0]['level']); + self::assertSame('Dump job started.', $logger->records[0]['message']); + self::assertSame(['jobId' => 'job-1'], $logger->records[0]['context']); + } + + public function testLogsErrorAndMarksFailedWhenCreateThrows(): void + { + $exception = new \RuntimeException('boom'); + $service = $this->createMock(DumpService::class); + $service->method('createAsync')->willThrowException($exception); + $status = $this->createMock(DumpJobStatusService::class); + $status->expects(self::once())->method('markFailed')->with('job-2', 'boom'); + $logger = new RecordingLogger(); + + (new CreateDumpHandler($service, $status, $logger))(new CreateDumpMessage('job-2')); + + self::assertCount(2, $logger->records); + self::assertSame('error', $logger->records[1]['level']); + self::assertSame('Dump job failed.', $logger->records[1]['message']); + self::assertSame('job-2', $logger->records[1]['context']['jobId']); + self::assertSame($exception, $logger->records[1]['context']['exception']); + } +} diff --git a/tests/Service/DumpServiceLoggingTest.php b/tests/Service/DumpServiceLoggingTest.php new file mode 100644 index 0000000..cffddbe --- /dev/null +++ b/tests/Service/DumpServiceLoggingTest.php @@ -0,0 +1,66 @@ +filesystem = $this->createMock(FilesystemOperator::class); + $this->logger = new RecordingLogger(); + $this->service = new DumpService( + $this->createMock(DumpLister::class), + $this->filesystem, + $this->createMock(DumpBinaryLocator::class), + $this->createMock(Connection::class), + $this->createMock(SystemConfigService::class), + new DumpFilenameParser(), + $this->logger, + ); + } + + public function testDeleteLogsInfo(): void + { + $this->filesystem->method('fileExists')->willReturn(true); + $this->filesystem->expects(self::once())->method('delete')->with(DumpLister::path(self::FILENAME)); + + $this->service->delete(self::FILENAME); + + self::assertSame( + [['level' => 'info', 'message' => 'Dump deleted.', 'context' => ['filename' => self::FILENAME]]], + $this->logger->records + ); + } + + public function testDeleteMissingDumpDoesNotLog(): void + { + $this->filesystem->method('fileExists')->willReturn(false); + + try { + $this->service->delete(self::FILENAME); + self::fail('Expected DumpNotFoundException.'); + } catch (DumpNotFoundException) { + self::assertSame([], $this->logger->records); + } + } +} diff --git a/tests/Support/RecordingLogger.php b/tests/Support/RecordingLogger.php new file mode 100644 index 0000000..933bf67 --- /dev/null +++ b/tests/Support/RecordingLogger.php @@ -0,0 +1,16 @@ +}> */ + public array $records = []; + + public function log($level, string|\Stringable $message, array $context = []): void + { + $this->records[] = ['level' => (string) $level, 'message' => (string) $message, 'context' => $context]; + } +}