diff --git a/src/Recorders/ValidationErrors.php b/src/Recorders/ValidationErrors.php index a366015..534a992 100644 --- a/src/Recorders/ValidationErrors.php +++ b/src/Recorders/ValidationErrors.php @@ -111,8 +111,8 @@ protected function parseValidationErrors(LivewireValidationError|RequestHandled protected function parseSessionValidationErrors(Request $request, SymfonyResponse $response): ?Collection { if ( - $response->getStatusCode() !== 302 || ! $request->hasSession() || + ! in_array($response->getStatusCode(), [302, 303]) || ! ($errors = $request->session()->get('errors', null)) instanceof ViewErrorBag ) { return null; diff --git a/tests/RecorderTest.php b/tests/RecorderTest.php index 2528781..713d009 100644 --- a/tests/RecorderTest.php +++ b/tests/RecorderTest.php @@ -17,6 +17,7 @@ use function Pest\Laravel\get; use function Pest\Laravel\post; use function Pest\Laravel\postJson; +use function Pest\Laravel\put; beforeEach(function () { Config::set('pulse.ingest.trim.lottery', [1, 1]); @@ -338,6 +339,24 @@ expect($aggregates->pluck('value')->every(fn ($value) => $value == 1.0))->toBe(true); }); +it('captures inertia validation non post errors', function () { + Config::set('pulse.recorders.'.ValidationErrors::class.'.capture_messages', false); + Route::put('settings', fn () => Request::validate([ + 'email' => 'required', + ]))->middleware(['web', InertiaMiddleware::class]); + + $response = put('settings', [], ['X-Inertia' => '1']); + + $response->assertStatus(303); + $entries = Pulse::ignore(fn () => DB::table('pulse_entries')->whereType('validation_error')->get()); + expect($entries)->toHaveCount(1); + expect($entries[0]->key)->toBe('["PUT","\/settings","Closure","default","email"]'); + $aggregates = Pulse::ignore(fn () => DB::table('pulse_aggregates')->whereType('validation_error')->orderBy('period')->get()); + expect($aggregates->pluck('key')->all())->toBe(array_fill(0, 4, '["PUT","\/settings","Closure","default","email"]')); + expect($aggregates->pluck('aggregate')->all())->toBe(array_fill(0, 4, 'count')); + expect($aggregates->pluck('value')->every(fn ($value) => $value == 1.0))->toBe(true); +}); + it('captures inertia validation errors with multiple bags', function () { Config::set('pulse.recorders.'.ValidationErrors::class.'.capture_messages', false); Route::post('users', function () {