shoulda-matchers 2.5.0 → 2.6.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.
Files changed (121) hide show
  1. data/.gitignore +8 -7
  2. data/.travis.yml +4 -0
  3. data/Appraisals +8 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +77 -66
  7. data/MIT-LICENSE +1 -1
  8. data/NEWS.md +63 -1
  9. data/README.md +189 -33
  10. data/Rakefile +6 -5
  11. data/features/rails_integration.feature +1 -1
  12. data/features/step_definitions/rails_steps.rb +7 -6
  13. data/gemfiles/3.0.gemfile +2 -2
  14. data/gemfiles/3.0.gemfile.lock +14 -5
  15. data/gemfiles/3.1.gemfile +2 -2
  16. data/gemfiles/3.1.gemfile.lock +14 -5
  17. data/gemfiles/3.2.gemfile +2 -2
  18. data/gemfiles/3.2.gemfile.lock +16 -7
  19. data/gemfiles/4.0.0.gemfile +2 -2
  20. data/gemfiles/4.0.0.gemfile.lock +15 -6
  21. data/gemfiles/4.0.1.gemfile +2 -2
  22. data/gemfiles/4.0.1.gemfile.lock +15 -6
  23. data/gemfiles/4.1.gemfile +19 -0
  24. data/gemfiles/4.1.gemfile.lock +176 -0
  25. data/lib/shoulda/matchers.rb +17 -1
  26. data/lib/shoulda/matchers/action_controller.rb +4 -2
  27. data/lib/shoulda/matchers/action_controller/callback_matcher.rb +100 -0
  28. data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +1 -1
  29. data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +4 -4
  30. data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +1 -1
  31. data/lib/shoulda/matchers/action_controller/route_matcher.rb +12 -12
  32. data/lib/shoulda/matchers/action_controller/route_params.rb +1 -1
  33. data/lib/shoulda/matchers/action_controller/set_the_flash_matcher.rb +2 -1
  34. data/lib/shoulda/matchers/action_controller/strong_parameters_matcher.rb +167 -0
  35. data/lib/shoulda/matchers/active_model.rb +4 -2
  36. data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +23 -5
  37. data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +0 -4
  38. data/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb +66 -14
  39. data/lib/shoulda/matchers/active_model/ensure_length_of_matcher.rb +8 -8
  40. data/lib/shoulda/matchers/active_model/errors.rb +40 -0
  41. data/lib/shoulda/matchers/active_model/helpers.rb +6 -6
  42. data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +33 -14
  43. data/lib/shoulda/matchers/active_model/numericality_matchers/even_number_matcher.rb +26 -0
  44. data/lib/shoulda/matchers/active_model/numericality_matchers/{odd_even_number_matcher.rb → numeric_type_matcher.rb} +9 -20
  45. data/lib/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher.rb +26 -0
  46. data/lib/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher.rb +5 -21
  47. data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +1 -1
  48. data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +71 -22
  49. data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +6 -1
  50. data/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb +25 -6
  51. data/lib/shoulda/matchers/active_record.rb +1 -0
  52. data/lib/shoulda/matchers/active_record/association_matcher.rb +67 -13
  53. data/lib/shoulda/matchers/active_record/association_matchers/inverse_of_matcher.rb +40 -0
  54. data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +24 -1
  55. data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +1 -1
  56. data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +1 -1
  57. data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +1 -1
  58. data/lib/shoulda/matchers/assertion_error.rb +7 -2
  59. data/lib/shoulda/matchers/error.rb +24 -0
  60. data/lib/shoulda/matchers/independent.rb +10 -0
  61. data/lib/shoulda/matchers/independent/delegate_matcher.rb +157 -0
  62. data/lib/shoulda/matchers/independent/delegate_matcher/stubbed_target.rb +34 -0
  63. data/lib/shoulda/matchers/integrations/nunit_test_case_detection.rb +36 -0
  64. data/lib/shoulda/matchers/integrations/rspec.rb +13 -14
  65. data/lib/shoulda/matchers/integrations/test_unit.rb +11 -9
  66. data/lib/shoulda/matchers/version.rb +1 -1
  67. data/lib/shoulda/matchers/warn.rb +7 -0
  68. data/shoulda-matchers.gemspec +2 -1
  69. data/spec/shoulda/matchers/action_controller/callback_matcher_spec.rb +79 -0
  70. data/spec/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +3 -3
  71. data/spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +11 -11
  72. data/spec/shoulda/matchers/action_controller/render_template_matcher_spec.rb +21 -21
  73. data/spec/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +10 -10
  74. data/spec/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +45 -18
  75. data/spec/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +8 -8
  76. data/spec/shoulda/matchers/action_controller/route_matcher_spec.rb +19 -19
  77. data/spec/shoulda/matchers/action_controller/route_params_spec.rb +6 -6
  78. data/spec/shoulda/matchers/action_controller/set_session_matcher_spec.rb +11 -11
  79. data/spec/shoulda/matchers/action_controller/set_the_flash_matcher_spec.rb +44 -44
  80. data/spec/shoulda/matchers/action_controller/strong_parameters_matcher_spec.rb +205 -0
  81. data/spec/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +24 -24
  82. data/spec/shoulda/matchers/active_model/allow_value_matcher_spec.rb +37 -37
  83. data/spec/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +17 -21
  84. data/spec/shoulda/matchers/active_model/ensure_exclusion_of_matcher_spec.rb +24 -24
  85. data/spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb +173 -67
  86. data/spec/shoulda/matchers/active_model/ensure_length_of_matcher_spec.rb +40 -40
  87. data/spec/shoulda/matchers/active_model/exception_message_finder_spec.rb +20 -20
  88. data/spec/shoulda/matchers/active_model/helpers_spec.rb +27 -25
  89. data/spec/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +126 -13
  90. data/spec/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb +59 -0
  91. data/spec/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher_spec.rb +59 -0
  92. data/spec/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher_spec.rb +27 -26
  93. data/spec/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +15 -15
  94. data/spec/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +8 -8
  95. data/spec/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +9 -9
  96. data/spec/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +229 -44
  97. data/spec/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +44 -25
  98. data/spec/shoulda/matchers/active_model/validate_uniqueness_of_matcher_spec.rb +110 -62
  99. data/spec/shoulda/matchers/active_model/validation_message_finder_spec.rb +19 -19
  100. data/spec/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +30 -30
  101. data/spec/shoulda/matchers/active_record/association_matcher_spec.rb +378 -192
  102. data/spec/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +4 -0
  103. data/spec/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +33 -33
  104. data/spec/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +21 -17
  105. data/spec/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +8 -8
  106. data/spec/shoulda/matchers/active_record/serialize_matcher_spec.rb +14 -14
  107. data/spec/shoulda/matchers/independent/delegate_matcher/stubbed_target_spec.rb +43 -0
  108. data/spec/shoulda/matchers/independent/delegate_matcher_spec.rb +184 -0
  109. data/spec/spec_helper.rb +4 -0
  110. data/spec/support/activemodel_helpers.rb +2 -2
  111. data/spec/support/capture_helpers.rb +19 -0
  112. data/spec/support/controller_builder.rb +22 -3
  113. data/spec/support/fail_with_message_including_matcher.rb +33 -0
  114. data/spec/support/model_builder.rb +1 -1
  115. data/spec/support/shared_examples/numerical_submatcher.rb +19 -0
  116. data/spec/support/shared_examples/numerical_type_submatcher.rb +17 -0
  117. data/spec/support/test_application.rb +23 -0
  118. metadata +90 -22
  119. checksums.yaml +0 -7
  120. data/spec/shoulda/matchers/active_model/numericality_matchers/odd_even_number_matcher_spec.rb +0 -97
  121. data/spec/support/shared_examples/numerical_submatcher_spec.rb +0 -23
data/.gitignore CHANGED
@@ -1,11 +1,12 @@
1
- test/*/log/*.log
2
- doc
3
- coverage
1
+ *.rbc
2
+ *.swo
3
+ *.swp
4
+ .bundle
4
5
  .svn/
6
+ .yardoc
7
+ coverage
8
+ doc
5
9
  pkg
6
- *.swp
7
- *.swo
8
10
  tags
11
+ test/*/log/*.log
9
12
  tmp
10
- .bundle
11
- *.rbc
@@ -20,12 +20,16 @@ matrix:
20
20
  gemfile: gemfiles/4.0.0.gemfile
21
21
  - rvm: 1.9.3
22
22
  gemfile: gemfiles/4.0.1.gemfile
23
+ - rvm: 1.9.3
24
+ gemfile: gemfiles/4.1.gemfile
23
25
  - rvm: 2.0.0
24
26
  gemfile: gemfiles/3.2.gemfile
25
27
  - rvm: 2.0.0
26
28
  gemfile: gemfiles/4.0.0.gemfile
27
29
  - rvm: 2.0.0
28
30
  gemfile: gemfiles/4.0.1.gemfile
31
+ - rvm: 2.0.0
32
+ gemfile: gemfiles/4.1.gemfile
29
33
  - rvm: rbx-19mode
30
34
  gemfile: gemfiles/3.2.gemfile
31
35
  - rvm: jruby-19mode
data/Appraisals CHANGED
@@ -43,3 +43,11 @@ appraise '4.0.1' do
43
43
  gem 'sass-rails', '4.0.1'
44
44
  gem 'bcrypt-ruby', '~> 3.1.2'
45
45
  end
46
+
47
+ appraise '4.1' do
48
+ instance_eval(&rails_4_0)
49
+ gem 'rails', '~> 4.1.0'
50
+ gem 'sass-rails', '4.0.3'
51
+ gem 'bcrypt-ruby', '~> 3.1.2'
52
+ gem "protected_attributes", '~> 1.0.6'
53
+ end
@@ -3,7 +3,7 @@ We love pull requests. Here's a quick guide:
3
3
  1. Fork the repo.
4
4
 
5
5
  2. Run the tests. We only take pull requests with passing tests, and it's great
6
- to know that you have a clean slate: `bundle && rake`
6
+ to know that you have a clean slate: `bundle && bundle exec rake`
7
7
 
8
8
  3. Add a test for your change. Only refactoring and documentation changes
9
9
  require no new tests. If you are adding functionality or fixing a bug, we need
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  # For test Rails application
6
- gem 'shoulda-context', '~> 1.1.2'
6
+ gem 'shoulda-context', '~> 1.2.0'
7
7
  gem 'sqlite3', :platform => :ruby
8
8
 
9
9
  # Can't wrap in platform :jruby do...end block because appraisal doesn't support
@@ -1,76 +1,84 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shoulda-matchers (2.5.0)
4
+ shoulda-matchers (2.6.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actionmailer (3.2.9)
11
- actionpack (= 3.2.9)
12
- mail (~> 2.4.4)
13
- actionpack (3.2.9)
14
- activemodel (= 3.2.9)
15
- activesupport (= 3.2.9)
10
+ actionmailer (3.2.16)
11
+ actionpack (= 3.2.16)
12
+ mail (~> 2.5.4)
13
+ actionpack (3.2.16)
14
+ activemodel (= 3.2.16)
15
+ activesupport (= 3.2.16)
16
16
  builder (~> 3.0.0)
17
17
  erubis (~> 2.7.0)
18
18
  journey (~> 1.0.4)
19
- rack (~> 1.4.0)
19
+ rack (~> 1.4.5)
20
20
  rack-cache (~> 1.2)
21
21
  rack-test (~> 0.6.1)
22
22
  sprockets (~> 2.2.1)
23
- activemodel (3.2.9)
24
- activesupport (= 3.2.9)
23
+ activemodel (3.2.16)
24
+ activesupport (= 3.2.16)
25
25
  builder (~> 3.0.0)
26
- activerecord (3.2.9)
27
- activemodel (= 3.2.9)
28
- activesupport (= 3.2.9)
26
+ activerecord (3.2.16)
27
+ activemodel (= 3.2.16)
28
+ activesupport (= 3.2.16)
29
29
  arel (~> 3.0.2)
30
30
  tzinfo (~> 0.3.29)
31
- activeresource (3.2.9)
32
- activemodel (= 3.2.9)
33
- activesupport (= 3.2.9)
34
- activesupport (3.2.9)
35
- i18n (~> 0.6)
31
+ activeresource (3.2.16)
32
+ activemodel (= 3.2.16)
33
+ activesupport (= 3.2.16)
34
+ activesupport (3.2.16)
35
+ i18n (~> 0.6, >= 0.6.4)
36
36
  multi_json (~> 1.0)
37
- appraisal (0.5.1)
37
+ appraisal (1.0.0.beta2)
38
38
  bundler
39
39
  rake
40
- arel (3.0.2)
41
- aruba (0.5.1)
40
+ thor (>= 0.14.0)
41
+ arel (3.0.3)
42
+ aruba (0.5.3)
42
43
  childprocess (~> 0.3.6)
43
44
  cucumber (>= 1.1.1)
44
45
  rspec-expectations (>= 2.7.0)
45
- bourne (1.4.0)
46
- mocha (~> 0.13.2)
46
+ bourne (1.5.0)
47
+ mocha (>= 0.13.2, < 0.15)
47
48
  builder (3.0.4)
48
- childprocess (0.3.6)
49
- ffi (~> 1.0, >= 1.0.6)
50
- cucumber (1.2.1)
49
+ childprocess (0.3.9)
50
+ ffi (~> 1.0, >= 1.0.11)
51
+ coderay (1.1.0)
52
+ cucumber (1.3.10)
51
53
  builder (>= 2.1.2)
52
54
  diff-lcs (>= 1.1.3)
53
- gherkin (~> 2.11.0)
54
- json (>= 1.4.6)
55
- diff-lcs (1.2.1)
55
+ gherkin (~> 2.12)
56
+ multi_json (>= 1.7.5, < 2.0)
57
+ multi_test (>= 0.0.2)
58
+ diff-lcs (1.2.5)
56
59
  erubis (2.7.0)
57
- ffi (1.2.0)
58
- gherkin (2.11.5)
59
- json (>= 1.4.6)
60
- hike (1.2.1)
61
- i18n (0.6.4)
60
+ ffi (1.9.3)
61
+ gherkin (2.12.2)
62
+ multi_json (~> 1.3)
63
+ hike (1.2.3)
64
+ i18n (0.6.9)
62
65
  journey (1.0.4)
63
- json (1.7.7)
64
- mail (2.4.4)
65
- i18n (>= 0.4.0)
66
+ json (1.8.1)
67
+ mail (2.5.4)
66
68
  mime-types (~> 1.16)
67
69
  treetop (~> 1.4.8)
68
70
  metaclass (0.0.1)
69
- mime-types (1.19)
70
- mocha (0.13.3)
71
+ method_source (0.8.2)
72
+ mime-types (1.25.1)
73
+ mocha (0.14.0)
71
74
  metaclass (~> 0.0.1)
72
- multi_json (1.7.1)
75
+ multi_json (1.8.4)
76
+ multi_test (0.0.3)
73
77
  polyglot (0.3.3)
78
+ pry (0.9.12.6)
79
+ coderay (~> 1.0)
80
+ method_source (~> 0.8)
81
+ slop (~> 3.4)
74
82
  rack (1.4.5)
75
83
  rack-cache (1.2)
76
84
  rack (>= 0.4)
@@ -78,48 +86,50 @@ GEM
78
86
  rack
79
87
  rack-test (0.6.2)
80
88
  rack (>= 1.0)
81
- rails (3.2.9)
82
- actionmailer (= 3.2.9)
83
- actionpack (= 3.2.9)
84
- activerecord (= 3.2.9)
85
- activeresource (= 3.2.9)
86
- activesupport (= 3.2.9)
89
+ rails (3.2.16)
90
+ actionmailer (= 3.2.16)
91
+ actionpack (= 3.2.16)
92
+ activerecord (= 3.2.16)
93
+ activeresource (= 3.2.16)
94
+ activesupport (= 3.2.16)
87
95
  bundler (~> 1.0)
88
- railties (= 3.2.9)
89
- railties (3.2.9)
90
- actionpack (= 3.2.9)
91
- activesupport (= 3.2.9)
96
+ railties (= 3.2.16)
97
+ railties (3.2.16)
98
+ actionpack (= 3.2.16)
99
+ activesupport (= 3.2.16)
92
100
  rack-ssl (~> 1.3.2)
93
101
  rake (>= 0.8.7)
94
102
  rdoc (~> 3.4)
95
103
  thor (>= 0.14.6, < 2.0)
96
- rake (10.0.3)
104
+ rake (10.1.1)
97
105
  rdoc (3.12.2)
98
106
  json (~> 1.4)
99
- rspec-core (2.13.1)
100
- rspec-expectations (2.13.0)
107
+ rspec-core (2.14.7)
108
+ rspec-expectations (2.14.4)
101
109
  diff-lcs (>= 1.1.3, < 2.0)
102
- rspec-mocks (2.13.1)
103
- rspec-rails (2.13.2)
110
+ rspec-mocks (2.14.4)
111
+ rspec-rails (2.14.1)
104
112
  actionpack (>= 3.0)
113
+ activemodel (>= 3.0)
105
114
  activesupport (>= 3.0)
106
115
  railties (>= 3.0)
107
- rspec-core (~> 2.13.0)
108
- rspec-expectations (~> 2.13.0)
109
- rspec-mocks (~> 2.13.0)
110
- shoulda-context (1.1.4)
116
+ rspec-core (~> 2.14.0)
117
+ rspec-expectations (~> 2.14.0)
118
+ rspec-mocks (~> 2.14.0)
119
+ shoulda-context (1.2.0)
120
+ slop (3.4.7)
111
121
  sprockets (2.2.2)
112
122
  hike (~> 1.2)
113
123
  multi_json (~> 1.0)
114
124
  rack (~> 1.0)
115
125
  tilt (~> 1.1, != 1.3.0)
116
- sqlite3 (1.3.6)
117
- thor (0.17.0)
118
- tilt (1.3.6)
119
- treetop (1.4.12)
126
+ sqlite3 (1.3.8)
127
+ thor (0.18.1)
128
+ tilt (1.4.1)
129
+ treetop (1.4.15)
120
130
  polyglot
121
131
  polyglot (>= 0.3.1)
122
- tzinfo (0.3.35)
132
+ tzinfo (0.3.38)
123
133
 
124
134
  PLATFORMS
125
135
  ruby
@@ -127,17 +137,18 @@ PLATFORMS
127
137
  DEPENDENCIES
128
138
  activerecord-jdbc-adapter
129
139
  activerecord-jdbcsqlite3-adapter
130
- appraisal (~> 0.4)
140
+ appraisal (~> 1.0.0.beta2)
131
141
  aruba
132
142
  bourne (~> 1.3)
133
143
  bundler (~> 1.1)
134
144
  cucumber (~> 1.1)
135
145
  jdbc-sqlite3
136
146
  jruby-openssl
147
+ pry
137
148
  rails (~> 3.0)
138
149
  rake (>= 0.9.2)
139
150
  rspec-rails (>= 2.13.1, < 3)
140
- shoulda-context (~> 1.1.2)
151
+ shoulda-context (~> 1.2.0)
141
152
  shoulda-matchers!
142
153
  sqlite3
143
154
  therubyrhino
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006-2013, Tammer Saleh, thoughtbot, inc.
1
+ Copyright (c) 2006-2014, Tammer Saleh, thoughtbot, inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person
4
4
  obtaining a copy of this software and associated documentation
data/NEWS.md CHANGED
@@ -1,4 +1,66 @@
1
- # HEAD
1
+ # 2.6.0
2
+
3
+ * The boolean argument to `have_db_index`'s `unique` option is now optional, for
4
+ consistency with other matchers.
5
+
6
+ * Association matchers now test that the model being referred to (either
7
+ implicitly or explicitly, using `:class_name`) actually exists.
8
+
9
+ * Add ability to test `:autosave` option on associations.
10
+
11
+ * Fix `validate_uniqueness_of(...).allow_nil` so that it can be used against an
12
+ non-password attribute which is in a model that `has_secure_password`. Doing
13
+ so previously would result in a "Password digest missing on new record" error.
14
+
15
+ * Fix description for `validate_numericality_of` so that if the matcher fails,
16
+ the error message reported does not say the matcher accepts integer values if
17
+ you didn't specify that.
18
+
19
+ * Fix `ensure_inclusion_of` so that you can use it against a boolean column
20
+ (and pass boolean values to `in_array`). There are two caveats:
21
+
22
+ * You should not test that your attribute allows both true and false
23
+ (`.in_array([true, false]`); there's no way to test that it doesn't accept
24
+ anything other than that.
25
+ * You cannot test that your attribute allows nil (`.in_array([nil])`) if
26
+ the column does not allow null values.
27
+
28
+ * Change `validate_uniqueness_of(...)` so that it provides default values for
29
+ non-nullable attributes.
30
+
31
+ * Running `rake` now installs Appraisals before running the test suite.
32
+ (Additionally, we now manage Appraisals using the `appraisal` executable in
33
+ Appraisal 1.0.0.)
34
+
35
+ * Add `allow_nil` option to `validate_numericality_of` so that you can validate
36
+ that numeric values are validated only if a value is supplied.
37
+
38
+ * Fix `validate_numericality_of` so that test fails when the value with
39
+ `greater_than`, `greater_than_or_equal_to`, `less_than`, `less_than_or_equal_
40
+ to` or `equal_to` is not appropriate.
41
+
42
+ * Change `validate_presence_of` under Rails 4 so that if you are using it with a
43
+ user whose model `has_secure_password` and whose password is set to a value,
44
+ you will be instructed to use a user whose password is blank instead. The
45
+ reason for this change is due to the fact that Rails 4's version of
46
+ `has_secure_password` defines #password= such that `nil` will be ignored,
47
+ which interferes with how `validate_presence_of` works.
48
+
49
+ * Add ability to test `belongs_to` associations defined with `:inverse_of`.
50
+
51
+ * Add back matchers that were removed in 2.0.0: `permit`, for testing strong
52
+ parameters, and `delegate_method`, for testing delegation.
53
+
54
+ * Add new matchers for testing controller filters: `before_filter`,
55
+ `after_filter`, and `around_filter` (aliased to `before_action`,
56
+ `after_action` and `around_action` for Rails 4).
57
+
58
+ * Fix `rescue_from` matcher so that it does not raise an error when testing
59
+ a method handler which has been marked as protected or private.
60
+
61
+ * Fix compatibility issues with Rails 4.1:
62
+ * `set_the_flash` and `have_and_belongs_to_many` no longer raise errors
63
+ * Minitest no longer prints warnings whenever shoulda-matchers is required
2
64
 
3
65
  # v 2.5.0
4
66
 
data/README.md CHANGED
@@ -8,7 +8,9 @@ complex, and error-prone.
8
8
 
9
9
  ## Installation
10
10
 
11
- Simply add the following to your Gemfile:
11
+ ### RSpec
12
+
13
+ Include the gem in your Gemfile:
12
14
 
13
15
  ```ruby
14
16
  group :test do
@@ -16,17 +18,45 @@ group :test do
16
18
  end
17
19
  ```
18
20
 
19
- shoulda-matchers automatically includes itself into your test framework. It will
20
- mix in the appropriate matchers for ActiveRecord, ActiveModel, and
21
- ActionController depending on the modules that are available at runtime. For
22
- instance, in order to use the ActiveRecord matchers, ActiveRecord must be
23
- available beforehand.
21
+ ### Test::Unit
22
+
23
+ shoulda-matchers was originally a component of
24
+ [Shoulda](http://github.com/thoughtbot/shoulda) -- it's what provides the nice
25
+ `should` syntax which is demonstrated below. For this reason, include it in
26
+ your Gemfile instead:
27
+
28
+ ```ruby
29
+ group :test do
30
+ gem 'shoulda'
31
+ end
32
+ ```
33
+
34
+ ### Non-Rails apps
35
+
36
+ Once it is loaded, shoulda-matchers automatically includes itself into your test
37
+ framework. It will mix in the appropriate matchers for ActiveRecord,
38
+ ActiveModel, and ActionController depending on the modules that are available at
39
+ runtime. For instance, in order to use the ActiveRecord matchers, ActiveRecord
40
+ must be available beforehand.
24
41
 
25
42
  If your application is on Rails, everything should "just work", as
26
43
  shoulda-matchers will most likely be declared after Rails in your Gemfile. If
27
44
  your application is on another framework such as Sinatra or Padrino, you may
28
45
  have a different setup, so you will want to ensure that you are requiring
29
- shoulda-matchers after the components of Rails you are using.
46
+ shoulda-matchers after the components of Rails you are using. For instance,
47
+ if you wanted to use and test against ActiveModel, you'd say:
48
+
49
+ ```ruby
50
+ gem 'activemodel'
51
+ gem 'shoulda-matchers'
52
+ ```
53
+
54
+ and not:
55
+
56
+ ```ruby
57
+ gem 'shoulda-matchers'
58
+ gem 'activemodel'
59
+ ```
30
60
 
31
61
  ## Usage
32
62
 
@@ -38,7 +68,7 @@ Different matchers apply to different parts of Rails:
38
68
 
39
69
  ### ActiveModel Matchers
40
70
 
41
- *Jump to: [allow_mass_assignment_of](#allow_mass_assignment_of), [allow_value / disallow_value](#allow_value--disallow_value), [ensure_inclusion_of](#ensure_inclusion_of), [ensure_exclusion_of](#ensure_exclusion_of), [ensure_length_of](#ensure_length_of), [have_secure_password](#have_secure_password), [validate_absence_of](#validate_absence_of), [validate_acceptance_of](#validate_acceptance_of), [validate_confirmation_of](#validate_confirmation_of), [validate_numericality_of](#validate_numericality_of), [validate_presence_of](#validate_presence_of), [validate_uniqueness_of](#validate_uniqueness_of)*
71
+ *Jump to: [allow_mass_assignment_of](#allow_mass_assignment_of), [allow_value](#allow_value), [ensure_inclusion_of](#ensure_inclusion_of), [ensure_exclusion_of](#ensure_exclusion_of), [ensure_length_of](#ensure_length_of), [have_secure_password](#have_secure_password), [validate_absence_of](#validate_absence_of), [validate_acceptance_of](#validate_acceptance_of), [validate_confirmation_of](#validate_confirmation_of), [validate_numericality_of](#validate_numericality_of), [validate_presence_of](#validate_presence_of), [validate_uniqueness_of](#validate_uniqueness_of)*
42
72
 
43
73
  Note that all of the examples in this section are based on an ActiveRecord
44
74
  model for simplicity, but these matchers will work just as well using an
@@ -81,7 +111,7 @@ class UserTest < ActiveSupport::TestCase
81
111
  end
82
112
  ```
83
113
 
84
- #### allow_value / disallow_value
114
+ #### allow_value
85
115
 
86
116
  The `allow_value` matcher tests usage of the `validates_format_of` validation.
87
117
  It asserts that an attribute can be set to one or more values, succeeding if
@@ -105,7 +135,11 @@ describe UserProfile do
105
135
  it { should allow_value('http://foo.com', 'http://bar.com/baz').for(:website_url) }
106
136
  it { should_not allow_value('asdfjkl').for(:website_url) }
107
137
 
108
- it { should allow_value(:birthday_as_string).on(:create) }
138
+ it do
139
+ should allow_value('2013-01-01').
140
+ for(:birthday_as_string).
141
+ on(:create)
142
+ end
109
143
 
110
144
  it do
111
145
  should allow_value('open', 'closed').
@@ -119,7 +153,9 @@ class UserProfileTest < ActiveSupport::TestCase
119
153
  should allow_value('http://foo.com', 'http://bar.com/baz').for(:website_url)
120
154
  should_not allow_value('asdfjkl').for(:website_url)
121
155
 
122
- should allow_value(:birthday_as_string).on(:create)
156
+ should allow_value('2013-01-01').
157
+ for(:birthday_as_string).
158
+ on(:create)
123
159
 
124
160
  should allow_value('open', 'closed').
125
161
  for(:state).
@@ -139,18 +175,6 @@ describe User do
139
175
  end
140
176
  ```
141
177
 
142
- The `disallow_value` matcher is the exact opposite of `allow_value`. That is,
143
- `should_not allow_value` can also be written `should disallow_value`, and
144
- `should allow_value` can also be written `should_not disallow_value`. Because
145
- of this, it carries the same caveat when multiple values are provided:
146
-
147
- ```ruby
148
- describe User do
149
- # 'b' and 'c' will not be tested
150
- it { should disallow_value('a', 'b', 'c').for(:website_url) }
151
- end
152
- ```
153
-
154
178
  #### ensure_inclusion_of
155
179
 
156
180
  The `ensure_inclusion_of` matcher tests usage of the `validates_inclusion_of`
@@ -169,8 +193,8 @@ end
169
193
 
170
194
  # RSpec
171
195
  describe Issue do
172
- it { should ensure_inclusion_of(:state).in_array(%w(open resolved unresolved))
173
- it { should ensure_inclusion_of(:state).in_range(1..5) }
196
+ it { should ensure_inclusion_of(:state).in_array(%w(open resolved unresolved)) }
197
+ it { should ensure_inclusion_of(:priority).in_range(1..5) }
174
198
 
175
199
  it do
176
200
  should ensure_inclusion_of(:severity).
@@ -182,7 +206,7 @@ end
182
206
  # Test::Unit
183
207
  class IssueTest < ActiveSupport::TestCase
184
208
  should ensure_inclusion_of(:state).in_array(%w(open resolved unresolved))
185
- should ensure_inclusion_of(:state).in_range(1..5)
209
+ should ensure_inclusion_of(:priority).in_range(1..5)
186
210
 
187
211
  should ensure_inclusion_of(:severity).
188
212
  in_array(%w(low medium high)).
@@ -259,7 +283,7 @@ describe User do
259
283
  should ensure_length_of(:api_token).
260
284
  is_at_least(10).
261
285
  is_at_most(20).
262
- message('Password must be in between 10 and 20 characters')
286
+ with_message('Password must be in between 10 and 20 characters')
263
287
  end
264
288
 
265
289
  it do
@@ -281,7 +305,7 @@ class UserTest < ActiveSupport::TestCase
281
305
  should ensure_length_of(:api_token).
282
306
  is_at_least(15).
283
307
  is_at_most(20).
284
- message('Password must be in between 15 and 20 characters')
308
+ with_message('Password must be in between 15 and 20 characters')
285
309
 
286
310
  should ensure_length_of(:secret_key).
287
311
  is_at_least(15).
@@ -424,6 +448,7 @@ class Person < ActiveRecord::Base
424
448
  validates_numericality_of :birth_year, less_than_or_equal_to: 1987
425
449
  validates_numericality_of :birth_day, odd: true
426
450
  validates_numericality_of :birth_month, even: true
451
+ validates_numericality_of :rank, less_than_or_equal_to: 10, allow_nil: true
427
452
 
428
453
  validates_numericality_of :number_of_dependents,
429
454
  message: 'Number of dependents must be a number'
@@ -443,7 +468,7 @@ describe Person do
443
468
 
444
469
  it do
445
470
  should validate_numericality_of(:number_of_dependents).
446
- with_message('Number of dependents must be a number' }
471
+ with_message('Number of dependents must be a number')
447
472
  end
448
473
  end
449
474
 
@@ -506,7 +531,7 @@ end
506
531
  # RSpec
507
532
  describe Post do
508
533
  it { should validate_uniqueness_of(:permalink) }
509
- it { should validate_uniqueness_of(:slug).scoped_to(:journal_id) }
534
+ it { should validate_uniqueness_of(:slug).scoped_to(:user_id) }
510
535
  it { should validate_uniqueness_of(:key).case_insensitive }
511
536
  it { should validate_uniqueness_of(:author_id).allow_nil }
512
537
 
@@ -519,7 +544,7 @@ end
519
544
  # Test::Unit
520
545
  class PostTest < ActiveSupport::TestCase
521
546
  should validate_uniqueness_of(:permalink)
522
- should validate_uniqueness_of(:slug).scoped_to(:journal_id)
547
+ should validate_uniqueness_of(:slug).scoped_to(:user_id)
523
548
  should validate_uniqueness_of(:key).case_insensitive
524
549
  should validate_uniqueness_of(:author_id).allow_nil
525
550
 
@@ -884,7 +909,7 @@ end
884
909
 
885
910
  ### ActionController Matchers
886
911
 
887
- *Jump to: [filter_param](#filter_param), [redirect_to](#redirect_to), [render_template](#render_template), [render_with_layout](#render_with_layout), [rescue_from](#rescue_from), [respond_with](#respond_with), [route](#route), [set_session](#set_session), [set_the_flash](#set_the_flash)*
912
+ *Jump to: [filter_param](#filter_param), [permit](#permit), [redirect_to](#redirect_to), [render_template](#render_template), [render_with_layout](#render_with_layout), [rescue_from](#rescue_from), [respond_with](#respond_with), [route](#route), [set_session](#set_session), [set_the_flash](#set_the_flash), [use_after_filter / use_after_action](#use_after_filter--use_after_action), [use_around_filter / use_around_action](#use_around_filter--use_around_action), [use_before_filter / use_around_action](#use_before_filter--use_before_action)*
888
913
 
889
914
  #### filter_param
890
915
 
@@ -906,6 +931,34 @@ class ApplicationControllerTest < ActionController::TestCase
906
931
  end
907
932
  ```
908
933
 
934
+ #### permit
935
+
936
+ The `permit` matcher tests that only whitelisted parameters are permitted.
937
+
938
+ ```ruby
939
+ class UserController < ActionController::Base
940
+ def create
941
+ User.create(user_params)
942
+ end
943
+
944
+ private
945
+
946
+ def user_params
947
+ params.require(:user).permit(:email)
948
+ end
949
+ end
950
+
951
+ # RSpec
952
+ describe UserController do
953
+ it { should permit(:email).for(:create) }
954
+ end
955
+
956
+ # Test::Unit
957
+ class UserControllerTest < ActionController::TestCase
958
+ should permit(:email).for(:create)
959
+ end
960
+ ```
961
+
909
962
  #### redirect_to
910
963
 
911
964
  The `redirect_to` matcher tests that an action redirects to a certain location.
@@ -1226,6 +1279,109 @@ class PostsControllerTest < ActionController::TestCase
1226
1279
  end
1227
1280
  ```
1228
1281
 
1282
+ #### use_after_filter / use_after_action
1283
+
1284
+ The `use_after_filter` ensures a given `after_filter` is used. This is also
1285
+ available as `use_after_action` to provide Rails 4 support.
1286
+
1287
+ ```ruby
1288
+ class UserController < ActionController::Base
1289
+ after_filter :log_activity
1290
+ end
1291
+
1292
+ # RSpec
1293
+ describe UserController do
1294
+ it { should use_after_filter(:log_activity) }
1295
+ end
1296
+
1297
+ # Test::Unit
1298
+ class UserControllerTest < ActionController::TestCase
1299
+ should use_after_filter(:log_activity)
1300
+ end
1301
+ ```
1302
+
1303
+ #### use_around_filter / use_around_action
1304
+
1305
+ The `use_around_filter` ensures a given `around_filter` is used. This is also
1306
+ available as `use_around_action` to provide Rails 4 support.
1307
+
1308
+ ```ruby
1309
+ class UserController < ActionController::Base
1310
+ around_filter :log_activity
1311
+ end
1312
+
1313
+ # RSpec
1314
+ describe UserController do
1315
+ it { should use_around_filter(:log_activity) }
1316
+ end
1317
+
1318
+ # Test::Unit
1319
+ class UserControllerTest < ActionController::TestCase
1320
+ should use_around_filter(:log_activity)
1321
+ end
1322
+ ```
1323
+
1324
+ #### use_before_filter / use_before_action
1325
+
1326
+ The `use_before_filter` ensures a given `before_filter` is used. This is also
1327
+ available as `use_before_action` for Rails 4 support.
1328
+
1329
+ ```ruby
1330
+ class UserController < ActionController::Base
1331
+ before_filter :authenticate_user!
1332
+ end
1333
+
1334
+ # RSpec
1335
+ describe UserController do
1336
+ it { should use_before_filter(:authenticate_user!) }
1337
+ end
1338
+
1339
+ # Test::Unit
1340
+ class UserControllerTest < ActionController::TestCase
1341
+ should use_before_filter(:authenticate_user!)
1342
+ end
1343
+ ```
1344
+
1345
+ ## Independent Matchers
1346
+
1347
+ Matchers to test non-Rails-dependent code:
1348
+
1349
+ #### delegate_method
1350
+
1351
+ ```ruby
1352
+ class Human < ActiveRecord::Base
1353
+ has_one :robot
1354
+ delegate :work, to: :robot
1355
+
1356
+ # alternatively, if you are not using Rails
1357
+ def work
1358
+ robot.work
1359
+ end
1360
+
1361
+ def protect
1362
+ robot.protect('Sarah Connor')
1363
+ end
1364
+
1365
+ def speak
1366
+ robot.beep_boop
1367
+ end
1368
+ end
1369
+
1370
+ # RSpec
1371
+ describe Human do
1372
+ it { should delegate_method(:work).to(:robot) }
1373
+ it { should delegate_method(:protect).to(:robot).with_arguments('Sarah Connor') }
1374
+ it { should delegate_method(:beep_boop).to(:robot).as(:speak) }
1375
+ end
1376
+
1377
+ # Test::Unit
1378
+ class HumanTest < ActiveSupport::TestCase
1379
+ should delegate_method(:work).to(:robot)
1380
+ should delegate_method(:protect).to(:robot).with_arguments('Sarah Connor')
1381
+ should delegate_method(:beep_boop).to(:robot).as(:speak)
1382
+ end
1383
+ ```
1384
+
1229
1385
  ## Versioning
1230
1386
 
1231
1387
  shoulda-matchers follows Semantic Versioning 2.0 as defined at
@@ -1238,7 +1394,7 @@ to all the [contributors][contributors].
1238
1394
 
1239
1395
  ## License
1240
1396
 
1241
- shoulda-matchers is copyright © 2006-2013 thoughtbot, inc. It is free software,
1397
+ shoulda-matchers is copyright © 2006-2014 thoughtbot, inc. It is free software,
1242
1398
  and may be redistributed under the terms specified in the
1243
1399
  [MIT-LICENSE](MIT-LICENSE) file.
1244
1400