Bandicoot
@Bandicoot
Вась-программист

Как залогиниться с помощью HTTP-клиента в админку?

Делаю скрипт для проверки битых ссылок в админке. Он должен логиниться и проходиться по всем ссылкам на определенной странице. В качестве клиента использую Guzzle: https://github.com/guzzle/guzzle

Но получается, что пытаясь залогиниться с этого клиента, по сути я делаю поддельный запрос, который CSRF защита успешно отбивает) Как можно решить эту проблему? Временно отключать CSRF на время тестирования? Должна быть стандартная практика на этот случай.
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Делаю скрипт для проверки битых ссылок в админке
Должна быть стандартная практика на этот случай

Тестированию -- тестовые инструменты

Почему бы не сделать это через Codeception? А именно через приемочные тесты....
Через драйвер PhpBrowser работают куки и сессия и можно залогиниться и собрать все ссылки :) И он ставится через композер вместе с самим Codeception, явный недостаток перед веб-драйвером -- он не может ждать (например запросы через аякс)

Кроме того и цель все же -- тестирование, так покрой всю админку простейшими тестами, а может быть даже и сделай задел для более полного тестирования

Примерный вид готового приемочного теста:
// Тут предварительно логинимся (метод amLogin() не родной, 
     // надо создать его в классе AcceptanceTester)
     public function _before(AcceptanceTester $I)
    {
        $I->amLogin('admin', 'admin');
        $I->amOnPage('/admin');
    }

    /** Ниже добавляем через аннотацию провайдер всех ссылок 
     * и данный тест будет выполняться для каждой ссылки в админке
     * @dataProvider linksInAdminPanel
     * 
     *  Или вычесать все ссылки с каждой страницы в методе
     *  и записать в массив и потом по ним идти, проверяя -- была ссылка или нет
     *  
     */
    public function linkIsCorrect(AcceptanceTester $I, \Codeception\Example $pageAdmin)
    {
        $I->amOnPage($pageAdmin['url']);
        $I->seeResponseCodeIs(HttpCode::OK);
    }

    // Перечень ссылок в админке
    protected function linksInAdminPanel()
    {
        return [
            ['url' => '/admin/users'],
            ['url' => '/admin/settings'],
            ['url' => '/admin/products'],
            ....
        ];
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы