spec/mailgun/sender_spec.rb in multi_mail-0.0.2 vs spec/mailgun/sender_spec.rb in multi_mail-0.1.0

- old
+ new

@@ -1,174 +1,349 @@ \ No newline at end of file +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') +require 'multi_mail/mailgun/sender' + +describe MultiMail::Sender::Mailgun do + let :message do + Mail.new do + date Time.at(946702800) + from 'foo@example.com' + to 'bar@example.com' + subject 'test' + body 'hello' + end + end + + let :message_without_from do + Mail.new do + date Time.at(946702800) + to 'bar@example.com' + subject 'test' + body 'hello' + end + end + + let :message_without_to do + Mail.new do + date Time.at(946702800) + from 'foo@example.com' + subject 'test' + body 'hello' + end + end + + let :message_without_subject do + Mail.new do + date Time.at(946702800) + from 'foo@example.com' + to 'bar@example.com' + body 'hello' + end + end + + let :message_without_body do + Mail.new do + date Time.at(946702800) + from 'foo@example.com' + to 'bar@example.com' + subject 'test' + end + end + + describe '#initialize' do + it 'should raise an error if :api_key is missing' do + expect{ + message.delivery_method MultiMail::Sender::Mailgun, :domain => 'xxx' + message.deliver # request not sent + }.to raise_error(ArgumentError, "Missing required arguments: api_key") + end + + it 'should raise an error if :domain is missing' do + expect{ + message.delivery_method MultiMail::Sender::Mailgun, :api_key => 'xxx' + message.deliver # request not sent + }.to raise_error(ArgumentError, "Missing required arguments: domain") + end + + it 'should raise an error if :api_key is nil' do + expect{ + message.delivery_method MultiMail::Sender::Mailgun, :api_key => nil, :domain => 'xxx' + message.deliver # request not sent + }.to raise_error(ArgumentError, "Missing required arguments: api_key") + end + + it 'should raise an error if :domain is nil' do + expect{ + message.delivery_method MultiMail::Sender::Mailgun, :api_key => 'xxx', :domain => nil + message.deliver # request not sent + }.to raise_error(ArgumentError, "Missing required arguments: domain") + end + + it 'should raise an error if :domain or :api_key are invalid' do + expect{ + message.delivery_method MultiMail::Sender::Mailgun, :api_key => 'xxx', :domain => 'xxx' + message.deliver + }.to raise_error(MultiMail::InvalidAPIKey) + end + + it 'should assign custom settings' do + sender = MultiMail::Sender::Mailgun.new(:api_key => 'xxx', :domain => 'xxx') + + sender.api_key.should == 'xxx' + sender.domain.should == 'xxx' + end + end + + describe '#parameters' do + it 'should allow "yes", "no" and "htmlonly" values' do + %w(yes no htmlonly).each do |value| + sender = MultiMail::Sender::Mailgun.new({ + :api_key => 'xxx', + :domain => 'xxx', + :track => { + :clicks => value, + } + }) + + sender.parameters.should == {:'o:tracking-clicks' => value} + end + end + + it 'should transform true and false values' do + sender = MultiMail::Sender::Mailgun.new({ + :api_key => 'xxx', + :domain => 'xxx', + :track => { + :opens => false, + :clicks => true, + } + }) + + sender.parameters.should == {:'o:tracking-opens' => 'no', :'o:tracking-clicks' => 'yes'} + end + + it 'should ignore nil values' do + sender = MultiMail::Sender::Mailgun.new({ + :api_key => 'xxx', + :domain => 'xxx', + :track => { + :clicks => nil, + } + }) + + sender.parameters.should == {} + end + end + + describe '#deliver' do + before :all do + Mail.defaults do + delivery_method MultiMail::Sender::Mailgun, :api_key => ENV['MAILGUN_API_KEY'], :domain => 'multimail.mailgun.org', 'o:testmode' => 'yes' + end + end + + it 'should send a message' do + message.deliver.should == message + end + end + + describe '#deliver!' do + before :all do + Mail.defaults do + delivery_method MultiMail::Sender::Mailgun, :api_key => ENV['MAILGUN_API_KEY'], :domain => 'multimail.mailgun.org', 'o:testmode' => 'yes', :return_response => true + end + end + + it 'should send a message' do + result = message.deliver! + result.size.should == 2 + + result['message'].should == 'Queued. Thank you.' + result['id'].should match(/<\S+@\S+>/) + end + + it 'should not send a message without a From header' do + expect{message_without_from.deliver!}.to raise_error(MultiMail::MissingSender, "'from' parameter is missing") + end + + it 'should not send a message without a To header' do + expect{message_without_to.deliver!}.to raise_error(MultiMail::MissingRecipients, "'to' parameter is missing") + end + + it 'should not send a message without a body' do + expect{message_without_body.deliver!}.to raise_error(MultiMail::MissingBody, "Need at least one of 'text' or 'html' parameters specified") + end + end +end