set('cache.default', 'array'); $this->withoutDefer(); $this->glitchTip = FakeGlitchTip::install(); Route::middleware('web')->get('/_test/monitoring/signal/forbidden', fn () => abort(403))->name('test.forbidden'); Route::middleware('web')->get('/_test/monitoring/signal/expired', fn () => abort(419))->name('test.expired'); Route::middleware('web')->get('/_test/monitoring/signal/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/mehr', ['referer' => url('/produkte/aloe')])->assertNotFound(); expect($this->glitchTip->messages())->toBe(['Toter interner Link: /gibt/es/nicht/mehr']); $event = $this->glitchTip->events[0]; expect($event->getTags())->toMatchArray(['signal' => ErrorSignal::DeadInternalLink]) ->and($event->getFingerprint())->toBe(['error-signal', ErrorSignal::DeadInternalLink, '/gibt/es/nicht/mehr']) ->and($event->getContexts()['signal']['referer'])->toBe('/produkte/aloe'); }); test('a 404 without referer or from another site is not reported', function () { $this->get('/gibt/es/nicht/mehr')->assertNotFound(); $this->get('/gibt/es/nicht/mehr', ['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/monitoring/signal/forbidden')->assertForbidden(); $this->get('/_test/monitoring/signal/throttled')->assertTooManyRequests(); expect($this->glitchTip->events)->toBe([]); $this->actingAs(User::forceCreate(['email' => 'berater@example.com', 'password' => bcrypt('secret'), 'lang' => 'de'])); $this->get('/_test/monitoring/signal/forbidden')->assertForbidden(); $this->get('/_test/monitoring/signal/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', function () { $this->get('/_test/monitoring/signal/expired')->assertStatus(419); expect($this->glitchTip->messages())->toBe(['Seite abgelaufen (419): test.expired']); }); test('each signal group is capped at five reports per window', function () { foreach (range(1, 7) as $attempt) { $this->get('/_test/monitoring/signal/expired'); } expect($this->glitchTip->events)->toHaveCount(5); });