thoughtbot-shoulda 2.10.2 → 2.11.1

Sign up to get free protection for your applications and to get access to all the features.
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,10 +1,10 @@
1
- We're using GitHub[http://github.com/thoughtbot/shoulda/tree/master], and we've been getting any combination of github pull requests, tickets, patches, emails, etc. We need to normalize this workflow to make sure we don't miss any fixes.
1
+ We're using GitHub[http://github.com/thoughtbot/shoulda/tree/master], and we've been getting any combination of github pull requests, tickets, patches, emails, etc. We need to normalize this workflow to make sure we don't miss any fixes.
2
2
 
3
3
  * Make sure you're accessing the source from the {official repository}[http://github.com/thoughtbot/shoulda/tree/master].
4
4
  * We prefer git branches over patches, but we can take either.
5
- * If you're using git, please make a branch for each separate contribution. We can cherry pick your commits, but pulling from a branch is easier.
5
+ * If you're using git, please make a branch for each separate contribution. We can cherry pick your commits, but pulling from a branch is easier.
6
6
  * If you're submitting patches, please cut each fix or feature into a separate patch.
7
- * There should be an issue[http://github.com/thoughtbot/shoulda/issues] for any submission. If you've found a bug and want to fix it, open a new ticket at the same time.
8
- * Please <b>don't send pull requests</b> Just update the issue with the url for your fix (or attach the patch) when it's ready. The github pull requests pretty much get dropped on the floor until someone with commit rights notices them in the mailbox.
9
- * Contributions without tests won't be accepted. The file <tt>/test/README</tt> explains the testing system pretty thoroughly.
7
+ * There should be an issue[http://github.com/thoughtbot/shoulda/issues] for any submission. If you've found a bug and want to fix it, open a new ticket at the same time.
8
+ * Please <b>don't send pull requests</b> Just update the issue with the url for your fix (or attach the patch) when it's ready. The github pull requests pretty much get dropped on the floor until someone with commit rights notices them in the mailbox.
9
+ * Contributions without tests won't be accepted. The file <tt>/test/README</tt> explains the testing system pretty thoroughly.
10
10
 
@@ -1,16 +1,64 @@
1
1
  = Shoulda - Making tests easy on the fingers and eyes
2
2
 
3
- Shoulda makes it easy to write elegant, understandable, and maintainable tests. Shoulda consists of test macros, assertions, and helpers added on to the Test::Unit framework. It's fully compatible with your existing tests, and requires no retooling to use.
3
+ Shoulda makes it easy to write elegant, understandable, and maintainable tests. Shoulda consists of matchers, test helpers, and assertions. It's fully compatible with your existing tests in Test::Unit or RSpec, and requires no retooling to use.
4
4
 
5
- Helpers:: #context and #should give you RSpec like test blocks.
5
+ Matchers:: Test::Unit- and RSpec-compatible one-liners that test common Rails functionality.
6
+ These tests would otherwise be much longer, more complex, and error-prone.
7
+ Helpers:: #context and #should give you RSpec like test blocks in Test::Unit.
6
8
  In addition, you get nested contexts and a much more readable syntax.
7
- Macros:: Generate hundreds of lines of Controller and ActiveRecord tests with these powerful macros.
8
- They get you started quickly, and can help you ensure that your application is conforming to best practices.
9
- Assertions:: Many common rails testing idioms have been distilled into a set of useful assertions.
10
- Matchers:: Rspec-compatible matchers providing the same tests as Shoulda macros.
9
+ Assertions:: Many common Rails testing idioms have been distilled into a set of useful assertions.
11
10
 
12
11
  = Usage
13
12
 
13
+ === ActiveRecord Tests (Shoulda::ActiveRecord::Matchers)
14
+
15
+ Test your ActiveRecord associations and validations with these powerful matchers:
16
+
17
+ class PostTest < Test::Unit::TestCase
18
+ should belong_to(:user)
19
+ should have_many(:tags).through(:taggings)
20
+
21
+ should validate_uniqueness_of(:title)
22
+ should validate_presence_of(:body).with_message(/wtf/)
23
+ should validate_presence_of(:title)
24
+ should validate_numericality_of(:user_id)
25
+ end
26
+
27
+ class UserTest < Test::Unit::TestCase
28
+ should have_many(:posts)
29
+
30
+ should_not allow_value("blah").for(:email)
31
+ should_not allow_value("b lah").for(:email)
32
+ should allow_value("a@b.com").for(:email)
33
+ should allow_value("asdf@asdf.com").for(:email)
34
+ should ensure_inclusion_of(:email).in_range(1..100)
35
+ should ensure_inclusion_of(:age).in_range(1..100)
36
+ should_not allow_mass_assignment_of(:password)
37
+ end
38
+
39
+ Makes TDD so much easier.
40
+
41
+ === Controller Tests (Shoulda::Controller::Matchers)
42
+
43
+ Matchers to test the most common controller patterns...
44
+
45
+ class PostsControllerTest < ActionController::TestCase
46
+ context "on GET to :show for first record" do
47
+ setup do
48
+ get :show, :id => 1
49
+ end
50
+
51
+ should assign_to(:user)
52
+ should respond_with(:success)
53
+ should render_template(:show)
54
+ should_not set_the_flash
55
+
56
+ should "do something else really cool" do
57
+ assert_equal 1, assigns(:user).id
58
+ end
59
+ end
60
+ end
61
+
14
62
  === Context Helpers (Shoulda::Context)
15
63
 
16
64
  Stop killing your fingers with all of those underscores... Name your tests with plain sentences!
@@ -44,55 +92,6 @@ Produces the following test methods:
44
92
 
45
93
  So readable!
46
94
 
47
- === ActiveRecord Tests (Shoulda::ActiveRecord::Macros)
48
-
49
- Quick macro tests for your ActiveRecord associations and validations:
50
-
51
- class PostTest < Test::Unit::TestCase
52
- fixtures :all
53
-
54
- should_belong_to :user
55
- should_have_many :tags, :through => :taggings
56
-
57
- should_validate_uniqueness_of :title
58
- should_validate_presence_of :body, :message => /wtf/
59
- should_validate_presence_of :title
60
- should_validate_numericality_of :user_id
61
- end
62
-
63
- class UserTest < Test::Unit::TestCase
64
- should_have_many :posts
65
-
66
- should_not_allow_values_for :email, "blah", "b lah"
67
- should_allow_values_for :email, "a@b.com", "asdf@asdf.com"
68
- should_ensure_length_in_range :email, 1..100
69
- should_ensure_value_in_range :age, 1..100
70
- should_not_allow_mass_assignment_of :password
71
- end
72
-
73
- Makes TDD so much easier.
74
-
75
- === Controller Tests (Shoulda::Controller::Macros)
76
-
77
- Macros to test the most common controller patterns...
78
-
79
- class PostsControllerTest < ActionController::TestCase
80
- context "on GET to :show for first record" do
81
- setup do
82
- get :show, :id => 1
83
- end
84
-
85
- should_assign_to :user
86
- should_respond_with :success
87
- should_render_template :show
88
- should_not_set_the_flash
89
-
90
- should "do something else really cool" do
91
- assert_equal 1, assigns(:user).id
92
- end
93
- end
94
- end
95
-
96
95
  === Helpful Assertions (Shoulda::Assertions)
97
96
 
98
97
  More to come here, but have fun with what's there.
@@ -101,26 +100,12 @@ More to come here, but have fun with what's there.
101
100
  assert_contains(['a', '1'], /\d/)
102
101
  assert_contains(['a', '1'], 'a')
103
102
 
104
- === 3rd Party and Application Specific Macros
105
-
106
- Any *.rb file under RAILS_ROOT/test/shoulda_macros/ or vendor/(plugins|gems)/gem_name/shoulda_macros/ will be automatically required when you run your tests. This allows you to distribute macros with your plugins, or to organize the macros inside your application. Remember to add your macro to Test::Unit::TestCase in the macro file:
107
-
108
- # test/shoulda_macros/security.rb
109
- class Test::Unit::TestCase
110
- def self.should_be_denied(opts = {})
111
- should_set_the_flash_to(opts[:flash] || /Please log in/i)
112
- should_redirect_to(opts[:redirect] || 'login_url')
113
- end
114
- end
115
-
116
103
  = Rails Installation (Test::Unit)
117
104
 
118
- === As a Gem
119
-
120
- Use this if you prefer to use versioned releases of shoulda. Specify the gem dependency in your config/environment.rb file:
105
+ Specify the gem dependency in your config/environment.rb file:
121
106
 
122
107
  Rails::Initializer.run do |config|
123
- config.gem "thoughtbot-shoulda", :lib => "shoulda", :source => "http://gems.github.com"
108
+ config.gem "shoulda", :lib => "shoulda"
124
109
  end
125
110
 
126
111
  Then:
@@ -128,29 +113,15 @@ Then:
128
113
  $ rake gems:install
129
114
  $ rake gems:unpack
130
115
 
131
- === As a Plugin
132
-
133
- Use this if you prefer to use the edge version of shoulda:
134
-
135
- $ script/plugin install git://github.com/thoughtbot/shoulda.git
136
-
137
- === As a Plugin (using git submodules)
138
-
139
- Use this if you prefer the idea of being able to easily switch between using edge or a tagged version of shoulda:
140
-
141
- $ git submodule add git://github.com/thoughtbot/shoulda.git vendor/plugins/shoulda
142
-
143
116
  = Rails Installation (RSpec)
144
117
 
145
118
  If you're using Shoulda with RSpec, we recommend that you add config.gem lines
146
119
  for RSpec and Shoulda in your config/environment/test.rb file, but do not ask
147
120
  Rails to load the RSpec and Shoulda libraries:
148
121
 
149
- config.gem 'rspec', :lib => false
122
+ config.gem 'rspec', :lib => false
150
123
  config.gem 'rspec-rails', :lib => false
151
- config.gem 'thoughtbot-shoulda',
152
- :lib => false,
153
- :source => 'http://gems.github.com'
124
+ config.gem 'shoulda', :lib => false
154
125
 
155
126
  Then require shoulda from your spec/spec_helper.rb file, before Spec::Runner is
156
127
  configured:
@@ -162,10 +133,22 @@ configured:
162
133
 
163
134
  You should not need to require anything besides the top-level shoulda library.
164
135
 
136
+ = Rails 3 Installation (RSpec)
137
+
138
+ With Rails 3 and Bundler, requiring Shoulda is as easy as adding it to your Gemfile:
139
+
140
+ group :test do
141
+ gem "shoulda"
142
+ gem "rspec-rails", "2.0.0.beta.12"
143
+ end
144
+
145
+ Shoulda will automatically include matchers into the appropriate example
146
+ groups.
147
+
165
148
  = Credits
166
149
 
167
- Shoulda is maintained by {Tammer Saleh}[mailto:tsaleh@thoughtbot.com], and is funded by Thoughtbot[http://www.thoughtbot.com], inc.
150
+ Shoulda is maintained and funded by {thougthbot}[http://thoughtbot.com/community]
168
151
 
169
152
  = License
170
153
 
171
- Shoulda is Copyright © 2006-2008 Tammer Saleh, Thoughtbot. It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
154
+ Shoulda is Copyright © 2006-2010 Tammer Saleh, Thoughtbot. It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
data/Rakefile CHANGED
@@ -1,16 +1,18 @@
1
+ require 'rubygems'
1
2
  require 'rake'
2
3
  require 'rake/testtask'
3
4
  require 'rake/rdoctask'
4
5
  require 'rake/gempackagetask'
6
+ require 'cucumber/rake/task'
5
7
 
6
8
  $LOAD_PATH.unshift("lib")
7
- require 'shoulda'
9
+ require 'shoulda/version'
8
10
  load 'tasks/shoulda.rake'
9
11
 
10
12
  # Test::Unit::UI::VERBOSE
11
13
  test_files_pattern = 'test/{unit,functional,other,matchers}/**/*_test.rb'
12
14
  Rake::TestTask.new do |t|
13
- t.libs << 'lib'
15
+ t.libs << 'lib' << 'test'
14
16
  t.pattern = test_files_pattern
15
17
  t.verbose = false
16
18
  end
@@ -30,33 +32,8 @@ task :coverage do
30
32
  system "rcov --rails --sort coverage -Ilib #{files.join(' ')}"
31
33
  end
32
34
 
33
- desc 'Update documentation on website'
34
- task :sync_docs => 'rdoc' do
35
- `rsync -ave ssh doc/ dev@dev.thoughtbot.com:/home/dev/www/dev.thoughtbot.com/shoulda`
36
- end
37
-
38
- desc 'Default: run tests.'
39
- task :default => ['test']
40
-
41
- spec = Gem::Specification.new do |s|
42
- s.name = "shoulda"
43
- s.version = Shoulda::VERSION
44
- s.summary = "Making tests easy on the fingers and eyes"
45
- s.homepage = "http://thoughtbot.com/projects/shoulda"
46
- s.rubyforge_project = "shoulda"
47
-
48
- s.files = FileList["[A-Z]*", "{bin,lib,rails,test}/**/*"]
49
- s.executables = s.files.grep(/^bin/) { |f| File.basename(f) }
50
-
51
- s.has_rdoc = true
52
- s.extra_rdoc_files = ["README.rdoc", "CONTRIBUTION_GUIDELINES.rdoc"]
53
- s.rdoc_options = ["--line-numbers", "--main", "README.rdoc"]
54
-
55
- s.authors = ["Tammer Saleh"]
56
- s.email = "tsaleh@thoughtbot.com"
57
- end
58
-
59
- Rake::GemPackageTask.new spec do |pkg|
35
+ eval("$specification = begin; #{IO.read('shoulda.gemspec')}; end")
36
+ Rake::GemPackageTask.new $specification do |pkg|
60
37
  pkg.need_tar = true
61
38
  pkg.need_zip = true
62
39
  end
@@ -64,9 +41,30 @@ end
64
41
  desc "Clean files generated by rake tasks"
65
42
  task :clobber => [:clobber_rdoc, :clobber_package]
66
43
 
67
- desc "Generate a gemspec file for GitHub"
68
- task :gemspec do
69
- File.open("#{spec.name}.gemspec", 'w') do |f|
70
- f.write spec.to_ruby
44
+ namespace :cucumber do
45
+ Cucumber::Rake::Task.new(:rails2, "Run the cucumber features in Rails 2") do |t|
46
+ t.fork = true
47
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
48
+ t.profile = 'rails2'
49
+ end
50
+
51
+ Cucumber::Rake::Task.new(:rails3, "Run the cucumber features in Rails 3") do |t|
52
+ t.fork = true
53
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
54
+ t.profile = 'rails3'
55
+ end
56
+ end
57
+
58
+ desc "Run the cucumber features in both Rails 2 and 3"
59
+ task :cucumber => ["cucumber:rails2", "cucumber:rails3"]
60
+
61
+ desc 'run tests for all supported versions of Rails'
62
+ task :test_all do
63
+ %w(2.3.8 3.0.0.beta4).each do |version|
64
+ system("RAILS_VERSION=#{version} rake -s test;")
71
65
  end
72
66
  end
67
+
68
+ desc 'Default: run test and cucumber features for support versions'
69
+ task :default => [:test_all, :cucumber]
70
+
@@ -1,9 +1,9 @@
1
- module Shoulda
2
- VERSION = "2.10.2"
3
- end
1
+ require 'shoulda/version'
4
2
 
5
- if defined? Spec
6
- require 'shoulda/rspec'
3
+ if defined?(RSpec)
4
+ require 'shoulda/integrations/rspec2'
5
+ elsif defined?(Spec)
6
+ require 'shoulda/integrations/rspec'
7
7
  else
8
- require 'shoulda/test_unit'
8
+ require 'shoulda/integrations/test_unit'
9
9
  end
@@ -24,3 +24,11 @@ module ActionController #:nodoc: all
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ if defined?(ActionController::TestCase)
29
+ class ActionController::TestCase
30
+ def subject
31
+ @controller
32
+ end
33
+ end
34
+ end
@@ -24,37 +24,30 @@ module Shoulda # :nodoc:
24
24
  module Macros
25
25
  include Matchers
26
26
 
27
+ # Deprecated: use ActionController::Matchers#set_the_flash instead.
28
+ #
27
29
  # Macro that creates a test asserting that the flash contains the given
28
30
  # value. Expects a +String+ or +Regexp+.
29
31
  #
30
- # If the argument is +nil+, it will assert that the flash is not set.
31
- # This behavior is deprecated.
32
- #
33
32
  # Example:
34
33
  #
35
34
  # should_set_the_flash_to "Thank you for placing this order."
36
35
  # should_set_the_flash_to /created/i
37
36
  def should_set_the_flash_to(val)
38
- if val
39
- matcher = set_the_flash.to(val)
40
- should matcher.description do
41
- assert_accepts matcher, @controller
42
- end
43
- else
44
- warn "[DEPRECATION] should_set_the_flash_to nil is deprecated. " <<
45
- "Use should_not_set_the_flash instead."
46
- should_not_set_the_flash
47
- end
37
+ ::ActiveSupport::Deprecation.warn("use: should set_the_flash")
38
+ should set_the_flash.to(val)
48
39
  end
49
40
 
41
+ # Deprecated: use ActionController::Matchers#set_the_flash instead.
42
+ #
50
43
  # Macro that creates a test asserting that the flash is empty.
51
44
  def should_not_set_the_flash
52
- matcher = set_the_flash
53
- should "not #{matcher.description}" do
54
- assert_rejects matcher, @controller
55
- end
45
+ ::ActiveSupport::Deprecation.warn("use: should_not set_the_flash")
46
+ should_not set_the_flash
56
47
  end
57
48
 
49
+ # Deprecated: use ActionController::Matchers#filter_param instead.
50
+ #
58
51
  # Macro that creates a test asserting that filter_parameter_logging
59
52
  # is set for the specified keys
60
53
  #
@@ -62,14 +55,14 @@ module Shoulda # :nodoc:
62
55
  #
63
56
  # should_filter_params :password, :ssn
64
57
  def should_filter_params(*keys)
58
+ ::ActiveSupport::Deprecation.warn("use: should filter_param")
65
59
  keys.each do |key|
66
- matcher = filter_param(key)
67
- should matcher.description do
68
- assert_accepts matcher, @controller
69
- end
60
+ should filter_param(key)
70
61
  end
71
62
  end
72
63
 
64
+ # Deprecated: use ActionController::Matchers#assign_to instead.
65
+ #
73
66
  # Macro that creates a test asserting that the controller assigned to
74
67
  # each of the named instance variable(s).
75
68
  #
@@ -85,20 +78,17 @@ module Shoulda # :nodoc:
85
78
  # should_assign_to :user, :class => User
86
79
  # should_assign_to(:user) { @user }
87
80
  def should_assign_to(*names, &block)
81
+ ::ActiveSupport::Deprecation.warn("use: should assign_to")
88
82
  klass = get_options!(names, :class)
89
83
  names.each do |name|
90
84
  matcher = assign_to(name).with_kind_of(klass)
91
- should matcher.description do
92
- if block
93
- expected_value = instance_eval(&block)
94
- matcher = matcher.with(expected_value)
95
- end
96
-
97
- assert_accepts matcher, @controller
98
- end
85
+ matcher = matcher.with(&block) if block
86
+ should matcher
99
87
  end
100
88
  end
101
89
 
90
+ # Deprecated: use ActionController::Matchers#assign_to instead.
91
+ #
102
92
  # Macro that creates a test asserting that the controller did not assign to
103
93
  # any of the named instance variable(s).
104
94
  #
@@ -106,25 +96,25 @@ module Shoulda # :nodoc:
106
96
  #
107
97
  # should_not_assign_to :user, :posts
108
98
  def should_not_assign_to(*names)
99
+ ::ActiveSupport::Deprecation.warn("use: should_not assign_to")
109
100
  names.each do |name|
110
- matcher = assign_to(name)
111
- should "not #{matcher.description}" do
112
- assert_rejects matcher, @controller
113
- end
101
+ should_not assign_to(name)
114
102
  end
115
103
  end
116
104
 
105
+ # Deprecated: use ActionController::Matchers#respond_with instead.
106
+ #
117
107
  # Macro that creates a test asserting that the controller responded with a 'response' status code.
118
108
  # Example:
119
109
  #
120
110
  # should_respond_with :success
121
111
  def should_respond_with(response)
122
- should "respond with #{response}" do
123
- matcher = respond_with(response)
124
- assert_accepts matcher, @controller
125
- end
112
+ ::ActiveSupport::Deprecation.warn("use: should respond_with")
113
+ should respond_with(response)
126
114
  end
127
115
 
116
+ # Deprecated: use ActionController::Matchers#respond_with_content_type instead.
117
+ #
128
118
  # Macro that creates a test asserting that the response content type was 'content_type'.
129
119
  # Example:
130
120
  #
@@ -132,12 +122,12 @@ module Shoulda # :nodoc:
132
122
  # should_respond_with_content_type :rss
133
123
  # should_respond_with_content_type /rss/
134
124
  def should_respond_with_content_type(content_type)
135
- matcher = respond_with_content_type(content_type)
136
- should matcher.description do
137
- assert_accepts matcher, @controller
138
- end
125
+ ::ActiveSupport::Deprecation.warn("use: should respond_with_content_type")
126
+ should respond_with_content_type(content_type)
139
127
  end
140
128
 
129
+ # Deprecated: use ActionController::Matchers#set_session instead.
130
+ #
141
131
  # Macro that creates a test asserting that a value returned from the
142
132
  # session is correct. Expects the session key as a parameter, and a block
143
133
  # that returns the expected value.
@@ -147,47 +137,45 @@ module Shoulda # :nodoc:
147
137
  # should_set_session(:user_id) { @user.id }
148
138
  # should_set_session(:message) { "Free stuff" }
149
139
  def should_set_session(key, &block)
140
+ ::ActiveSupport::Deprecation.warn("use: should set_session")
150
141
  matcher = set_session(key)
151
- should matcher.description do
152
- expected_value = instance_eval(&block)
153
- matcher = matcher.to(expected_value)
154
- assert_accepts matcher, @controller
155
- end
142
+ matcher = matcher.to(&block) if block
143
+ should matcher
156
144
  end
157
145
 
146
+ # Deprecated: use ActionController::Matchers#render_template instead.
147
+ #
158
148
  # Macro that creates a test asserting that the controller rendered the given template.
159
149
  # Example:
160
150
  #
161
151
  # should_render_template :new
162
152
  def should_render_template(template)
163
- should "render template #{template.inspect}" do
164
- assert_template template.to_s
165
- end
153
+ ::ActiveSupport::Deprecation.warn("use: should render_template")
154
+ should render_template(template)
166
155
  end
167
156
 
157
+ # Deprecated: use ActionController::Matchers#render_with_layout instead.
158
+ #
168
159
  # Macro that creates a test asserting that the controller rendered with the given layout.
169
160
  # Example:
170
161
  #
171
162
  # should_render_with_layout 'special'
172
163
  def should_render_with_layout(expected_layout = 'application')
173
- matcher = render_with_layout(expected_layout)
174
- if expected_layout
175
- should matcher.description do
176
- assert_accepts matcher, @controller
177
- end
178
- else
179
- should "render without layout" do
180
- assert_rejects matcher, @controller
181
- end
182
- end
164
+ ::ActiveSupport::Deprecation.warn("use: should render_with_layout")
165
+ should render_with_layout(expected_layout)
183
166
  end
184
167
 
168
+ # Deprecated: use ActionController::Matchers#render_with_layout instead.
169
+ #
185
170
  # Macro that creates a test asserting that the controller rendered without a layout.
186
171
  # Same as @should_render_with_layout false@
187
172
  def should_render_without_layout
188
- should_render_with_layout nil
173
+ ::ActiveSupport::Deprecation.warn("use: should_not render_with_layout")
174
+ should_not render_with_layout
189
175
  end
190
176
 
177
+ # Deprecated: use ActionController::Matchers#redirect_to instead.
178
+ #
191
179
  # Macro that creates a test asserting that the controller returned a
192
180
  # redirect to the given path. The passed description will be used when
193
181
  # generating a test name. Expects a block that returns the expected path
@@ -197,12 +185,12 @@ module Shoulda # :nodoc:
197
185
  #
198
186
  # should_redirect_to("the user's profile") { user_url(@user) }
199
187
  def should_redirect_to(description, &block)
200
- should "redirect to #{description}" do
201
- expected_url = instance_eval(&block)
202
- assert_redirected_to expected_url
203
- end
188
+ ::ActiveSupport::Deprecation.warn("use: should redirect_to")
189
+ should redirect_to(description, &block)
204
190
  end
205
191
 
192
+ # Deprecated: use ActionController::Matchers#route instead.
193
+ #
206
194
  # Macro that creates a routing test. It tries to use the given HTTP
207
195
  # +method+ on the given +path+, and asserts that it routes to the
208
196
  # given +options+.
@@ -225,15 +213,8 @@ module Shoulda # :nodoc:
225
213
  # :action => :show, :id => 1, :user_id => 1
226
214
  #
227
215
  def should_route(method, path, options)
228
- unless options[:controller]
229
- options[:controller] = self.name.gsub(/ControllerTest$/, '').tableize
230
- end
231
-
232
- matcher = route(method, path).to(options)
233
-
234
- should matcher.description do
235
- assert_accepts matcher.in_context(self), self
236
- end
216
+ ::ActiveSupport::Deprecation.warn("use: should route")
217
+ should route(method, path).to(options)
237
218
  end
238
219
  end
239
220
  end