50 lines
1.8 KiB
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);
|
|
});
|