From fb0730c6f96900c961c2ba678b9ab24ad8802577 Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Mon, 18 Dec 2023 08:37:46 +1100 Subject: [PATCH] wip --- src/Recorders/ValidationErrors.php | 15 ++++++++++- .../Recorders/ValidationErrorsTest.php | 25 ++++++++++++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/Recorders/ValidationErrors.php b/src/Recorders/ValidationErrors.php index 144f5c59..d51afe7b 100644 --- a/src/Recorders/ValidationErrors.php +++ b/src/Recorders/ValidationErrors.php @@ -73,8 +73,9 @@ public function record(RequestHandled $event): void protected function parseValidationErrors(Request $request, BaseResponse $response): array { return $this->parseSessionValidationErrors($request, $response) - ?? $this->parseJsonValidationErrors($response, $response) + ?? $this->parseJsonValidationErrors($request, $response) ?? $this->parseInertiaValidationErrors($request, $response) + ?? $this->parseUnknownValidationErrors($request, $response) ?? []; } @@ -133,4 +134,16 @@ protected function parseInertiaValidationErrors(Request $request, BaseResponse $ return array_keys((array) $response->original['props']['errors']); } + + /** + * Parse unknown validation errors. + */ + protected function parseUnknownValidationErrors(Request $request, BaseResponse $response): ?array + { + if ($response->getStatusCode() !== 422) { + return null; + } + + return ['__unknown']; + } } diff --git a/tests/Feature/Recorders/ValidationErrorsTest.php b/tests/Feature/Recorders/ValidationErrorsTest.php index ffe706e0..c8b59dff 100644 --- a/tests/Feature/Recorders/ValidationErrorsTest.php +++ b/tests/Feature/Recorders/ValidationErrorsTest.php @@ -8,8 +8,9 @@ use function Pest\Laravel\post; -it('captures session based validation errors', function () { - Pulse::register([ValidationErrors::class => []]); +beforeEach(fn () => Pulse::register([ValidationErrors::class => []])); + +it('captures validation errors from the session', function () { Route::post('users', fn () => Request::validate([ 'email' => 'required', ]))->middleware('web'); @@ -28,8 +29,7 @@ expect($aggregates->pluck('value')->all())->toBe(array_fill(0, 4, '1.00')); }); -it('captures one entry when a single field as multiple errors', function () { - Pulse::register([ValidationErrors::class => []]); +it('captures one entry for field when multiple errors are present for the given field from the session', function () { Route::post('users', fn () => Request::validate([ 'email' => 'string|min:5', ]))->middleware('web'); @@ -56,3 +56,20 @@ expect($aggregates->pluck('aggregate')->all())->toBe(array_fill(0, 4, 'count')); expect($aggregates->pluck('value')->all())->toBe(array_fill(0, 4, '1.00')); }); + +it('captures a generic error when it is unable to parse the validation error fields from the session', function () { + Route::post('users', fn () => response('

An error occurred.

', 422))->middleware('web'); + + $response = post('users'); + + $response->assertStatus(422); + + $entries = Pulse::ignore(fn () => DB::table('pulse_entries')->whereType('validation_error')->get()); + expect($entries)->toHaveCount(1); + expect($entries[0]->key)->toBe('["POST","\/users","Closure","__unknown"]'); + + $aggregates = Pulse::ignore(fn () => DB::table('pulse_aggregates')->whereType('validation_error')->orderBy('period')->get()); + expect($aggregates->pluck('key')->all())->toBe(array_fill(0, 4, '["POST","\/users","Closure","__unknown"]')); + expect($aggregates->pluck('aggregate')->all())->toBe(array_fill(0, 4, 'count')); + expect($aggregates->pluck('value')->all())->toBe(array_fill(0, 4, '1.00')); +});