Как проверить, есть ли у авторизованных пользователей разрешения на что-то, используя Laravel и Spatie Permissions Package - PullRequest
0 голосов
/ 17 мая 2019

Я хотел бы написать тест, если у пользователя есть доступ к определенным маршрутам.

Что-то вроде администратора может видеть всех пользователей или администратор может видеть детали пользователей.

class UsersController extends Controller
{
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }

    public function show(User $user)
    {
        return view('users.show', compact('user'));
    }
}

Это мой упрощенный пользовательский контроллер.Прямо сейчас я защищаю его с помощью промежуточного программного обеспечения в web.php

    Route::group(['middleware' => ['permission:view users']], function() {
        Route::get('/users', 'UsersController@index');
    });
    Route::group(['middleware' => ['permission:show user']], function() {
        Route::get('/users/{user}', 'UsersController@show');
    });

Позже я хотел бы реорганизовать его и использовать вместо этого Middleware для этого действия.

Я использую SpatieПакет разрешений для авторизации пользователей.

Это мой тест:

class UserManagementTest extends TestCase
{
    use RefreshDatabase, WithFaker;

    public function setUp(): void
    {
        // first include all the normal setUp operations
        parent::setUp();

        // re-register all the roles and permissions
        $this->app->make(\Spatie\Permission\PermissionRegistrar::class)->registerPermissions();
    }

        /** @test */
      public function only_authorized_users_can_see_user_details_site()
      {
           // $this->withoutExceptionHandling();
           $admin = factory(User::class)->create();
           $user = factory(User::class)->create();

           $role = factory(Role::class)->create();
           $permission = factory(Permission::class)->create([
                'name' => 'show user'
           ]);

           $role->givePermissionTo($permission);

           $admin->assignRole($role);

           $this->actingAs($admin)->get("/users/{$user->id}")->assertOk();
           $this->actingAs($user)->get("/users/{$user->id}")->assertStatus(403);
      }
}

Это мой тест.Я создаю администратора, а также пользователя.Администратор имеет роль «администратор» и получает разрешение «показать пользователя».После этого я утверждаю статус администратора и пользователя.

К сожалению, в этот момент я получаю $this->actingAs($admin)->get("/users/{$user->id}")->assertOk(); ошибку.

Tests \ Feature \ UserManagementTest ::only_authorized_users_can_see_user_details_site Код состояния ответа [500] не соответствует ожидаемому коду 200.Не удалось утверждать, что false - это истина.

Когда я запускаю тест с методомlessExceptionHandling (), я получаю эту ошибку:

Tests \ Feature \ UserManagementTest ::only_authorized_users_can_see_user_details_site ErrorException: попытка получить свойство 'name' не-объекта (View: /home/vagrant/code/boilerplate/resources/views/users/show.blade.php) .... ErrorException: попытка получить свойство name'необъекта ...

Очевидно, он не может найти свойство $user->name.

Есть ли лучший способ проверить авторизацию для маршрутов?

...