thoughtbot--shoulda-matchers/lib/shoulda/matchers/action_controller/set_session_or_flash_matche...

110 lines
2.6 KiB
Ruby

module Shoulda
module Matchers
module ActionController
# @private
class SetSessionOrFlashMatcher
def initialize(store)
@store = store
end
def in_context(context)
@context = context
self
end
def [](key)
@key = key
self
end
def to(expected_value = nil, &block)
if block
unless context_set?
message = 'When specifying a value as a block, a context must be'\
' specified beforehand,'\
" e.g., #{store.name}.in_context(context).to { ... }"
raise ArgumentError, message
end
@expected_value = context.instance_eval(&block)
else
@expected_value = expected_value
end
self
end
def description
"should #{expectation_description}"
end
def matches?(controller)
@controller = store.controller = controller
!store.empty? && key_matches? && expected_value_matches?
end
def failure_message
"Expected #{controller.class} to #{expectation_description},"\
' but it did not'
end
alias_method :failure_message_for_should, :failure_message
def failure_message_when_negated
"Expected #{controller.class} not to #{expectation_description},"\
' but it did'
end
alias_method :failure_message_for_should_not,
:failure_message_when_negated
protected
attr_reader :store, :context, :key, :expected_value, :controller
private
def context_set?
defined?(@context)
end
def key_set?
defined?(@key)
end
def expected_value_set?
defined?(@expected_value)
end
def key_matches?
!key_set? || store.has_key?(key)
end
def expected_value_matches?
!expected_value_set? || store.has_value?(expected_value)
end
def expectation_description
string = 'set'
string <<
if key_set?
" #{store.name}[#{key.inspect}]"
else
" any key in #{store.name}"
end
if expected_value_set?
string <<
if expected_value.is_a?(Regexp)
" to a value matching #{expected_value.inspect}"
else
" to #{expected_value.inspect}"
end
end
string
end
end
end
end
end