From 564507c9e2fd8b9557121acd3551bcdc13424ebf Mon Sep 17 00:00:00 2001 From: stevethomas Date: Thu, 16 May 2024 15:44:39 +1000 Subject: [PATCH 1/2] allow Inertia 303 redirects --- src/Recorders/ValidationErrors.php | 2 +- tests/RecorderTest.php | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Recorders/ValidationErrors.php b/src/Recorders/ValidationErrors.php index a366015..4681b3e 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() || + ! ($response->getStatusCode() !== 302 && $response->getStatusCode() !== 303) || ! ($errors = $request->session()->get('errors', null)) instanceof ViewErrorBag ) { return null; diff --git a/tests/RecorderTest.php b/tests/RecorderTest.php index 2528781..4088539 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('users', [], ['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 () { From 974f239514feecc028b925681455e7eafd4f08d7 Mon Sep 17 00:00:00 2001 From: stevethomas Date: Thu, 16 May 2024 15:52:41 +1000 Subject: [PATCH 2/2] wip --- src/Recorders/ValidationErrors.php | 2 +- tests/RecorderTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Recorders/ValidationErrors.php b/src/Recorders/ValidationErrors.php index 4681b3e..534a992 100644 --- a/src/Recorders/ValidationErrors.php +++ b/src/Recorders/ValidationErrors.php @@ -112,7 +112,7 @@ protected function parseSessionValidationErrors(Request $request, SymfonyRespons { if ( ! $request->hasSession() || - ! ($response->getStatusCode() !== 302 && $response->getStatusCode() !== 303) || + ! 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 4088539..713d009 100644 --- a/tests/RecorderTest.php +++ b/tests/RecorderTest.php @@ -345,7 +345,7 @@ 'email' => 'required', ]))->middleware(['web', InertiaMiddleware::class]); - $response = put('users', [], ['X-Inertia' => '1']); + $response = put('settings', [], ['X-Inertia' => '1']); $response->assertStatus(303); $entries = Pulse::ignore(fn () => DB::table('pulse_entries')->whereType('validation_error')->get());