I'm trying to test Laravel with different users roles.
I have made 4 tests (actually, 2 tests with 2 different approach):
use RefreshDatabase;
/** @test */
public function if_administrators_can_view_user_list_post()
{
$this->seed();
$user = User::find(1);
$credentials = [
'email' => $user->email,
'password' => 'password'
];
$response = $this->post(route('login'), $credentials);
$this->get(route('admin.users.index'))
->assertStatus(200);
$this->post(route('logout'));
}
/** @test */
public function if_users_cannot_view_user_list_post()
{
$this->seed();
$user = User::find(2);
$credentials = [
'email' => $user->email,
'password' => 'password'
];
$response = $this->post(route('login'), $credentials);
$this->get(route('admin.users.index'))
->assertStatus(403);
$this->post(route('logout'));
}
/** @test */
public function if_administrators_can_view_user_list_auth()
{
$this->seed();
$user = User::find(1);
if (Auth::attempt(['email' => $user->email, 'password' => 'password'])) {
$this->get(route('admin.users.index'))
->assertStatus(200);
Auth::logout();
} else {
$this->assertTrue(false);
}
}
/** @test */
public function if_users_cannot_view_user_list_auth()
{
$this->seed();
$user = User::find(2);
if (Auth::attempt(['email' => $user->email, 'password' => 'password'])) {
$this->get(route('admin.users.index'))
->assertStatus(403);
Auth::logout();
} else {
$this->assertTrue(false);
}
}
The database is seeded with 2 users. User id = 1 is an administrator, and user id = 2 is an ordinary user.
If I run each test separately, all tests are OK:
PS C:\laravel> php artisan test --filter if_administrators_can_view_user_list_post
Warning: TTY mode is not supported on Windows platform.
PASS Tests\Feature\Routes\UserRoutesTest
✓ if administrators can view user list post
Tests: 1 passed
Time: 1.51s
PS C:\laravel> php artisan test --filter if_users_cannot_view_user_list_post
Warning: TTY mode is not supported on Windows platform.
PASS Tests\Feature\Routes\UserRoutesTest
✓ if users cannot view user list post
Tests: 1 passed
Time: 1.54s
PS C:\laravel> php artisan test --filter if_administrators_can_view_user_list_auth
Warning: TTY mode is not supported on Windows platform.
PASS Tests\Feature\Routes\UserRoutesTest
✓ if administrators can view user list auth
Tests: 1 passed
Time: 1.45s
PS C:\laravel> php artisan test --filter if_users_cannot_view_user_list_auth
Warning: TTY mode is not supported on Windows platform.
PASS Tests\Feature\Routes\UserRoutesTest
✓ if users cannot view user list auth
Tests: 1 passed
Time: 1.50s
But, if I run all tests, the second and others failed with Illuminate\Database\Eloquent\ModelNotFoundException exception:
PS C:\laravel> php artisan test
FAIL Tests\Feature\Routes\UserRoutesTest
✓ if administrators can view user list post
⨯ if users cannot view user list post
⨯ if administrators can view user list auth
⨯ if users cannot view user list auth
• Tests\Feature\Routes\UserRoutesTest > if users cannot view user list post
Illuminate\Database\Eloquent\ModelNotFoundException
No query results for model [App\Models\User] 1
at C:\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php:434
430▕ } elseif (! is_null($result)) {
431▕ return $result;
432▕ }
433▕
➜ 434▕ throw (new ModelNotFoundException)->setModel(
435▕ get_class($this->model), $id
436▕ );
437▕ }
438▕
1 C:\laravel\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php:23
Illuminate\Database\Eloquent\Builder::findOrFail()
2 C:\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1993
Illuminate\Database\Eloquent\Model::forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), "findOrFail")
• Tests\Feature\Routes\UserRoutesTest > if administrators can view user list auth
Illuminate\Database\Eloquent\ModelNotFoundException
No query results for model [App\Models\User] 1
at C:\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php:434
430▕ } elseif (! is_null($result)) {
431▕ return $result;
432▕ }
433▕
➜ 434▕ throw (new ModelNotFoundException)->setModel(
435▕ get_class($this->model), $id
436▕ );
437▕ }
438▕
1 C:\laravel\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php:23
Illuminate\Database\Eloquent\Builder::findOrFail()
2 C:\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1993
Illuminate\Database\Eloquent\Model::forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), "findOrFail")
• Tests\Feature\Routes\UserRoutesTest > if users cannot view user list auth
Illuminate\Database\Eloquent\ModelNotFoundException
No query results for model [App\Models\User] 1
at C:\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php:434
430▕ } elseif (! is_null($result)) {
431▕ return $result;
432▕ }
433▕
➜ 434▕ throw (new ModelNotFoundException)->setModel(
435▕ get_class($this->model), $id
436▕ );
437▕ }
438▕
1 C:\laravel\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php:23
Illuminate\Database\Eloquent\Builder::findOrFail()
2 C:\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1993
Illuminate\Database\Eloquent\Model::forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), "findOrFail")
Tests: 3 failed, 1 passed
Time: 1.84s
Does anyone has any clue to this?