CluPilotCloud/tests/Feature/SignInMailOnceTest.php

50 lines
1.8 KiB
PHP

<?php
use App\Mail\NewDeviceSignInMail;
use App\Models\User;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Mail;
/**
* Zwei identische „neues Gerät"-Mails im selben Augenblick.
*
* Gemessen, nicht vermutet — `Event::getRawListeners()` führte den Listener
* zweimal:
*
* App\Listeners\RecordSignInDevice ← Laravel findet ihn selbst
* App\Listeners\RecordSignInDevice@handle ← die Zeile im AppServiceProvider
*
* Laravel 11+ erkennt Listener in `app/Listeners` an der Typangabe ihrer
* handle()-Methode. Die ausdrückliche Registrierung war zu der Zeit richtig,
* als sie geschrieben wurde, und ist seither eine zweite Anmeldung desselben
* Empfängers. Der Kopfkommentar des Listeners begründet, warum am EVENT
* gehorcht wird und nicht an den zwei Anmeldewegen — diese Begründung trägt die
* automatische Erkennung genauso.
*/
it('registers the sign-in listener exactly once', function () {
$listeners = Event::getRawListeners()[Login::class] ?? [];
expect($listeners)->toHaveCount(1);
});
it('sends one new-device mail per sign-in, not two', function () {
// Der Test, der wirklich zählt: nicht wie oft etwas registriert ist,
// sondern wie oft der Kunde etwas bekommt.
Mail::fake();
$user = User::factory()->create();
// Erste Anmeldung überhaupt: die warnt bewusst nicht (siehe
// DeviceRecognition — jemandem das Gerät zu melden, mit dem er sich gerade
// anmeldet, ist keine Warnung).
Event::dispatch(new Login('web', $user, false));
Mail::assertNothingQueued();
// Zweite Anmeldung, neues Gerät: genau EINE Mail.
request()->cookies->remove('clupilot_device');
Event::dispatch(new Login('web', $user, false));
Mail::assertQueued(NewDeviceSignInMail::class, 1);
});