| 
									
										
										
										
											2021-12-07 11:09:13 -01:00
										 |  |  | import boto3 | 
					
						
							|  |  |  | import pytest | 
					
						
							|  |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from botocore.exceptions import ClientError | 
					
						
							|  |  |  | from moto import mock_elasticache | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  | from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2021-12-07 11:09:13 -01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # See our Development Tips on writing tests for hints on how to write good tests: | 
					
						
							|  |  |  | # http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_create_user_no_password_required(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  |     user_id = "user1" | 
					
						
							|  |  |  |     resp = client.create_user( | 
					
						
							|  |  |  |         UserId=user_id, | 
					
						
							|  |  |  |         UserName="User1", | 
					
						
							|  |  |  |         Engine="Redis", | 
					
						
							|  |  |  |         AccessString="on ~* +@all", | 
					
						
							|  |  |  |         NoPasswordRequired=True, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp.should.have.key("UserId").equals(user_id) | 
					
						
							|  |  |  |     resp.should.have.key("UserName").equals("User1") | 
					
						
							|  |  |  |     resp.should.have.key("Status").equals("active") | 
					
						
							|  |  |  |     resp.should.have.key("Engine").equals("Redis") | 
					
						
							|  |  |  |     resp.should.have.key("MinimumEngineVersion").equals("6.0") | 
					
						
							|  |  |  |     resp.should.have.key("AccessString").equals("on ~* +@all") | 
					
						
							|  |  |  |     resp.should.have.key("UserGroupIds").equals([]) | 
					
						
							|  |  |  |     resp.should.have.key("Authentication") | 
					
						
							|  |  |  |     resp["Authentication"].should.have.key("Type").equals("no-password") | 
					
						
							|  |  |  |     resp["Authentication"].shouldnt.have.key("PasswordCount") | 
					
						
							|  |  |  |     resp.should.have.key("ARN").equals( | 
					
						
							|  |  |  |         f"arn:aws:elasticache:ap-southeast-1:{ACCOUNT_ID}:user:{user_id}" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_create_user_with_password_too_short(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  |     user_id = "user1" | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as exc: | 
					
						
							|  |  |  |         client.create_user( | 
					
						
							|  |  |  |             UserId=user_id, | 
					
						
							|  |  |  |             UserName="User1", | 
					
						
							|  |  |  |             Engine="Redis", | 
					
						
							|  |  |  |             AccessString="on ~* +@all", | 
					
						
							|  |  |  |             Passwords=["mysecretpass"], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     err = exc.value.response["Error"] | 
					
						
							|  |  |  |     err["Code"].should.equal("InvalidParameterValue") | 
					
						
							|  |  |  |     err["Message"].should.equal("Passwords length must be between 16-128 characters.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_create_user_with_password(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  |     user_id = "user1" | 
					
						
							|  |  |  |     resp = client.create_user( | 
					
						
							|  |  |  |         UserId=user_id, | 
					
						
							|  |  |  |         UserName="User1", | 
					
						
							|  |  |  |         Engine="Redis", | 
					
						
							|  |  |  |         AccessString="on ~* +@all", | 
					
						
							|  |  |  |         Passwords=["mysecretpassthatsverylong"], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp.should.have.key("UserId").equals(user_id) | 
					
						
							|  |  |  |     resp.should.have.key("UserName").equals("User1") | 
					
						
							|  |  |  |     resp.should.have.key("Status").equals("active") | 
					
						
							|  |  |  |     resp.should.have.key("Engine").equals("Redis") | 
					
						
							|  |  |  |     resp.should.have.key("MinimumEngineVersion").equals("6.0") | 
					
						
							|  |  |  |     resp.should.have.key("AccessString").equals("on ~* +@all") | 
					
						
							|  |  |  |     resp.should.have.key("UserGroupIds").equals([]) | 
					
						
							|  |  |  |     resp.should.have.key("Authentication") | 
					
						
							|  |  |  |     resp["Authentication"].should.have.key("Type").equals("password") | 
					
						
							|  |  |  |     resp["Authentication"].should.have.key("PasswordCount").equals(1) | 
					
						
							|  |  |  |     resp.should.have.key("ARN").equals( | 
					
						
							|  |  |  |         f"arn:aws:elasticache:ap-southeast-1:{ACCOUNT_ID}:user:{user_id}" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_create_user_without_password(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as exc: | 
					
						
							|  |  |  |         client.create_user( | 
					
						
							|  |  |  |             UserId="user1", UserName="User1", Engine="Redis", AccessString="?" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     err = exc.value.response["Error"] | 
					
						
							|  |  |  |     err["Code"].should.equal("InvalidParameterValue") | 
					
						
							|  |  |  |     err["Message"].should.equal( | 
					
						
							|  |  |  |         "No password was provided. If you want to create/update the user without password, please use the NoPasswordRequired flag." | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_create_user_twice(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  |     user_id = "user1" | 
					
						
							|  |  |  |     client.create_user( | 
					
						
							|  |  |  |         UserId=user_id, | 
					
						
							|  |  |  |         UserName="User1", | 
					
						
							|  |  |  |         Engine="Redis", | 
					
						
							|  |  |  |         AccessString="on ~* +@all", | 
					
						
							|  |  |  |         Passwords=["mysecretpassthatsverylong"], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as exc: | 
					
						
							|  |  |  |         client.create_user( | 
					
						
							|  |  |  |             UserId=user_id, | 
					
						
							|  |  |  |             UserName="User1", | 
					
						
							|  |  |  |             Engine="Redis", | 
					
						
							|  |  |  |             AccessString="on ~* +@all", | 
					
						
							|  |  |  |             Passwords=["mysecretpassthatsverylong"], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     err = exc.value.response["Error"] | 
					
						
							|  |  |  |     err["Code"].should.equal("UserAlreadyExists") | 
					
						
							|  |  |  |     err["Message"].should.equal("User user1 already exists.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_delete_user_unknown(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as exc: | 
					
						
							|  |  |  |         client.delete_user(UserId="unknown") | 
					
						
							|  |  |  |     err = exc.value.response["Error"] | 
					
						
							|  |  |  |     err["Code"].should.equal("UserNotFound") | 
					
						
							|  |  |  |     err["Message"].should.equal("User unknown not found.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_delete_user(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_user( | 
					
						
							|  |  |  |         UserId="user1", | 
					
						
							|  |  |  |         UserName="User1", | 
					
						
							|  |  |  |         Engine="Redis", | 
					
						
							|  |  |  |         AccessString="on ~* +@all", | 
					
						
							|  |  |  |         Passwords=["mysecretpassthatsverylong"], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.delete_user(UserId="user1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Initial status is 'deleting' | 
					
						
							|  |  |  |     resp = client.describe_users(UserId="user1") | 
					
						
							|  |  |  |     resp["Users"][0]["Status"].should.equal("deleting") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # User is only deleted after some time | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as exc: | 
					
						
							|  |  |  |         client.describe_users(UserId="unknown") | 
					
						
							|  |  |  |     exc.value.response["Error"]["Code"].should.equal("UserNotFound") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_describe_users_initial(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="us-east-2") | 
					
						
							|  |  |  |     resp = client.describe_users() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp.should.have.key("Users").length_of(1) | 
					
						
							|  |  |  |     resp["Users"][0].should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "UserId": "default", | 
					
						
							|  |  |  |             "UserName": "default", | 
					
						
							|  |  |  |             "Status": "active", | 
					
						
							|  |  |  |             "Engine": "redis", | 
					
						
							|  |  |  |             "MinimumEngineVersion": "6.0", | 
					
						
							|  |  |  |             "AccessString": "on ~* +@all", | 
					
						
							|  |  |  |             "UserGroupIds": [], | 
					
						
							|  |  |  |             "Authentication": {"Type": "no-password"}, | 
					
						
							|  |  |  |             "ARN": f"arn:aws:elasticache:us-east-2:{ACCOUNT_ID}:user:default", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_describe_users(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_user( | 
					
						
							|  |  |  |         UserId="user1", | 
					
						
							|  |  |  |         UserName="User1", | 
					
						
							|  |  |  |         Engine="Redis", | 
					
						
							|  |  |  |         AccessString="on ~* +@all", | 
					
						
							|  |  |  |         Passwords=["mysecretpassthatsverylong"], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.describe_users() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp.should.have.key("Users").length_of(2) | 
					
						
							|  |  |  |     resp["Users"].should.contain( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "UserId": "user1", | 
					
						
							|  |  |  |             "UserName": "User1", | 
					
						
							|  |  |  |             "Status": "active", | 
					
						
							|  |  |  |             "Engine": "Redis", | 
					
						
							|  |  |  |             "MinimumEngineVersion": "6.0", | 
					
						
							|  |  |  |             "AccessString": "on ~* +@all", | 
					
						
							|  |  |  |             "UserGroupIds": [], | 
					
						
							|  |  |  |             "Authentication": {"Type": "password", "PasswordCount": 1}, | 
					
						
							|  |  |  |             "ARN": f"arn:aws:elasticache:ap-southeast-1:{ACCOUNT_ID}:user:user1", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elasticache | 
					
						
							|  |  |  | def test_describe_users_unknown_userid(): | 
					
						
							|  |  |  |     client = boto3.client("elasticache", region_name="ap-southeast-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as exc: | 
					
						
							|  |  |  |         client.describe_users(UserId="unknown") | 
					
						
							|  |  |  |     err = exc.value.response["Error"] | 
					
						
							|  |  |  |     err["Code"].should.equal("UserNotFound") | 
					
						
							|  |  |  |     err["Message"].should.equal("User unknown not found.") |