shoulda-matchers 1.4.2 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +11 -3
- data/Appraisals +3 -3
- data/Gemfile +1 -1
- data/Gemfile.lock +69 -70
- data/MIT-LICENSE +1 -1
- data/NEWS.md +22 -4
- data/README.md +3 -1
- data/Rakefile +9 -5
- data/features/step_definitions/rails_steps.rb +7 -7
- data/features/support/env.rb +1 -1
- data/gemfiles/3.0.gemfile +1 -1
- data/gemfiles/3.0.gemfile.lock +25 -22
- data/gemfiles/3.1.gemfile +1 -1
- data/gemfiles/3.1.gemfile.lock +27 -24
- data/gemfiles/3.2.gemfile +1 -1
- data/gemfiles/3.2.gemfile.lock +56 -52
- data/lib/shoulda/matchers/action_controller.rb +3 -2
- data/lib/shoulda/matchers/action_controller/assign_to_matcher.rb +10 -8
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +2 -4
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +3 -4
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +3 -4
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +6 -6
- data/lib/shoulda/matchers/action_controller/respond_with_content_type_matcher.rb +5 -2
- data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +2 -2
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +12 -12
- data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -4
- data/lib/shoulda/matchers/action_controller/set_the_flash_matcher.rb +10 -11
- data/lib/shoulda/matchers/action_controller/strong_parameters_matcher.rb +121 -0
- data/lib/shoulda/matchers/action_mailer/have_sent_email_matcher.rb +7 -4
- data/lib/shoulda/matchers/active_model.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +8 -8
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +5 -4
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_model/exception_message_finder.rb +0 -1
- data/lib/shoulda/matchers/active_model/helpers.rb +16 -7
- data/lib/shoulda/matchers/active_model/only_integer_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +8 -6
- data/lib/shoulda/matchers/active_model/validate_format_of_matcher.rb +19 -10
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +4 -4
- data/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb +19 -21
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +7 -7
- data/lib/shoulda/matchers/active_model/validation_message_finder.rb +1 -1
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +5 -5
- data/lib/shoulda/matchers/active_record/association_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +11 -7
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +5 -5
- data/lib/shoulda/matchers/active_record/query_the_database_matcher.rb +5 -2
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +3 -3
- data/lib/shoulda/matchers/assertion_error.rb +4 -1
- data/lib/shoulda/matchers/independent/delegate_matcher.rb +17 -7
- data/lib/shoulda/matchers/integrations/rspec.rb +19 -33
- data/lib/shoulda/matchers/version.rb +1 -1
- data/shoulda-matchers.gemspec +6 -4
- data/spec/shoulda/matchers/action_controller/assign_to_matcher_spec.rb +66 -0
- data/spec/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +22 -0
- data/spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +42 -0
- data/spec/shoulda/matchers/action_controller/render_template_matcher_spec.rb +78 -0
- data/spec/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +58 -0
- data/spec/shoulda/matchers/action_controller/respond_with_content_type_matcher_spec.rb +31 -0
- data/spec/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +31 -0
- data/spec/shoulda/matchers/action_controller/route_matcher_spec.rb +65 -0
- data/spec/shoulda/matchers/action_controller/set_session_matcher_spec.rb +51 -0
- data/spec/shoulda/matchers/action_controller/set_the_flash_matcher_spec.rb +153 -0
- data/spec/shoulda/matchers/action_controller/strong_parameters_matcher_spec.rb +142 -0
- data/spec/shoulda/matchers/action_mailer/have_sent_email_spec.rb +324 -0
- data/spec/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +111 -0
- data/spec/shoulda/matchers/active_model/allow_value_matcher_spec.rb +124 -0
- data/spec/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +43 -0
- data/spec/shoulda/matchers/active_model/ensure_exclusion_of_matcher_spec.rb +74 -0
- data/spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb +171 -0
- data/spec/shoulda/matchers/active_model/ensure_length_of_matcher_spec.rb +113 -0
- data/spec/shoulda/{active_model → matchers/active_model}/exception_message_finder_spec.rb +2 -2
- data/spec/shoulda/matchers/active_model/helpers_spec.rb +158 -0
- data/spec/shoulda/matchers/active_model/only_integer_matcher_spec.rb +52 -0
- data/spec/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +41 -0
- data/spec/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +41 -0
- data/spec/shoulda/matchers/active_model/validate_format_of_matcher_spec.rb +75 -0
- data/spec/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +73 -0
- data/spec/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +127 -0
- data/spec/shoulda/matchers/active_model/validate_uniqueness_of_matcher_spec.rb +175 -0
- data/spec/shoulda/{active_model → matchers/active_model}/validation_message_finder_spec.rb +0 -1
- data/spec/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +106 -0
- data/spec/shoulda/matchers/active_record/association_matcher_spec.rb +534 -0
- data/spec/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +111 -0
- data/spec/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +78 -0
- data/spec/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +41 -0
- data/spec/shoulda/{active_record → matchers/active_record}/query_the_database_matcher_spec.rb +10 -10
- data/spec/shoulda/matchers/active_record/serialize_matcher_spec.rb +86 -0
- data/spec/shoulda/{independent → matchers/independent}/delegate_matcher_spec.rb +55 -34
- data/spec/spec_helper.rb +1 -2
- data/spec/support/active_model_versions.rb +4 -0
- data/spec/support/activemodel_helpers.rb +19 -0
- data/spec/support/controller_builder.rb +38 -12
- data/spec/support/model_builder.rb +8 -2
- metadata +106 -98
- data/spec/fixtures/addresses.yml +0 -3
- data/spec/fixtures/friendships.yml +0 -0
- data/spec/fixtures/posts.yml +0 -5
- data/spec/fixtures/products.yml +0 -0
- data/spec/fixtures/taggings.yml +0 -0
- data/spec/fixtures/tags.yml +0 -9
- data/spec/fixtures/users.yml +0 -6
- data/spec/shoulda/action_controller/assign_to_matcher_spec.rb +0 -63
- data/spec/shoulda/action_controller/filter_param_matcher_spec.rb +0 -20
- data/spec/shoulda/action_controller/redirect_to_matcher_spec.rb +0 -40
- data/spec/shoulda/action_controller/render_template_matcher_spec.rb +0 -69
- data/spec/shoulda/action_controller/render_with_layout_matcher_spec.rb +0 -55
- data/spec/shoulda/action_controller/respond_with_content_type_matcher_spec.rb +0 -28
- data/spec/shoulda/action_controller/respond_with_matcher_spec.rb +0 -83
- data/spec/shoulda/action_controller/route_matcher_spec.rb +0 -65
- data/spec/shoulda/action_controller/set_session_matcher_spec.rb +0 -46
- data/spec/shoulda/action_controller/set_the_flash_matcher_spec.rb +0 -130
- data/spec/shoulda/action_mailer/have_sent_email_spec.rb +0 -333
- data/spec/shoulda/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
- data/spec/shoulda/active_model/allow_value_matcher_spec.rb +0 -131
- data/spec/shoulda/active_model/disallow_value_matcher_spec.rb +0 -65
- data/spec/shoulda/active_model/ensure_exclusion_of_matcher_spec.rb +0 -79
- data/spec/shoulda/active_model/ensure_inclusion_of_matcher_spec.rb +0 -181
- data/spec/shoulda/active_model/ensure_length_of_matcher_spec.rb +0 -138
- data/spec/shoulda/active_model/helpers_spec.rb +0 -129
- data/spec/shoulda/active_model/only_integer_matcher_spec.rb +0 -69
- data/spec/shoulda/active_model/validate_acceptance_of_matcher_spec.rb +0 -43
- data/spec/shoulda/active_model/validate_confirmation_of_matcher_spec.rb +0 -48
- data/spec/shoulda/active_model/validate_format_of_matcher_spec.rb +0 -79
- data/spec/shoulda/active_model/validate_numericality_of_matcher_spec.rb +0 -112
- data/spec/shoulda/active_model/validate_presence_of_matcher_spec.rb +0 -135
- data/spec/shoulda/active_model/validate_uniqueness_of_matcher_spec.rb +0 -154
- data/spec/shoulda/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -84
- data/spec/shoulda/active_record/association_matcher_spec.rb +0 -642
- data/spec/shoulda/active_record/have_db_column_matcher_spec.rb +0 -185
- data/spec/shoulda/active_record/have_db_index_matcher_spec.rb +0 -105
- data/spec/shoulda/active_record/have_readonly_attributes_matcher_spec.rb +0 -46
- data/spec/shoulda/active_record/serialize_matcher_spec.rb +0 -81
@@ -1,7 +1,6 @@
|
|
1
1
|
module Shoulda # :nodoc:
|
2
2
|
module Matchers
|
3
3
|
module ActionController # :nodoc:
|
4
|
-
|
5
4
|
# Ensures a controller redirected to the given url.
|
6
5
|
#
|
7
6
|
# Example:
|
@@ -13,7 +12,7 @@ module Shoulda # :nodoc:
|
|
13
12
|
end
|
14
13
|
|
15
14
|
class RedirectToMatcher # :nodoc:
|
16
|
-
attr_reader :
|
15
|
+
attr_reader :failure_message_for_should, :failure_message_for_should_not
|
17
16
|
|
18
17
|
def initialize(url_or_description, context, &block)
|
19
18
|
if block
|
@@ -45,10 +44,10 @@ module Shoulda # :nodoc:
|
|
45
44
|
def redirects_to_url?
|
46
45
|
begin
|
47
46
|
@context.send(:assert_redirected_to, url)
|
48
|
-
@
|
47
|
+
@failure_message_for_should_not = "Didn't expect to redirect to #{url}"
|
49
48
|
true
|
50
49
|
rescue Shoulda::Matchers::AssertionError => error
|
51
|
-
@
|
50
|
+
@failure_message_for_should = error.message
|
52
51
|
false
|
53
52
|
end
|
54
53
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Shoulda # :nodoc:
|
2
2
|
module Matchers
|
3
3
|
module ActionController # :nodoc:
|
4
|
-
|
5
4
|
# Ensures a controller rendered the given template.
|
6
5
|
#
|
7
6
|
# Example:
|
@@ -21,7 +20,7 @@ module Shoulda # :nodoc:
|
|
21
20
|
end
|
22
21
|
|
23
22
|
class RenderTemplateMatcher # :nodoc:
|
24
|
-
attr_reader :
|
23
|
+
attr_reader :failure_message_for_should, :failure_message_for_should_not
|
25
24
|
|
26
25
|
def initialize(options, message, context)
|
27
26
|
@options = options
|
@@ -49,10 +48,10 @@ module Shoulda # :nodoc:
|
|
49
48
|
def renders_template?
|
50
49
|
begin
|
51
50
|
@context.send(:assert_template, @options, @message)
|
52
|
-
@
|
51
|
+
@failure_message_for_should_not = "Didn't expect to render #{@template}"
|
53
52
|
true
|
54
53
|
rescue Shoulda::Matchers::AssertionError => error
|
55
|
-
@
|
54
|
+
@failure_message_for_should = error.message
|
56
55
|
false
|
57
56
|
end
|
58
57
|
end
|
@@ -33,18 +33,18 @@ module Shoulda # :nodoc:
|
|
33
33
|
rendered_with_layout? && rendered_with_expected_layout?
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
36
|
+
def failure_message_for_should
|
37
37
|
"Expected #{expectation}, but #{result}"
|
38
38
|
end
|
39
39
|
|
40
|
-
def
|
40
|
+
def failure_message_for_should_not
|
41
41
|
"Did not expect #{expectation}, but #{result}"
|
42
42
|
end
|
43
43
|
|
44
44
|
def description
|
45
|
-
description =
|
45
|
+
description = 'render with '
|
46
46
|
if @expected_layout.nil?
|
47
|
-
description <<
|
47
|
+
description << 'a layout'
|
48
48
|
else
|
49
49
|
description << "the #{@expected_layout.inspect} layout"
|
50
50
|
end
|
@@ -83,9 +83,9 @@ module Shoulda # :nodoc:
|
|
83
83
|
|
84
84
|
def result
|
85
85
|
if rendered_with_layout?
|
86
|
-
|
86
|
+
'rendered with ' + rendered_layouts.map(&:inspect).join(', ')
|
87
87
|
else
|
88
|
-
|
88
|
+
'rendered without a layout'
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/deprecation'
|
2
|
+
|
1
3
|
module Shoulda # :nodoc:
|
2
4
|
module Matchers
|
3
5
|
module ActionController # :nodoc:
|
@@ -23,6 +25,7 @@ module Shoulda # :nodoc:
|
|
23
25
|
|
24
26
|
class RespondWithContentTypeMatcher # :nodoc:
|
25
27
|
def initialize(content_type)
|
28
|
+
ActiveSupport::Deprecation.warn 'The respond_with_content_type matcher is deprecated and will be removed in 2.0'
|
26
29
|
@content_type = look_up_content_type(content_type)
|
27
30
|
end
|
28
31
|
|
@@ -35,11 +38,11 @@ module Shoulda # :nodoc:
|
|
35
38
|
content_type_matches_regexp? || content_type_matches_string?
|
36
39
|
end
|
37
40
|
|
38
|
-
def
|
41
|
+
def failure_message_for_should
|
39
42
|
"Expected #{expectation}"
|
40
43
|
end
|
41
44
|
|
42
|
-
def
|
45
|
+
def failure_message_for_should_not
|
43
46
|
"Did not expect #{expectation}"
|
44
47
|
end
|
45
48
|
|
@@ -30,11 +30,11 @@ module Shoulda # :nodoc:
|
|
30
30
|
correct_status_code? || correct_status_code_range?
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
33
|
+
def failure_message_for_should
|
34
34
|
"Expected #{expectation}"
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
37
|
+
def failure_message_for_should_not
|
38
38
|
"Did not expect #{expectation}"
|
39
39
|
end
|
40
40
|
|
@@ -11,16 +11,16 @@ module Shoulda # :nodoc:
|
|
11
11
|
#
|
12
12
|
# Examples:
|
13
13
|
#
|
14
|
-
# it { should route(:get,
|
14
|
+
# it { should route(:get, '/posts').
|
15
15
|
# to(:controller => :posts, :action => :index) }
|
16
|
-
# it { should route(:get,
|
17
|
-
# it { should route(:post,
|
18
|
-
# it { should route(:get,
|
19
|
-
# it { should route(:get,
|
20
|
-
# it { should route(:put,
|
21
|
-
# it { should route(:delete,
|
16
|
+
# it { should route(:get, '/posts/new').to(:action => :new) }
|
17
|
+
# it { should route(:post, '/posts').to(:action => :create) }
|
18
|
+
# it { should route(:get, '/posts/1').to(:action => :show, :id => 1) }
|
19
|
+
# it { should route(:get, '/posts/1/edit').to(:action => :edit, :id => 1) }
|
20
|
+
# it { should route(:put, '/posts/1').to(:action => :update, :id => 1) }
|
21
|
+
# it { should route(:delete, '/posts/1').
|
22
22
|
# to(:action => :destroy, :id => 1) }
|
23
|
-
# it { should route(:get,
|
23
|
+
# it { should route(:get, '/users/1/posts/1').
|
24
24
|
# to(:action => :show, :id => 1, :user_id => 1) }
|
25
25
|
def route(method, path)
|
26
26
|
RouteMatcher.new(method, path, self)
|
@@ -33,7 +33,7 @@ module Shoulda # :nodoc:
|
|
33
33
|
@context = context
|
34
34
|
end
|
35
35
|
|
36
|
-
attr_reader :
|
36
|
+
attr_reader :failure_message_for_should, :failure_message_for_should_not
|
37
37
|
|
38
38
|
def to(params)
|
39
39
|
@params = stringify_params(params)
|
@@ -80,13 +80,13 @@ module Shoulda # :nodoc:
|
|
80
80
|
{ :method => @method, :path => @path },
|
81
81
|
@params)
|
82
82
|
|
83
|
-
@
|
83
|
+
@failure_message_for_should_not = "Didn't expect to #{description}"
|
84
84
|
true
|
85
85
|
rescue ::ActionController::RoutingError => error
|
86
|
-
@
|
86
|
+
@failure_message_for_should = error.message
|
87
87
|
false
|
88
88
|
rescue Shoulda::Matchers::AssertionError => error
|
89
|
-
@
|
89
|
+
@failure_message_for_should = error.message
|
90
90
|
false
|
91
91
|
end
|
92
92
|
end
|
@@ -32,11 +32,11 @@ module Shoulda # :nodoc:
|
|
32
32
|
assigned_correct_value? || cleared_value?
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
35
|
+
def failure_message_for_should
|
36
36
|
"Expected #{expectation}, but #{result}"
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
39
|
+
def failure_message_for_should_not
|
40
40
|
"Didn't expect #{expectation}, but #{result}"
|
41
41
|
end
|
42
42
|
|
@@ -82,12 +82,11 @@ module Shoulda # :nodoc:
|
|
82
82
|
if @value
|
83
83
|
expectation << " to #{@value.inspect}"
|
84
84
|
end
|
85
|
-
expectation
|
86
85
|
end
|
87
86
|
|
88
87
|
def result
|
89
88
|
if session.empty?
|
90
|
-
|
89
|
+
'no session variables were set'
|
91
90
|
else
|
92
91
|
"the session was #{session.inspect}"
|
93
92
|
end
|
@@ -8,9 +8,9 @@ module Shoulda # :nodoc:
|
|
8
8
|
# Example:
|
9
9
|
#
|
10
10
|
# it { should set_the_flash }
|
11
|
-
# it { should set_the_flash.to(
|
11
|
+
# it { should set_the_flash.to('Thank you for placing this order.') }
|
12
12
|
# it { should set_the_flash.to(/created/i) }
|
13
|
-
# it { should set_the_flash[:alert].to(
|
13
|
+
# it { should set_the_flash[:alert].to('Password does not match') }
|
14
14
|
# it { should set_the_flash.to(/logged in/i).now }
|
15
15
|
# it { should_not set_the_flash }
|
16
16
|
def set_the_flash
|
@@ -22,8 +22,6 @@ module Shoulda # :nodoc:
|
|
22
22
|
@options = {}
|
23
23
|
end
|
24
24
|
|
25
|
-
attr_reader :failure_message, :negative_failure_message
|
26
|
-
|
27
25
|
def to(value)
|
28
26
|
if !value.is_a?(String) && !value.is_a?(Regexp)
|
29
27
|
raise "cannot match against #{value.inspect}"
|
@@ -53,11 +51,11 @@ module Shoulda # :nodoc:
|
|
53
51
|
description
|
54
52
|
end
|
55
53
|
|
56
|
-
def
|
54
|
+
def failure_message_for_should
|
57
55
|
"Expected #{expectation}"
|
58
56
|
end
|
59
57
|
|
60
|
-
def
|
58
|
+
def failure_message_for_should_not
|
61
59
|
"Did not expect #{expectation}"
|
62
60
|
end
|
63
61
|
|
@@ -96,7 +94,8 @@ module Shoulda # :nodoc:
|
|
96
94
|
@flash
|
97
95
|
else
|
98
96
|
@flash = @controller.flash.dup
|
99
|
-
|
97
|
+
used = @controller.flash.instance_variable_get(:@used).dup
|
98
|
+
@flash.instance_variable_set(:@used, used)
|
100
99
|
sweep_flash_if_necessary
|
101
100
|
@flash
|
102
101
|
end
|
@@ -117,7 +116,7 @@ module Shoulda # :nodoc:
|
|
117
116
|
|
118
117
|
def flash_description
|
119
118
|
if flash.blank?
|
120
|
-
|
119
|
+
'no flash was set'
|
121
120
|
else
|
122
121
|
"was #{flash.inspect}"
|
123
122
|
end
|
@@ -129,9 +128,9 @@ module Shoulda # :nodoc:
|
|
129
128
|
|
130
129
|
def pretty_now
|
131
130
|
if @options[:now]
|
132
|
-
|
131
|
+
'.now'
|
133
132
|
else
|
134
|
-
|
133
|
+
''
|
135
134
|
end
|
136
135
|
end
|
137
136
|
|
@@ -139,7 +138,7 @@ module Shoulda # :nodoc:
|
|
139
138
|
if @options[:key]
|
140
139
|
"[:#{@options[:key]}]"
|
141
140
|
else
|
142
|
-
|
141
|
+
''
|
143
142
|
end
|
144
143
|
end
|
145
144
|
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'bourne'
|
2
|
+
require 'active_support/deprecation'
|
3
|
+
begin
|
4
|
+
require 'strong_parameters'
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
|
8
|
+
module Shoulda
|
9
|
+
module Matchers
|
10
|
+
module ActionController
|
11
|
+
def permit(*attributes)
|
12
|
+
attributes_and_context = attributes + [self]
|
13
|
+
StrongParametersMatcher.new(*attributes_and_context)
|
14
|
+
end
|
15
|
+
|
16
|
+
class StrongParametersMatcher
|
17
|
+
def initialize(*attributes_and_context)
|
18
|
+
ActiveSupport::Deprecation.warn 'The strong_parameters matcher is deprecated and will be removed in 2.0'
|
19
|
+
@attributes = attributes_and_context[0...-1]
|
20
|
+
@context = attributes_and_context.last
|
21
|
+
@permitted_params = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def for(action, options = {})
|
25
|
+
@action = action
|
26
|
+
@verb = options[:verb] || verb_for_action
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def in_context(context)
|
31
|
+
@context = context
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def matches?(controller = nil)
|
36
|
+
simulate_controller_action && parameters_difference.empty?
|
37
|
+
end
|
38
|
+
|
39
|
+
def does_not_match?(controller = nil)
|
40
|
+
simulate_controller_action && parameters_difference.present?
|
41
|
+
end
|
42
|
+
|
43
|
+
def failure_message
|
44
|
+
"Expected controller to permit #{parameters_difference.to_sentence}, but it did not."
|
45
|
+
end
|
46
|
+
|
47
|
+
def negative_failure_message
|
48
|
+
"Expected controller not to permit #{parameters_difference.to_sentence}, but it did."
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
attr_reader :verb, :action, :attributes, :context
|
53
|
+
attr_accessor :permitted_params
|
54
|
+
|
55
|
+
def simulate_controller_action
|
56
|
+
ensure_action_and_verb_present!
|
57
|
+
model_attrs = stubbed_model_attributes
|
58
|
+
|
59
|
+
context.send(verb, action)
|
60
|
+
|
61
|
+
verify_permit_call(model_attrs)
|
62
|
+
end
|
63
|
+
|
64
|
+
def verify_permit_call(model_attrs)
|
65
|
+
matcher = Mocha::API::HaveReceived.new(:permit).with do |*params|
|
66
|
+
self.permitted_params = params
|
67
|
+
end
|
68
|
+
|
69
|
+
matcher.matches?(model_attrs)
|
70
|
+
rescue Mocha::ExpectationError
|
71
|
+
false
|
72
|
+
end
|
73
|
+
|
74
|
+
def parameters_difference
|
75
|
+
attributes - permitted_params
|
76
|
+
end
|
77
|
+
|
78
|
+
def stubbed_model_attributes
|
79
|
+
extend Mocha::API
|
80
|
+
|
81
|
+
model_attrs = ::ActionController::Parameters.new(arbitrary_attributes)
|
82
|
+
model_attrs.stubs(:permit)
|
83
|
+
::ActionController::Parameters.any_instance.stubs(:[]).returns(model_attrs)
|
84
|
+
|
85
|
+
model_attrs
|
86
|
+
end
|
87
|
+
|
88
|
+
def ensure_action_and_verb_present!
|
89
|
+
if action.blank?
|
90
|
+
raise ActionNotDefinedError
|
91
|
+
end
|
92
|
+
if verb.blank?
|
93
|
+
raise VerbNotDefinedError
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def arbitrary_attributes
|
98
|
+
{:any_key => 'any_value'}
|
99
|
+
end
|
100
|
+
|
101
|
+
def verb_for_action
|
102
|
+
verb_lookup = { :create => :post, :update => :put }
|
103
|
+
verb_lookup[action]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
class StrongParametersMatcher::ActionNotDefinedError < StandardError
|
108
|
+
def message
|
109
|
+
'You must specify the controller action using the #for method.'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class StrongParametersMatcher::VerbNotDefinedError < StandardError
|
114
|
+
def message
|
115
|
+
'You must specify an HTTP verb when using a non-RESTful action.' +
|
116
|
+
' e.g. for(:authorize, :verb => :post)'
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/deprecation'
|
2
|
+
|
1
3
|
module Shoulda # :nodoc:
|
2
4
|
module Matchers
|
3
5
|
module ActionMailer # :nodoc:
|
@@ -24,6 +26,7 @@ module Shoulda # :nodoc:
|
|
24
26
|
class HaveSentEmailMatcher # :nodoc:
|
25
27
|
|
26
28
|
def initialize(context)
|
29
|
+
ActiveSupport::Deprecation.warn 'The have_sent_email matcher is deprecated and will be removed in 2.0'
|
27
30
|
@context = context
|
28
31
|
end
|
29
32
|
|
@@ -106,16 +109,16 @@ module Shoulda # :nodoc:
|
|
106
109
|
end
|
107
110
|
end
|
108
111
|
|
109
|
-
def
|
112
|
+
def failure_message_for_should
|
110
113
|
"Expected #{expectation}"
|
111
114
|
end
|
112
115
|
|
113
|
-
def
|
116
|
+
def failure_message_for_should_not
|
114
117
|
"Did not expect #{expectation}"
|
115
118
|
end
|
116
119
|
|
117
120
|
def description
|
118
|
-
description =
|
121
|
+
description = 'send an email'
|
119
122
|
description << " with a subject of #{@email_subject.inspect}" if @email_subject
|
120
123
|
description << " containing #{@body.inspect}" if @body
|
121
124
|
if @parts
|
@@ -136,7 +139,7 @@ module Shoulda # :nodoc:
|
|
136
139
|
private
|
137
140
|
|
138
141
|
def expectation
|
139
|
-
expectation =
|
142
|
+
expectation = 'sent email'
|
140
143
|
expectation << " with subject #{@email_subject.inspect}" if @subject_failed
|
141
144
|
expectation << " with body #{@body.inspect}" if @body_failed
|
142
145
|
@parts.each do |_, body, content_type|
|