- sentry/sentry-laravel 4.28; config/sentry.php gehaertet (keine PII, keine Request-Bodys, before_send ErrorReportScrubber) - Handler: Integration::captureUnhandledException, CommandNotFoundException nicht melden - ReportErrorSignals (global): toter interner Link (nach Pfad wegen Catch-all-Route), 403/429 fuer Angemeldete, 419; gedrosselt - Browser: selbst gehostetes SDK (esbuild-Bundle 11.5.0), Loader ohne Build-Schritt und ohne Regex-Lookbehind, in 7 Layouts mit area-Tag - phpunit.xml: DSNs und ntfy-URL leer, CACHE_DRIVER=array (Tests schrieben bisher in den lokalen Datei-Cache) - dev/glitch-tip/README.md mit Instanz, Org, Projekt-IDs, API-Auswertung Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
3 KiB
PHP
73 lines
3 KiB
PHP
<?php
|
|
|
|
use App\Support\Monitoring\ErrorSignal;
|
|
use App\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Facades\Route;
|
|
use Tests\Support\FakeGlitchTip;
|
|
use Tests\TestCase;
|
|
|
|
uses(TestCase::class, RefreshDatabase::class);
|
|
|
|
/**
|
|
* Fehler ohne Exception: tote interne Links, 403/429 für Angemeldete und
|
|
* 419 werden als GlitchTip-Warnung gemeldet. Testrouten mit vier Segmenten,
|
|
* sonst greift die Catch-all-Route der Haupt-Domain.
|
|
*/
|
|
beforeEach(function () {
|
|
config()->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);
|
|
});
|