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:
		
							
								
								
									
										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()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user