withoutDefer(); $this->glitchTip = FakeGlitchTip::install(); Route::middleware('web')->get('/_test/forbidden', fn () => abort(403))->name('test.forbidden'); Route::middleware('web')->get('/_test/expired', fn () => abort(419))->name('test.expired'); Route::middleware('web')->get('/_test/throttled', fn () => abort(429))->name('test.throttled'); }); test('a 404 reached from one of our own pages is reported as a dead internal link', function () { $this->get('/gibt-es-nicht', ['referer' => url('/de/presse')])->assertNotFound(); expect($this->glitchTip->messages())->toBe(['Toter interner Link: /gibt-es-nicht']); $event = $this->glitchTip->events[0]; expect($event->getTags())->toMatchArray(['signal' => ErrorSignal::DeadInternalLink]) ->and($event->getFingerprint())->toBe(['error-signal', ErrorSignal::DeadInternalLink, '/gibt-es-nicht']) ->and($event->getContexts()['signal']['referer'])->toBe('/de/presse'); }); test('a 404 without referer or from another site is not reported', function () { $this->get('/gibt-es-nicht')->assertNotFound(); $this->get('/gibt-es-nicht', ['referer' => 'https://google.com/search'])->assertNotFound(); expect($this->glitchTip->events)->toBe([]); }); test('403 and 429 are reported only for signed-in users', function () { $this->get('/_test/forbidden')->assertForbidden(); $this->get('/_test/throttled')->assertTooManyRequests(); expect($this->glitchTip->events)->toBe([]); $this->actingAs(User::factory()->create()); $this->get('/_test/forbidden')->assertForbidden(); $this->get('/_test/throttled')->assertTooManyRequests(); expect($this->glitchTip->messages())->toBe([ 'Zugriff verweigert (angemeldet): test.forbidden', 'Drosselung trifft angemeldeten Nutzer: test.throttled', ]); }); test('an expired page is always reported, for livewire with the page as location', function () { $this->get('/_test/expired')->assertStatus(419); $this->get('/_test/expired', ['X-Livewire' => '1', 'referer' => url('/me/pressemitteilungen/neu')])->assertStatus(419); expect($this->glitchTip->messages())->toBe([ 'Seite abgelaufen (419): test.expired', 'Seite abgelaufen (419): livewire /me/pressemitteilungen/neu', ]); }); test('each signal group is capped at five reports per window', function () { foreach (range(1, 7) as $attempt) { $this->get('/_test/expired'); } expect($this->glitchTip->events)->toHaveCount(5); });