test: regression guards for listener registration uniqueness + always-present binary tags
Drie regression-tests die de klasse fouten uit PR-2 nazorg empirisch
voorkomen:
1. test_authenticated_listener_registered_exactly_once
2. test_token_authenticated_listener_registered_exactly_once
3. test_job_processing_tag_listener_registered_exactly_once
— vangen OBS-8 patroon (auto-discovery + explicit listen samen) plus
accidentally-removed registrations door toekomstige refactors. Walk
Event::getRawListeners() en faalt met count != 1 met een duidelijke
message ("auto-discovery re-enabled? OR explicit Event::listen
missing?"). Empirisch geverifieerd: zowel duplicate als missing
registratie wordt gevangen.
4. test_impersonation_active_tag_invariant_on_captured_events
— RFC §3.6 binary signal invariant op een echte HTTP request flow.
Vangt regressie waar de baseline-tag-binding verdwijnt.
BACKLOG.md OBS-8 entry toegevoegd en gemarkeerd als Resolved met
verwijzing naar de drie commits van deze sessie + architecturaal
pattern (explicit > implicit voor observability-kritische bindings).
Test count 1545 to 1549. Larastan + Pint clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1740,3 +1740,48 @@ invariant is subtiel en silent-failure-prone bij toevoegingen.
|
||||
**Refs:** `bootstrap/app.php`,
|
||||
`tests/Feature/Observability/ExceptionReportingTest.php`,
|
||||
RFC-WS-7-OBSERVABILITY.md §3.10.
|
||||
|
||||
### OBS-8 — Observability listener double-registration via auto-discovery + explicit Event::listen ✅ Resolved
|
||||
|
||||
**Aanleiding:** Bert's live verification na de Sanctum-bearer-token fix
|
||||
(`adab3be`) toonde via `php artisan event:list` dat de
|
||||
`AuthScopeContextListener@handleTokenAuthenticated` binding twee keer
|
||||
geregistreerd stond op `Laravel\Sanctum\Events\TokenAuthenticated` —
|
||||
één keer via Laravel 12's default listener auto-discovery
|
||||
(reflection-scan van `app/Listeners/**` op type-hint), één keer via de
|
||||
expliciete `Event::listen()` call in `AppServiceProvider::boot()`.
|
||||
Listener firede twee keer per Sanctum-auth. Idempotent vandaag (scope-
|
||||
tag overwrite-semantiek), maar architecturaal onacceptabel.
|
||||
|
||||
Plus aanverwant: de `Authenticated` listener-registratie was via
|
||||
class-string in plaats van array-callable, waardoor `event:list` de
|
||||
gebonden methode niet toonde. En `impersonation.active` als binary tag
|
||||
ontbrak op non-impersonation events (RFC §3.6 vereist always-present
|
||||
binary signal).
|
||||
|
||||
**Status (mei 2026):** Resolved via:
|
||||
|
||||
- `215405a` `fix: disable Laravel listener auto-discovery; explicit registrations only`
|
||||
→ `->withEvents(discover: false)` in `bootstrap/app.php`; alle observability
|
||||
listeners expliciet via array-callable (`[Class::class, 'method']`) in
|
||||
`AppServiceProvider::boot()`.
|
||||
- `a939820` `fix: impersonation.active default tag for non-impersonation authenticated events`
|
||||
→ baseline `'false'` in `AuthScopeContextListener::bindForUser()`,
|
||||
override naar `'true'` in `HandleImpersonation` middleware (default-in-
|
||||
listener, override-in-middleware pattern).
|
||||
- Commit 3 (deze sessie): `tests/Feature/Observability/EventListenerRegistrationTest.php`
|
||||
introspecteert `Event::getRawListeners()` en faalt bij count != 1; plus
|
||||
always-present binary tag invariant test op een live HTTP flow.
|
||||
|
||||
Verified via `php artisan event:list`: elke observability listener exact
|
||||
één keer geregistreerd, met `@method` binding zichtbaar.
|
||||
|
||||
**Architecturaal pattern dat dit vastlegt:** explicit > implicit voor
|
||||
observability-kritische bindings. Toekomstige listeners die op een
|
||||
event mounten worden expliciet in `AppServiceProvider::boot()`
|
||||
geregistreerd; auto-discovery is uitgeschakeld zodat silent double-
|
||||
registration niet meer kan voorkomen.
|
||||
|
||||
**Refs:** `bootstrap/app.php`, `app/Providers/AppServiceProvider.php`,
|
||||
`tests/Feature/Observability/EventListenerRegistrationTest.php`,
|
||||
RFC-WS-7-OBSERVABILITY.md §3.6.
|
||||
|
||||
Reference in New Issue
Block a user