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