Skip to content

Commit

Permalink
[TransactionalMessenger] Added tests, Delete unused code
Browse files Browse the repository at this point in the history
  • Loading branch information
fractalzombie committed Aug 19, 2022
1 parent 95c07e4 commit df5bbc2
Show file tree
Hide file tree
Showing 10 changed files with 418 additions and 45 deletions.
26 changes: 18 additions & 8 deletions Helper/AttributeHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ private function __construct()

public static function hasAttribute(string|object $target, string $attributeClass): bool
{
return null !== self::getAttribute($target, $attributeClass);
return !empty(self::getReflectionAttributes($target, $attributeClass));
}

/**
Expand All @@ -44,15 +44,25 @@ public static function getAttribute(string|object $target, string $attributeClas
*/
public static function getAttributes(string|object $target, string $attributeClass): array
{
try {
$attributes = (new \ReflectionClass($target))->getAttributes($attributeClass);
} catch (\ReflectionException) {
$attributes = [];
}

return ArrayList::collect($attributes)
return ArrayList::collect(self::getReflectionAttributes($target, $attributeClass))
->map(static fn (\ReflectionAttribute $a) => $a->newInstance())
->toArray()
;
}

/**
* @template T
*
* @param class-string<T> $attributeClass
*
* @return array<\ReflectionAttribute<T>>
*/
public static function getReflectionAttributes(string|object $target, string $attributeClass): array
{
try {
return (new \ReflectionClass($target))->getAttributes($attributeClass);
} catch (\ReflectionException) {
return [];
}
}
}
2 changes: 1 addition & 1 deletion Helper/ClassHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#[Immutable]
final class ClassHelper
{
final public const DEFAULT_SHORT_NAME = 'NoName';
final public const DEFAULT_SHORT_NAME = 'InvalidClassName';

private function __construct()
{
Expand Down
22 changes: 11 additions & 11 deletions Helper/TransactionHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,23 @@ private function __construct()
{
}

public static function isTransactional(object $message): bool
public static function isTransactional(string|object $target): bool
{
return AttributeHelper::hasAttribute($message, Transactional::class);
return AttributeHelper::hasAttribute($target, Transactional::class);
}

public static function isDispatchAllowed(PendingEnvelope $envelope, CommitType ...$commitTypes): bool
public static function getTransactional(string|object $target): array
{
$attributes = AttributeHelper::getAttributes($envelope->getMessageClass(), Transactional::class);
$allowedCommitTypes = ArrayList::collect($attributes)
return AttributeHelper::getAttributes($target, Transactional::class);
}

public static function isDispatchAllowed(string|object $target, CommitType ...$commitTypes): bool
{
return ArrayList::collect(self::getTransactional($target))
->map(static fn (Transactional $t) => $t->commitTypes)
->reduce(array_merge(...))
->getOrElse([])
;

return ArrayList::collect($allowedCommitTypes)
->filter(static fn (CommitType $ct) => \in_array($ct, $commitTypes, true))
->isNonEmpty()
->toArrayList(static fn (array $cts) => ArrayList::collect($cts))
->every(static fn (CommitType $ct) => \in_array($ct, $commitTypes, true))
;
}
}
19 changes: 14 additions & 5 deletions MessageBus/TransactionalMessageBus.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use FRZB\Component\TransactionalMessenger\Enum\CommitType;
use FRZB\Component\TransactionalMessenger\Event\DispatchFailedEvent;
use FRZB\Component\TransactionalMessenger\Event\DispatchSucceedEvent;
use FRZB\Component\TransactionalMessenger\Exception\MessageBusException;
use FRZB\Component\TransactionalMessenger\Helper\EnvelopeHelper;
use FRZB\Component\TransactionalMessenger\Helper\TransactionHelper;
use FRZB\Component\TransactionalMessenger\Storage\Storage as StorageImpl;
Expand Down Expand Up @@ -62,9 +63,13 @@ public function dispatch(object $message, array $stamps = []): Envelope
/** {@inheritdoc} */
public function commit(CommitType ...$commitTypes): void
{
$this->dispatchPendingEnvelopes(...$commitTypes);
$this->dispatchSucceedEnvelopes();
$this->dispatchFailedEnvelopes();
try {
$this->dispatchPendingEnvelopes(...$commitTypes);
$this->dispatchSucceedEnvelopes();
$this->dispatchFailedEnvelopes();
} catch (\Throwable $e) {
throw MessageBusException::fromThrowable($e);
}
}

/** {@inheritdoc} */
Expand All @@ -76,7 +81,11 @@ public function rollback(\Throwable $exception): void
),
);

$this->dispatchFailedEnvelopes();
try {
$this->dispatchFailedEnvelopes();
} catch (\Throwable $e) {
throw MessageBusException::fromThrowable($e);
}

$this->pendingStorage->clear();
$this->succeedStorage->clear();
Expand All @@ -88,7 +97,7 @@ private function dispatchPendingEnvelopes(CommitType ...$commitTypes): void
$notAllowedForDispatchEnvelopes = new StorageImpl();

while ($pendingEnvelope = $this->pendingStorage->next()) {
TransactionHelper::isDispatchAllowed($pendingEnvelope, ...$commitTypes)
TransactionHelper::isDispatchAllowed($pendingEnvelope->getMessageClass(), ...$commitTypes)
? $this->dispatchEnvelope($pendingEnvelope->envelope)
: $notAllowedForDispatchEnvelopes->prepend($pendingEnvelope)
;
Expand Down
56 changes: 56 additions & 0 deletions Tests/Unit/Helper/AttributeHelperTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

declare(strict_types=1);


namespace FRZB\Component\TransactionalMessenger\Tests\Unit\Helper;

use FRZB\Component\TransactionalMessenger\Enum\CommitType;
use FRZB\Component\TransactionalMessenger\Helper\ClassHelper;
use FRZB\Component\TransactionalMessenger\Helper\TransactionHelper;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\NonTransactionalMessage;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\TransactionalOnHandledMessage;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\TransactionalOnResponseMessage;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\TransactionalOnTerminateMessage;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;

/** @iternal */
#[Group('transactional-messenger')]
final class AttributeHelperTest extends TestCase
{
#[DataProvider('dataProvider')]
public function testGetShortNameMethod(string $className, string $shortClassName): void
{
self::assertSame($shortClassName, ClassHelper::getShortName($className));
}

public function dataProvider(): iterable
{
yield sprintf('%s', ClassHelper::getShortName(TransactionalOnTerminateMessage::class)) => [
'class_name' => TransactionalOnTerminateMessage::class,
'short_class_name' => 'TransactionalOnTerminateMessage',
];

yield sprintf('%s', ClassHelper::getShortName(TransactionalOnResponseMessage::class)) => [
'class_name' => TransactionalOnResponseMessage::class,
'short_class_name' => 'TransactionalOnResponseMessage',
];

yield sprintf('%s', ClassHelper::getShortName(TransactionalOnHandledMessage::class)) => [
'class_name' => TransactionalOnHandledMessage::class,
'short_class_name' => 'TransactionalOnHandledMessage',
];

yield sprintf('%s', ClassHelper::getShortName(NonTransactionalMessage::class)) => [
'class_name' => NonTransactionalMessage::class,
'short_class_name' => 'NonTransactionalMessage',
];

yield 'InvalidClassName' => [
'class_name' => 'InvalidClassName',
'short_class_name' => 'InvalidClassName',
];
}
}
86 changes: 86 additions & 0 deletions Tests/Unit/Helper/ClassHelperTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php

declare(strict_types=1);


namespace FRZB\Component\TransactionalMessenger\Tests\Unit\Helper;

use FRZB\Component\TransactionalMessenger\Attribute\Transactional;
use FRZB\Component\TransactionalMessenger\Enum\CommitType;
use FRZB\Component\TransactionalMessenger\Helper\AttributeHelper;
use FRZB\Component\TransactionalMessenger\Helper\ClassHelper;
use FRZB\Component\TransactionalMessenger\Helper\TransactionHelper;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\NonTransactionalMessage;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\TransactionalOnHandledMessage;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\TransactionalOnResponseMessage;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\TransactionalOnTerminateMessage;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;

/** @iternal */
#[Group('transactional-messenger')]
final class ClassHelperTest extends TestCase
{
#[DataProvider('dataProvider')]
public function testGetAttributesMethod(string $className, bool $hasAttributes): void
{
$hasAttributes
? self::assertNotEmpty(AttributeHelper::getAttributes($className, Transactional::class))
: self::assertEmpty(AttributeHelper::getAttributes($className, Transactional::class))
;
}

#[DataProvider('dataProvider')]
public function testGetAttributeMethod(string $className, bool $hasAttributes): void
{
$hasAttributes
? self::assertNotNull(AttributeHelper::getAttribute($className, Transactional::class))
: self::assertNull(AttributeHelper::getAttribute($className, Transactional::class))
;
}

#[DataProvider('dataProvider')]
public function testGetReflectionAttributesMethod(string $className, bool $hasAttributes): void
{
$hasAttributes
? self::assertNotEmpty(AttributeHelper::getReflectionAttributes($className, Transactional::class))
: self::assertEmpty(AttributeHelper::getReflectionAttributes($className, Transactional::class))
;
}

#[DataProvider('dataProvider')]
public function testHasAttributeMethod(string $className, bool $hasAttributes): void
{
self::assertSame($hasAttributes, AttributeHelper::hasAttribute($className, Transactional::class))
;
}

public function dataProvider(): iterable
{
yield sprintf('%s', ClassHelper::getShortName(TransactionalOnTerminateMessage::class)) => [
'class_name' => TransactionalOnTerminateMessage::class,
'has_attributes' => true,
];

yield sprintf('%s', ClassHelper::getShortName(TransactionalOnResponseMessage::class)) => [
'class_name' => TransactionalOnResponseMessage::class,
'has_attributes' => true,
];

yield sprintf('%s', ClassHelper::getShortName(TransactionalOnHandledMessage::class)) => [
'class_name' => TransactionalOnHandledMessage::class,
'has_attributes' => true,
];

yield sprintf('%s', ClassHelper::getShortName(NonTransactionalMessage::class)) => [
'class_name' => NonTransactionalMessage::class,
'has_attributes' => false,
];

yield 'InvalidClassName' => [
'class_name' => 'InvalidClassName',
'has_attributes' => false,
];
}
}
43 changes: 43 additions & 0 deletions Tests/Unit/Helper/EnvelopeHelperTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

declare(strict_types=1);

namespace FRZB\Component\TransactionalMessenger\Tests\Unit\Helper;

use FRZB\Component\TransactionalMessenger\Helper\ClassHelper;
use FRZB\Component\TransactionalMessenger\Helper\EnvelopeHelper;
use FRZB\Component\TransactionalMessenger\Tests\Stub\Message\TransactionalOnTerminateMessage;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp;

/** @iternal */
#[Group('transactional-messenger')]
final class EnvelopeHelperTest extends TestCase
{
#[DataProvider('dataProvider')]
public function testWrapMethod(object $target): void
{
$envelope = EnvelopeHelper::wrap($target);
$messageClass = $target instanceof Envelope ? $target->getMessage()::class : $target::class;

self::assertInstanceOf(Envelope::class, $envelope);
self::assertSame($messageClass, $envelope->getMessage()::class);
self::assertNotNull($envelope->last(DispatchAfterCurrentBusStamp::class));
}

public function dataProvider(): iterable
{
yield sprintf('%s', ClassHelper::getShortName(TransactionalOnTerminateMessage::class)) => [
'target' => new TransactionalOnTerminateMessage(),
'has_attributes' => true,
];

yield sprintf('%s', ClassHelper::getShortName(Envelope::class)) => [
'target' => Envelope::wrap(new TransactionalOnTerminateMessage()),
'has_attributes' => false,
];
}
}
Loading

0 comments on commit df5bbc2

Please sign in to comment.