test(events): guard against double-registered transaction listeners

The PHP-LARAVEL-3V fix removed the explicit Event::listen calls that,
combined with event discovery, registered each transaction listener
twice. Add a regression test that fires each transaction event and
asserts its queued listener is dispatched exactly once, so re-adding an
explicit registration (or otherwise double-wiring) fails CI.
This commit is contained in:
Víctor Falcón 2026-07-02 15:18:52 +02:00
parent 56f21c2d79
commit 5700f85cf7
1 changed files with 33 additions and 0 deletions

View File

@ -0,0 +1,33 @@
<?php
use App\Events\TransactionCreated;
use App\Events\TransactionDeleted;
use App\Events\TransactionUpdated;
use App\Listeners\AssignTransactionToBudget;
use App\Listeners\UnassignTransactionFromBudget;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Events\CallQueuedListener;
use Illuminate\Support\Facades\Queue;
function queuedListenerCount(string $listener): int
{
return Queue::pushed(CallQueuedListener::class)
->filter(fn (CallQueuedListener $job): bool => $job->class === $listener)
->count();
}
it('registers each transaction listener exactly once', function (string $event, string $listener): void {
$user = User::factory()->onboarded()->create();
$transaction = Transaction::factory()->plaintext()->create(['user_id' => $user->id]);
Queue::fake();
event(new $event($transaction));
expect(queuedListenerCount($listener))->toBe(1);
})->with([
'created dispatches budget assignment once' => [TransactionCreated::class, AssignTransactionToBudget::class],
'updated dispatches budget assignment once' => [TransactionUpdated::class, AssignTransactionToBudget::class],
'deleted dispatches budget unassignment once' => [TransactionDeleted::class, UnassignTransactionFromBudget::class],
]);