From ab06778adf51ae38f58f7eb1d48046d7a3fab20b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Voron?= Date: Mon, 20 Sep 2021 08:49:19 +0200 Subject: [PATCH] Fix #733: don't raise error when updating user with same email --- fastapi_users/manager.py | 14 +++++++------- tests/test_manager.py | 10 ++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/fastapi_users/manager.py b/fastapi_users/manager.py index 8da3e423..d8925576 100644 --- a/fastapi_users/manager.py +++ b/fastapi_users/manager.py @@ -536,19 +536,19 @@ class BaseUserManager(Generic[models.UC, models.UD]): async def _update(self, user: models.UD, update_dict: Dict[str, Any]) -> models.UD: for field in update_dict: - if field == "email": + value = update_dict[field] + if field == "email" and value != user.email: try: - await self.get_by_email(update_dict[field]) + await self.get_by_email(value) raise UserAlreadyExists() except UserNotExists: - user.email = update_dict[field] + user.email = value elif field == "password": - password = update_dict[field] - await self.validate_password(password, user) - hashed_password = get_password_hash(password) + await self.validate_password(value, user) + hashed_password = get_password_hash(value) user.hashed_password = hashed_password else: - setattr(user, field, update_dict[field]) + setattr(user, field, value) return await self.user_db.update(user) diff --git a/tests/test_manager.py b/tests/test_manager.py index 67f3ae9e..ed284b11 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -471,6 +471,16 @@ class TestUpdateUser: assert user_manager.on_after_update.called is False + async def test_email_update_with_same_email( + self, user: UserDB, user_manager: UserManagerMock + ): + user_update = UserUpdate(email=user.email) + updated_user = await user_manager.update(user_update, user, safe=True) + + assert updated_user.email == user.email + + assert user_manager.on_after_update.called is True + @pytest.mark.asyncio @pytest.mark.manager