Class: Shoulda::Callback::Matchers::ActiveModel::CallbackMatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/shoulda/callback/matchers/active_model.rb

Overview

:nodoc:

Instance Method Summary collapse

Constructor Details

#initialize(method) ⇒ CallbackMatcher

Returns a new instance of CallbackMatcher.



26
27
28
# File 'lib/shoulda/callback/matchers/active_model.rb', line 26

def initialize(method)
  @method = method
end

Instance Method Details

#descriptionObject



98
99
100
# File 'lib/shoulda/callback/matchers/active_model.rb', line 98

def description
  "callback #{@method} #{@hook} #{@lifecycle}#{optional_lifecycle_phrase}#{condition_phrase}"
end

#failure_messageObject



90
91
92
# File 'lib/shoulda/callback/matchers/active_model.rb', line 90

def failure_message
  @failure_message || "expected #{@method} to be listed as a callback #{@hook} #{@lifecycle}#{optional_lifecycle_phrase}#{condition_phrase}, but was not"
end

#is_callback?(subject, callback) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/shoulda/callback/matchers/active_model.rb', line 75

def is_callback?(subject, callback)
  is_callback_object?(subject, callback) || is_callback_symbol?(subject, callback)
end

#is_callback_object?(subject, callback) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
86
87
88
# File 'lib/shoulda/callback/matchers/active_model.rb', line 83

def is_callback_object?(subject, callback)
  @method.kind_of?(Class) && 
  callback.filter.match(/^_callback/) && 
  subject.respond_to?("#{callback.filter}_object") && 
  subject.send("#{callback.filter}_object").class == @method 
end

#is_callback_symbol?(subject, callback) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/shoulda/callback/matchers/active_model.rb', line 79

def is_callback_symbol?(subject, callback)
  callback.filter == @method
end

#matches?(subject) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/shoulda/callback/matchers/active_model.rb', line 58

def matches?(subject)
  unless @lifecycle
    @failure_message = "callback #{@method} can not be tested against an undefined lifecycle, use .before, .after or .around"
    false
  else
    callbacks = subject.send(:"_#{@lifecycle}_callbacks").dup
    callbacks = callbacks.select do |callback|
      subject.respond_to?(callback.filter) &&
      is_callback?(subject, callback) && 
      callback.kind == @hook && 
      matches_conditions?(callback) && 
      matches_optional_lifecycle?(callback)
    end
    callbacks.size > 0
  end
end

#negative_failure_messageObject



94
95
96
# File 'lib/shoulda/callback/matchers/active_model.rb', line 94

def negative_failure_message
  @failure_message || "expected #{@method} not to be listed as a callback #{@hook} #{@lifecycle}#{optional_lifecycle_phrase}#{condition_phrase}, but was"
end

#on(optional_lifecycle) ⇒ Object



48
49
50
51
52
53
54
55
56
# File 'lib/shoulda/callback/matchers/active_model.rb', line 48

def on(optional_lifecycle)
  unless @lifecycle == :validation
    @failure_message = "The .on option is only valid for the validation lifecycle and cannot be used with #{@lifecycle}, use with .before(:validation) or .after(:validation)"
  else
    @optional_lifecycle = optional_lifecycle
  end

  self
end