logFile = self::createTempFile('freshrss-log-test-'); putenv('FRESHRSS_ENV=development'); } #[\Override] protected function tearDown(): void { putenv('FRESHRSS_ENV'); @unlink($this->logFile); } private static function createTempFile(string $prefix): string { $path = tempnam(sys_get_temp_dir(), $prefix); if ($path === false) { throw new RuntimeException('Could not create a temporary file for the test'); } return $path; } /** @return list */ private function loggedLines(): array { $content = @file_get_contents($this->logFile); return $content === false || $content === '' ? [] : explode("\n", rtrim($content, "\n")); } public function testDevelopmentEnvironmentLogsDebugMessages(): void { Minz_Log::debug('some debug message', $this->logFile); self::assertCount(1, $this->loggedLines()); } public function testProductionEnvironmentDiscardsDebugAndNoticeMessages(): void { putenv('FRESHRSS_ENV=production'); Minz_Log::debug('discarded', $this->logFile); Minz_Log::notice('discarded too', $this->logFile); Minz_Log::warning('kept', $this->logFile); Minz_Log::error('kept too', $this->logFile); $lines = $this->loggedLines(); self::assertCount(2, $lines); self::assertStringContainsString('[warning]', $lines[0]); self::assertStringContainsString('[error]', $lines[1]); } public function testSilentEnvironmentDiscardsEverything(): void { putenv('FRESHRSS_ENV=silent'); Minz_Log::error('should not be written', $this->logFile); self::assertSame([], $this->loggedLines()); } public function testLogLevelOverridesEnvironmentVerbosity(): void { $this->withSystemConf(['environment' => 'development', 'log_level' => 'notice'], function (): void { Minz_Log::debug('discarded, too verbose for notice', $this->logFile); Minz_Log::notice('kept, matches the threshold', $this->logFile); Minz_Log::error('kept, more severe than the threshold', $this->logFile); }); $lines = $this->loggedLines(); self::assertCount(2, $lines); self::assertStringContainsString('[notice]', $lines[0]); self::assertStringContainsString('[error]', $lines[1]); } public function testLogLevelCanRelaxProductionVerbosity(): void { $this->withSystemConf(['environment' => 'production', 'log_level' => 'info'], function (): void { Minz_Log::debug('discarded, more verbose than info', $this->logFile); Minz_Log::record('kept, an info message', LOG_INFO, $this->logFile); }); self::assertCount(1, $this->loggedLines()); } /** * Temporarily registers a `system` configuration namespace so that `log_level` can be exercised, * then restores the previous state to avoid leaking configuration into other tests. * @param array $overrides */ private function withSystemConf(array $overrides, callable $test): void { putenv('FRESHRSS_ENV'); // Let Minz_Log fall back to the registered `system` configuration. $configFile = self::createTempFile('freshrss-config-test-'); file_put_contents($configFile, '