Stubbing the XML AWS expects is not easy (expects lists to have member keys) and has lots of repetitive elements like XyzResponse + XyzRequest … so I wanted to share a few useful helpers that make it dry.
(Alternative: use stub_requests, example PR)
# turn ruby hashes into aws style xml
def fake_xml(name, body={})
xml = {"#{name}Result" => body}
.to_xml(root: "#{name}Response", camelize: true).
.gsub(/ type="array"/, '')
loop do
break unless xml.gsub!(%r{<(\S+)s>\s*<\1>(.*?)</\1>\s*</\1s>}m, "<\\1s><member>\\2</member></\\1s>")
end
xml
end
def expect_aws_request(method, url, action, response={})
request = stub_request(method, url).
with(:body => /Action=#{action}(&|$)/)
request = if response.is_a?(Exception)
request.to_raise(response)
else
request.to_return(:body => fake_xml(action, response))
end
requested << request
request
end
def expect_upload_certificate
expect_aws_request(
:post, "https://iam.amazonaws.com/",
"UploadServerCertificate",
{server_certificate_metadata: {arn: 'FAKE-ARN'}}
)
end
after { requested.each { |r| assert_requested r } }
it "uploads a cert" do
expect_upload_certificate
manager.upload.must_equal 'FAKE-ARN'
end