diff --git a/lib/shoulda/matchers/action_mailer/have_sent_email.rb b/lib/shoulda/matchers/action_mailer/have_sent_email.rb index aaae15e0..26240d45 100644 --- a/lib/shoulda/matchers/action_mailer/have_sent_email.rb +++ b/lib/shoulda/matchers/action_mailer/have_sent_email.rb @@ -40,6 +40,26 @@ module Shoulda # :nodoc: @recipient = recipient self end + + def cc(recipient) + @cc = recipient + self + end + + def with_cc(recipients) + @cc_recipients = recipients + self + end + + def bcc(recipient) + @bcc = recipient + self + end + + def with_bcc(recipients) + @bcc_recipients = recipients + self + end def matches?(subject) ::ActionMailer::Base.deliveries.each do |mail| @@ -47,6 +67,10 @@ module Shoulda # :nodoc: @body_failed = !regexp_or_string_match(mail.body, @body) if @body @sender_failed = !regexp_or_string_match_in_array(mail.from, @sender) if @sender @recipient_failed = !regexp_or_string_match_in_array(mail.to, @recipient) if @recipient + @cc_failed = !regexp_or_string_match_in_array(mail.cc, @cc) if @cc + @cc_recipients_failed = !match_array_in_array(mail.cc, @cc_recipients) if @cc_recipients + @bcc_failed = !regexp_or_string_match_in_array(mail.bcc, @bcc) if @bcc + @bcc_recipients_failed = !match_array_in_array(mail.bcc, @bcc_recipients) if @bcc_recipients return true unless anything_failed? end @@ -67,6 +91,10 @@ module Shoulda # :nodoc: description << " containing #{@body.inspect}" if @body description << " from #{@sender.inspect}" if @sender description << " to #{@recipient.inspect}" if @recipient + description << " cc #{@cc.inspect}" if @cc + description << " with cc #{@cc_recipients.inspect}" if @cc_recipients + description << " bcc #{@bcc.inspect}" if @bcc + description << " with bcc #{@bcc_recipients.inspect}" if @bcc_recipients description end @@ -78,6 +106,10 @@ module Shoulda # :nodoc: expectation << " with body #{@body.inspect}" if @body_failed expectation << " from #{@sender.inspect}" if @sender_failed expectation << " to #{@recipient.inspect}" if @recipient_failed + expectation << " cc #{@cc.inspect}" if @cc_failed + expectation << " with cc #{@cc_recipients.inspect}" if @cc_recipients_failed + expectation << " bcc #{@bcc.inspect}" if @bcc_failed + expectation << " with bcc #{@bcc_recipients.inspect}" if @bcc_recipients_failed expectation << "\nDeliveries:\n#{inspect_deliveries}" end @@ -88,7 +120,7 @@ module Shoulda # :nodoc: end def anything_failed? - @subject_failed || @body_failed || @sender_failed || @recipient_failed + @subject_failed || @body_failed || @sender_failed || @recipient_failed || @cc_failed || @cc_recipients_failed || @bcc_failed || @bcc_recipients_failed end def regexp_or_string_match(a_string, a_regexp_or_string) @@ -108,6 +140,13 @@ module Shoulda # :nodoc: an_array.include?(a_regexp_or_string) end end + + def match_array_in_array(target_array, match_array) + target_array.sort! + match_array.sort! + + target_array.each_cons(match_array.size).include? match_array + end end end end diff --git a/spec/shoulda/action_mailer/have_sent_email_spec.rb b/spec/shoulda/action_mailer/have_sent_email_spec.rb index 8909fb93..4cff8165 100644 --- a/spec/shoulda/action_mailer/have_sent_email_spec.rb +++ b/spec/shoulda/action_mailer/have_sent_email_spec.rb @@ -12,6 +12,8 @@ describe Shoulda::Matchers::ActionMailer::HaveSentEmailMatcher do mail :from => "do-not-reply@example.com", :to => "myself@me.com", :subject => "This is spam", + :cc => ["you@you.com", "joe@bob.com", "hello@goodbye.com"], + :bcc => ["test@example.com", "sam@bob.com", "goodbye@hello.com"], :body => "Every email is spam." end end @@ -48,12 +50,54 @@ describe Shoulda::Matchers::ActionMailer::HaveSentEmailMatcher do matcher.failure_message.should =~ /Expected sent email with body/ end - it "accept sent e-mail based on the recipient" do + it "accepts sent e-mail based on the recipient" do should have_sent_email.to('myself@me.com') matcher = have_sent_email.to('you@example.com') matcher.matches?(nil) matcher.failure_message.should =~ /Expected sent email to/ end + + it "accepts sent e-mail based on cc string" do + should have_sent_email.cc('joe@bob.com') + matcher = have_sent_email.cc('you@example.com') + matcher.matches?(nil) + matcher.failure_message.should =~ /Expected sent email cc/ + end + + it "accepts sent-email based on cc regex" do + should have_sent_email.cc(/@bob\.com/) + matcher = have_sent_email.cc(/us@/) + matcher.matches?(nil) + matcher.failure_message.should =~ /Expected sent email cc/ + end + + it "accepts sent e-mail based on cc list" do + should have_sent_email.with_cc(['you@you.com', 'joe@bob.com']) + matcher = have_sent_email.with_cc(['you@example.com']) + matcher.matches?(nil) + matcher.failure_message.should =~ /Expected sent email with cc/ + end + + it "accepts sent e-mail based on bcc string" do + should have_sent_email.bcc("goodbye@hello.com") + matcher = have_sent_email.bcc("test@hello.com") + matcher.matches?(nil) + matcher.failure_message.should =~ /Expected sent email bcc/ + end + + it "accepts sent e-mail based on bcc regex" do + should have_sent_email.bcc(/@example\.com/) + matcher = have_sent_email.bcc(/you@/) + matcher.matches?(nil) + matcher.failure_message.should =~ /Expected sent email bcc/ + end + + it "accepts sent e-mail based on bcc list" do + should have_sent_email.with_bcc(['sam@bob.com', 'test@example.com']) + matcher = have_sent_email.with_bcc(['you@you.com', 'joe@bob.com']) + matcher.matches?(nil) + matcher.failure_message.should =~ /Expected sent email with bcc/ + end it "lists all the deliveries within failure message" do add_mail_to_deliveries