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