Skip to content

PSR-3 compliant test logger for developers who like tests and want to check if their application logs messages as they expect.

License

Notifications You must be signed in to change notification settings

beste/psr-testlogger

Repository files navigation

PSR Test Logger

PSR-3 compliant test logger for developers who like tests and want to check if their application logs messages as they expect.

Current version Packagist PHP Version Support Monthly Downloads Total Downloads Tests Sponsor

Installation

composer require --dev beste/psr-testlogger

Usage

In your unit tests, inject the Beste\Psr\Log\TestLogger class into tested subjects that expect a Prs\Log\LoggerInterface.

The test logger records all log messages and exposes them via the records property which is an instance of Beste\Psr\Log\Records.

use Beste\Psr\Log\Record;
use Beste\Psr\Log\TestLogger;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;

final class Subject
{
    public function __construct(
        public readonly LoggerInterface $logger
    ) {}
    
    public function doSomething(): void
    {
        $this->logger->info('Doing something');
        $this->logger->warning('1st problem');
        $this->logger->warning('2nd problem');
        $this->logger->critical('Uh oh!');
    }
}

final class SubjectTest extends \PHPUnit\Framework\TestCase
{
    private TestLogger $logger;
    private Subject $subject;
    
    protected function setUp() : void{
        $this->logger = TestLogger::create();
    }
    
    /** @test */
    public function it_does_something(): void
    {
        $this->subject->doSomething();
        
        self::assertCount(4, $this->logger->records);
        
        self::assertEqualsCanonicalizing(
            [LogLevel::INFO, LogLevel::WARNING, LogLevel::CRITICAL],
            $this->logger->records->levels()
        );
        
        self::assertTrue($this->logger->records->includeMessagesWithLevel('info'));
        self::assertCount(1, $this->logger->records->filteredByLevel('info'));
        self::assertCount(3, $this->logger->records->filteredByLevel('info', 'warning'));
        
        self::assertTrue($this->logger->records->includeMessagesContaining('problem'));
        self::assertCount(2, $this->logger->records->filteredByMessageContaining('problem'));
        
        self::assertTrue($this->logger->records->includeMessagesMatching('/^\d{1,}(st|nd)/i'));
        self::assertCount(2, $this->logger->records->filteredByMessageMatching('/^\d{1,}(st|nd)/i'));
        
        // You can filter by your own criteria. If you discover criteria not natively
        // covered by the test logger, please consider a pull request.
        self::assertTrue($this->logger->records->includeMessagesBy(fn (Record $r) => str_contains($r->level, 'n')));
        self::assertCount(3, $this->logger->records->filteredBy(fn (Record $r) => str_contains($r->level, 'n')));  
    }
}

License

This project is published under the MIT License.

About

PSR-3 compliant test logger for developers who like tests and want to check if their application logs messages as they expect.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Sponsor this project

 

Languages