mockLogger = $this->createMock(Logger::class); $this->channelLogger = new DefaultChannelLogger($this->mockLogger, LogChannel::SECURITY); } public function test_implements_channel_logger_interface(): void { expect($this->channelLogger)->toBeInstanceOf(ChannelLogger::class); } public function test_can_get_channel(): void { expect($this->channelLogger->getChannel())->toBe(LogChannel::SECURITY); } public function test_debug_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::DEBUG, 'Test message', ['key' => 'value']); $this->channelLogger->debug('Test message', ['key' => 'value']); } public function test_info_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::INFO, 'Test message', ['key' => 'value']); $this->channelLogger->info('Test message', ['key' => 'value']); } public function test_warning_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::WARNING, 'Test message', ['key' => 'value']); $this->channelLogger->warning('Test message', ['key' => 'value']); } public function test_error_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::ERROR, 'Test message', ['key' => 'value']); $this->channelLogger->error('Test message', ['key' => 'value']); } public function test_critical_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::CRITICAL, 'Test message', ['key' => 'value']); $this->channelLogger->critical('Test message', ['key' => 'value']); } public function test_alert_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::ALERT, 'Test message', ['key' => 'value']); $this->channelLogger->alert('Test message', ['key' => 'value']); } public function test_emergency_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::EMERGENCY, 'Test message', ['key' => 'value']); $this->channelLogger->emergency('Test message', ['key' => 'value']); } public function test_log_delegates_to_parent_logger(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::WARNING, 'Test message', ['key' => 'value']); $this->channelLogger->log(LogLevel::WARNING, 'Test message', ['key' => 'value']); } public function test_supports_log_context_objects(): void { $logContext = LogContext::withData(['user_id' => 123]); $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::INFO, 'Test message', $logContext); $this->channelLogger->info('Test message', $logContext); } public function test_supports_empty_context(): void { $this->mockLogger ->expects($this->once()) ->method('logToChannel') ->with(LogChannel::SECURITY, LogLevel::INFO, 'Test message', []); $this->channelLogger->info('Test message'); } public function test_different_channels_work_independently(): void { $cacheLogger = new DefaultChannelLogger($this->mockLogger, LogChannel::CACHE); $dbLogger = new DefaultChannelLogger($this->mockLogger, LogChannel::DATABASE); expect($cacheLogger->getChannel())->toBe(LogChannel::CACHE); expect($dbLogger->getChannel())->toBe(LogChannel::DATABASE); expect($this->channelLogger->getChannel())->toBe(LogChannel::SECURITY); } }