Fix #733: don't raise error when updating user with same email

This commit is contained in:
François Voron
2021-09-20 08:49:19 +02:00
parent ab89cdea2f
commit ab06778adf
2 changed files with 17 additions and 7 deletions

View File

@@ -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)

View File

@@ -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