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,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,7 +1,24 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class RouteToMatcherTest < ActionController::TestCase # :nodoc:
4
4
 
5
+ context "given a controller with a defined glob url" do
6
+ setup do
7
+ @controller = define_controller('Examples').new
8
+ define_routes do |map|
9
+ map.connect 'examples/*id', :controller => 'examples',
10
+ :action => 'example'
11
+ end
12
+ end
13
+
14
+ should "accept glob route" do
15
+ assert_accepts route(:get, '/examples/foo/bar').
16
+ to(:action => 'example', :id => ['foo', 'bar']),
17
+ @controller
18
+ end
19
+
20
+ end
21
+
5
22
  context "given a controller with a defined route" do
6
23
  setup do
7
24
  @controller = define_controller('Examples').new
@@ -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,12 +1,12 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
1
+ require 'test_helper'
2
2
 
3
3
  class ContextTest < ActiveSupport::TestCase # :nodoc:
4
-
4
+
5
5
  def self.context_macro(&blk)
6
6
  context "with a subcontext made by a macro" do
7
7
  setup { @context_macro = :foo }
8
8
 
9
- merge_block &blk
9
+ merge_block &blk
10
10
  end
11
11
  end
12
12
 
@@ -21,11 +21,11 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
21
21
  setup do
22
22
  @blah = "blah"
23
23
  end
24
-
24
+
25
25
  should "run the setup block" do
26
26
  assert_equal "blah", @blah
27
27
  end
28
-
28
+
29
29
  should "have name set right" do
30
30
  assert_match(/^test: context with setup block/, self.to_s)
31
31
  end
@@ -34,11 +34,11 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
34
34
  setup do
35
35
  @blah = "#{@blah} twice"
36
36
  end
37
-
37
+
38
38
  should "be named correctly" do
39
39
  assert_match(/^test: context with setup block and a subcontext should be named correctly/, self.to_s)
40
40
  end
41
-
41
+
42
42
  should "run the setup blocks in order" do
43
43
  assert_equal @blah, "blah twice"
44
44
  end
@@ -64,7 +64,7 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
64
64
  setup do
65
65
  @blah = "foo"
66
66
  end
67
-
67
+
68
68
  should "have @blah == 'foo'" do
69
69
  assert_equal "foo", @blah
70
70
  end
@@ -73,12 +73,12 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
73
73
  assert_match(/^test: another context with setup block/, self.to_s)
74
74
  end
75
75
  end
76
-
76
+
77
77
  context "context with method definition" do
78
78
  setup do
79
79
  def hello; "hi"; end
80
80
  end
81
-
81
+
82
82
  should "be able to read that method" do
83
83
  assert_equal "hi", hello
84
84
  end
@@ -87,52 +87,52 @@ class ContextTest < ActiveSupport::TestCase # :nodoc:
87
87
  assert_match(/^test: context with method definition/, self.to_s)
88
88
  end
89
89
  end
90
-
90
+
91
91
  context "another context" do
92
92
  should "not define @blah" do
93
93
  assert_nil @blah
94
94
  end
95
95
  end
96
-
96
+
97
97
  context "context with multiple setups and/or teardowns" do
98
-
98
+
99
99
  cleanup_count = 0
100
-
100
+
101
101
  2.times do |i|
102
102
  setup { cleanup_count += 1 }
103
103
  teardown { cleanup_count -= 1 }
104
104
  end
105
-
105
+
106
106
  2.times do |i|
107
107
  should "call all setups and all teardowns (check ##{i + 1})" do
108
108
  assert_equal 2, cleanup_count
109
109
  end
110
110
  end
111
-
111
+
112
112
  context "subcontexts" do
113
-
113
+
114
114
  2.times do |i|
115
115
  setup { cleanup_count += 1 }
116
116
  teardown { cleanup_count -= 1 }
117
117
  end
118
-
118
+
119
119
  2.times do |i|
120
120
  should "also call all setups and all teardowns in parent and subcontext (check ##{i + 1})" do
121
121
  assert_equal 4, cleanup_count
122
122
  end
123
123
  end
124
-
124
+
125
125
  end
126
-
126
+
127
127
  end
128
-
128
+
129
129
  should_eventually "pass, since it's unimplemented" do
130
130
  flunk "what?"
131
131
  end
132
132
 
133
133
  should_eventually "not require a block when using should_eventually"
134
134
  should "pass without a block, as that causes it to piggyback to should_eventually"
135
-
135
+
136
136
  context "context for testing should piggybacking" do
137
137
  should "call should_eventually as we are not passing a block"
138
138
  end
@@ -158,18 +158,176 @@ 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 }
169
164
  should "return the result of the block as the subject" do
170
165
  assert_equal @expected, subject
171
166
  end
167
+
168
+ context "nested context block without a subject block" do
169
+ should "return the result of the parent context's subject block" do
170
+ assert_equal @expected, subject
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
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
172
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
173
331
  end
174
332
  end
175
333
 
@@ -187,3 +345,28 @@ class SubjectTest < ActiveSupport::TestCase
187
345
  assert_equal @expected, subject
188
346
  end
189
347
  end
348
+
349
+ class SubjectLazinessTest < ActiveSupport::TestCase
350
+ subject { Subject.new }
351
+
352
+ should "only build the subject once" do
353
+ assert_equal subject, subject
354
+ 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