From 42b95023f538808989df042a73b340066751b753 Mon Sep 17 00:00:00 2001 From: Jot Date: Mon, 3 Aug 2015 00:31:36 +0200 Subject: [PATCH] Added iam backend to servers, added some tests to check backend --- moto/backends.py | 2 ++ moto/iam/responses.py | 3 +-- moto/server.py | 27 +++++++++++++++++++++++- tests/test_cloudformation/test_server.py | 24 ++++++--------------- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/moto/backends.py b/moto/backends.py index b45e0fa5e..817db25b9 100644 --- a/moto/backends.py +++ b/moto/backends.py @@ -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 @@ -29,6 +30,7 @@ BACKENDS = { 'elb': elb_backend, 'emr': emr_backend, 'glacier': glacier_backend, + 'iam': iam_backend, 'kinesis': kinesis_backend, 'kms': kms_backend, 'redshift': redshift_backend, diff --git a/moto/iam/responses.py b/moto/iam/responses.py index be1601a83..b490ee302 100644 --- a/moto/iam/responses.py +++ b/moto/iam/responses.py @@ -559,8 +559,7 @@ USER_TEMPLATE = """<{{ action }}UserResponse> {{ user.path }} {{ user.name }} {{ user.id }} - arn:aws:iam::123456789012:user/{{ user.path }}/{{ user.name }} - + arn:aws:iam::123456789012:user/{{ user.path }}/{{ user.name }} diff --git a/moto/server.py b/moto/server.py index 4a7de1a70..d32c6f45e 100644 --- a/moto/server.py +++ b/moto/server.py @@ -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 diff --git a/tests/test_cloudformation/test_server.py b/tests/test_cloudformation/test_server.py index 47a094630..7bfed6dea 100644 --- a/tests/test_cloudformation/test_server.py +++ b/tests/test_cloudformation/test_server.py @@ -15,27 +15,17 @@ Test the different server responses def test_cloudformation_server_get(): backend = server.create_backend_app("cloudformation") stack_name = 'test stack' - test_client = backend.test_client() + test_client = backend.test_client(service="cloudformation") 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("(.*)", res.data.decode('utf-8')) + data = test_client.action_data("ListStacks") + + stacks = re.search("(.*)", data) list_stack_id = stacks.groups()[0] assert stack_id == list_stack_id