thoughtbot-shoulda 2.10.2 → 2.11.1

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 (241) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +5 -5
  2. data/README.rdoc +72 -89
  3. data/Rakefile +31 -33
  4. data/lib/shoulda.rb +6 -6
  5. data/lib/shoulda/action_controller.rb +8 -0
  6. data/lib/shoulda/action_controller/macros.rb +54 -73
  7. data/lib/shoulda/action_controller/matchers.rb +7 -5
  8. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +10 -7
  9. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +18 -1
  10. data/lib/shoulda/action_controller/matchers/redirect_to_matcher.rb +62 -0
  11. data/lib/shoulda/action_controller/matchers/render_template_matcher.rb +54 -0
  12. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +33 -15
  13. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +10 -10
  14. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +17 -13
  15. data/lib/shoulda/action_controller/matchers/route_matcher.rb +3 -3
  16. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +13 -2
  17. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +1 -1
  18. data/lib/shoulda/action_mailer.rb +3 -0
  19. data/lib/shoulda/action_mailer/assertions.rb +4 -0
  20. data/lib/shoulda/action_mailer/matchers.rb +22 -0
  21. data/lib/shoulda/action_mailer/matchers/have_sent_email.rb +110 -0
  22. data/lib/shoulda/active_record/helpers.rb +8 -3
  23. data/lib/shoulda/active_record/macros.rb +88 -143
  24. data/lib/shoulda/active_record/matchers.rb +0 -1
  25. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +1 -1
  26. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +10 -2
  27. data/lib/shoulda/active_record/matchers/association_matcher.rb +8 -8
  28. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +1 -1
  29. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +2 -2
  30. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +11 -11
  31. data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +8 -8
  32. data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +2 -4
  33. data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +3 -3
  34. data/lib/shoulda/active_record/matchers/validation_matcher.rb +0 -1
  35. data/lib/shoulda/assertions.rb +10 -2
  36. data/lib/shoulda/autoload_macros.rb +20 -20
  37. data/lib/shoulda/context.rb +70 -39
  38. data/lib/shoulda/{rspec.rb → integrations/rspec.rb} +2 -0
  39. data/lib/shoulda/integrations/rspec2.rb +22 -0
  40. data/lib/shoulda/{test_unit.rb → integrations/test_unit.rb} +0 -0
  41. data/lib/shoulda/macros.rb +46 -18
  42. data/lib/shoulda/rails.rb +0 -5
  43. data/lib/shoulda/tasks/yaml_to_shoulda.rake +11 -11
  44. data/lib/shoulda/version.rb +4 -0
  45. data/rails/init.rb +3 -2
  46. data/test/fail_macros.rb +20 -4
  47. data/test/functional/posts_controller_test.rb +7 -7
  48. data/test/functional/users_controller_test.rb +1 -1
  49. data/test/matchers/action_mailer/have_sent_email_test.rb +70 -0
  50. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +7 -1
  51. data/test/matchers/active_record/allow_value_matcher_test.rb +1 -1
  52. data/test/matchers/active_record/association_matcher_test.rb +16 -16
  53. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +3 -2
  54. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +1 -1
  55. data/test/matchers/active_record/have_db_column_matcher_test.rb +1 -1
  56. data/test/matchers/active_record/have_db_index_matcher_test.rb +1 -1
  57. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +1 -1
  58. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +1 -1
  59. data/test/matchers/active_record/validate_format_of_matcher_test.rb +1 -1
  60. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +1 -1
  61. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +1 -1
  62. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +1 -1
  63. data/test/matchers/controller/assign_to_matcher_test.rb +11 -1
  64. data/test/matchers/controller/filter_param_matcher_test.rb +10 -2
  65. data/test/matchers/controller/redirect_to_matcher_test.rb +37 -0
  66. data/test/matchers/controller/render_template_matcher_test.rb +37 -0
  67. data/test/matchers/controller/render_with_layout_matcher_test.rb +15 -1
  68. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +1 -1
  69. data/test/matchers/controller/respond_with_matcher_test.rb +1 -11
  70. data/test/matchers/controller/route_matcher_test.rb +18 -1
  71. data/test/matchers/controller/set_session_matcher_test.rb +11 -1
  72. data/test/matchers/controller/set_the_flash_matcher.rb +1 -1
  73. data/test/other/autoload_macro_test.rb +1 -1
  74. data/test/other/context_test.rb +210 -27
  75. data/test/other/convert_to_should_syntax_test.rb +1 -1
  76. data/test/other/helpers_test.rb +13 -36
  77. data/test/other/private_helpers_test.rb +2 -2
  78. data/test/other/should_test.rb +13 -13
  79. data/test/{model_builder.rb → rails2_model_builder.rb} +32 -8
  80. data/test/{rails_root → rails2_root}/app/controllers/application_controller.rb +0 -3
  81. data/test/{rails_root → rails2_root}/app/controllers/posts_controller.rb +0 -0
  82. data/test/{rails_root → rails2_root}/app/controllers/users_controller.rb +0 -0
  83. data/test/{rails_root → rails2_root}/app/helpers/application_helper.rb +0 -0
  84. data/test/{rails_root → rails2_root}/app/helpers/posts_helper.rb +0 -0
  85. data/test/{rails_root → rails2_root}/app/helpers/users_helper.rb +0 -0
  86. data/test/{rails_root → rails2_root}/app/models/address.rb +0 -0
  87. data/test/rails2_root/app/models/flea.rb +11 -0
  88. data/test/{rails_root → rails2_root}/app/models/friendship.rb +0 -0
  89. data/test/rails2_root/app/models/notifier.rb +8 -0
  90. data/test/{rails_root → rails2_root}/app/models/pets/cat.rb +0 -0
  91. data/test/{rails_root → rails2_root}/app/models/pets/dog.rb +0 -0
  92. data/test/{rails_root → rails2_root}/app/models/post.rb +1 -1
  93. data/test/{rails_root → rails2_root}/app/models/product.rb +0 -0
  94. data/test/{rails_root → rails2_root}/app/models/profile.rb +0 -0
  95. data/test/{rails_root → rails2_root}/app/models/registration.rb +0 -0
  96. data/test/{rails_root → rails2_root}/app/models/tag.rb +0 -0
  97. data/test/{rails_root → rails2_root}/app/models/tagging.rb +0 -0
  98. data/test/{rails_root → rails2_root}/app/models/treat.rb +0 -0
  99. data/test/{rails_root → rails2_root}/app/models/user.rb +0 -0
  100. data/test/{rails_root → rails2_root}/app/views/layouts/posts.rhtml +0 -0
  101. data/test/{rails_root → rails2_root}/app/views/layouts/users.rhtml +0 -0
  102. data/test/{rails_root → rails2_root}/app/views/layouts/wide.html.erb +0 -0
  103. data/test/rails2_root/app/views/notifier/the_email.html.erb +1 -0
  104. data/test/{rails_root → rails2_root}/app/views/posts/edit.rhtml +0 -0
  105. data/test/{rails_root → rails2_root}/app/views/posts/index.rhtml +0 -0
  106. data/test/{rails_root → rails2_root}/app/views/posts/new.rhtml +0 -0
  107. data/test/{rails_root → rails2_root}/app/views/posts/show.rhtml +0 -0
  108. data/test/{rails_root → rails2_root}/app/views/users/edit.rhtml +0 -0
  109. data/test/{rails_root → rails2_root}/app/views/users/index.rhtml +0 -0
  110. data/test/{rails_root → rails2_root}/app/views/users/new.rhtml +0 -0
  111. data/test/{rails_root → rails2_root}/app/views/users/show.rhtml +0 -0
  112. data/test/{rails_root → rails2_root}/config/boot.rb +0 -0
  113. data/test/{rails_root → rails2_root}/config/database.yml +1 -1
  114. data/test/{rails_root → rails2_root}/config/environment.rb +0 -1
  115. data/test/rails2_root/config/environments/test.rb +23 -0
  116. data/test/{rails_root → rails2_root}/config/initializers/new_rails_defaults.rb +0 -0
  117. data/test/{rails_root → rails2_root}/config/initializers/shoulda.rb +0 -0
  118. data/test/{rails_root → rails2_root}/config/routes.rb +0 -0
  119. data/test/{rails_root → rails2_root}/db/migrate/001_create_users.rb +0 -0
  120. data/test/{rails_root → rails2_root}/db/migrate/002_create_posts.rb +0 -0
  121. data/test/{rails_root → rails2_root}/db/migrate/003_create_taggings.rb +0 -0
  122. data/test/{rails_root → rails2_root}/db/migrate/004_create_tags.rb +0 -0
  123. data/test/{rails_root → rails2_root}/db/migrate/005_create_dogs.rb +0 -0
  124. data/test/{rails_root → rails2_root}/db/migrate/006_create_addresses.rb +0 -0
  125. data/test/{rails_root → rails2_root}/db/migrate/007_create_fleas.rb +0 -0
  126. data/test/{rails_root → rails2_root}/db/migrate/008_create_dogs_fleas.rb +0 -0
  127. data/test/{rails_root → rails2_root}/db/migrate/009_create_products.rb +0 -0
  128. data/test/{rails_root → rails2_root}/db/migrate/010_create_friendships.rb +0 -0
  129. data/test/{rails_root → rails2_root}/db/migrate/011_create_treats.rb +0 -0
  130. data/test/{rails_root → rails2_root}/db/migrate/20090506203502_create_profiles.rb +0 -0
  131. data/test/{rails_root → rails2_root}/db/migrate/20090506203536_create_registrations.rb +0 -0
  132. data/test/{rails_root → rails2_root}/db/migrate/20090513104502_create_cats.rb +0 -0
  133. data/test/{rails_root → rails2_root}/db/schema.rb +0 -0
  134. data/test/{rails_root → rails2_root}/public/404.html +0 -0
  135. data/test/{rails_root → rails2_root}/public/422.html +0 -0
  136. data/test/{rails_root → rails2_root}/public/500.html +0 -0
  137. data/test/{rails_root → rails2_root}/script/console +0 -0
  138. data/test/{rails_root → rails2_root}/script/generate +0 -0
  139. data/test/{rails_root → rails2_root}/test/shoulda_macros/custom_macro.rb +0 -0
  140. data/test/{rails_root → rails2_root}/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +0 -0
  141. data/test/{rails_root → rails2_root}/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +0 -0
  142. data/test/rails2_test_helper.rb +6 -0
  143. data/test/rails3_model_builder.rb +118 -0
  144. data/test/rails3_root/Gemfile +28 -0
  145. data/test/rails3_root/README +244 -0
  146. data/test/rails3_root/Rakefile +10 -0
  147. data/test/rails3_root/app/controllers/application_controller.rb +22 -0
  148. data/test/rails3_root/app/controllers/posts_controller.rb +87 -0
  149. data/test/rails3_root/app/controllers/users_controller.rb +82 -0
  150. data/test/rails3_root/app/helpers/application_helper.rb +2 -0
  151. data/test/rails3_root/app/models/address.rb +7 -0
  152. data/test/rails3_root/app/models/flea.rb +11 -0
  153. data/test/rails3_root/app/models/friendship.rb +4 -0
  154. data/test/rails3_root/app/models/notifier.rb +8 -0
  155. data/test/rails3_root/app/models/pets/cat.rb +7 -0
  156. data/test/rails3_root/app/models/pets/dog.rb +10 -0
  157. data/test/rails3_root/app/models/post.rb +12 -0
  158. data/test/rails3_root/app/models/product.rb +12 -0
  159. data/test/rails3_root/app/models/profile.rb +2 -0
  160. data/test/rails3_root/app/models/registration.rb +2 -0
  161. data/test/rails3_root/app/models/tag.rb +8 -0
  162. data/test/rails3_root/app/models/tagging.rb +4 -0
  163. data/test/rails3_root/app/models/treat.rb +3 -0
  164. data/test/rails3_root/app/models/user.rb +32 -0
  165. data/test/rails3_root/app/views/layouts/application.html.erb +14 -0
  166. data/test/rails3_root/app/views/layouts/posts.rhtml +19 -0
  167. data/test/rails3_root/app/views/layouts/users.rhtml +17 -0
  168. data/test/rails3_root/app/views/layouts/wide.html.erb +1 -0
  169. data/test/rails3_root/app/views/notifier/the_email.html.erb +1 -0
  170. data/test/rails3_root/app/views/posts/edit.rhtml +27 -0
  171. data/test/rails3_root/app/views/posts/index.rhtml +25 -0
  172. data/test/rails3_root/app/views/posts/new.rhtml +24 -0
  173. data/test/rails3_root/app/views/posts/show.rhtml +18 -0
  174. data/test/rails3_root/app/views/users/edit.rhtml +22 -0
  175. data/test/rails3_root/app/views/users/index.rhtml +22 -0
  176. data/test/rails3_root/app/views/users/new.rhtml +21 -0
  177. data/test/rails3_root/app/views/users/show.rhtml +13 -0
  178. data/test/rails3_root/config.ru +4 -0
  179. data/test/rails3_root/config/application.rb +46 -0
  180. data/test/rails3_root/config/boot.rb +6 -0
  181. data/test/rails3_root/config/database.yml +22 -0
  182. data/test/rails3_root/config/environment.rb +5 -0
  183. data/test/rails3_root/config/environments/development.rb +19 -0
  184. data/test/rails3_root/config/environments/production.rb +42 -0
  185. data/test/rails3_root/config/environments/test.rb +32 -0
  186. data/test/rails3_root/config/initializers/backtrace_silencers.rb +7 -0
  187. data/test/rails3_root/config/initializers/inflections.rb +10 -0
  188. data/test/rails3_root/config/initializers/mime_types.rb +5 -0
  189. data/test/rails3_root/config/initializers/secret_token.rb +7 -0
  190. data/test/rails3_root/config/initializers/session_store.rb +8 -0
  191. data/test/rails3_root/config/locales/en.yml +5 -0
  192. data/test/rails3_root/config/routes.rb +4 -0
  193. data/test/rails3_root/db/migrate/001_create_users.rb +19 -0
  194. data/test/rails3_root/db/migrate/002_create_posts.rb +13 -0
  195. data/test/rails3_root/db/migrate/003_create_taggings.rb +12 -0
  196. data/test/rails3_root/db/migrate/004_create_tags.rb +11 -0
  197. data/test/rails3_root/db/migrate/005_create_dogs.rb +12 -0
  198. data/test/rails3_root/db/migrate/006_create_addresses.rb +14 -0
  199. data/test/rails3_root/db/migrate/007_create_fleas.rb +11 -0
  200. data/test/rails3_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  201. data/test/rails3_root/db/migrate/009_create_products.rb +17 -0
  202. data/test/rails3_root/db/migrate/010_create_friendships.rb +14 -0
  203. data/test/rails3_root/db/migrate/011_create_treats.rb +12 -0
  204. data/test/rails3_root/db/migrate/20090506203502_create_profiles.rb +12 -0
  205. data/test/rails3_root/db/migrate/20090506203536_create_registrations.rb +14 -0
  206. data/test/rails3_root/db/migrate/20090513104502_create_cats.rb +12 -0
  207. data/test/rails3_root/db/seeds.rb +7 -0
  208. data/test/rails3_root/public/404.html +26 -0
  209. data/test/rails3_root/public/422.html +26 -0
  210. data/test/rails3_root/public/500.html +26 -0
  211. data/test/{rails_root/config/environments/test.rb → rails3_root/public/favicon.ico} +0 -0
  212. data/test/rails3_root/public/images/rails.png +0 -0
  213. data/test/rails3_root/public/index.html +279 -0
  214. data/test/rails3_root/public/javascripts/application.js +2 -0
  215. data/test/rails3_root/public/javascripts/controls.js +965 -0
  216. data/test/rails3_root/public/javascripts/dragdrop.js +974 -0
  217. data/test/rails3_root/public/javascripts/effects.js +1123 -0
  218. data/test/rails3_root/public/javascripts/prototype.js +4874 -0
  219. data/test/rails3_root/public/javascripts/rails.js +118 -0
  220. data/test/rails3_root/public/robots.txt +5 -0
  221. data/test/rails3_root/script/rails +9 -0
  222. data/test/rails3_root/test/performance/browsing_test.rb +9 -0
  223. data/test/rails3_root/test/test_helper.rb +13 -0
  224. data/test/rails3_test_helper.rb +6 -0
  225. data/test/test_helper.rb +16 -8
  226. data/test/unit/address_test.rb +1 -1
  227. data/test/unit/cat_test.rb +1 -1
  228. data/test/unit/dog_test.rb +1 -1
  229. data/test/unit/flea_test.rb +9 -1
  230. data/test/unit/friendship_test.rb +1 -1
  231. data/test/unit/post_test.rb +1 -5
  232. data/test/unit/product_test.rb +1 -1
  233. data/test/unit/tag_test.rb +1 -5
  234. data/test/unit/tagging_test.rb +1 -1
  235. data/test/unit/user_test.rb +3 -37
  236. metadata +184 -118
  237. data/lib/shoulda/action_view.rb +0 -10
  238. data/lib/shoulda/action_view/macros.rb +0 -61
  239. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +0 -128
  240. data/test/matchers/active_record/have_named_scope_matcher_test.rb +0 -65
  241. data/test/rails_root/app/models/flea.rb +0 -3
@@ -1,5 +1,6 @@
1
1
  require 'shoulda/active_record/matchers'
2
2
  require 'shoulda/action_controller/matchers'
3
+ require 'shoulda/action_mailer/matchers'
3
4
  require 'active_support/test_case'
4
5
 
5
6
  # :enddoc:
@@ -7,5 +8,6 @@ module ActiveSupport
7
8
  class TestCase
8
9
  include Shoulda::ActiveRecord::Matchers
9
10
  include Shoulda::ActionController::Matchers
11
+ include Shoulda::ActionMailer::Matchers
10
12
  end
11
13
  end
@@ -0,0 +1,22 @@
1
+ require 'shoulda/active_record/matchers'
2
+ require 'shoulda/action_controller/matchers'
3
+ require 'shoulda/action_mailer/matchers'
4
+
5
+ # :enddoc:
6
+
7
+ module RSpec
8
+ module Matchers
9
+ include Shoulda::ActiveRecord::Matchers
10
+ end
11
+
12
+ module Rails
13
+ module ControllerExampleGroup
14
+ include Shoulda::ActionController::Matchers
15
+ end
16
+
17
+ module MailerExampleGroup
18
+ include Shoulda::ActionMailer::Matchers
19
+ end
20
+ end
21
+ end
22
+
@@ -2,6 +2,8 @@ require 'shoulda/private_helpers'
2
2
 
3
3
  module Shoulda # :nodoc:
4
4
  module Macros
5
+ # Deprecated.
6
+ #
5
7
  # Macro that creates a test asserting a change between the return value
6
8
  # of a block that is run before and after the current setup block
7
9
  # is run. This is similar to Active Support's <tt>assert_difference</tt>
@@ -34,24 +36,33 @@ module Shoulda # :nodoc:
34
36
  #
35
37
  # # Assert the value changed to "new:"
36
38
  # should_change("the post title", :to => "new") { @post.title }
39
+ #
40
+ # This macro was deprecated because these tests aren't as valuable as
41
+ # alternative tests that explicitly test the final state.
42
+ #
43
+ # Consider an alternative:
44
+ #
45
+ # context "updating a post" do
46
+ # setup do
47
+ # @post = Post.create(:title => "old")
48
+ # put :update, :post => {:title => "new"}, :id => @post.to_param
49
+ # end
50
+ # should "update the title" do
51
+ # assert_equal "new", @post.reload.title
52
+ # end
53
+ # end
37
54
  def should_change(description, options = {}, &block)
55
+ ::ActiveSupport::Deprecation.warn("Not considered a useful test. Instead, test the end state explicitly.")
38
56
  by, from, to = get_options!([options], :by, :from, :to)
39
57
  stmt = "change #{description}"
40
58
  stmt << " from #{from.inspect}" if from
41
59
  stmt << " to #{to.inspect}" if to
42
60
  stmt << " by #{by.inspect}" if by
43
61
 
44
- if block_given?
45
- code = block
46
- else
47
- warn "[DEPRECATION] should_change(expression, options) is deprecated. " <<
48
- "Use should_change(description, options) { code } instead."
49
- code = lambda { eval(description) }
50
- end
51
- before = lambda { @_before_should_change = code.bind(self).call }
62
+ before = lambda { @_before_should_change = block.bind(self).call }
52
63
  should stmt, :before => before do
53
64
  old_value = @_before_should_change
54
- new_value = code.bind(self).call
65
+ new_value = block.bind(self).call
55
66
  assert_operator from, :===, old_value, "#{description} did not originally match #{from.inspect}" if from
56
67
  assert_not_equal old_value, new_value, "#{description} did not change" unless by == 0
57
68
  assert_operator to, :===, new_value, "#{description} was not changed to match #{to.inspect}" if to
@@ -59,6 +70,8 @@ module Shoulda # :nodoc:
59
70
  end
60
71
  end
61
72
 
73
+ # Deprecated.
74
+ #
62
75
  # Macro that creates a test asserting no change between the return value
63
76
  # of a block that is run before and after the current setup block
64
77
  # is run. This is the logical opposite of should_change.
@@ -71,21 +84,32 @@ module Shoulda # :nodoc:
71
84
  # setup { @post.update_attributes(:title => "new") }
72
85
  # should_not_change("the number of posts") { Post.count }
73
86
  # end
87
+ #
88
+ # This macro was deprecated because these tests aren't as valuable as
89
+ # alternative tests that explicitly test the final state.
90
+ #
91
+ # Consider an alternative:
92
+ #
93
+ # context "updating a post" do
94
+ # setup do
95
+ # @post = Post.create(:title => "old")
96
+ # put :update, :post => {:title => ""}, :id => @post.to_param
97
+ # end
98
+ # should "not update the title" do
99
+ # assert_equal "old", @post.reload.title
100
+ # end
101
+ # end
74
102
  def should_not_change(description, &block)
75
- if block_given?
76
- code = block
77
- else
78
- warn "[DEPRECATION] should_not_change(expression) is deprecated. " <<
79
- "Use should_not_change(description) { code } instead."
80
- code = lambda { eval(description) }
81
- end
82
- before = lambda { @_before_should_not_change = code.bind(self).call }
103
+ ::ActiveSupport::Deprecation.warn("Not considered a useful test. Instead, test the end state explicitly.")
104
+ before = lambda { @_before_should_not_change = block.bind(self).call }
83
105
  should "not change #{description}", :before => before do
84
- new_value = code.bind(self).call
106
+ new_value = block.bind(self).call
85
107
  assert_equal @_before_should_not_change, new_value, "#{description} changed"
86
108
  end
87
109
  end
88
110
 
111
+ # Deprecated.
112
+ #
89
113
  # Macro that creates a test asserting that a record of the given class was
90
114
  # created.
91
115
  #
@@ -96,9 +120,12 @@ module Shoulda # :nodoc:
96
120
  # should_create :post
97
121
  # end
98
122
  def should_create(class_name)
123
+ ::ActiveSupport::Deprecation.warn
99
124
  should_change_record_count_of(class_name, 1, 'create')
100
125
  end
101
126
 
127
+ # Deprecated.
128
+ #
102
129
  # Macro that creates a test asserting that a record of the given class was
103
130
  # destroyed.
104
131
  #
@@ -109,6 +136,7 @@ module Shoulda # :nodoc:
109
136
  # should_destroy :post
110
137
  # end
111
138
  def should_destroy(class_name)
139
+ ::ActiveSupport::Deprecation.warn
112
140
  should_change_record_count_of(class_name, -1, 'destroy')
113
141
  end
114
142
 
@@ -4,10 +4,5 @@ require 'shoulda'
4
4
 
5
5
  require 'shoulda/active_record' if defined? ActiveRecord::Base
6
6
  require 'shoulda/action_controller' if defined? ActionController::Base
7
- require 'shoulda/action_view' if defined? ActionView::Base
8
7
  require 'shoulda/action_mailer' if defined? ActionMailer::Base
9
8
 
10
- if defined?(RAILS_ROOT)
11
- # load in the 3rd party macros from vendorized plugins and gems
12
- Shoulda.autoload_macros RAILS_ROOT, File.join("vendor", "{plugins,gems}", "*")
13
- end
@@ -1,28 +1,28 @@
1
1
  namespace :shoulda do
2
2
  # From http://blog.internautdesign.com/2007/11/2/a-yaml_to_shoulda-rake-task
3
3
  # David.Lowenfels@gmail.com
4
- desc "Converts a YAML file (FILE=./path/to/yaml) into a Shoulda skeleton"
4
+ desc "Converts a YAML file (FILE=./path/to/yaml) into a Shoulda skeleton"
5
5
  task :from_yaml do
6
6
  require 'yaml'
7
-
7
+
8
8
  def yaml_to_context(hash, indent = 0)
9
9
  indent1 = ' ' * indent
10
10
  indent2 = ' ' * (indent + 1)
11
11
  hash.each_pair do |context, shoulds|
12
- puts indent1 + "context \"#{context}\" do"
13
- puts
12
+ puts indent1 + "context \"#{context}\" do"
13
+ puts
14
14
  shoulds.each do |should|
15
15
  yaml_to_context( should, indent + 1 ) and next if should.is_a?( Hash )
16
- puts indent2 + "should_eventually \"" + should.gsub(/^should +/,'') + "\" do"
17
- puts indent2 + "end"
16
+ puts indent2 + "should_eventually \"" + should.gsub(/^should +/,'') + "\" do"
17
+ puts indent2 + "end"
18
18
  puts
19
19
  end
20
- puts indent1 + "end"
20
+ puts indent1 + "end"
21
21
  end
22
- end
23
-
22
+ end
23
+
24
24
  puts("Please pass in a FILE argument.") and exit unless ENV['FILE']
25
-
25
+
26
26
  yaml_to_context( YAML.load_file( ENV['FILE'] ) )
27
27
  end
28
- end
28
+ end
@@ -0,0 +1,4 @@
1
+ module Shoulda
2
+ VERSION = "2.11.1"
3
+ end
4
+
@@ -1,7 +1,8 @@
1
1
  if RAILS_ENV == 'test'
2
2
  if defined? Spec
3
- require 'shoulda/rspec'
3
+ require 'shoulda/integrations/rspec'
4
4
  else
5
- require 'shoulda/rails'
5
+ require 'shoulda/integrations/test_unit'
6
+ Shoulda.autoload_macros RAILS_ROOT, File.join("vendor", "{plugins,gems}", "*")
6
7
  end
7
8
  end
@@ -27,13 +27,29 @@ module Shoulda
27
27
 
28
28
  class Context
29
29
  # alias_method_chain hack to allow the should_fail macro to work
30
- def should_with_failure_scenario(name, options = {}, &block)
30
+ def should_with_failure_scenario(*args, &block)
31
+ should_without_failure_scenario(*args, &block)
32
+ wrap_last_should_with_failure_expectation
33
+ end
34
+ alias_method_chain :should, :failure_scenario
35
+
36
+ # alias_method_chain hack to allow the should_fail macro to work
37
+ def should_not_with_failure_scenario(*args, &block)
38
+ should_not_without_failure_scenario(*args, &block)
39
+ wrap_last_should_with_failure_expectation
40
+ end
41
+ alias_method_chain :should_not, :failure_scenario
42
+
43
+ def wrap_last_should_with_failure_expectation
31
44
  if Shoulda.expected_exceptions
32
45
  expected_exceptions = Shoulda.expected_exceptions
33
- failure_block = lambda { assert_raise(*expected_exceptions, &block.bind(self)) }
46
+ should = self.shoulds.last
47
+ assertion_block = should[:block]
48
+ failure_block = lambda do
49
+ assert_raise(*expected_exceptions, &assertion_block.bind(self))
50
+ end
51
+ should[:block] = failure_block
34
52
  end
35
- should_without_failure_scenario(name, options, &(failure_block || block))
36
53
  end
37
- alias_method_chain :should, :failure_scenario
38
54
  end
39
55
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../test_helper'
1
+ require 'test_helper'
2
2
  require 'posts_controller'
3
3
 
4
4
  # Re-raise errors caught by the controller.
@@ -54,8 +54,6 @@ class PostsControllerTest < ActionController::TestCase
54
54
  end
55
55
  should_assign_to :posts
56
56
  should_not_assign_to :foo, :bar
57
- should_render_page_with_metadata :description => /Posts/, :title => /index/
58
- should_render_page_with_metadata :keywords => "posts"
59
57
  end
60
58
 
61
59
  context "viewing posts for a user with rss format" do
@@ -65,8 +63,12 @@ class PostsControllerTest < ActionController::TestCase
65
63
  end
66
64
  should_respond_with :success
67
65
  should_respond_with_content_type 'application/rss+xml'
68
- should_respond_with_content_type :rss
69
- should_respond_with_content_type /rss/
66
+ context "with a symbol" do
67
+ should_respond_with_content_type :rss
68
+ end
69
+ context "with a regexp" do
70
+ should_respond_with_content_type /rss/
71
+ end
70
72
  should_set_session(:mischief) { nil }
71
73
  should_set_session(:special) { '$2 off your next purchase' }
72
74
  should_set_session(:special_user_id) { @user.id }
@@ -85,7 +87,6 @@ class PostsControllerTest < ActionController::TestCase
85
87
  should_render_with_layout :wide
86
88
  end
87
89
  should_assign_to :false_flag
88
- should_set_the_flash_to nil
89
90
  should_fail do
90
91
  should_set_the_flash_to /.*/
91
92
  end
@@ -95,7 +96,6 @@ class PostsControllerTest < ActionController::TestCase
95
96
  setup { get :new, :user_id => users(:first) }
96
97
  should_render_without_layout
97
98
  should_not_set_the_flash
98
- should_render_a_form
99
99
  end
100
100
 
101
101
  context "on POST to #create" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../test_helper'
1
+ require 'test_helper'
2
2
  require 'users_controller'
3
3
 
4
4
  # Re-raise errors caught by the controller.
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+
3
+ class HaveSentEmailTest < ActiveSupport::TestCase # :nodoc:
4
+ def add_mail_to_deliveries
5
+ if defined?(AbstractController::Rendering)
6
+ ::ActionMailer::Base.deliveries << Mailer.the_email
7
+ else
8
+ ::ActionMailer::Base.deliveries << Mailer.create_the_email
9
+ end
10
+ end
11
+
12
+ context "an email" do
13
+ setup do
14
+ define_mailer :mailer, [:the_email] do
15
+ def the_email
16
+ if defined?(AbstractController::Rendering)
17
+ mail :from => "do-not-reply@example.com",
18
+ :to => "myself@me.com",
19
+ :subject => "This is spam",
20
+ :body => "Every email is spam."
21
+ else
22
+ from "do-not-reply@example.com"
23
+ recipients "myself@me.com"
24
+ subject "This is spam"
25
+ body "Every email is spam."
26
+ end
27
+ end
28
+ end
29
+ add_mail_to_deliveries
30
+ end
31
+
32
+ teardown { ::ActionMailer::Base.deliveries.clear }
33
+
34
+ should "accept based on the subject" do
35
+ assert_accepts have_sent_email.with_subject(/is spam$/), nil
36
+ assert_rejects have_sent_email.with_subject(/totally safe/), nil,
37
+ :message => /Expected sent email with subject/
38
+ end
39
+
40
+ should "accept based on the sender" do
41
+ assert_accepts have_sent_email.from('do-not-reply@example.com'), nil
42
+ assert_rejects have_sent_email.from('you@example.com'), nil,
43
+ :message => /Expected sent email from/
44
+ end
45
+
46
+ should "accept based on the body" do
47
+ assert_accepts have_sent_email.with_body(/is spam\./), nil
48
+ assert_rejects have_sent_email.with_body(/totally safe/), nil,
49
+ :message => /Expected sent email with body/
50
+ end
51
+
52
+ should "accept based on the recipient" do
53
+ assert_accepts have_sent_email.to('myself@me.com'), nil
54
+ assert_rejects have_sent_email.to('you@example.com'), nil,
55
+ :message => /Expected sent email to/
56
+ end
57
+
58
+ should "list all deliveries within failure message" do
59
+ add_mail_to_deliveries
60
+
61
+ assert_rejects have_sent_email.to('you@example.com'), nil,
62
+ :message => /Deliveries:\n"This is spam" to \["myself@me\.com"\]\n"This is spam" to \["myself@me\.com"\]/
63
+ end
64
+
65
+ should "chain" do
66
+ assert_accepts have_sent_email.with_subject(/spam/).from('do-not-reply@example.com').with_body(/spam/).to('myself@me.com'), nil
67
+ assert_rejects have_sent_email.with_subject(/ham/).from('you@example.com').with_body(/ham/).to('them@example.com'), nil
68
+ end
69
+ end
70
+ end
@@ -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