codeception symfony functional Программная авторизация в тестах, мок пользователя, подмена - изолированное тестирование

Предварительная информация

Ниже речь идет об организации авторизации в функциональных тестов на симфони с помощью кодесепшн в случае, если нам нужно программно авторизоваться, чтобы не зависить от модуля/микросервиса авторизации.

В основе кода, приведенного ниже, лежит использование симфоневского метода loginUser().

Как подменить объект пользователя (полезно при изоляции авторизации, напр. в микросервисе)

Опишем класс, с теми ролями, что нам нужны, и можно описать методы для проведения авторизации:

/**
    * Авторизация под обычным пользователем 
    * 
    * @param FunctionalTester $I
    */
protected function authAsSimpleUser(FunctionalTester $I)
{
    $this->client = $this->getUnauthedClient();
    $client = $this->client;
    $simpleUser = new SimpleUser();
    $client->loginUser($simpleUser);
}

protected function getUnauthedClient(): KernelBrowser
{
    $client = $this->functionalTester->grabService('kernel')->getContainer()->get('test.client');
    $client->catchExceptions(false); // выключаем перехват исключений
    return $client;
}

-- тут мы используем loginUser(), опираясь на authAsSimpleUser() (с помощью аннотаций codeception) мы можем использовать уже авторизованного пользователя для выполнения к запроса к методу, для которого нужно обладать ролью:

/**
    * @before authAsSimpleUser
    */
public function test(FunctionalTester $I)
{
    $client = $this->client;
    $client->request(
        'GET',
        '/api/' . $this->getApiVersion() . '/test',
        [],
        [],
        [],
    );

    $rsContent = json_decode($client->getResponse()->getContent(), true);

    $I->pre($rsContent);
}

Возможные проблемы

При использовании такой авторизации могут быть проблемы:

Видео-материалы

  • Подмена пользователя, авторизация с указанной ролью (в т.ч. для несуществующего пользователя): https://youtu.be/j4-ttbmaOFM