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,4 +1,4 @@
|
|
1
|
-
require
|
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
|
-
|
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
|
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
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
data/test/other/context_test.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require
|
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
|