koyard
@koyard
PHP Developer

Как протестировать метод авторизации?

Пишу тест для метода авторизации пользователя. Тест не должен проходить если метод авторизовал пользователя с неверным паролем. То есть фактически тест должен проверять присутствует ли в методе сравнение хешей паролей.
Я впервые пишу тест, поэтому не уверен что делаю это правильно. Мне кажется что тест авторизации не должен содержать в себе логику хеширования паролей, но как сделать иначе я не знаю. Гуру тестирования помогите мне.

Примерная реализация авторизации для понимания что я тестирую, на самом деле ее не существует.
class UserManager implements UserManagerInterface
{
    public function makePasswordHash($password)
    {
        return md5($password); // какое-то хеширование
    }
}

class AuthorizationManager implements AuthorizationManagerInterface
{
    public function authorizeUserByLogin($login, $password)
    {
        $user = $this->userManager->getUserByLogin($login);
        $passwordHash = $this->userManager->makePasswordHash($password);
        if ($passwordHash === $user->getPasswordHash()) {
            // авторизуем пользователя
            return true;
        }
    }
}

Тест этой авторизации
class AuthorizationManagerTest extends TestCase
{
    /**
     * Не должно авторизовывать пользователя по правильному логину но по неправильному паролю
     * @test
     */
    public function dontAuthorizeUserByLoginAndWrongPassword()
    {
        $userManagerMock = $this->getUserManagerMock();
        $authorizationManager = new AuthorizationManager($tokenManagerMock, $userManagerMock);

        $login = 'login';
        $password = 'wrongPassword';

        $userId = 15;
        $passwordHash = md5('password'); // Логика хеширования пароля в тесте, мне кажется это не правильно

        $userManagerMock->method('getUsersByLogin')
            ->willReturn([$this->getUserMock($userId, $login, $passwordHash)]);

        $result = $authorizationManager->authorizeUserByLogin($login, $password);

        $this->assertEquals(false, $result, 'Пользователь был авторизован по верному логину и неверному паролю');
    }
}
  • Вопрос задан
  • 1269 просмотров
Пригласить эксперта
Ответы на вопрос 3
rpsv
@rpsv
делай что-то одно и делай это хорошо
Не слишком ли все сложно? Вам нужно проверить, что аутентификация происходит правильно и все. Достаточно теста:

$tokenManagerMock = "???";
$userManagerMock = $this->getUserManagerMock();
$authorizationManager = new AuthorizationManager($tokenManagerMock, $userManagerMock)

$login = "Bob";

$this->assertTrue(
	$authorizationManager->authorizeUserByLogin($login, "true password")
);
$this->assertFalse(
	$authorizationManager->authorizeUserByLogin($login, "false password")
);
$this->assertFalse(
	$authorizationManager->authorizeUserByLogin($login, "")
);
$this->assertFalse(
	$authorizationManager->authorizeUserByLogin($login, null)
);


Ну и собственно метод `authorizeUserByLogin` должен вернуть `false` в случае неудачи
Ответ написан
koyard
@koyard Автор вопроса
PHP Developer
Переписал код, думаю стало лучше. Теперь тест проверяет что хеши были учтены в методе авторизации, при этом реализация хеширования в UserManager не имеет значения.
/**
 * Не должно авторизовывать пользователя по правильному логину но по неправильному паролю
 * @test
 */
public function dontAuthorizeUserByLoginAndWrongPassword()
{
    $userManagerMock = $this->getUserManagerMock();
    $authorizationManager = new AuthorizationManager($userManagerMock);

    $login = 'login';
    $password = 'wrongPassword';

    $userId = 15;
    $passwordHash = md5('password');

    $userManagerMock->method('getUsersByFilter')
        ->willReturn([$this->getUserStub($userId, $login, $passwordHash)]);

    $userManagerMock->method('makePasswordHash')
        ->will($this->returnCallback(function($password) {
            return md5($password);
        }));

    $result = $authorizationManager->authorizeUserByLogin($login, $password);

    $this->assertFalse($result, 'Пользователь был авторизован по корректому логину и неверному паролю');
}
Ответ написан
Как я решил подобную ситуацию у себя:
использование Guzzle;

Потом передаешь произвольные данные из провайдера с вариантами пароля, логина и смотришь по коду ответа - был ли редирект (Успешен или нет метод авторизации). Разумеется допускаешь редиректы и включаешь куки.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
26 янв. 2020, в 17:40
1000 руб./за проект
26 янв. 2020, в 17:25
10000 руб./за проект
26 янв. 2020, в 17:06
120000 руб./за проект