Flamefork-shoulda 2.10.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 (160) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +12 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.rdoc +169 -0
  4. data/Rakefile +72 -0
  5. data/bin/convert_to_should_syntax +42 -0
  6. data/lib/shoulda/action_controller/helpers.rb +47 -0
  7. data/lib/shoulda/action_controller/macros.rb +277 -0
  8. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
  9. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
  10. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
  11. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +70 -0
  12. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +81 -0
  13. data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
  14. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
  15. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
  16. data/lib/shoulda/action_controller/matchers.rb +37 -0
  17. data/lib/shoulda/action_controller.rb +24 -0
  18. data/lib/shoulda/action_mailer/assertions.rb +38 -0
  19. data/lib/shoulda/action_mailer.rb +6 -0
  20. data/lib/shoulda/action_view/macros.rb +56 -0
  21. data/lib/shoulda/action_view.rb +6 -0
  22. data/lib/shoulda/active_record/assertions.rb +69 -0
  23. data/lib/shoulda/active_record/helpers.rb +40 -0
  24. data/lib/shoulda/active_record/macros.rb +588 -0
  25. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
  26. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
  27. data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
  28. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
  29. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
  30. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
  31. data/lib/shoulda/active_record/matchers/have_index_matcher.rb +105 -0
  32. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -0
  33. data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
  34. data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
  35. data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
  36. data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
  37. data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
  38. data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
  39. data/lib/shoulda/active_record/matchers.rb +42 -0
  40. data/lib/shoulda/active_record.rb +12 -0
  41. data/lib/shoulda/assertions.rb +59 -0
  42. data/lib/shoulda/autoload_macros.rb +46 -0
  43. data/lib/shoulda/context.rb +304 -0
  44. data/lib/shoulda/helpers.rb +8 -0
  45. data/lib/shoulda/macros.rb +73 -0
  46. data/lib/shoulda/private_helpers.rb +20 -0
  47. data/lib/shoulda/proc_extensions.rb +14 -0
  48. data/lib/shoulda/rails.rb +13 -0
  49. data/lib/shoulda/rspec.rb +11 -0
  50. data/lib/shoulda/tasks/list_tests.rake +29 -0
  51. data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
  52. data/lib/shoulda/tasks.rb +3 -0
  53. data/lib/shoulda/test_unit.rb +14 -0
  54. data/lib/shoulda.rb +9 -0
  55. data/rails/init.rb +7 -0
  56. data/test/README +36 -0
  57. data/test/fail_macros.rb +34 -0
  58. data/test/fixtures/addresses.yml +3 -0
  59. data/test/fixtures/friendships.yml +0 -0
  60. data/test/fixtures/posts.yml +5 -0
  61. data/test/fixtures/products.yml +0 -0
  62. data/test/fixtures/taggings.yml +0 -0
  63. data/test/fixtures/tags.yml +9 -0
  64. data/test/fixtures/users.yml +6 -0
  65. data/test/functional/posts_controller_test.rb +125 -0
  66. data/test/functional/users_controller_test.rb +19 -0
  67. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
  68. data/test/matchers/active_record/allow_value_matcher_test.rb +41 -0
  69. data/test/matchers/active_record/association_matcher_test.rb +258 -0
  70. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
  71. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
  72. data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
  73. data/test/matchers/active_record/have_index_matcher_test.rb +74 -0
  74. data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
  75. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
  76. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
  77. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
  78. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  79. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  80. data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
  81. data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
  82. data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
  83. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +27 -0
  84. data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
  85. data/test/matchers/controller/route_matcher_test.rb +58 -0
  86. data/test/matchers/controller/set_session_matcher_test.rb +31 -0
  87. data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
  88. data/test/model_builder.rb +106 -0
  89. data/test/other/autoload_macro_test.rb +18 -0
  90. data/test/other/context_test.rb +145 -0
  91. data/test/other/convert_to_should_syntax_test.rb +63 -0
  92. data/test/other/helpers_test.rb +241 -0
  93. data/test/other/private_helpers_test.rb +34 -0
  94. data/test/other/should_test.rb +266 -0
  95. data/test/rails_root/app/controllers/application.rb +25 -0
  96. data/test/rails_root/app/controllers/posts_controller.rb +86 -0
  97. data/test/rails_root/app/controllers/users_controller.rb +84 -0
  98. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  99. data/test/rails_root/app/helpers/posts_helper.rb +2 -0
  100. data/test/rails_root/app/helpers/users_helper.rb +2 -0
  101. data/test/rails_root/app/models/address.rb +7 -0
  102. data/test/rails_root/app/models/flea.rb +3 -0
  103. data/test/rails_root/app/models/friendship.rb +4 -0
  104. data/test/rails_root/app/models/pets/dog.rb +10 -0
  105. data/test/rails_root/app/models/post.rb +12 -0
  106. data/test/rails_root/app/models/product.rb +12 -0
  107. data/test/rails_root/app/models/tag.rb +8 -0
  108. data/test/rails_root/app/models/tagging.rb +4 -0
  109. data/test/rails_root/app/models/treat.rb +3 -0
  110. data/test/rails_root/app/models/user.rb +29 -0
  111. data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
  112. data/test/rails_root/app/views/layouts/users.rhtml +17 -0
  113. data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
  114. data/test/rails_root/app/views/posts/edit.rhtml +27 -0
  115. data/test/rails_root/app/views/posts/index.rhtml +25 -0
  116. data/test/rails_root/app/views/posts/new.rhtml +26 -0
  117. data/test/rails_root/app/views/posts/show.rhtml +18 -0
  118. data/test/rails_root/app/views/users/edit.rhtml +22 -0
  119. data/test/rails_root/app/views/users/index.rhtml +22 -0
  120. data/test/rails_root/app/views/users/new.rhtml +21 -0
  121. data/test/rails_root/app/views/users/show.rhtml +13 -0
  122. data/test/rails_root/config/boot.rb +109 -0
  123. data/test/rails_root/config/database.yml +4 -0
  124. data/test/rails_root/config/environment.rb +14 -0
  125. data/test/rails_root/config/environments/test.rb +0 -0
  126. data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
  127. data/test/rails_root/config/initializers/shoulda.rb +8 -0
  128. data/test/rails_root/config/routes.rb +6 -0
  129. data/test/rails_root/db/migrate/001_create_users.rb +19 -0
  130. data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
  131. data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
  132. data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
  133. data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
  134. data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
  135. data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
  136. data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  137. data/test/rails_root/db/migrate/009_create_products.rb +17 -0
  138. data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
  139. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  140. data/test/rails_root/db/schema.rb +0 -0
  141. data/test/rails_root/public/404.html +30 -0
  142. data/test/rails_root/public/422.html +30 -0
  143. data/test/rails_root/public/500.html +30 -0
  144. data/test/rails_root/script/console +3 -0
  145. data/test/rails_root/script/generate +3 -0
  146. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  147. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  148. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  149. data/test/rspec_test.rb +207 -0
  150. data/test/test_helper.rb +35 -0
  151. data/test/unit/address_test.rb +10 -0
  152. data/test/unit/dog_test.rb +10 -0
  153. data/test/unit/flea_test.rb +6 -0
  154. data/test/unit/friendship_test.rb +6 -0
  155. data/test/unit/post_test.rb +19 -0
  156. data/test/unit/product_test.rb +27 -0
  157. data/test/unit/tag_test.rb +15 -0
  158. data/test/unit/tagging_test.rb +6 -0
  159. data/test/unit/user_test.rb +70 -0
  160. metadata +258 -0
@@ -0,0 +1,24 @@
1
+ require 'shoulda'
2
+ require 'shoulda/action_controller/helpers'
3
+ require 'shoulda/action_controller/matchers'
4
+ require 'shoulda/action_controller/macros'
5
+
6
+ Test::Unit::TestCase.class_eval do
7
+ include Shoulda::ActionController::Matchers
8
+ include Shoulda::ActionController::Helpers
9
+ extend Shoulda::ActionController::Macros
10
+ end
11
+
12
+ require 'shoulda/active_record/assertions'
13
+ require 'shoulda/action_mailer/assertions'
14
+
15
+ module ActionController #:nodoc: all
16
+ module Integration
17
+ class Session
18
+ include Shoulda::Assertions
19
+ include Shoulda::Helpers
20
+ include Shoulda::ActiveRecord::Assertions
21
+ include Shoulda::ActionMailer::Assertions
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,38 @@
1
+ module Shoulda # :nodoc:
2
+ module ActionMailer # :nodoc:
3
+ module Assertions
4
+ # Asserts that an email was delivered. Can take a block that can further
5
+ # narrow down the types of emails you're expecting.
6
+ #
7
+ # assert_sent_email
8
+ #
9
+ # Passes if ActionMailer::Base.deliveries has an email
10
+ #
11
+ # assert_sent_email do |email|
12
+ # email.subject =~ /hi there/ && email.to.include?('none@none.com')
13
+ # end
14
+ #
15
+ # Passes if there is an email with subject containing 'hi there' and
16
+ # 'none@none.com' as one of the recipients.
17
+ #
18
+ def assert_sent_email
19
+ emails = ::ActionMailer::Base.deliveries
20
+ assert !emails.empty?, "No emails were sent"
21
+ if block_given?
22
+ matching_emails = emails.select {|email| yield email }
23
+ assert !matching_emails.empty?, "None of the emails matched."
24
+ end
25
+ end
26
+
27
+ # Asserts that no ActionMailer mails were delivered
28
+ #
29
+ # assert_did_not_send_email
30
+ def assert_did_not_send_email
31
+ msg = "Sent #{::ActionMailer::Base.deliveries.size} emails.\n"
32
+ ::ActionMailer::Base.deliveries.each { |m| msg << " '#{m.subject}' sent to #{m.to.to_sentence}\n" }
33
+ assert ::ActionMailer::Base.deliveries.empty?, msg
34
+ end
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,6 @@
1
+ require 'shoulda'
2
+ require 'shoulda/action_mailer/assertions'
3
+
4
+ Test::Unit::TestCase.class_eval do
5
+ include Shoulda::ActionMailer::Assertions
6
+ end
@@ -0,0 +1,56 @@
1
+ module Shoulda # :nodoc:
2
+ module ActionView # :nodoc:
3
+ # = Macro test helpers for your view
4
+ #
5
+ # By using the macro helpers you can quickly and easily create concise and
6
+ # easy to read test suites.
7
+ #
8
+ # This code segment:
9
+ # context "on GET to :new" do
10
+ # setup do
11
+ # get :new
12
+ # end
13
+ #
14
+ # should_render_a_form
15
+ # should_render_page_with_metadata :title => /index/
16
+ #
17
+ # should "do something else really cool" do
18
+ # assert_select '#really_cool'
19
+ # end
20
+ # end
21
+ #
22
+ # Would produce 3 tests for the +show+ action
23
+ module Macros
24
+
25
+ # Macro that creates a test asserting that the rendered view contains a <form> element.
26
+ def should_render_a_form
27
+ should "display a form" do
28
+ assert_select "form", true, "The template doesn't contain a <form> element"
29
+ end
30
+ end
31
+
32
+ # Macro that creates a test asserting that the rendered view contains the selected metatags.
33
+ # Values can be string or Regexps.
34
+ # Example:
35
+ #
36
+ # should_render_page_with_metadata :description => "Description of this page", :keywords => /post/
37
+ #
38
+ # You can also use this method to test the rendered views title.
39
+ #
40
+ # Example:
41
+ # should_render_page_with_metadata :title => /index/
42
+ def should_render_page_with_metadata(options)
43
+ options.each do |key, value|
44
+ should "have metatag #{key}" do
45
+ if key.to_sym == :title
46
+ assert_select "title", value
47
+ else
48
+ assert_select "meta[name=?][content#{"*" if value.is_a?(Regexp)}=?]", key, value
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
@@ -0,0 +1,6 @@
1
+ require 'shoulda'
2
+ require 'shoulda/action_view/macros'
3
+
4
+ Test::Unit::TestCase.class_eval do
5
+ extend Shoulda::ActionView::Macros
6
+ end
@@ -0,0 +1,69 @@
1
+ module Shoulda # :nodoc:
2
+ module ActiveRecord # :nodoc:
3
+ module Assertions
4
+ # Asserts that the given object can be saved
5
+ #
6
+ # assert_save User.new(params)
7
+ def assert_save(obj)
8
+ assert obj.save, "Errors: #{pretty_error_messages obj}"
9
+ obj.reload
10
+ end
11
+
12
+ # Asserts that the given object is valid
13
+ #
14
+ # assert_valid User.new(params)
15
+ def assert_valid(obj)
16
+ assert obj.valid?, "Errors: #{pretty_error_messages obj}"
17
+ end
18
+
19
+ # Asserts that an Active Record model validates with the passed
20
+ # <tt>value</tt> by making sure the <tt>error_message_to_avoid</tt> is not
21
+ # contained within the list of errors for that attribute.
22
+ #
23
+ # assert_good_value(User.new, :email, "user@example.com")
24
+ # assert_good_value(User.new, :ssn, "123456789", /length/)
25
+ #
26
+ # If a class is passed as the first argument, a new object will be
27
+ # instantiated before the assertion. If an instance variable exists with
28
+ # the same name as the class (underscored), that object will be used
29
+ # instead.
30
+ #
31
+ # assert_good_value(User, :email, "user@example.com")
32
+ #
33
+ # @product = Product.new(:tangible => false)
34
+ # assert_good_value(Product, :price, "0")
35
+ def assert_good_value(object_or_klass, attribute, value, error_message_to_avoid = nil)
36
+ object = get_instance_of(object_or_klass)
37
+ matcher = allow_value(value).
38
+ for(attribute).
39
+ with_message(error_message_to_avoid)
40
+ assert_accepts(matcher, object)
41
+ end
42
+
43
+ # Asserts that an Active Record model invalidates the passed
44
+ # <tt>value</tt> by making sure the <tt>error_message_to_expect</tt> is
45
+ # contained within the list of errors for that attribute.
46
+ #
47
+ # assert_bad_value(User.new, :email, "invalid")
48
+ # assert_bad_value(User.new, :ssn, "123", /length/)
49
+ #
50
+ # If a class is passed as the first argument, a new object will be
51
+ # instantiated before the assertion. If an instance variable exists with
52
+ # the same name as the class (underscored), that object will be used
53
+ # instead.
54
+ #
55
+ # assert_bad_value(User, :email, "invalid")
56
+ #
57
+ # @product = Product.new(:tangible => true)
58
+ # assert_bad_value(Product, :price, "0")
59
+ def assert_bad_value(object_or_klass, attribute, value,
60
+ error_message_to_expect = nil)
61
+ object = get_instance_of(object_or_klass)
62
+ matcher = allow_value(value).
63
+ for(attribute).
64
+ with_message(error_message_to_expect)
65
+ assert_rejects(matcher, object)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,40 @@
1
+ module Shoulda # :nodoc:
2
+ module ActiveRecord # :nodoc:
3
+ module Helpers
4
+ def pretty_error_messages(obj) # :nodoc:
5
+ obj.errors.map do |a, m|
6
+ msg = "#{a} #{m}"
7
+ msg << " (#{obj.send(a).inspect})" unless a.to_sym == :base
8
+ end
9
+ end
10
+
11
+ def get_instance_of(object_or_klass)
12
+ if object_or_klass.is_a?(Class)
13
+ klass = object_or_klass
14
+ instance_variable_get("@#{instance_variable_name_for(klass)}") || klass.new
15
+ else
16
+ object_or_klass
17
+ end
18
+ end
19
+
20
+ def instance_variable_name_for(klass)
21
+ klass.to_s.split('::').last.underscore
22
+ end
23
+
24
+ # Helper method that determines the default error message used by Active
25
+ # Record. Works for both existing Rails 2.1 and Rails 2.2 with the newly
26
+ # introduced I18n module used for localization.
27
+ #
28
+ # default_error_message(:blank)
29
+ # default_error_message(:too_short, :count => 5)
30
+ # default_error_message(:too_long, :count => 60)
31
+ def default_error_message(key, values = {})
32
+ if Object.const_defined?(:I18n) # Rails >= 2.2
33
+ I18n.translate("activerecord.errors.messages.#{key}", values)
34
+ else # Rails <= 2.1.x
35
+ ::ActiveRecord::Errors.default_error_messages[key] % values[:count]
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end