Merge pull request #390 from jotes/iam_sns_server
Added server backends with tests for IAM and SNS services.
This commit is contained in:
commit
ed38a296db
@ -8,6 +8,7 @@ from moto.ec2 import ec2_backend
|
|||||||
from moto.elb import elb_backend
|
from moto.elb import elb_backend
|
||||||
from moto.emr import emr_backend
|
from moto.emr import emr_backend
|
||||||
from moto.glacier import glacier_backend
|
from moto.glacier import glacier_backend
|
||||||
|
from moto.iam import iam_backend
|
||||||
from moto.kinesis import kinesis_backend
|
from moto.kinesis import kinesis_backend
|
||||||
from moto.kms import kms_backend
|
from moto.kms import kms_backend
|
||||||
from moto.rds import rds_backend
|
from moto.rds import rds_backend
|
||||||
@ -15,6 +16,7 @@ from moto.redshift import redshift_backend
|
|||||||
from moto.s3 import s3_backend
|
from moto.s3 import s3_backend
|
||||||
from moto.s3bucket_path import s3bucket_path_backend
|
from moto.s3bucket_path import s3bucket_path_backend
|
||||||
from moto.ses import ses_backend
|
from moto.ses import ses_backend
|
||||||
|
from moto.sns import sns_backend
|
||||||
from moto.sqs import sqs_backend
|
from moto.sqs import sqs_backend
|
||||||
from moto.sts import sts_backend
|
from moto.sts import sts_backend
|
||||||
from moto.route53 import route53_backend
|
from moto.route53 import route53_backend
|
||||||
@ -29,6 +31,7 @@ BACKENDS = {
|
|||||||
'elb': elb_backend,
|
'elb': elb_backend,
|
||||||
'emr': emr_backend,
|
'emr': emr_backend,
|
||||||
'glacier': glacier_backend,
|
'glacier': glacier_backend,
|
||||||
|
'iam': iam_backend,
|
||||||
'kinesis': kinesis_backend,
|
'kinesis': kinesis_backend,
|
||||||
'kms': kms_backend,
|
'kms': kms_backend,
|
||||||
'redshift': redshift_backend,
|
'redshift': redshift_backend,
|
||||||
@ -36,6 +39,7 @@ BACKENDS = {
|
|||||||
's3': s3_backend,
|
's3': s3_backend,
|
||||||
's3bucket_path': s3bucket_path_backend,
|
's3bucket_path': s3bucket_path_backend,
|
||||||
'ses': ses_backend,
|
'ses': ses_backend,
|
||||||
|
'sns': sns_backend,
|
||||||
'sqs': sqs_backend,
|
'sqs': sqs_backend,
|
||||||
'sts': sts_backend,
|
'sts': sts_backend,
|
||||||
'route53': route53_backend
|
'route53': route53_backend
|
||||||
|
@ -559,8 +559,7 @@ USER_TEMPLATE = """<{{ action }}UserResponse>
|
|||||||
<Path>{{ user.path }}</Path>
|
<Path>{{ user.path }}</Path>
|
||||||
<UserName>{{ user.name }}</UserName>
|
<UserName>{{ user.name }}</UserName>
|
||||||
<UserId>{{ user.id }}</UserId>
|
<UserId>{{ user.id }}</UserId>
|
||||||
<Arn>arn:aws:iam::123456789012:user/{{ user.path }}/{{ user.name }}
|
<Arn>arn:aws:iam::123456789012:user/{{ user.path }}/{{ user.name }}</Arn>
|
||||||
</Arn>
|
|
||||||
</User>
|
</User>
|
||||||
</{{ action }}UserResult>
|
</{{ action }}UserResult>
|
||||||
<ResponseMetadata>
|
<ResponseMetadata>
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
import json
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
|
from six.moves.urllib.parse import urlencode
|
||||||
|
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
|
from flask.testing import FlaskClient
|
||||||
from werkzeug.routing import BaseConverter
|
from werkzeug.routing import BaseConverter
|
||||||
from werkzeug.serving import run_simple
|
from werkzeug.serving import run_simple
|
||||||
|
|
||||||
@ -60,18 +64,38 @@ class RegexConverter(BaseConverter):
|
|||||||
self.regex = items[0]
|
self.regex = items[0]
|
||||||
|
|
||||||
|
|
||||||
|
class AWSTestHelper(FlaskClient):
|
||||||
|
|
||||||
|
def action_data(self, action_name, **kwargs):
|
||||||
|
"""
|
||||||
|
Method calls resource with action_name and returns data of response.
|
||||||
|
"""
|
||||||
|
opts = {"Action": action_name}
|
||||||
|
opts.update(kwargs)
|
||||||
|
res = self.get("/?{0}".format(urlencode(opts)),
|
||||||
|
headers={"Host": "{0}.us-east-1.amazonaws.com".format(self.application.service)})
|
||||||
|
return res.data.decode("utf-8")
|
||||||
|
|
||||||
|
def action_json(self, action_name, **kwargs):
|
||||||
|
"""
|
||||||
|
Method calls resource with action_name and returns object obtained via
|
||||||
|
deserialization of output.
|
||||||
|
"""
|
||||||
|
return json.loads(self.action_data(action_name, **kwargs))
|
||||||
|
|
||||||
|
|
||||||
def create_backend_app(service):
|
def create_backend_app(service):
|
||||||
from werkzeug.routing import Map
|
from werkzeug.routing import Map
|
||||||
|
|
||||||
# Create the backend_app
|
# Create the backend_app
|
||||||
backend_app = Flask(__name__)
|
backend_app = Flask(__name__)
|
||||||
backend_app.debug = True
|
backend_app.debug = True
|
||||||
|
backend_app.service = service
|
||||||
|
|
||||||
# Reset view functions to reset the app
|
# Reset view functions to reset the app
|
||||||
backend_app.view_functions = {}
|
backend_app.view_functions = {}
|
||||||
backend_app.url_map = Map()
|
backend_app.url_map = Map()
|
||||||
backend_app.url_map.converters['regex'] = RegexConverter
|
backend_app.url_map.converters['regex'] = RegexConverter
|
||||||
|
|
||||||
backend = BACKENDS[service]
|
backend = BACKENDS[service]
|
||||||
for url_path, handler in backend.flask_paths.items():
|
for url_path, handler in backend.flask_paths.items():
|
||||||
if handler.__name__ == 'dispatch':
|
if handler.__name__ == 'dispatch':
|
||||||
@ -91,6 +115,7 @@ def create_backend_app(service):
|
|||||||
view_func=convert_flask_to_httpretty_response(handler),
|
view_func=convert_flask_to_httpretty_response(handler),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
backend_app.test_client_class = AWSTestHelper
|
||||||
return backend_app
|
return backend_app
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,23 +19,13 @@ def test_cloudformation_server_get():
|
|||||||
template_body = {
|
template_body = {
|
||||||
"Resources": {},
|
"Resources": {},
|
||||||
}
|
}
|
||||||
res = test_client.get(
|
res = test_client.action_json("CreateStack", StackName=stack_name,
|
||||||
'/?{0}'.format(
|
TemplateBody=json.dumps(template_body))
|
||||||
urlencode({
|
stack_id = res["CreateStackResponse"]["CreateStackResult"]["StackId"]
|
||||||
"Action": "CreateStack",
|
|
||||||
"StackName": stack_name,
|
|
||||||
"TemplateBody": json.dumps(template_body)
|
|
||||||
})
|
|
||||||
),
|
|
||||||
headers={"Host": "cloudformation.us-east-1.amazonaws.com"}
|
|
||||||
)
|
|
||||||
stack_id = json.loads(res.data.decode("utf-8"))["CreateStackResponse"]["CreateStackResult"]["StackId"]
|
|
||||||
|
|
||||||
res = test_client.get(
|
data = test_client.action_data("ListStacks")
|
||||||
'/?Action=ListStacks',
|
|
||||||
headers={"Host": "cloudformation.us-east-1.amazonaws.com"}
|
stacks = re.search("<StackId>(.*)</StackId>", data)
|
||||||
)
|
|
||||||
stacks = re.search("<StackId>(.*)</StackId>", res.data.decode('utf-8'))
|
|
||||||
|
|
||||||
list_stack_id = stacks.groups()[0]
|
list_stack_id = stacks.groups()[0]
|
||||||
assert stack_id == list_stack_id
|
assert stack_id == list_stack_id
|
||||||
|
25
tests/test_iam/test_server.py
Normal file
25
tests/test_iam/test_server.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sure # noqa
|
||||||
|
|
||||||
|
import moto.server as server
|
||||||
|
|
||||||
|
'''
|
||||||
|
Test the different server responses
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def test_iam_server_get():
|
||||||
|
backend = server.create_backend_app("iam")
|
||||||
|
test_client = backend.test_client()
|
||||||
|
|
||||||
|
group_data = test_client.action_data("CreateGroup", GroupName="test group", Path="/")
|
||||||
|
group_id = re.search("<GroupId>(.*)</GroupId>", group_data).groups()[0]
|
||||||
|
|
||||||
|
groups_data = test_client.action_data("ListGroups")
|
||||||
|
groups_ids = re.findall("<GroupId>(.*)</GroupId>", groups_data)
|
||||||
|
|
||||||
|
assert group_id in groups_ids
|
@ -1 +1,24 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sure # noqa
|
||||||
|
|
||||||
|
import moto.server as server
|
||||||
|
|
||||||
|
'''
|
||||||
|
Test the different server responses
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def test_sns_server_get():
|
||||||
|
backend = server.create_backend_app("sns")
|
||||||
|
test_client = backend.test_client()
|
||||||
|
|
||||||
|
topic_data = test_client.action_json("CreateTopic", Name="test topic")
|
||||||
|
topic_arn = topic_data["CreateTopicResponse"]["CreateTopicResult"]["TopicArn"]
|
||||||
|
topics_data = test_client.action_json("ListTopics")
|
||||||
|
topics_arns = [t["TopicArn"] for t in topics_data["ListTopicsResponse"]["ListTopicsResult"]["Topics"]]
|
||||||
|
|
||||||
|
assert topic_arn in topics_arns
|
Loading…
x
Reference in New Issue
Block a user