1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
require 'spec_helper'
describe "Sending Mail::Messages with Postmark::ApiClient" do
let(:postmark_message_id_format) { /\w{8}\-\w{4}-\w{4}-\w{4}-\w{12}/ }
let(:api_client) { Postmark::ApiClient.new('POSTMARK_API_TEST', :http_open_timeout => 15, :http_read_timeout => 15) }
let(:message) {
Mail.new do
from "sender@postmarkapp.com"
to "recipient@postmarkapp.com"
subject "Mail::Message object"
body "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do "
"eiusmod tempor incididunt ut labore et dolore magna aliqua."
end
}
let(:message_with_no_body) {
Mail.new do
from "sender@postmarkapp.com"
to "recipient@postmarkapp.com"
end
}
let(:message_with_attachment) { message.tap { |msg| msg.attachments["test.gif"] = File.read(empty_gif_path) } }
let(:message_with_invalid_to) {
Mail.new do
from "sender@postmarkapp.com"
to "@postmarkapp.com"
end
}
let(:valid_messages) { [message, message.dup] }
let(:partially_valid_messages) { [message, message.dup, message_with_no_body] }
let(:invalid_messages) { [message_with_no_body, message_with_no_body.dup] }
context 'invalid API code' do
it "doesn't deliver messages" do
expect {
Postmark::ApiClient.new('INVALID').deliver_message(message) rescue Postmark::InvalidApiKeyError
}.to change{message.delivered?}.to(false)
end
end
context "single message" do
it 'plain text message' do
expect(api_client.deliver_message(message)).to have_key(:message_id)
end
it 'message with attachment' do
expect(api_client.deliver_message(message_with_attachment)).to have_key(:message_id)
end
it 'response Message-ID' do
expect(api_client.deliver_message(message)[:message_id]).to be =~ postmark_message_id_format
end
it 'response is Hash' do
expect(api_client.deliver_message(message)).to be_a Hash
end
it 'fails to deliver a message without body' do
expect { api_client.deliver_message(message_with_no_body) }.to raise_error(Postmark::InvalidMessageError)
end
it 'fails to deliver a message with invalid To address' do
expect { api_client.deliver_message(message_with_invalid_to) }.to raise_error(Postmark::InvalidMessageError)
end
end
context "batch message" do
it 'response - valid Mail::Message objects' do
expect { api_client.deliver_messages(valid_messages) }.
to change{valid_messages.all? { |m| m.delivered? }}.to true
end
it 'response - valid X-PM-Message-Ids' do
api_client.deliver_messages(valid_messages)
expect(valid_messages.all? { |m| m['X-PM-Message-Id'].to_s =~ postmark_message_id_format }).to be true
end
it 'response - valid response objects' do
api_client.deliver_messages(valid_messages)
expect(valid_messages.all? { |m| m.postmark_response["To"] == m.to[0] }).to be true
end
it 'response - message responses count' do
expect(api_client.deliver_messages(valid_messages).count).to eq valid_messages.count
end
context "custom max_batch_size" do
before do
api_client.max_batch_size = 1
end
it 'response - valid response objects' do
api_client.deliver_messages(valid_messages)
expect(valid_messages.all? { |m| m.postmark_response["To"] == m.to[0] }).to be true
end
it 'response - message responses count' do
expect(api_client.deliver_messages(valid_messages).count).to eq valid_messages.count
end
end
it 'partially delivers a batch of partially valid Mail::Message objects' do
expect { api_client.deliver_messages(partially_valid_messages) }.
to change{partially_valid_messages.select { |m| m.delivered? }.count}.to 2
end
it "doesn't deliver a batch of invalid Mail::Message objects" do
aggregate_failures do
expect { api_client.deliver_messages(invalid_messages) }.
to change{invalid_messages.all? { |m| m.delivered? == false }}.to true
expect(invalid_messages).to satisfy { |ms| ms.all? { |m| !!m.postmark_response }}
end
end
end
end
|