2022-02-13 12:08:24 +01:00
|
|
|
from unittest.mock import patch
|
|
|
|
|
2022-02-12 14:30:59 +01:00
|
|
|
import pytest
|
|
|
|
from flask import Flask
|
|
|
|
|
2022-03-19 20:34:36 +01:00
|
|
|
from fittrackee.tests.utils import random_string
|
2022-02-12 14:30:59 +01:00
|
|
|
from fittrackee.users.exceptions import UserNotFoundException
|
|
|
|
from fittrackee.users.models import User
|
2022-02-16 18:07:05 +01:00
|
|
|
from fittrackee.users.utils.admin import set_admin_rights
|
|
|
|
from fittrackee.users.utils.controls import (
|
2022-03-13 08:39:50 +01:00
|
|
|
check_password,
|
2022-02-13 12:08:24 +01:00
|
|
|
check_username,
|
|
|
|
is_valid_email,
|
|
|
|
register_controls,
|
|
|
|
)
|
2022-02-12 14:30:59 +01:00
|
|
|
|
|
|
|
|
|
|
|
class TestSetAdminRights:
|
|
|
|
def test_it_raises_exception_if_user_does_not_exist(
|
|
|
|
self, app: Flask
|
|
|
|
) -> None:
|
|
|
|
with pytest.raises(UserNotFoundException):
|
|
|
|
set_admin_rights(random_string())
|
|
|
|
|
|
|
|
def test_it_sets_admin_right_for_a_given_user(
|
|
|
|
self, app: Flask, user_1: User
|
|
|
|
) -> None:
|
|
|
|
set_admin_rights(user_1.username)
|
|
|
|
|
|
|
|
assert user_1.admin is True
|
|
|
|
|
|
|
|
def test_it_does_not_raise_exception_when_user_has_already_admin_right(
|
|
|
|
self, app: Flask, user_1_admin: User
|
|
|
|
) -> None:
|
|
|
|
set_admin_rights(user_1_admin.username)
|
|
|
|
|
|
|
|
assert user_1_admin.admin is True
|
2022-02-13 12:08:24 +01:00
|
|
|
|
2022-03-20 16:31:48 +01:00
|
|
|
def test_it_activates_account_if_user_is_inactive(
|
|
|
|
self, app: Flask, inactive_user: User
|
|
|
|
) -> None:
|
|
|
|
set_admin_rights(inactive_user.username)
|
|
|
|
|
|
|
|
assert inactive_user.admin is True
|
|
|
|
assert inactive_user.is_active is True
|
|
|
|
assert inactive_user.confirmation_token is None
|
|
|
|
|
2022-02-13 12:08:24 +01:00
|
|
|
|
|
|
|
class TestIsValidEmail:
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
('input_email',),
|
|
|
|
[
|
|
|
|
('',),
|
|
|
|
('foo',),
|
|
|
|
('foo@',),
|
|
|
|
('@foo.fr',),
|
|
|
|
('foo@foo',),
|
|
|
|
('.',),
|
|
|
|
('./',),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_it_returns_false_if_email_is_invalid(
|
|
|
|
self, input_email: str
|
|
|
|
) -> None:
|
|
|
|
assert is_valid_email(input_email) is False
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
('input_email',),
|
|
|
|
[
|
|
|
|
('admin@example.com',),
|
|
|
|
('admin@test.example.com',),
|
|
|
|
('admin.site@test.example.com',),
|
|
|
|
('admin-site@test-example.com',),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_it_returns_true_if_email_is_valid(self, input_email: str) -> None:
|
|
|
|
assert is_valid_email(input_email) is True
|
|
|
|
|
|
|
|
|
|
|
|
class TestCheckPasswords:
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
('input_password_length',),
|
|
|
|
[
|
|
|
|
(0,),
|
|
|
|
(3,),
|
|
|
|
(7,),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_it_returns_error_message_string_if_password_length_is_below_8_characters( # noqa
|
|
|
|
self, input_password_length: int
|
|
|
|
) -> None:
|
|
|
|
password = random_string(input_password_length)
|
2022-03-13 08:39:50 +01:00
|
|
|
assert check_password(password) == (
|
2022-02-13 12:08:24 +01:00
|
|
|
'password: 8 characters required\n'
|
|
|
|
)
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
('input_password_length',),
|
|
|
|
[
|
|
|
|
(8,),
|
|
|
|
(10,),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_it_returns_empty_string_when_password_length_exceeds_7_characters(
|
|
|
|
self, input_password_length: int
|
|
|
|
) -> None:
|
|
|
|
password = random_string(input_password_length)
|
2022-03-13 08:39:50 +01:00
|
|
|
assert check_password(password) == ''
|
2022-02-13 12:08:24 +01:00
|
|
|
|
|
|
|
|
|
|
|
class TestIsUsernameValid:
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
('input_username_length',),
|
|
|
|
[
|
|
|
|
(2,),
|
2022-03-13 08:38:45 +01:00
|
|
|
(31,),
|
2022-02-13 12:08:24 +01:00
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_it_returns_error_message_when_username_length_is_invalid(
|
|
|
|
self, input_username_length: int
|
|
|
|
) -> None:
|
|
|
|
assert (
|
|
|
|
check_username(
|
2022-03-13 08:38:45 +01:00
|
|
|
username=random_string(31),
|
2022-02-13 12:08:24 +01:00
|
|
|
)
|
2022-03-13 08:38:45 +01:00
|
|
|
== 'username: 3 to 30 characters required\n'
|
2022-02-13 12:08:24 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
('input_invalid_character',),
|
|
|
|
[
|
|
|
|
('.',),
|
|
|
|
('/',),
|
|
|
|
('$',),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_it_returns_error_message_when_username_has_invalid_character(
|
|
|
|
self, input_invalid_character: str
|
|
|
|
) -> None:
|
|
|
|
username = random_string() + input_invalid_character
|
|
|
|
assert check_username(username=username) == (
|
|
|
|
'username: only alphanumeric characters and the '
|
|
|
|
'underscore character "_" allowed\n'
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_it_returns_empty_string_when_username_is_valid(self) -> None:
|
|
|
|
assert check_username(username=random_string()) == ''
|
|
|
|
|
|
|
|
def test_it_returns_multiple_errors(self) -> None:
|
2022-03-13 08:38:45 +01:00
|
|
|
username = random_string(31) + '.'
|
2022-02-13 12:08:24 +01:00
|
|
|
assert check_username(username=username) == (
|
2022-03-13 08:38:45 +01:00
|
|
|
'username: 3 to 30 characters required\n'
|
2022-02-13 12:08:24 +01:00
|
|
|
'username: only alphanumeric characters and the underscore '
|
|
|
|
'character "_" allowed\n'
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class TestRegisterControls:
|
2022-02-16 18:07:05 +01:00
|
|
|
module_path = 'fittrackee.users.utils.controls.'
|
2022-02-13 12:08:24 +01:00
|
|
|
valid_username = random_string()
|
|
|
|
valid_email = f'{random_string()}@example.com'
|
|
|
|
valid_password = random_string()
|
|
|
|
|
|
|
|
def test_it_calls_all_validators(self) -> None:
|
|
|
|
with patch(
|
2022-03-13 08:39:50 +01:00
|
|
|
self.module_path + 'check_password'
|
2022-02-13 12:08:24 +01:00
|
|
|
) as check_passwords_mock, patch(
|
|
|
|
self.module_path + 'check_username'
|
|
|
|
) as check_username_mock, patch(
|
|
|
|
self.module_path + 'is_valid_email'
|
|
|
|
) as is_valid_email_mock:
|
|
|
|
register_controls(
|
|
|
|
self.valid_username,
|
|
|
|
self.valid_email,
|
|
|
|
self.valid_password,
|
|
|
|
)
|
|
|
|
|
2022-03-13 08:39:50 +01:00
|
|
|
check_passwords_mock.assert_called_once_with(self.valid_password)
|
2022-02-13 12:08:24 +01:00
|
|
|
check_username_mock.assert_called_once_with(self.valid_username)
|
|
|
|
is_valid_email_mock.assert_called_once_with(self.valid_email)
|
|
|
|
|
|
|
|
def test_it_returns_empty_string_when_inputs_are_valid(self) -> None:
|
|
|
|
assert (
|
|
|
|
register_controls(
|
|
|
|
self.valid_username,
|
|
|
|
self.valid_email,
|
|
|
|
self.valid_password,
|
|
|
|
)
|
|
|
|
== ''
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_it_returns_multiple_errors_when_inputs_are_invalid(self) -> None:
|
2022-03-13 08:38:45 +01:00
|
|
|
invalid_username = random_string(31)
|
2022-02-13 12:08:24 +01:00
|
|
|
assert register_controls(
|
|
|
|
username=invalid_username,
|
|
|
|
email=invalid_username,
|
|
|
|
password=random_string(8),
|
|
|
|
) == (
|
2022-03-13 08:38:45 +01:00
|
|
|
'username: 3 to 30 characters required\n'
|
2022-02-13 12:08:24 +01:00
|
|
|
'email: valid email must be provided\n'
|
|
|
|
)
|