moto/tests/test_elasticache/test_elasticache.py
2021-12-07 11:09:13 -01:00

217 lines
7.0 KiB
Python

import boto3
import pytest
import sure # noqa # pylint: disable=unused-import
from botocore.exceptions import ClientError
from moto import mock_elasticache
from moto.core import ACCOUNT_ID
# 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.")