0, 'float' => 3.14, 'bool' => true, ]); })->toThrow(ValidationException::class); }); it('returns null when fails() returns null', function () { $result = FailsReturnsNull::fromArray([ 'int' => 0, ]); expect($result)->toBeNull(); }); it('returns static instance when fails() returns an object', function () { $result = FailsReturnsDefault::fromArray([ 'int' => 0, ]); expect($result)->toBeInstanceOf(FailsReturnsDefault::class); expect($result->string)->toBe('default_value'); expect($result->int)->toBe(42); }); }); describe('HTTP request handling', function () { beforeEach(function () { \Illuminate\Support\Facades\Route::post('/test-validation-exception', function () { PrimitiveData::fromArray([ 'int' => 0, 'float' => 3.14, 'bool' => true, ]); return response()->json(['success' => true]); }); \Illuminate\Support\Facades\Route::post('/test-http-response-exception', function () { FailsWithHttpResponse::fromArray([ 'int' => 0, ]); return response()->json(['success' => true]); }); \Illuminate\Support\Facades\Route::post('/test-validation-exception-html', function () { PrimitiveData::fromArray([ 'int' => 0, 'float' => 3.14, 'bool' => true, ]); return response('success'); }); }); it('returns 422 with errors when ValidationException is thrown in JSON request', function () { $response = $this->postJson('/test-validation-exception', [ 'int' => 0, 'float' => 3.14, 'bool' => true, ]); $response->assertStatus(422); $response->assertJsonValidationErrors(['string']); }); it('returns custom JSON response when HttpResponseException is thrown', function () { $response = $this->postJson('/test-http-response-exception', [ 'int' => 0, ]); $response->assertStatus(422); $response->assertJsonStructure(['errors']); $response->assertJsonFragment([ 'errors' => [ 'string' => ['The string field is required.'], ], ]); }); it('redirects back with session errors when ValidationException is thrown in text/html request', function () { $response = $this->post('/test-validation-exception-html', [ 'int' => 0, 'float' => 3.14, 'bool' => true, ], [ 'Accept' => 'text/html', ]); $response->assertRedirect(); $response->assertSessionHasErrors(['string']); }); });