Как протестировать контроль доступа (RBAC)?

Всё про тестирование в Yii 2.0
Ответить
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Как протестировать контроль доступа (RBAC)?

Сообщение Nicolai6120 »

Пытаюсь начать использовать тестирование. Придумал себе задачу - протестировать контроль доступа. То есть проверить через автоматический тест, имеет ли пользователь с определенной ролью доступ к определенному экшену.

Смотрю на unit-тесты: они все соответствуют моделям, создается впечатление, что они концептуально не подходят для такой задачи и это будет нецелевое использование инструмента.

Смотрю на функциональные тесты: вроде бы как раз то, что нужно, так как есть amOnPage метод, который позволяет получить ответ на запрос по нужному роуту. НО, тут нет функциональности которая есть в unit-тестах (загрузка данных через haveFixtures перед тестом) и без которой данный тест не реализовать, т.к. сначала нужно добавить пользователей в базу, а только потом проинициализировать RBAC и начинать проверки.

1. Не понимаю какой тип теста мне подходит и подходит ли вообще?
2. Не понимаю, как можно вызвать из теста консольный RbacController/actionInit для инициализации RBAC на тестовой БД?
3. Не понимаю, как осуществлять проверку роута от пользователя с определенной ролью. Тут наверно сначала нужно залогиниться пользователем с заранее известной ролью, а затем как-то делать проверку, например Yii::$app->user->can(...) ?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как протестировать контроль доступа (RBAC)?

Сообщение ElisDN »

Nicolai6120 писал(а): 2017.02.06, 14:32 1. Не понимаю какой тип теста мне подходит и подходит ли вообще?
Функциональный.
Nicolai6120 писал(а): 2017.02.06, 14:32 2. Не понимаю, как можно вызвать из теста консольный RbacController/actionInit для инициализации RBAC на тестовой БД?
БД везде заполняется фикстурами.
Nicolai6120 писал(а): 2017.02.06, 14:32 НО, тут нет функциональности которая есть в unit-тестах (загрузка данных через haveFixtures перед тестом) и без которой данный тест не реализовать.
Есть такая же:

Код: Выделить всё

class MyCest
{    
    public function _before(FunctionalTester $I)
    {
        $I->haveFixtures([
            'user' => [
                'class' => UserFixture::className(),
            ]
        ]);
    }
}
и ещё такая:

Код: Выделить всё

class MyCest
{    
    public function _fixtures()
    {
         return ['posts' => PostsFixture::className()]
    }
}
Nicolai6120 писал(а): 2017.02.06, 14:32 3. Не понимаю, как осуществлять проверку роута от пользователя с определенной ролью. Тут наверно сначала нужно залогиниться пользователем с заранее известной ролью, а затем как-то делать проверку, например Yii::$app->user->can(...) ?
Да, логинимся и проверяем:

Код: Выделить всё

class AdminHomeCest
{
    ...
    
    public function testAccessForbidden(FunctionalTester $I)
    {
        $I->amLoggedInAs($I->grabRecord(User::className(), ['username' => 'user']));
        $I->amOnRoute('admin/default/index');
        $I->seeResponseCodeIs(403);
        $I->see('Forbidden', 'h1');
    }
    
    public function testAccessSuccess(FunctionalTester $I)
    {
        $I->amLoggedInAs($I->grabRecord(User::className(), ['username' => 'admin']));
        $I->amOnRoute('admin/default/index');
        $I->see('Control panel', 'h1');
    }
}
Последний раз редактировалось ElisDN 2017.02.06, 16:22, всего редактировалось 2 раза.
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Re: Как протестировать контроль доступа (RBAC)?

Сообщение Nicolai6120 »

Дмитрий, большое спасибо! Не знал что также можно и в функциональном тесте. Наверно нужно больше смотреть в исходный код чтобы видеть такие вещи.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как протестировать контроль доступа (RBAC)?

Сообщение ElisDN »

Nicolai6120 писал(а): 2017.02.06, 16:16 Наверно нужно больше смотреть в исходный код чтобы видеть такие вещи.
Да, в готовые тесты в app-basic/advanced и в список методов модуля.
Ответить