diff --git a/composer.json b/composer.json index e47efc7..73a987f 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "packaged/docblock": "~1.1", "packaged/i18n": "~1.2", "symfony/console": "~4.2||~5.0", - "psr/log": "~1.1" + "psr/log": "~1.1||^2.0||^3.0" }, "suggest": { "ext-xdebug": "*" diff --git a/src/Cubex.php b/src/Cubex.php index 80fefcc..dc26d28 100644 --- a/src/Cubex.php +++ b/src/Cubex.php @@ -171,7 +171,7 @@ public function getLogger() * * @return void */ - public function setLogger(LoggerInterface $logger) + public function setLogger(LoggerInterface $logger): void { $this->share(LoggerInterface::class, $logger); } diff --git a/src/Logger/ErrorLogLogger.php b/src/Logger/ErrorLogLogger.php index 4c283b6..8606c3d 100644 --- a/src/Logger/ErrorLogLogger.php +++ b/src/Logger/ErrorLogLogger.php @@ -21,7 +21,7 @@ class ErrorLogLogger extends AbstractLogger * * @throws \Exception */ - public function log($level, $message, array $context = []) + public function log($level, $message, array $context = []): void { $requestId = $this->hasContext() ? $this->getContext()->id() : Strings::randomString(10); $now = \DateTime::createFromFormat('U.u', sprintf("%.6F", microtime(true))); diff --git a/tests/CubexTest.php b/tests/CubexTest.php index 9b663ee..965ce40 100644 --- a/tests/CubexTest.php +++ b/tests/CubexTest.php @@ -12,6 +12,7 @@ use Cubex\Events\ShutdownEvent; use Cubex\Logger\ErrorLogLogger; use Cubex\Routing\Router; +use Cubex\Tests\Logger\MockLogger; use Cubex\Tests\Supporting\Console\TestExceptionCommand; use Cubex\Tests\Supporting\Http\TestResponse; use Exception; @@ -23,7 +24,6 @@ use Packaged\Routing\Handler\FuncHandler; use Packaged\Routing\Handler\Handler; use PHPUnit\Framework\TestCase; -use Psr\Log\Test\TestLogger; use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\BufferedOutput; @@ -98,7 +98,7 @@ public function testHandle() public function testHandleCompleteException() { $cubex = $this->_cubex(); - $logger = new TestLogger(); + $logger = new MockLogger(); $cubex->setLogger($logger); $router = new Router(); $router->onPath( @@ -244,7 +244,7 @@ public function _defaultShutdownProvider() public function testLog() { $cubex = new Cubex(__DIR__, null, true); - $logger = new TestLogger(); + $logger = new MockLogger(); $cubex->setLogger($logger); Cubex::log()->error("TEST"); self::assertTrue($logger->hasError("TEST")); diff --git a/tests/Logger/MockLogger.php b/tests/Logger/MockLogger.php new file mode 100644 index 0000000..a586a25 --- /dev/null +++ b/tests/Logger/MockLogger.php @@ -0,0 +1,147 @@ + $level, + 'message' => $message, + 'context' => $context, + ]; + + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = ['message' => $record]; + } + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + return true; + }, $level); + } + + public function hasRecordThatContains($message, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return strpos($rec['message'], $message) !== false; + }, $level); + } + + public function hasRecordThatMatches($regex, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + public function hasRecordThatPasses(callable $predicate, $level) + { + if (!isset($this->recordsByLevel[$level])) { + return false; + } + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if (call_user_func($predicate, $rec, $i)) { + return true; + } + } + return false; + } + + public function __call($method, $args) + { + if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { + $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; + $level = strtolower($matches[2]); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + return call_user_func_array([$this, $genericMethod], $args); + } + } + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } + + public function reset() + { + $this->records = []; + $this->recordsByLevel = []; + } +}