# encoding: utf-8
# frozen_string_literal: true
require_relative '../spec_helper'
module Aws
module SQS
class Client
describe ':verify_checksums' do
let(:client) { Client.new(stub_responses:true, verify_checksums: true) }
let(:message_body) { 'abc' }
let(:message_attributes) {{
'ccc' => {
string_value: 'test',
data_type: 'String'
},
aaa: {
binary_value: [ 2, 3, 4 ].pack('C*'),
data_type: 'Binary'
},
zzz: {
data_type: 'Number',
string_value: '0230.01'
},
'öther_encodings' => {
data_type: 'String',
string_value: 'Tüst'.encode('ISO-8859-1')
}
}}
it 'is enabled by default' do
client = Client.new(
region: 'us-east-1',
access_key_id: 'akid',
secret_access_key: 'secret',
)
expect(client.config.verify_checksums).to be(true)
end
it 'is disabled when response stubbing is enabled' do
client = Client.new(stub_responses: true)
expect(client.config.verify_checksums).to be(false)
end
it 'can be enabled with response stubbing is enabled' do
client = Client.new(stub_responses: true, verify_checksums: true)
expect(client.config.verify_checksums).to be(true)
end
describe '#send_message' do
let(:md5_of_attributes) { '756d7f4338696745d063b420a2f7e502' }
before(:each) do
if client.config.api.metadata['protocol'] == 'json'
response_body = <<-JSON
{
"MD5OfMessageAttributes": "#{md5_of_attributes}",
"MD5OfMessageBody": "900150983cd24fb0d6963f7d28e17f72",
"MessageId": "5fea7756-0ea4-451a-a703-a558b933e274"
}
JSON
else
response_body = <<-XML
900150983cd24fb0d6963f7d28e17f72
#{md5_of_attributes}
5fea7756-0ea4-451a-a703-a558b933e274
XML
end
client.handle(step: :send) do |context|
context.http_response.signal_done(
status_code: 200,
headers: {},
body: response_body)
Seahorse::Client::Response.new(context: context)
end
end
it 'does not raise an error if checksums match' do
expect {
client.send_message(
queue_url:'https://queue.url',
message_body: message_body,
message_attributes: message_attributes,
)
}.not_to raise_error
end
it 'does not raise an error with empty message attributes' do
expect {
client.send_message(
queue_url:'https://queue.url',
message_body: message_body,
message_attributes: {},
)
}.not_to raise_error
end
context 'when data types have custom labels' do
let(:md5_of_attributes) { '5b7ef6c8a8d46001c7cdadaeea917aa4' }
before(:each) do
message_attributes.keys.each do |attribute_name|
message_attributes[attribute_name][:data_type] += '.test'
end
end
it 'does not raise an error if checksums match' do
expect {
client.send_message(
queue_url:'https://queue.url',
message_body: message_body,
message_attributes: message_attributes,
)
}.not_to raise_error
end
end
it 'raises when the md5 checksums do not match for the body' do
expect {
client.send_message(
queue_url:'https://queue.url',
message_body: message_body + 'junk',
message_attributes: message_attributes,
)
}.to raise_error(Aws::Errors::ChecksumError)
end
it 'raises when the md5 checksums do not match for the body' do
message_attributes['ccc'][:string_value] += 'junk'
expect {
client.send_message(
queue_url:'https://queue.url',
message_body: message_body,
message_attributes: message_attributes,
)
}.to raise_error(Aws::Errors::ChecksumError)
end
it 'does not interfere with service errors' do
client.handle(step: :send) do |context|
context.http_response.signal_done(
status_code: 500,
headers: {},
body:'',
)
Seahorse::Client::Response.new(context: context)
end
expect {
client.send_message(
queue_url:'https://queue.url',
message_body: message_body,
message_attributes: message_attributes,
)
}.to raise_error(Aws::SQS::Errors::ServiceError)
end
end
describe '#send_message_batch' do
before(:each) do
if client.config.api.metadata['protocol'] == 'json'
client.handle(step: :send) do |context|
context.http_response.signal_done(
status_code: 200,
headers: {},
body:<<-JSON)
{
"Successful": [
{
"Id": "msg-id",
"MD5OfMessageBody": "900150983cd24fb0d6963f7d28e17f72",
"MD5OfMessageAttributes": "756d7f4338696745d063b420a2f7e502"
}
]
}
JSON
Seahorse::Client::Response.new(context: context)
end
else
client.handle(step: :send) do |context|
context.http_response.signal_done(
status_code: 200,
headers: {},
body:<<-XML)
msg-id
900150983cd24fb0d6963f7d28e17f72
756d7f4338696745d063b420a2f7e502
XML
Seahorse::Client::Response.new(context: context)
end
end
end
it 'does not raise an error if checksums match' do
expect {
client.send_message_batch(
queue_url:'https://queue.url',
entries: [
{
id: 'msg-id',
message_body: message_body,
message_attributes: message_attributes,
}
]
)
}.not_to raise_error
end
it 'raises when the md5 checksums do not match for the body' do
expect {
client.send_message_batch(
queue_url:'https://queue.url',
entries: [
{
id: 'msg-id',
message_body: message_body + 'junk',
message_attributes: message_attributes,
}
]
)
}.to raise_error(Aws::Errors::ChecksumError)
end
it 'raises when the md5 checksums do not match for the body' do
message_attributes['ccc'][:string_value] += 'junk'
expect {
client.send_message_batch(
queue_url:'https://queue.url',
entries: [
{
id: 'msg-id',
message_body: message_body,
message_attributes: message_attributes,
}
]
)
}.to raise_error(Aws::Errors::ChecksumError)
end
it 'skips failed errors' do
if client.config.api.metadata['protocol'] == 'json'
client.handle(step: :send) do |context|
context.http_response.signal_done(
status_code: 200,
headers: {},
body:<<-JSON)
{
"Successful": [],
"Failed": [
{
"Id": "msg-id"
}
]
}
JSON
Seahorse::Client::Response.new(context: context)
end
else
client.handle(step: :send) do |context|
context.http_response.signal_done(
status_code: 200,
headers: {},
body:<<-XML)
msg-id
XML
Seahorse::Client::Response.new(context: context)
end
end
expect {
client.send_message_batch(
queue_url:'https://queue.url',
entries: [
{
id: 'msg-id',
message_body: message_body,
message_attributes: message_attributes,
}
]
)
}.not_to raise_error
end
it 'does not interfere with service errors' do
client.handle(step: :send) do |context|
context.http_response.signal_done(
status_code: 500,
headers: {},
body:'',
)
Seahorse::Client::Response.new(context: context)
end
expect {
client.send_message_batch(
queue_url:'https://queue.url',
entries: []
)
}.to raise_error(Aws::SQS::Errors::ServiceError)
end
end
end
end
end
end