shoulda 2.10.3 → 2.11.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 (233) hide show
  1. data/Rakefile +8 -27
  2. data/lib/shoulda.rb +1 -3
  3. data/lib/shoulda/action_controller.rb +8 -0
  4. data/lib/shoulda/action_controller/macros.rb +54 -73
  5. data/lib/shoulda/action_controller/matchers.rb +2 -0
  6. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +9 -6
  7. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +18 -1
  8. data/lib/shoulda/action_controller/matchers/redirect_to_matcher.rb +62 -0
  9. data/lib/shoulda/action_controller/matchers/render_template_matcher.rb +54 -0
  10. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +33 -15
  11. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +1 -1
  12. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +5 -1
  13. data/lib/shoulda/action_controller/matchers/route_matcher.rb +1 -1
  14. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +13 -2
  15. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +1 -1
  16. data/lib/shoulda/action_mailer.rb +3 -0
  17. data/lib/shoulda/action_mailer/assertions.rb +4 -0
  18. data/lib/shoulda/action_mailer/matchers.rb +22 -0
  19. data/lib/shoulda/action_mailer/matchers/have_sent_email.rb +119 -0
  20. data/lib/shoulda/active_record/helpers.rb +6 -1
  21. data/lib/shoulda/active_record/macros.rb +86 -141
  22. data/lib/shoulda/active_record/matchers.rb +0 -1
  23. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +1 -1
  24. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +10 -2
  25. data/lib/shoulda/assertions.rb +8 -0
  26. data/lib/shoulda/context.rb +52 -32
  27. data/lib/shoulda/macros.rb +16 -18
  28. data/lib/shoulda/rails.rb +0 -5
  29. data/lib/shoulda/rspec.rb +2 -0
  30. data/lib/shoulda/version.rb +4 -0
  31. data/rails/init.rb +1 -0
  32. data/test/fail_macros.rb +20 -4
  33. data/test/functional/posts_controller_test.rb +7 -7
  34. data/test/functional/users_controller_test.rb +1 -1
  35. data/test/matchers/action_mailer/have_sent_email_test.rb +53 -0
  36. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +7 -1
  37. data/test/matchers/active_record/allow_value_matcher_test.rb +1 -1
  38. data/test/matchers/active_record/association_matcher_test.rb +16 -16
  39. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +3 -2
  40. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +1 -1
  41. data/test/matchers/active_record/have_db_column_matcher_test.rb +1 -1
  42. data/test/matchers/active_record/have_db_index_matcher_test.rb +1 -1
  43. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +1 -1
  44. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +1 -1
  45. data/test/matchers/active_record/validate_format_of_matcher_test.rb +1 -1
  46. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +1 -1
  47. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +1 -1
  48. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +1 -1
  49. data/test/matchers/controller/assign_to_matcher_test.rb +11 -1
  50. data/test/matchers/controller/filter_param_matcher_test.rb +10 -2
  51. data/test/matchers/controller/redirect_to_matcher_test.rb +37 -0
  52. data/test/matchers/controller/render_template_matcher_test.rb +37 -0
  53. data/test/matchers/controller/render_with_layout_matcher_test.rb +15 -1
  54. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +1 -1
  55. data/test/matchers/controller/respond_with_matcher_test.rb +1 -11
  56. data/test/matchers/controller/route_matcher_test.rb +1 -1
  57. data/test/matchers/controller/set_session_matcher_test.rb +11 -1
  58. data/test/matchers/controller/set_the_flash_matcher.rb +1 -1
  59. data/test/other/autoload_macro_test.rb +1 -1
  60. data/test/other/context_test.rb +177 -8
  61. data/test/other/helpers_test.rb +13 -36
  62. data/test/other/private_helpers_test.rb +1 -1
  63. data/test/other/should_test.rb +1 -1
  64. data/test/{model_builder.rb → rails2_model_builder.rb} +28 -4
  65. data/test/{rails_root → rails2_root}/app/controllers/application_controller.rb +0 -3
  66. data/test/{rails_root → rails2_root}/app/controllers/posts_controller.rb +0 -0
  67. data/test/{rails_root → rails2_root}/app/controllers/users_controller.rb +0 -0
  68. data/test/{rails_root → rails2_root}/app/helpers/application_helper.rb +0 -0
  69. data/test/{rails_root → rails2_root}/app/helpers/posts_helper.rb +0 -0
  70. data/test/{rails_root → rails2_root}/app/helpers/users_helper.rb +0 -0
  71. data/test/{rails_root → rails2_root}/app/models/address.rb +0 -0
  72. data/test/rails2_root/app/models/flea.rb +11 -0
  73. data/test/{rails_root → rails2_root}/app/models/friendship.rb +0 -0
  74. data/test/rails2_root/app/models/notifier.rb +8 -0
  75. data/test/{rails_root → rails2_root}/app/models/pets/cat.rb +0 -0
  76. data/test/{rails_root → rails2_root}/app/models/pets/dog.rb +0 -0
  77. data/test/{rails_root → rails2_root}/app/models/post.rb +0 -0
  78. data/test/{rails_root → rails2_root}/app/models/product.rb +0 -0
  79. data/test/{rails_root → rails2_root}/app/models/profile.rb +0 -0
  80. data/test/{rails_root → rails2_root}/app/models/registration.rb +0 -0
  81. data/test/{rails_root → rails2_root}/app/models/tag.rb +0 -0
  82. data/test/{rails_root → rails2_root}/app/models/tagging.rb +0 -0
  83. data/test/{rails_root → rails2_root}/app/models/treat.rb +0 -0
  84. data/test/{rails_root → rails2_root}/app/models/user.rb +0 -0
  85. data/test/{rails_root → rails2_root}/app/views/layouts/posts.rhtml +0 -0
  86. data/test/{rails_root → rails2_root}/app/views/layouts/users.rhtml +0 -0
  87. data/test/{rails_root → rails2_root}/app/views/layouts/wide.html.erb +0 -0
  88. data/test/rails2_root/app/views/notifier/the_email.html.erb +1 -0
  89. data/test/{rails_root → rails2_root}/app/views/posts/edit.rhtml +0 -0
  90. data/test/{rails_root → rails2_root}/app/views/posts/index.rhtml +0 -0
  91. data/test/{rails_root → rails2_root}/app/views/posts/new.rhtml +0 -0
  92. data/test/{rails_root → rails2_root}/app/views/posts/show.rhtml +0 -0
  93. data/test/{rails_root → rails2_root}/app/views/users/edit.rhtml +0 -0
  94. data/test/{rails_root → rails2_root}/app/views/users/index.rhtml +0 -0
  95. data/test/{rails_root → rails2_root}/app/views/users/new.rhtml +0 -0
  96. data/test/{rails_root → rails2_root}/app/views/users/show.rhtml +0 -0
  97. data/test/{rails_root → rails2_root}/config/boot.rb +0 -0
  98. data/test/{rails_root → rails2_root}/config/database.yml +1 -1
  99. data/test/{rails_root → rails2_root}/config/environment.rb +0 -1
  100. data/test/rails2_root/config/environments/test.rb +23 -0
  101. data/test/{rails_root → rails2_root}/config/initializers/new_rails_defaults.rb +0 -0
  102. data/test/{rails_root → rails2_root}/config/initializers/shoulda.rb +0 -0
  103. data/test/{rails_root → rails2_root}/config/routes.rb +0 -0
  104. data/test/{rails_root → rails2_root}/db/migrate/001_create_users.rb +0 -0
  105. data/test/{rails_root → rails2_root}/db/migrate/002_create_posts.rb +0 -0
  106. data/test/{rails_root → rails2_root}/db/migrate/003_create_taggings.rb +0 -0
  107. data/test/{rails_root → rails2_root}/db/migrate/004_create_tags.rb +0 -0
  108. data/test/{rails_root → rails2_root}/db/migrate/005_create_dogs.rb +0 -0
  109. data/test/{rails_root → rails2_root}/db/migrate/006_create_addresses.rb +0 -0
  110. data/test/{rails_root → rails2_root}/db/migrate/007_create_fleas.rb +0 -0
  111. data/test/{rails_root → rails2_root}/db/migrate/008_create_dogs_fleas.rb +0 -0
  112. data/test/{rails_root → rails2_root}/db/migrate/009_create_products.rb +0 -0
  113. data/test/{rails_root → rails2_root}/db/migrate/010_create_friendships.rb +0 -0
  114. data/test/{rails_root → rails2_root}/db/migrate/011_create_treats.rb +0 -0
  115. data/test/{rails_root → rails2_root}/db/migrate/20090506203502_create_profiles.rb +0 -0
  116. data/test/{rails_root → rails2_root}/db/migrate/20090506203536_create_registrations.rb +0 -0
  117. data/test/{rails_root → rails2_root}/db/migrate/20090513104502_create_cats.rb +0 -0
  118. data/test/{rails_root → rails2_root}/db/schema.rb +0 -0
  119. data/test/rails2_root/log/test.log +121771 -0
  120. data/test/{rails_root → rails2_root}/public/404.html +0 -0
  121. data/test/{rails_root → rails2_root}/public/422.html +0 -0
  122. data/test/{rails_root → rails2_root}/public/500.html +0 -0
  123. data/test/{rails_root → rails2_root}/script/console +0 -0
  124. data/test/{rails_root → rails2_root}/script/generate +0 -0
  125. data/test/{rails_root → rails2_root}/test/shoulda_macros/custom_macro.rb +0 -0
  126. data/test/{rails_root → rails2_root}/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +0 -0
  127. data/test/{rails_root → rails2_root}/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +0 -0
  128. data/test/rails2_test_helper.rb +6 -0
  129. data/test/rails3_model_builder.rb +118 -0
  130. data/test/rails3_root/Gemfile +28 -0
  131. data/test/rails3_root/README +244 -0
  132. data/test/rails3_root/Rakefile +10 -0
  133. data/test/rails3_root/app/controllers/application_controller.rb +22 -0
  134. data/test/rails3_root/app/controllers/posts_controller.rb +87 -0
  135. data/test/rails3_root/app/controllers/users_controller.rb +82 -0
  136. data/test/rails3_root/app/helpers/application_helper.rb +2 -0
  137. data/test/rails3_root/app/models/address.rb +7 -0
  138. data/test/rails3_root/app/models/flea.rb +11 -0
  139. data/test/rails3_root/app/models/friendship.rb +4 -0
  140. data/test/rails3_root/app/models/notifier.rb +8 -0
  141. data/test/rails3_root/app/models/pets/cat.rb +7 -0
  142. data/test/rails3_root/app/models/pets/dog.rb +10 -0
  143. data/test/rails3_root/app/models/post.rb +12 -0
  144. data/test/rails3_root/app/models/product.rb +12 -0
  145. data/test/rails3_root/app/models/profile.rb +2 -0
  146. data/test/rails3_root/app/models/registration.rb +2 -0
  147. data/test/rails3_root/app/models/tag.rb +8 -0
  148. data/test/rails3_root/app/models/tagging.rb +4 -0
  149. data/test/rails3_root/app/models/treat.rb +3 -0
  150. data/test/rails3_root/app/models/user.rb +32 -0
  151. data/test/rails3_root/app/views/layouts/application.html.erb +14 -0
  152. data/test/rails3_root/app/views/layouts/posts.rhtml +19 -0
  153. data/test/rails3_root/app/views/layouts/users.rhtml +17 -0
  154. data/test/rails3_root/app/views/layouts/wide.html.erb +1 -0
  155. data/test/rails3_root/app/views/notifier/the_email.html.erb +1 -0
  156. data/test/rails3_root/app/views/posts/edit.rhtml +27 -0
  157. data/test/rails3_root/app/views/posts/index.rhtml +25 -0
  158. data/test/rails3_root/app/views/posts/new.rhtml +24 -0
  159. data/test/rails3_root/app/views/posts/show.rhtml +18 -0
  160. data/test/rails3_root/app/views/users/edit.rhtml +22 -0
  161. data/test/rails3_root/app/views/users/index.rhtml +22 -0
  162. data/test/rails3_root/app/views/users/new.rhtml +21 -0
  163. data/test/rails3_root/app/views/users/show.rhtml +13 -0
  164. data/test/rails3_root/config.ru +4 -0
  165. data/test/rails3_root/config/application.rb +46 -0
  166. data/test/rails3_root/config/boot.rb +6 -0
  167. data/test/rails3_root/config/database.yml +22 -0
  168. data/test/rails3_root/config/environment.rb +5 -0
  169. data/test/rails3_root/config/environments/development.rb +19 -0
  170. data/test/rails3_root/config/environments/production.rb +42 -0
  171. data/test/rails3_root/config/environments/test.rb +32 -0
  172. data/test/rails3_root/config/initializers/backtrace_silencers.rb +7 -0
  173. data/test/rails3_root/config/initializers/inflections.rb +10 -0
  174. data/test/rails3_root/config/initializers/mime_types.rb +5 -0
  175. data/test/rails3_root/config/initializers/secret_token.rb +7 -0
  176. data/test/rails3_root/config/initializers/session_store.rb +8 -0
  177. data/test/rails3_root/config/locales/en.yml +5 -0
  178. data/test/rails3_root/config/routes.rb +4 -0
  179. data/test/rails3_root/db/migrate/001_create_users.rb +19 -0
  180. data/test/rails3_root/db/migrate/002_create_posts.rb +13 -0
  181. data/test/rails3_root/db/migrate/003_create_taggings.rb +12 -0
  182. data/test/rails3_root/db/migrate/004_create_tags.rb +11 -0
  183. data/test/rails3_root/db/migrate/005_create_dogs.rb +12 -0
  184. data/test/rails3_root/db/migrate/006_create_addresses.rb +14 -0
  185. data/test/rails3_root/db/migrate/007_create_fleas.rb +11 -0
  186. data/test/rails3_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  187. data/test/rails3_root/db/migrate/009_create_products.rb +17 -0
  188. data/test/rails3_root/db/migrate/010_create_friendships.rb +14 -0
  189. data/test/rails3_root/db/migrate/011_create_treats.rb +12 -0
  190. data/test/rails3_root/db/migrate/20090506203502_create_profiles.rb +12 -0
  191. data/test/rails3_root/db/migrate/20090506203536_create_registrations.rb +14 -0
  192. data/test/rails3_root/db/migrate/20090513104502_create_cats.rb +12 -0
  193. data/test/rails3_root/db/seeds.rb +7 -0
  194. data/test/rails3_root/db/test.sqlite3 +0 -0
  195. data/test/rails3_root/doc/README_FOR_APP +2 -0
  196. data/test/{rails_root/config/environments/test.rb → rails3_root/log/development.log} +0 -0
  197. data/test/rails3_root/log/production.log +0 -0
  198. data/test/rails3_root/log/server.log +0 -0
  199. data/test/rails3_root/log/test.log +63274 -0
  200. data/test/rails3_root/public/404.html +26 -0
  201. data/test/rails3_root/public/422.html +26 -0
  202. data/test/rails3_root/public/500.html +26 -0
  203. data/test/rails3_root/public/favicon.ico +0 -0
  204. data/test/rails3_root/public/images/rails.png +0 -0
  205. data/test/rails3_root/public/index.html +279 -0
  206. data/test/rails3_root/public/javascripts/application.js +2 -0
  207. data/test/rails3_root/public/javascripts/controls.js +965 -0
  208. data/test/rails3_root/public/javascripts/dragdrop.js +974 -0
  209. data/test/rails3_root/public/javascripts/effects.js +1123 -0
  210. data/test/rails3_root/public/javascripts/prototype.js +4874 -0
  211. data/test/rails3_root/public/javascripts/rails.js +118 -0
  212. data/test/rails3_root/public/robots.txt +5 -0
  213. data/test/rails3_root/script/rails +9 -0
  214. data/test/rails3_root/test/performance/browsing_test.rb +9 -0
  215. data/test/rails3_root/test/test_helper.rb +13 -0
  216. data/test/rails3_test_helper.rb +6 -0
  217. data/test/test_helper.rb +16 -8
  218. data/test/unit/address_test.rb +1 -1
  219. data/test/unit/cat_test.rb +1 -1
  220. data/test/unit/dog_test.rb +1 -1
  221. data/test/unit/flea_test.rb +9 -1
  222. data/test/unit/friendship_test.rb +1 -1
  223. data/test/unit/post_test.rb +1 -5
  224. data/test/unit/product_test.rb +1 -1
  225. data/test/unit/tag_test.rb +1 -5
  226. data/test/unit/tagging_test.rb +1 -1
  227. data/test/unit/user_test.rb +3 -37
  228. metadata +180 -73
  229. data/lib/shoulda/action_view.rb +0 -10
  230. data/lib/shoulda/action_view/macros.rb +0 -61
  231. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +0 -128
  232. data/test/matchers/active_record/have_named_scope_matcher_test.rb +0 -65
  233. data/test/rails_root/app/models/flea.rb +0 -3
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class AllowMassAssignmentOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -63,6 +63,12 @@ class AllowMassAssignmentOfMatcherTest < ActiveSupport::TestCase # :nodoc:
63
63
  should "accept being mass-assignable" do
64
64
  assert_accepts allow_mass_assignment_of(:attr), @model
65
65
  end
66
+
67
+ should "assign a negative failure message" do
68
+ matcher = allow_mass_assignment_of(:attr)
69
+ matcher.matches?(@model)
70
+ assert_not_nil matcher.negative_failure_message
71
+ end
66
72
  end
67
73
 
68
74
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class AllowValueMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class AssociationMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -166,55 +166,55 @@ class AssociationMatcherTest < ActiveSupport::TestCase # :nodoc:
166
166
 
167
167
  context "have_one" do
168
168
  setup do
169
- @matcher = have_one(:profile)
169
+ @matcher = have_one(:detail)
170
170
  end
171
171
 
172
172
  should "accept a valid association without any options" do
173
- define_model :profile, :person_id => :integer
173
+ define_model :detail, :person_id => :integer
174
174
  define_model :person do
175
- has_one :profile
175
+ has_one :detail
176
176
  end
177
177
  assert_accepts @matcher, Person.new
178
178
  end
179
179
 
180
180
  should "accept a valid association with an :as option" do
181
- define_model :profile, :profilable_id => :integer,
182
- :profilable_type => :string
181
+ define_model :detail, :detailable_id => :integer,
182
+ :detailable_type => :string
183
183
  define_model :person do
184
- has_one :profile, :as => :profilable
184
+ has_one :detail, :as => :detailable
185
185
  end
186
186
  assert_accepts @matcher, Person.new
187
187
  end
188
188
 
189
189
  should "reject an association that has a nonexistent foreign key" do
190
- define_model :profile
190
+ define_model :detail
191
191
  define_model :person do
192
- has_one :profile
192
+ has_one :detail
193
193
  end
194
194
  assert_rejects @matcher, Person.new
195
195
  end
196
196
 
197
197
  should "reject an association with a bad :as option" do
198
- define_model :profile, :profilable_id => :integer,
199
- :profilable_type => :string
198
+ define_model :detail, :detailable_id => :integer,
199
+ :detailable_type => :string
200
200
  define_model :person do
201
- has_one :profile, :as => :describable
201
+ has_one :detail, :as => :describable
202
202
  end
203
203
  assert_rejects @matcher, Person.new
204
204
  end
205
205
 
206
206
  should "accept an association with a valid :dependent option" do
207
- define_model :profile, :person_id => :integer
207
+ define_model :detail, :person_id => :integer
208
208
  define_model :person do
209
- has_one :profile, :dependent => :destroy
209
+ has_one :detail, :dependent => :destroy
210
210
  end
211
211
  assert_accepts @matcher.dependent(:destroy), Person.new
212
212
  end
213
213
 
214
214
  should "reject an association with a bad :dependent option" do
215
- define_model :profile, :person_id => :integer
215
+ define_model :detail, :person_id => :integer
216
216
  define_model :person do
217
- has_one :profile
217
+ has_one :detail
218
218
  end
219
219
  assert_rejects @matcher.dependent(:destroy), Person.new
220
220
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class EnsureInclusionOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -56,7 +56,8 @@ class EnsureInclusionOfMatcherTest < ActiveSupport::TestCase # :nodoc:
56
56
  context "an attribute with custom range validations" do
57
57
  setup do
58
58
  define_model :example, :attr => :integer do
59
- def validate
59
+ validate :custom_validation
60
+ def custom_validation
60
61
  if attr < 2
61
62
  errors.add(:attr, 'too low')
62
63
  elsif attr > 5
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class EnsureLengthOfMatcher < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class HaveDbColumnMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class HaveDbIndexMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class HaveReadonlyAttributesMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class ValidateAcceptanceOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class ValidateFormatOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class ValidateNumericalityOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class ValidatePresenceOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class ValidateUniquenessOfMatcherTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class AssignToMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
@@ -30,6 +30,16 @@ class AssignToMatcherTest < ActionController::TestCase # :nodoc:
30
30
  should "reject assigning to another variable" do
31
31
  assert_rejects assign_to(:other), @controller
32
32
  end
33
+
34
+ should "accept assigning to the same value in the test context" do
35
+ @expected = 'value'
36
+ assert_accepts assign_to(:var).with { @expected }, @controller
37
+ end
38
+
39
+ should "reject assigning to the another value in the test context" do
40
+ @expected = 'other'
41
+ assert_rejects assign_to(:var).with { @expected }, @controller
42
+ end
33
43
  end
34
44
 
35
45
  end
@@ -1,9 +1,12 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class FilterParamMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
5
5
  context "a controller that filters no parameters" do
6
6
  setup do
7
+ if Rails.respond_to?(:application)
8
+ Rails.application.config.filter_parameters = []
9
+ end
7
10
  @controller = define_controller(:examples).new
8
11
  end
9
12
 
@@ -14,8 +17,13 @@ class FilterParamMatcherTest < ActionController::TestCase # :nodoc:
14
17
 
15
18
  context "a controller that filters a parameter" do
16
19
  setup do
20
+ if Rails.respond_to?(:application)
21
+ Rails.application.config.filter_parameters = [:password]
22
+ end
17
23
  @controller = define_controller :examples do
18
- filter_parameter_logging :password
24
+ unless Rails.respond_to?(:application)
25
+ filter_parameter_logging :password
26
+ end
19
27
  end.new
20
28
  end
21
29
 
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ class RedirectToMatcherTest < ActionController::TestCase # :nodoc:
4
+
5
+ context "a controller that redirects" do
6
+ setup do
7
+ @controller = build_response { redirect_to '/some/url' }
8
+ end
9
+
10
+ should "accept redirecting to that url" do
11
+ assert_accepts redirect_to('/some/url'), @controller
12
+ end
13
+
14
+ should "reject redirecting to a different url" do
15
+ assert_rejects redirect_to('/some/other/url'), @controller
16
+ end
17
+
18
+ should "accept redirecting to that url in a block" do
19
+ assert_accepts redirect_to('somewhere') { '/some/url' }, @controller
20
+ end
21
+
22
+ should "reject redirecting to a different url in a block" do
23
+ assert_rejects redirect_to('somewhere else') { '/some/other/url' }, @controller
24
+ end
25
+ end
26
+
27
+ context "a controller that doesn't redirect" do
28
+ setup do
29
+ @controller = build_response { render :text => 'hello' }
30
+ end
31
+
32
+ should "reject redirecting to a url" do
33
+ assert_rejects redirect_to('/some/url'), @controller
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ class RenderTemplateMatcherTest < ActionController::TestCase # :nodoc:
4
+
5
+ context "a controller that renders a template" do
6
+ setup do
7
+ @controller = build_response(:action => 'show') { render }
8
+ end
9
+
10
+ should "accept rendering that template" do
11
+ assert_accepts render_template(:show), @controller
12
+ end
13
+
14
+ should "reject rendering a different template" do
15
+ assert_rejects render_template(:index), @controller
16
+ end
17
+
18
+ should "accept rendering that template in the given context" do
19
+ assert_accepts self.class.render_template(:show).in_context(self), @controller
20
+ end
21
+
22
+ should "reject rendering a different template in the given context" do
23
+ assert_rejects self.class.render_template(:index).in_context(self), @controller
24
+ end
25
+ end
26
+
27
+ context "a controller that doesn't render a template" do
28
+ setup do
29
+ @controller = build_response { render :nothing => true }
30
+ end
31
+
32
+ should "reject rendering a template" do
33
+ assert_rejects render_template(:show), @controller
34
+ end
35
+ end
36
+
37
+ end
@@ -1,9 +1,10 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class RenderWithLayoutMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
5
5
  context "a controller that renders with a layout" do
6
6
  setup do
7
+ create_view('layouts/wide.html.erb', 'some content, <%= yield %>')
7
8
  @controller = build_response { render :layout => 'wide' }
8
9
  end
9
10
 
@@ -30,4 +31,17 @@ class RenderWithLayoutMatcherTest < ActionController::TestCase # :nodoc:
30
31
  end
31
32
  end
32
33
 
34
+ context "given a context with layouts" do
35
+ setup do
36
+ @layout = 'happy'
37
+ @controller = build_response { render :layout => false }
38
+ @layouts = Hash.new(0)
39
+ @layouts[@layout] = 1
40
+ end
41
+
42
+ should "accept that layout in that context" do
43
+ assert_accepts render_with_layout(@layout).in_context(self), @controller
44
+ end
45
+ end
46
+
33
47
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class RespondWithContentTypeMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class RespondWithMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
@@ -91,16 +91,6 @@ class RespondWithMatcherTest < ActionController::TestCase # :nodoc:
91
91
  assert_rejects respond_with(:success), @controller
92
92
  end
93
93
  end
94
-
95
- context "a controller raising an error" do
96
- setup do
97
- @controller = build_response { raise RailsError }
98
- end
99
-
100
- should "reject responding with any status" do
101
- assert_rejects respond_with(:success), @controller
102
- end
103
- end
104
94
 
105
95
  end
106
96
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class RouteToMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class SetSessionMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
@@ -33,6 +33,16 @@ class SetSessionMatcherTest < ActionController::TestCase # :nodoc:
33
33
  should "accept assigning false to that variable" do
34
34
  assert_accepts set_session(:false_var).to(false), @controller
35
35
  end
36
+
37
+ should "accept assigning to the same value in the test context" do
38
+ @expected = 'value'
39
+ assert_accepts set_session(:var).to { @expected }, @controller
40
+ end
41
+
42
+ should "reject assigning to the another value in the test context" do
43
+ @expected = 'other'
44
+ assert_rejects set_session(:var).to { @expected }, @controller
45
+ end
36
46
  end
37
47
 
38
48
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class SetTheFlashMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class AutoloadMacroTest < ActiveSupport::TestCase # :nodoc:
4
4
  context "The macro auto-loader" do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class ContextTest < ActiveSupport::TestCase # :nodoc:
4
4
 
@@ -158,11 +158,6 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
158
158
  assert_kind_of SomeModel, subject
159
159
  end
160
160
 
161
- should "return an existing instance of the described type as the subject" do
162
- @some_model = SomeModel.new
163
- assert_equal @some_model, subject
164
- end
165
-
166
161
  context "with an explicit subject block" do
167
162
  setup { @expected = SomeModel.new }
168
163
  subject { @expected }
@@ -179,6 +174,163 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
179
174
  end
180
175
  end
181
176
 
177
+ class ShouldMatcherTest < Test::Unit::TestCase
178
+ class FakeMatcher
179
+ attr_reader :subject
180
+ attr_accessor :fail
181
+
182
+ def description
183
+ "do something"
184
+ end
185
+
186
+ def matches?(subject)
187
+ @subject = subject
188
+ !@fail
189
+ end
190
+
191
+ def failure_message
192
+ "a failure message"
193
+ end
194
+
195
+ def negative_failure_message
196
+ "not a failure message"
197
+ end
198
+ end
199
+
200
+ def run_test
201
+ @test_suite.run(@test_result) { |event, name |}
202
+ end
203
+
204
+ def setup
205
+ @matcher = FakeMatcher.new
206
+ @test_result = Test::Unit::TestResult.new
207
+ class << @test_result
208
+ def failure_messages
209
+ @failures.map { |failure| failure.message }
210
+ end
211
+ end
212
+ end
213
+
214
+ def create_test_suite(&definition)
215
+ test_class = Class.new(Test::Unit::TestCase, &definition)
216
+ test_class.suite
217
+ end
218
+
219
+ def assert_failed_with(message, test_result)
220
+ assert_equal 1, test_result.failure_count
221
+ assert_equal [message], test_result.failure_messages
222
+ end
223
+
224
+ def assert_passed(test_result)
225
+ assert_equal 0, test_result.failure_count
226
+ end
227
+
228
+ def assert_test_named(expected_name, test_suite)
229
+ name = test_suite.tests.map { |test| test.method_name }.first
230
+ assert name.include?(expected_name), "Expected #{name} to include #{expected_name}"
231
+ end
232
+
233
+ def self.should_use_positive_matcher
234
+ should "generate a test using the matcher's description" do
235
+ assert_test_named "should #{@matcher.description}", @test_suite
236
+ end
237
+
238
+ should "pass with a passing matcher" do
239
+ @matcher.fail = false
240
+ run_test
241
+ assert_passed @test_result
242
+ end
243
+
244
+ should "fail with a failing matcher" do
245
+ @matcher.fail = true
246
+ run_test
247
+ assert_failed_with @matcher.failure_message, @test_result
248
+ end
249
+
250
+ should "provide the subject" do
251
+ @matcher.fail = false
252
+ run_test
253
+ assert_equal 'a subject', @matcher.subject
254
+ end
255
+ end
256
+
257
+ def self.should_use_negative_matcher
258
+ should "generate a test using the matcher's description" do
259
+ assert_test_named "should not #{@matcher.description}", @test_suite
260
+ end
261
+
262
+ should "pass with a failing matcher" do
263
+ @matcher.fail = true
264
+ run_test
265
+ assert_passed @test_result
266
+ end
267
+
268
+ should "fail with a passing matcher" do
269
+ @matcher.fail = false
270
+ run_test
271
+ assert_failed_with @matcher.negative_failure_message, @test_result
272
+ end
273
+
274
+ should "provide the subject" do
275
+ @matcher.fail = false
276
+ run_test
277
+ assert_equal 'a subject', @matcher.subject
278
+ end
279
+ end
280
+
281
+ context "a should block with a matcher" do
282
+ setup do
283
+ matcher = @matcher
284
+ @test_suite = create_test_suite do
285
+ subject { 'a subject' }
286
+ should matcher
287
+ end
288
+ end
289
+
290
+ should_use_positive_matcher
291
+ end
292
+
293
+ context "a should block with a matcher within a context" do
294
+ setup do
295
+ matcher = @matcher
296
+ @test_suite = create_test_suite do
297
+ context "in context" do
298
+ subject { 'a subject' }
299
+ should matcher
300
+ end
301
+ end
302
+ end
303
+
304
+ should_use_positive_matcher
305
+ end
306
+
307
+ context "a should_not block with a matcher" do
308
+ setup do
309
+ matcher = @matcher
310
+ @test_suite = create_test_suite do
311
+ subject { 'a subject' }
312
+ should_not matcher
313
+ end
314
+ end
315
+
316
+ should_use_negative_matcher
317
+ end
318
+
319
+ context "a should_not block with a matcher within a context" do
320
+ setup do
321
+ matcher = @matcher
322
+ @test_suite = create_test_suite do
323
+ context "in context" do
324
+ subject { 'a subject' }
325
+ should_not matcher
326
+ end
327
+ end
328
+ end
329
+
330
+ should_use_negative_matcher
331
+ end
332
+ end
333
+
182
334
  class Subject; end
183
335
 
184
336
  class SubjectTest < ActiveSupport::TestCase
@@ -196,8 +348,25 @@ end
196
348
 
197
349
  class SubjectLazinessTest < ActiveSupport::TestCase
198
350
  subject { Subject.new }
199
-
351
+
200
352
  should "only build the subject once" do
201
353
  assert_equal subject, subject
202
354
  end
203
- end
355
+ end
356
+
357
+ class SomeController < ActionController::Base
358
+ end
359
+
360
+ class ControllerSubjectTest < ActionController::TestCase
361
+ tests SomeController
362
+
363
+ should "use the controller as the subject outside a context" do
364
+ assert_equal @controller, subject
365
+ end
366
+
367
+ context "in a context" do
368
+ should "use the controller as the subject" do
369
+ assert_equal @controller, subject
370
+ end
371
+ end
372
+ end