peterdickins's avatar

Test is throwing an Exception

Hi,

I have a test which is throwing an exception, however when send a request to the same endpoint in postman, it sends the expected error json response. Can anyone advise what I am doing wrong here?

This is my test:

public function email_field_is_required() {
    User::factory()->create([
        'name' =>  $this->faker->name,
        'email' => $this->faker->email,
        'password' => 'password'
    ]);

    $response = $this->post('/api/login', [
        'email' => null,
        'password' => 'password'
    ]);

    $response->assertStatus(422);
    $response->assertJson([
        [
            'email' => [
                'The email field is required.'
            ]
        ]
    ]);
}

This is the output when I run the test:

% ./vendor/bin/phpunit --filter email_field_is_required
PHPUnit 9.5.28 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 00:00.502, Memory: 32.00 MB

There was 1 error:

1) Tests\Feature\AuthApiTest::email_field_is_required
Illuminate\Validation\ValidationException: The email field is required.

/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php:148
/project/vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php:32
/project/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider.php:30
/project/vendor/laravel/framework/src/Illuminate/Container/Container.php:1285
/project/vendor/laravel/framework/src/Illuminate/Container/Container.php:1250
/project/vendor/laravel/framework/src/Illuminate/Container/Container.php:1235
/project/vendor/laravel/framework/src/Illuminate/Container/Container.php:794
/project/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:860
/project/vendor/laravel/framework/src/Illuminate/Container/Container.php:710
/project/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:845
/project/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php:85
/project/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php:50
/project/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php:30
/project/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:60
/project/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:40
/project/vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
/project/vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:798
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:141
/project/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:50
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php:126
/project/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php:102
/project/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php:54
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:116
/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:799
/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:776
/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:740
/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:729
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:190
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:141
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php:31
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php:40
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php:86
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php:62
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php:39
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:116
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:165
/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:134
/project/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:557
/project/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:352
/project/tests/Feature/AuthApiTest.php:57

This is the controller function:

public function store(StoreAuthRequest $request): Response
{
    $user = User::where('email', $request->validated('email'))->first();

    if(!$user || !Hash::check($request->validated('password'), $user->password)) {
        return response([
            'message' => 'Invalid Credentials'
        ], 401);
    }

    return response([
        'user' => new UserResource($user),
        'token' => $user->createToken('AppToken')->plainTextToken
    ], 201);
}

And this is the response from Postman when I leave the email field blank:

{
    "message": "The email field is required.",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}
0 likes
1 reply

Please or to participate in this conversation.