Skip to content

Commit

Permalink
Add a test logger
Browse files Browse the repository at this point in the history
This is meant to make it easier to do unit tests and also assert
what's in the log.

I know it's bad practices to test against implementation details but
sometimes there are not other good options
  • Loading branch information
sunkan committed Jan 24, 2025
1 parent 512efec commit f39f8c3
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 0 deletions.
87 changes: 87 additions & 0 deletions src/Logger/TestLogger.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php declare(strict_types=1);

namespace Stefna\Logger\Logger;

use PHPUnit\Framework\Assert;
use Psr\Log\AbstractLogger;
use Psr\Log\LogLevel;

/**
* @phpstan-type LogRecord array{
* level: string,
* message: string|\Stringable,
* context: array<string, mixed>
* }
*/
final class TestLogger extends AbstractLogger
{
/** @var array<array-key, LogRecord> */
protected array $buffer = [];

/**
* @inheritdoc
* @phpstan-param LogLevel::* $level
* @param array<string, mixed> $context
*/
public function log($level, string|\Stringable $message, array $context = []): void
{
$this->buffer[] = [
'level' => $level,
'message' => $message,
'context' => $context,
];
}

/**
* @param int $index
* @return false|LogRecord
*/
public function getLogAt(int $index): false|array
{
if (!isset($this->buffer[$index])) {
return false;
}

return $this->buffer[$index];
}

public function assertBufferContainsMessage(string $message, int $expectedCount = 1): void
{
$found = 0;
foreach ($this->buffer as $buffer) {
if ($buffer['message'] === $message) {
$found++;
}
}

Assert::assertSame($expectedCount, $found);
}

/**
* @param \Closure(LogRecord): bool $check
*/
public function assertBufferContains(\Closure $check): void
{
$found = 0;
foreach ($this->buffer as $buffer) {
if ($check($buffer)) {
$found++;
}
}

Assert::assertTrue($found !== 0);
}

public function reset(): void
{
$this->buffer = [];
}

/**
* @return array<array-key, LogRecord>
*/
public function getBuffer(): array
{
return $this->buffer;
}
}
50 changes: 50 additions & 0 deletions tests/Logger/TestLoggerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php declare(strict_types=1);

namespace Stefna\Logger\Logger;

use PHPUnit\Framework\TestCase;

final class TestLoggerTest extends TestCase
{
public function testAssert(): void
{
$logger = new TestLogger();
$logger->debug('Test message');
$logger->info('Info message');
$logger->info('Info message');
$logger->error('Error message');

$logger->assertBufferContainsMessage('Info message', 2);
}

public function testCustomCheck(): void
{
$logger = new TestLogger();
$logger->debug('Test message', [
'test' => 1,
]);
$logger->notice('Test message', [
'test' => 1,
]);
$logger->info('Test message', [
'test' => 1,
]);
$logger->error('Test message', [
'test' => 1,
]);

$logger->assertBufferContains(fn (array $record) => $record['context']['test'] === 1);
}

public function testReset(): void
{
$logger = new TestLogger();
$logger->debug('Test message');

$this->assertCount(1, $logger->getBuffer());

$logger->reset();

$this->assertCount(0, $logger->getBuffer());
}
}

0 comments on commit f39f8c3

Please sign in to comment.