123456789_123456789_123456789_123456789_123456789_

Class: RSpec::Rails::Matchers::SendEmail Private

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, BaseMatcher
Instance Chain:
Inherits: RSpec::Rails::Matchers::BaseMatcher
Defined in: rspec-rails/lib/rspec/rails/matchers/send_email.rb

Overview

Matcher class for ‘send_email`. Should not be instantiated directly.

See Also:

Constant Summary

BaseMatcher - Inherited

UNDEFINED

Class Method Summary

BaseMatcher - Inherited

.matcher_name, .new,
.underscore

Borrowed from ActiveSupport.

Instance Attribute Summary

BaseMatcher - Inherited

#actual,
#diffable?

::RSpec::Rails::Matchers are not diffable by default.

#expected, #expects_call_stack_jump?, #matcher_name, #matcher_name=, #rescued_exception,
#supports_block_expectations?

Most matchers are value matchers (i.e. meant to work with ‘expect(value)`) rather than block matchers (i.e. meant to work with `expect { }`), so this defaults to false.

Instance Method Summary

BaseMatcher - Inherited

#actual_formatted,
#description

Generates a description using ::RSpec::Matchers::EnglishPhrasing.

#expected_formatted,
#match_unless_raises

Used to wrap a block of code that will indicate failure by raising one of the named exceptions.

#matches?

Indicates if the match is successful.

#assert_ivars, #present_ivars

BaseMatcher::DefaultFailureMessages - Included

#failure_message

Provides a good generic failure message.

#failure_message_when_negated

Provides a good generic negative failure message.

BaseMatcher::HashFormatting - Included

#improve_hash_formatting

‘{ :a => 5, :b => 2 }.inspect` produces:

::RSpec::Matchers::Composable - Included

#&
#===

Delegates to ‘#matches?`.

#and

Creates a compound ‘and` expectation.

#description_of

Returns the description of the given object in a way that is aware of composed matchers.

#or

Creates a compound ‘or` expectation.

#values_match?

This provides a generic way to fuzzy-match an expected value against an actual value.

#|
#should_enumerate?

We should enumerate arrays as long as they are not recursive.

#surface_descriptions_in

Transforms the given data structure (typically a hash or array) into a new data structure that, when ‘#inspect` is called on it, will provide descriptions of any contained matchers rather than the normal #inspect output.

#unreadable_io?,
#with_matchers_cloned

Historically, a single matcher instance was only checked against a single value.

Instance Attribute Details

#diffable?Boolean (readonly, private)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 56

def diffable?
  true
end

#multiple_match?Boolean (readonly, private)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 88

def multiple_match?
  @matched_emails.many?
end

#supports_block_expectations?Boolean (readonly)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 26

def supports_block_expectations?
  true
end

#supports_value_expectations?Boolean (readonly)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 21

def supports_value_expectations?
  false
end

Instance Method Details

#define_matched_emails(block) (private)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 64

def define_matched_emails(block)
  before = deliveries.dup

  block.call

  after = deliveries

  @diff = after - before
  @matched_emails = @diff.select(&method(:matched_email?))
end

#deliveries (private)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 60

def deliveries
  ActionMailer::Base.deliveries
end

#failure_messageString

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 38

def failure_message
  result =
    if multiple_match?
      "More than 1 matching emails were sent."
    else
      "No matching emails were sent."
    end
  "#{result}#{sent_emails_message}"
end

#failure_message_when_negatedString

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 50

def failure_message_when_negated
  "Expected not to send an email but it was sent."
end

#matched_email?(email) ⇒ Boolean (private)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 75

def matched_email?(email)
  @criteria.all? do |attr, value|
    expected =
      case attr
      when :to, :from, :cc, :bcc then Array(value)
      else
        value
      end

    values_match?(expected, email.public_send(attr))
  end
end

#matches?(block) ⇒ Boolean

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 30

def matches?(block)
  define_matched_emails(block)

  @matched_emails.one?
end

#sent_emails_message (private)

[ GitHub ]

  
# File 'rspec-rails/lib/rspec/rails/matchers/send_email.rb', line 92

def sent_emails_message
  if @diff.empty?
    "\n\nThere were no any emails sent inside the expectation block."
  else
    sent_emails =
      @diff.map do |email|
        inspected = INSPECT_EMAIL_ATTRIBUTES.map { |attr| "#{attr}: #{email.public_send(attr)}" }.join(", ")
        "- #{inspected}"
      end.join("\n")
    "\n\nThe following emails were sent:\n#{sent_emails}"
  end
end