Merge pull request #390 from jotes/iam_sns_server

Added server backends with tests for IAM and SNS services.
This commit is contained in:
Steve Pulec 2015-08-03 18:58:53 -04:00
commit ed38a296db
6 changed files with 85 additions and 19 deletions

View File

@ -8,6 +8,7 @@ from moto.ec2 import ec2_backend
from moto.elb import elb_backend
from moto.emr import emr_backend
from moto.glacier import glacier_backend
from moto.iam import iam_backend
from moto.kinesis import kinesis_backend
from moto.kms import kms_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.s3bucket_path import s3bucket_path_backend
from moto.ses import ses_backend
from moto.sns import sns_backend
from moto.sqs import sqs_backend
from moto.sts import sts_backend
from moto.route53 import route53_backend
@ -29,6 +31,7 @@ BACKENDS = {
'elb': elb_backend,
'emr': emr_backend,
'glacier': glacier_backend,
'iam': iam_backend,
'kinesis': kinesis_backend,
'kms': kms_backend,
'redshift': redshift_backend,
@ -36,6 +39,7 @@ BACKENDS = {
's3': s3_backend,
's3bucket_path': s3bucket_path_backend,
'ses': ses_backend,
'sns': sns_backend,
'sqs': sqs_backend,
'sts': sts_backend,
'route53': route53_backend

View File

@ -559,8 +559,7 @@ USER_TEMPLATE = """<{{ action }}UserResponse>
<Path>{{ user.path }}</Path>
<UserName>{{ user.name }}</UserName>
<UserId>{{ user.id }}</UserId>
<Arn>arn:aws:iam::123456789012:user/{{ user.path }}/{{ user.name }}
</Arn>
<Arn>arn:aws:iam::123456789012:user/{{ user.path }}/{{ user.name }}</Arn>
</User>
</{{ action }}UserResult>
<ResponseMetadata>

View File

@ -1,11 +1,15 @@
from __future__ import unicode_literals
import json
import re
import sys
import argparse
from six.moves.urllib.parse import urlencode
from threading import Lock
from flask import Flask
from flask.testing import FlaskClient
from werkzeug.routing import BaseConverter
from werkzeug.serving import run_simple
@ -60,18 +64,38 @@ class RegexConverter(BaseConverter):
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):
from werkzeug.routing import Map
# Create the backend_app
backend_app = Flask(__name__)
backend_app.debug = True
backend_app.service = service
# Reset view functions to reset the app
backend_app.view_functions = {}
backend_app.url_map = Map()
backend_app.url_map.converters['regex'] = RegexConverter
backend = BACKENDS[service]
for url_path, handler in backend.flask_paths.items():
if handler.__name__ == 'dispatch':
@ -91,6 +115,7 @@ def create_backend_app(service):
view_func=convert_flask_to_httpretty_response(handler),
)
backend_app.test_client_class = AWSTestHelper
return backend_app

View File

@ -19,23 +19,13 @@ def test_cloudformation_server_get():
template_body = {
"Resources": {},
}
res = test_client.get(
'/?{0}'.format(
urlencode({
"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.action_json("CreateStack", StackName=stack_name,
TemplateBody=json.dumps(template_body))
stack_id = res["CreateStackResponse"]["CreateStackResult"]["StackId"]
res = test_client.get(
'/?Action=ListStacks',
headers={"Host": "cloudformation.us-east-1.amazonaws.com"}
)
stacks = re.search("<StackId>(.*)</StackId>", res.data.decode('utf-8'))
data = test_client.action_data("ListStacks")
stacks = re.search("<StackId>(.*)</StackId>", data)
list_stack_id = stacks.groups()[0]
assert stack_id == list_stack_id

View 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

View File

@ -1 +1,24 @@
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