ldc-arcadia-api/tests/Integration/Infra/Adapters/Events/LaravelTransactionalDomainEventDispatcherTest.php

83 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Integration\Infra\Adapters\Events;
use Illuminate\Contracts\Events\Dispatcher;
use Infra\Adapters\Events\LaravelTransactionalDomainEventDispatcher;
use Mockery;
use Shared\DDD\Event\Event;
covers(LaravelTransactionalDomainEventDispatcher::class);
describe('LaravelTransactionalDomainEventDispatcher Integration Tests', function (): void {
it('buffers events on dispatch without immediately forwarding to Laravel dispatcher', function (): void {
// GIVEN
/** @var Dispatcher&Mockery\MockInterface $laravelDispatcher */
$laravelDispatcher = Mockery::mock(Dispatcher::class);
$laravelDispatcher->shouldNotReceive('dispatch');
$dispatcher = new LaravelTransactionalDomainEventDispatcher($laravelDispatcher);
$event = new class () implements Event
{
};
// WHEN
$dispatcher->dispatch($event);
// THEN
expect($dispatcher->pendingEventsCount())->toBe(1);
});
it('releases all buffered events to Laravel event dispatcher in order and clears buffer', function (): void {
// GIVEN
/** @var Dispatcher&Mockery\MockInterface $laravelDispatcher */
$laravelDispatcher = Mockery::mock(Dispatcher::class);
$event1 = new class () implements Event
{
};
$event2 = new class () implements Event
{
};
$laravelDispatcher->expects('dispatch')->once()->with($event1);
$laravelDispatcher->expects('dispatch')->once()->with($event2);
$dispatcher = new LaravelTransactionalDomainEventDispatcher($laravelDispatcher);
$dispatcher->dispatch($event1);
$dispatcher->dispatch($event2);
expect($dispatcher->pendingEventsCount())->toBe(2);
// WHEN
$dispatcher->release();
// THEN
expect($dispatcher->pendingEventsCount())->toBe(0);
});
it('clears all buffered events without dispatching on clear', function (): void {
// GIVEN
/** @var Dispatcher&Mockery\MockInterface $laravelDispatcher */
$laravelDispatcher = Mockery::mock(Dispatcher::class);
$laravelDispatcher->shouldNotReceive('dispatch');
$dispatcher = new LaravelTransactionalDomainEventDispatcher($laravelDispatcher);
$event = new class () implements Event
{
};
$dispatcher->dispatch($event);
expect($dispatcher->pendingEventsCount())->toBe(1);
// WHEN
$dispatcher->clear();
// THEN
expect($dispatcher->pendingEventsCount())->toBe(0);
});
});