Skip to content

Commit

Permalink
[MetricsPower] [MetricsPower] Added unit and feature tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fractalzombie committed Mar 27, 2024
1 parent 72c5514 commit 3e794ee
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 10 deletions.
14 changes: 12 additions & 2 deletions Helper/MetricalHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@
namespace FRZB\Component\MetricsPower\Helper;

use Fp\Collections\ArrayList;
use FRZB\Component\MetricsPower\Attribute\LoggerOptions;
use FRZB\Component\MetricsPower\Attribute\Metrical;
use FRZB\Component\MetricsPower\Attribute\OptionsInterface as Option;
use FRZB\Component\MetricsPower\Attribute\OptionsInterface;
use FRZB\Component\MetricsPower\Attribute\PrometheusOptions;
use FRZB\Component\MetricsPower\Traits\WithPrivateEmptyConstructor;
use JetBrains\PhpStorm\Immutable;
Expand Down Expand Up @@ -45,7 +46,7 @@ public static function getFirstMetrical(object|string $target): ?Metrical
->get();
}

/** @return array<Option> */
/** @return array<OptionsInterface> */
public static function getOptions(object|string $target): array
{
return ArrayList::collect(self::getMetrical($target))
Expand All @@ -54,6 +55,15 @@ public static function getOptions(object|string $target): array
->toList();
}

public static function getFirstOptions(object|string $target): ?OptionsInterface
{
return ArrayList::collect(self::getMetrical($target))
->map(static fn (Metrical $metrical) => $metrical->options)
->flatten()
->firstElement()
->getOrElse(fn() => new LoggerOptions());
}

public static function getCounterName(PrometheusOptions $options): string
{
return str_replace('-', '_', "{$options->topic}-{$options->name}");
Expand Down
12 changes: 6 additions & 6 deletions Logger/MetricsPowerLogger.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,27 +26,27 @@
class MetricsPowerLogger implements MetricsPowerLoggerInterface
{
private const MESSAGE_INFO = '[MetricsPower] [INFO] [OPTIONS_CLASS: {option_class}] Metrics registration success for [MESSAGE_CLASS: {message_class}]';
private const MESSAGE_ERROR = '[MetricsPower] [ERROR] [OPTIONS_CLASS: {option_class}] Metrics registration failed for [MESSAGE_CLASS: {message_class}], [REASON: {reason_message}], [OPTIONS_VALUES: {option_values}]';
private const MESSAGE_ERROR = '[MetricsPower] [ERROR] [OPTIONS_CLASS: {option_class}] Metrics registration failed for [MESSAGE_CLASS: {message_class}] [REASON: {reason_message}] [OPTIONS_VALUES: {option_values}]';

public function __construct(
private readonly LoggerInterface $metricsPowerLogger
) {}

public function logInfo(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $option): void
public function logInfo(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $options): void
{
$context = [
'option_class' => ClassHelper::getShortName($option),
'option_class' => ClassHelper::getShortName($options),
'message_class' => ClassHelper::getShortName($event->getEnvelope()->getMessage()),
];

$this->metricsPowerLogger->info(self::MESSAGE_INFO, $context);
}

public function logError(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $option, \Throwable $e): void
public function logError(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $options, \Throwable $e): void
{
$context = [
'option_class' => ClassHelper::getShortName($option),
'option_values' => ClassHelper::getProperties($option),
'option_class' => ClassHelper::getShortName($options),
'option_values' => ClassHelper::getProperties($options),
'message_class' => ClassHelper::getShortName($event->getEnvelope()->getMessage()),
'reason_message' => $e->getMessage(),
'reason_trace' => $e->getTrace(),
Expand Down
4 changes: 2 additions & 2 deletions Logger/MetricsPowerLoggerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#[AsAlias(MetricsPowerLogger::class)]
interface MetricsPowerLoggerInterface
{
public function logInfo(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $option): void;
public function logInfo(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $options): void;

public function logError(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $option, \Throwable $e): void;
public function logError(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event, OptionsInterface $options, \Throwable $e): void;
}
70 changes: 70 additions & 0 deletions Tests/Feature/Logger/MetricsPowerLoggerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

declare(strict_types=1);


namespace FRZB\Component\MetricsPower\Tests\Feature\Logger;

use FRZB\Component\MetricsPower\Helper\ClassHelper;
use FRZB\Component\MetricsPower\Helper\MetricalHelper;
use FRZB\Component\MetricsPower\Logger\MetricsPowerLogger;
use FRZB\Component\MetricsPower\Tests\Stub\Exception\SomethingGoesWrongException;
use FRZB\Component\MetricsPower\Tests\Stub\TestConstants;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;

uses(KernelTestCase::class);

beforeEach(function (): void {
$this->ensureKernelShutdown();
$this->bootKernel();
});

test('It can map info log', function () {
$decoratedLogger = \Mockery::mock(LoggerInterface::class);
$metricsPowerLogger = new MetricsPowerLogger($decoratedLogger);
$message = createTestMessage();
$envelope = createTestEnvelope($message);
$options = MetricalHelper::getFirstOptions($message);
$event = new WorkerMessageHandledEvent($envelope, TestConstants::DEFAULT_RECEIVER_NAME);

$decoratedLogger->expects('info')
->once()
->andReturnUsing(function (string $logMessage, array $logContext) use ($options, $message): void {
expect()
->and($logMessage)->toBe('[MetricsPower] [INFO] [OPTIONS_CLASS: {option_class}] Metrics registration success for [MESSAGE_CLASS: {message_class}]')
->and($logContext)->toBe([
'option_class' => ClassHelper::getShortName($options),
'message_class' => ClassHelper::getShortName($message),
]);
});

$metricsPowerLogger->logInfo($event, $options);
});

test('It can map error log', function () {
$decoratedLogger = \Mockery::mock(LoggerInterface::class);
$metricsPowerLogger = new MetricsPowerLogger($decoratedLogger);
$message = createTestMessage();
$envelope = createTestEnvelope($message);
$exception = SomethingGoesWrongException::wrong();
$options = MetricalHelper::getFirstOptions($message);
$event = new WorkerMessageHandledEvent($envelope, TestConstants::DEFAULT_RECEIVER_NAME);

$decoratedLogger->expects('error')
->once()
->andReturnUsing(function (string $logMessage, array $logContext) use ($options, $message, $event, $exception): void {
expect()
->and($logMessage)->toBe('[MetricsPower] [ERROR] [OPTIONS_CLASS: {option_class}] Metrics registration failed for [MESSAGE_CLASS: {message_class}] [REASON: {reason_message}] [OPTIONS_VALUES: {option_values}]')
->and($logContext)->toBe([
'option_class' => ClassHelper::getShortName($options),
'option_values' => ClassHelper::getProperties($options),
'message_class' => ClassHelper::getShortName($event->getEnvelope()->getMessage()),
'reason_message' => $exception->getMessage(),
'reason_trace' => $exception->getTrace(),
]);
});

$metricsPowerLogger->logError($event, $options, $exception);
});

0 comments on commit 3e794ee

Please sign in to comment.