Merge pull request #488 from SamR1/fix-cli-user-creation
CLI - fix user creation when user already exists with same email
This commit is contained in:
commit
0726aeb748
227
fittrackee/tests/users/test_users_commands.py
Normal file
227
fittrackee/tests/users/test_users_commands.py
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
import secrets
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from click.testing import CliRunner
|
||||||
|
from flask import Flask
|
||||||
|
|
||||||
|
from fittrackee.cli import users_cli
|
||||||
|
from fittrackee.users.models import User
|
||||||
|
|
||||||
|
from ..utils import random_email, random_string
|
||||||
|
|
||||||
|
|
||||||
|
class TestCliUserCreate:
|
||||||
|
def test_it_displays_error_when_user_exists_with_same_username(
|
||||||
|
self, app: Flask, user_1: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
[
|
||||||
|
"create",
|
||||||
|
user_1.username,
|
||||||
|
"--email",
|
||||||
|
random_email(),
|
||||||
|
"--password",
|
||||||
|
random_string(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (
|
||||||
|
result.output
|
||||||
|
== 'Error(s) occurred:\nsorry, that username is already taken\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_it_displays_error_when_user_exists_with_same_email(
|
||||||
|
self, app: Flask, user_1: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
[
|
||||||
|
"create",
|
||||||
|
random_string(),
|
||||||
|
"--email",
|
||||||
|
user_1.email,
|
||||||
|
"--password",
|
||||||
|
random_string(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == (
|
||||||
|
'Error(s) occurred:\n'
|
||||||
|
'This user already exists. No action done.\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_it_displays_success_message_when_user_is_created(
|
||||||
|
self,
|
||||||
|
app: Flask,
|
||||||
|
) -> None:
|
||||||
|
username = random_string()
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
[
|
||||||
|
"create",
|
||||||
|
username,
|
||||||
|
"--email",
|
||||||
|
random_email(),
|
||||||
|
"--password",
|
||||||
|
random_string(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == f"User '{username}' created.\n"
|
||||||
|
|
||||||
|
def test_it_displays_password_when_password_is_not_provided(
|
||||||
|
self,
|
||||||
|
app: Flask,
|
||||||
|
) -> None:
|
||||||
|
username = random_string()
|
||||||
|
password = random_string()
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
with patch.object(secrets, 'token_urlsafe', return_value=password):
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["create", username, "--email", random_email()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == (
|
||||||
|
f"User '{username}' created.\n"
|
||||||
|
f"The user password is: {password}\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestCliUserUpdate:
|
||||||
|
def test_it_displays_error_when_user_does_not_exist(
|
||||||
|
self, app: Flask
|
||||||
|
) -> None:
|
||||||
|
username = random_string()
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", username],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == (
|
||||||
|
f"User '{username}' not found.\n"
|
||||||
|
f"Check the provided user name (case sensitive).\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_it_displays_no_updates_when_no_option_provided(
|
||||||
|
self, app: Flask, user_1: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", user_1.username],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == 'No updates.\n'
|
||||||
|
|
||||||
|
def test_it_displays_error_updated_when_user_not_found(
|
||||||
|
self, app: Flask, user_1: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", user_1.username.upper(), '--set-admin', "true"],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == (
|
||||||
|
f"User '{user_1.username.upper()}' not found.\n"
|
||||||
|
f"Check the provided user name (case sensitive).\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_it_displays_user_updated_when_setting_admin_rights(
|
||||||
|
self, app: Flask, user_1: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", user_1.username, '--set-admin', "true"],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == f"User '{user_1.username}' updated.\n"
|
||||||
|
|
||||||
|
def test_it_displays_user_updated_when_removing_admin_rights(
|
||||||
|
self, app: Flask, user_1_admin: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", user_1_admin.username, '--set-admin', "false"],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == f"User '{user_1_admin.username}' updated.\n"
|
||||||
|
|
||||||
|
def test_it_displays_user_updated_when_activating_user(
|
||||||
|
self, app: Flask, inactive_user: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", inactive_user.username, '--activate'],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == f"User '{inactive_user.username}' updated.\n"
|
||||||
|
|
||||||
|
def test_it_displays_password_when_resetting_password(
|
||||||
|
self, app: Flask, user_1: User
|
||||||
|
) -> None:
|
||||||
|
password = random_string()
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
with patch.object(secrets, 'token_urlsafe', return_value=password):
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", user_1.username, '--reset-password'],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == (
|
||||||
|
f"User '{user_1.username}' updated.\n"
|
||||||
|
f"The new password is: {password}\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_it_displays_user_updated_when_updating_email(
|
||||||
|
self, app: Flask, inactive_user: User
|
||||||
|
) -> None:
|
||||||
|
new_email = random_email()
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
["update", inactive_user.username, '--update-email', new_email],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.output == f"User '{inactive_user.username}' updated.\n"
|
||||||
|
|
||||||
|
def test_it_displays_error_when_email_is_invalid(
|
||||||
|
self, app: Flask, inactive_user: User
|
||||||
|
) -> None:
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
result = runner.invoke(
|
||||||
|
users_cli,
|
||||||
|
[
|
||||||
|
"update",
|
||||||
|
inactive_user.username,
|
||||||
|
'--update-email',
|
||||||
|
random_string(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (
|
||||||
|
result.output
|
||||||
|
== "An error occurred: valid email must be provided\n"
|
||||||
|
)
|
@ -40,7 +40,7 @@ def create_user(username: str, email: str, password: Optional[str]) -> None:
|
|||||||
try:
|
try:
|
||||||
user_manager_service = UserManagerService(username)
|
user_manager_service = UserManagerService(username)
|
||||||
user, user_password = user_manager_service.create_user(
|
user, user_password = user_manager_service.create_user(
|
||||||
email=email, password=password
|
email=email, password=password, check_email=True
|
||||||
)
|
)
|
||||||
db.session.add(user)
|
db.session.add(user)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
Loading…
Reference in New Issue
Block a user