Description
- Laravel Version: 5.7
- PHP Version: 7.2
- Database Driver & Version: Postgres 9.6
Description:
In a PHPUnit test, when creating a User through a factory and returning Auth::user() from a controller/action, the response status is 201, where it should be 200.
This was addressed in #21107 #25775 and #23270 (and probably others). However, the suggested solution of ->refresh()
ing the user before passing it to ->actingAs()
doesn't work for me. Further, i think it should not be necessary to refresh the user in order to work around the framework trying to be smart. It's not difficult to manually set the response status to 201 in an endpoint where a fresh resource is created. So the "smartness" of wasRecentlyCreated resulting in a 201 status code is not that valuable. Especially if it's only half smart and doesn't distinguish between resources created within the request/response lifecycle and resources created by a test before making the request.
I consider the following scenario a valid test that should actually pass. If you agree on that, let's look for a solution together. If you don't agree that the test should pass, feel free to close this issue, and sugggest a reliable approach to get the proper status code that is consistent between test and production environment.
Steps to reproduce:
1. Create a test case:
$user = factory(User::class)->create();
$response = $this->actingAs($user, 'api')->json('GET', '/api/v1/users/me');
$response->assertOk();
2. Create the corresponding action:
<?php
namespace App\Http\Actions\User;
use App\Http\Resources\UserResource;
use Illuminate\Support\Facades\Auth;
class ShowMeAction
{
public function __invoke()
{
return new UserResource(Auth::user());
}
}
3. Run the test
4. Call ->refresh()
on the user before passing it to actingAs()
Contrary to what was suggested as a solution in one of the quoted issues, even with the refresh()
call, the test fails for me:
Response status code [201] does not match expected 200 status code.
Failed asserting that false is true.