getLoggerWithBuffer($level); $logger->$level('message', ['key' => 'value']); $output = $this->getContents($inputBuffer); $this->assertNotEmpty($output); $decoded = json_decode($output, true); $this->assertEquals('message', $decoded['message']); $this->assertEquals('value', $decoded['context']['key']); } private function testLogLevelEmpty(string $configLevel, string $logLevel): void { [$logger, $inputBuffer] = $this->getLoggerWithBuffer($configLevel); $logger->$logLevel('message', ['key' => 'value']); $output = $this->getContents($inputBuffer); $this->assertEmpty($output); } public function testLogsDebugMessageWhenLevelIsDebug(): void { $this->testLogLevel(LogLevel::DEBUG); } public function testLogsInfoMessageWhenLevelIsInfo(): void { $this->testLogLevel(LogLevel::INFO); } public function testLogsWarningMessageWhenLevelIsWarning(): void { $this->testLogLevel(LogLevel::WARNING); } public function testLogsErrorMessageWhenLevelIsError(): void { $this->testLogLevel(LogLevel::ERROR); } public function testLogsCriticalMessageWhenLevelIsCritical(): void { $this->testLogLevel(LogLevel::CRITICAL); } public function testLogsAlertMessageWhenLevelIsAlert(): void { $this->testLogLevel(LogLevel::ALERT); } public function testLogsEmergencyMessageWhenLevelIsEmergency(): void { $this->testLogLevel(LogLevel::EMERGENCY); } public function testLogsNoticeMessageWhenLevelIsNotice(): void { $this->testLogLevel(LogLevel::NOTICE); } public function testDoesNotLogWhenMinimumLevelIsInfo(): void { $this->testLogLevelEmpty(LogLevel::INFO, LogLevel::DEBUG); } public function testDoesNotLogWhenMinimumLevelIsWarning(): void { $this->testLogLevelEmpty(LogLevel::WARNING, LogLevel::INFO); $this->testLogLevelEmpty(LogLevel::WARNING, LogLevel::DEBUG); } public function testDoesNotLogWhenMinimumLevelIsError(): void { $this->testLogLevelEmpty(LogLevel::ERROR, LogLevel::DEBUG); $this->testLogLevelEmpty(LogLevel::ERROR, LogLevel::INFO); $this->testLogLevelEmpty(LogLevel::ERROR, LogLevel::WARNING); } public function testDoesNotLogWhenMinimumLevelIsNotice(): void { $this->testLogLevelEmpty(LogLevel::NOTICE, LogLevel::DEBUG); $this->testLogLevelEmpty(LogLevel::NOTICE, LogLevel::INFO); } public function testLogsMessageWithEmptyContext(): void { [$logger, $buffer] = $this->getLoggerWithBuffer(LogLevel::INFO); $logger->info('Message without context'); $output = $this->getContents($buffer); $this->assertNotEmpty($output); $decoded = json_decode($output, true); $this->assertEquals('Message without context', $decoded['message']); } public function testLogsMessageWithComplexContext(): void { [$logger, $buffer] = $this->getLoggerWithBuffer(LogLevel::INFO); $logger->info('Complex context', [ 'user_id' => 123, 'nested' => ['key' => 'value'], 'array' => [1, 2, 3] ]); $output = $this->getContents($buffer); $this->assertNotEmpty($output); $decoded = json_decode($output, true); $this->assertEquals(123, $decoded['context']['user_id']); $this->assertEquals('value', $decoded['context']['nested']['key']); } public function testLogsStringableMessage(): void { [$logger, $buffer] = $this->getLoggerWithBuffer(LogLevel::INFO); $stringable = new class implements \Stringable { public function __toString(): string { return 'Stringable message'; } }; $logger->info($stringable); $output = $this->getContents($buffer); $this->assertNotEmpty($output); $decoded = json_decode($output, true); $this->assertEquals('Stringable message', $decoded['message']); } }