feat(notification): enhance email logging and refactor event handling to use scalar identifiers

This commit is contained in:
2026-08-26 09:38:19 -03:00
parent 28d09dedab
commit d0424c5589
13 changed files with 381 additions and 176 deletions

View File

@@ -5,60 +5,42 @@ namespace Tests\Feature\Notification;
use App\Domains\Notification\Events\TicketsAvailable;
use App\Domains\Notification\Listeners\SendPurchasePaidEmail;
use App\Domains\Notification\Listeners\SendTicketsAvailableEmail;
use App\Domains\Notification\Services\NotificationMailService;
use App\Domains\Purchase\Events\PurchasePaid;
use App\Domains\Purchase\Models\Purchase;
use Illuminate\Events\CallQueuedListener;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Queue;
use Mockery;
use Tests\TestCase;
class QueuedNotificationListenerTest extends TestCase
{
public function test_purchase_paid_email_is_discarded_when_the_purchase_no_longer_exists(): void
public function test_purchase_paid_email_delegates_with_the_purchase_id(): void
{
$job = $this->dispatchQueuedListener(
PurchasePaid::class,
SendPurchasePaidEmail::class,
new PurchasePaid($this->purchase()),
);
$mailService = Mockery::mock(NotificationMailService::class);
$mailService->shouldReceive('sendPurchasePaid')
->once()
->with(123);
$this->app->instance(NotificationMailService::class, $mailService);
$this->assertTrue($job->deleteWhenMissingModels);
(new SendPurchasePaidEmail)->handle(new PurchasePaid(123));
}
public function test_tickets_available_email_is_discarded_when_the_purchase_no_longer_exists(): void
public function test_tickets_available_email_delegates_with_scalar_identifiers(): void
{
$job = $this->dispatchQueuedListener(
TicketsAvailable::class,
SendTicketsAvailableEmail::class,
new TicketsAvailable($this->purchase(), [10, 11]),
);
$mailService = Mockery::mock(NotificationMailService::class);
$mailService->shouldReceive('sendTicketsAvailable')
->once()
->with(123, [10, 11]);
$this->app->instance(NotificationMailService::class, $mailService);
$this->assertTrue($job->deleteWhenMissingModels);
(new SendTicketsAvailableEmail)->handle(new TicketsAvailable(123, [10, 11]));
}
private function dispatchQueuedListener(string $event, string $listener, object $payload): CallQueuedListener
public function test_email_events_only_serialize_scalar_identifiers(): void
{
Queue::fake();
Event::forget($event);
Event::listen($event, $listener);
$purchasePaid = unserialize(serialize(new PurchasePaid(123)));
$ticketsAvailable = unserialize(serialize(new TicketsAvailable(123, [10, 11])));
event($payload);
$queuedListener = null;
Queue::assertPushed(CallQueuedListener::class, function (CallQueuedListener $job) use (&$queuedListener): bool {
$queuedListener = $job;
return true;
});
$this->assertInstanceOf(CallQueuedListener::class, $queuedListener);
return $queuedListener;
}
private function purchase(): Purchase
{
return (new Purchase)->forceFill(['id' => 123]);
$this->assertSame(123, $purchasePaid->purchaseId);
$this->assertSame(123, $ticketsAvailable->purchaseId);
$this->assertSame([10, 11], $ticketsAvailable->ticketIds);
}
}