95 lines
3.5 KiB
Python
95 lines
3.5 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import sure # noqa
|
|
|
|
from botocore.awsrequest import AWSPreparedRequest
|
|
|
|
from moto.core.responses import AWSServiceSpec, BaseResponse
|
|
from moto.core.responses import flatten_json_request_body
|
|
|
|
|
|
def test_flatten_json_request_body():
|
|
spec = AWSServiceSpec("data/emr/2009-03-31/service-2.json").input_spec("RunJobFlow")
|
|
|
|
body = {
|
|
"Name": "cluster",
|
|
"Instances": {
|
|
"Ec2KeyName": "ec2key",
|
|
"InstanceGroups": [
|
|
{"InstanceRole": "MASTER", "InstanceType": "m1.small"},
|
|
{"InstanceRole": "CORE", "InstanceType": "m1.medium"},
|
|
],
|
|
"Placement": {"AvailabilityZone": "us-east-1"},
|
|
},
|
|
"Steps": [
|
|
{
|
|
"HadoopJarStep": {
|
|
"Properties": [
|
|
{"Key": "k1", "Value": "v1"},
|
|
{"Key": "k2", "Value": "v2"},
|
|
],
|
|
"Args": ["arg1", "arg2"],
|
|
}
|
|
}
|
|
],
|
|
"Configurations": [
|
|
{
|
|
"Classification": "class",
|
|
"Properties": {"propkey1": "propkey1", "propkey2": "propkey2"},
|
|
},
|
|
{"Classification": "anotherclass", "Properties": {"propkey3": "propkey3"}},
|
|
],
|
|
}
|
|
|
|
flat = flatten_json_request_body("", body, spec)
|
|
flat["Name"].should.equal(body["Name"])
|
|
flat["Instances.Ec2KeyName"].should.equal(body["Instances"]["Ec2KeyName"])
|
|
for idx in range(2):
|
|
flat[
|
|
"Instances.InstanceGroups.member." + str(idx + 1) + ".InstanceRole"
|
|
].should.equal(body["Instances"]["InstanceGroups"][idx]["InstanceRole"])
|
|
flat[
|
|
"Instances.InstanceGroups.member." + str(idx + 1) + ".InstanceType"
|
|
].should.equal(body["Instances"]["InstanceGroups"][idx]["InstanceType"])
|
|
flat["Instances.Placement.AvailabilityZone"].should.equal(
|
|
body["Instances"]["Placement"]["AvailabilityZone"]
|
|
)
|
|
|
|
for idx in range(1):
|
|
prefix = "Steps.member." + str(idx + 1) + ".HadoopJarStep"
|
|
step = body["Steps"][idx]["HadoopJarStep"]
|
|
i = 0
|
|
while prefix + ".Properties.member." + str(i + 1) + ".Key" in flat:
|
|
flat[prefix + ".Properties.member." + str(i + 1) + ".Key"].should.equal(
|
|
step["Properties"][i]["Key"]
|
|
)
|
|
flat[prefix + ".Properties.member." + str(i + 1) + ".Value"].should.equal(
|
|
step["Properties"][i]["Value"]
|
|
)
|
|
i += 1
|
|
i = 0
|
|
while prefix + ".Args.member." + str(i + 1) in flat:
|
|
flat[prefix + ".Args.member." + str(i + 1)].should.equal(step["Args"][i])
|
|
i += 1
|
|
|
|
for idx in range(2):
|
|
flat["Configurations.member." + str(idx + 1) + ".Classification"].should.equal(
|
|
body["Configurations"][idx]["Classification"]
|
|
)
|
|
|
|
props = {}
|
|
i = 1
|
|
keyfmt = "Configurations.member.{0}.Properties.entry.{1}"
|
|
key = keyfmt.format(idx + 1, i)
|
|
while key + ".key" in flat:
|
|
props[flat[key + ".key"]] = flat[key + ".value"]
|
|
i += 1
|
|
key = keyfmt.format(idx + 1, i)
|
|
props.should.equal(body["Configurations"][idx]["Properties"])
|
|
|
|
|
|
def test_parse_qs_unicode_decode_error():
|
|
body = b'{"key": "%D0"}, "C": "#0 = :0"}'
|
|
request = AWSPreparedRequest("GET", "http://request", {"foo": "bar"}, body, False)
|
|
BaseResponse().setup_class(request, request.url, request.headers)
|