From ec99a6b8275d928af41e6c2b74b7b40ff4ce3e7b Mon Sep 17 00:00:00 2001 From: "brodie.gallinger" Date: Tue, 6 Aug 2019 13:51:00 -0300 Subject: [PATCH] Existing user now raises a UsernameExistsException If a user is attempted to be added to a pool that already contains a user with that username, the UsernameExistsException is thrown, to match AWS behaviour. --- moto/cognitoidp/exceptions.py | 10 ++++++++ moto/cognitoidp/models.py | 6 ++++- tests/test_cognitoidp/test_cognitoidp.py | 30 ++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/moto/cognitoidp/exceptions.py b/moto/cognitoidp/exceptions.py index 45267021..d05ee8f0 100644 --- a/moto/cognitoidp/exceptions.py +++ b/moto/cognitoidp/exceptions.py @@ -24,6 +24,16 @@ class UserNotFoundError(BadRequest): }) +class UsernameExistsException(BadRequest): + + def __init__(self, message): + super(UsernameExistsException, self).__init__() + self.description = json.dumps({ + "message": message, + '__type': 'UsernameExistsException', + }) + + class GroupExistsException(BadRequest): def __init__(self, message): diff --git a/moto/cognitoidp/models.py b/moto/cognitoidp/models.py index 2c82367c..25a173f2 100644 --- a/moto/cognitoidp/models.py +++ b/moto/cognitoidp/models.py @@ -14,7 +14,8 @@ from jose import jws from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel -from .exceptions import GroupExistsException, NotAuthorizedError, ResourceNotFoundError, UserNotFoundError +from .exceptions import GroupExistsException, NotAuthorizedError, ResourceNotFoundError, UserNotFoundError, \ + UsernameExistsException UserStatus = { "FORCE_CHANGE_PASSWORD": "FORCE_CHANGE_PASSWORD", @@ -561,6 +562,9 @@ class CognitoIdpBackend(BaseBackend): if not user_pool: raise ResourceNotFoundError(user_pool_id) + if username in user_pool.users: + raise UsernameExistsException(username) + user = CognitoIdpUser(user_pool_id, username, temporary_password, UserStatus["FORCE_CHANGE_PASSWORD"], attributes) user_pool.users[user.username] = user return user diff --git a/tests/test_cognitoidp/test_cognitoidp.py b/tests/test_cognitoidp/test_cognitoidp.py index 774ff762..5f9d4a15 100644 --- a/tests/test_cognitoidp/test_cognitoidp.py +++ b/tests/test_cognitoidp/test_cognitoidp.py @@ -886,6 +886,36 @@ def test_admin_create_user(): result["User"]["Enabled"].should.equal(True) +@mock_cognitoidp +def test_admin_create_existing_user(): + conn = boto3.client("cognito-idp", "us-west-2") + + username = str(uuid.uuid4()) + value = str(uuid.uuid4()) + user_pool_id = conn.create_user_pool(PoolName=str(uuid.uuid4()))["UserPool"]["Id"] + conn.admin_create_user( + UserPoolId=user_pool_id, + Username=username, + UserAttributes=[ + {"Name": "thing", "Value": value} + ], + ) + + caught = False + try: + conn.admin_create_user( + UserPoolId=user_pool_id, + Username=username, + UserAttributes=[ + {"Name": "thing", "Value": value} + ], + ) + except conn.exceptions.UsernameExistsException: + caught = True + + caught.should.be.true + + @mock_cognitoidp def test_admin_get_user(): conn = boto3.client("cognito-idp", "us-west-2")