nimboids-shoulda 2.11.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CONTRIBUTION_GUIDELINES.rdoc +10 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +154 -0
- data/Rakefile +74 -0
- data/bin/convert_to_should_syntax +42 -0
- data/lib/shoulda/action_controller/macros.rb +221 -0
- data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +114 -0
- data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +74 -0
- 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 +99 -0
- data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +74 -0
- data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +85 -0
- data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
- data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +98 -0
- data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +100 -0
- data/lib/shoulda/action_controller/matchers.rb +39 -0
- data/lib/shoulda/action_controller.rb +34 -0
- data/lib/shoulda/action_mailer/assertions.rb +42 -0
- data/lib/shoulda/action_mailer/matchers/have_sent_email.rb +110 -0
- data/lib/shoulda/action_mailer/matchers.rb +22 -0
- data/lib/shoulda/action_mailer.rb +13 -0
- data/lib/shoulda/active_record/assertions.rb +69 -0
- data/lib/shoulda/active_record/helpers.rb +32 -0
- data/lib/shoulda/active_record/macros.rb +457 -0
- data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
- data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +110 -0
- data/lib/shoulda/active_record/matchers/association_matcher.rb +275 -0
- data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
- data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
- data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
- data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +112 -0
- data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
- data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
- data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +65 -0
- data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
- data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
- data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
- data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
- data/lib/shoulda/active_record/matchers.rb +42 -0
- data/lib/shoulda/active_record.rb +16 -0
- data/lib/shoulda/assertions.rb +79 -0
- data/lib/shoulda/autoload_macros.rb +46 -0
- data/lib/shoulda/context.rb +441 -0
- data/lib/shoulda/helpers.rb +8 -0
- data/lib/shoulda/integrations/rspec.rb +13 -0
- data/lib/shoulda/integrations/rspec2.rb +22 -0
- data/lib/shoulda/integrations/test_unit.rb +22 -0
- data/lib/shoulda/macros.rb +161 -0
- data/lib/shoulda/private_helpers.rb +13 -0
- data/lib/shoulda/proc_extensions.rb +14 -0
- data/lib/shoulda/rails.rb +8 -0
- data/lib/shoulda/tasks/list_tests.rake +29 -0
- data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
- data/lib/shoulda/tasks.rb +3 -0
- data/lib/shoulda/version.rb +4 -0
- data/lib/shoulda.rb +9 -0
- data/rails/init.rb +8 -0
- data/test/README +36 -0
- data/test/fail_macros.rb +55 -0
- data/test/fixtures/addresses.yml +3 -0
- data/test/fixtures/friendships.yml +0 -0
- data/test/fixtures/posts.yml +5 -0
- data/test/fixtures/products.yml +0 -0
- data/test/fixtures/taggings.yml +0 -0
- data/test/fixtures/tags.yml +9 -0
- data/test/fixtures/users.yml +6 -0
- data/test/functional/posts_controller_test.rb +121 -0
- data/test/functional/users_controller_test.rb +19 -0
- data/test/matchers/action_mailer/have_sent_email_test.rb +76 -0
- data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +74 -0
- data/test/matchers/active_record/allow_value_matcher_test.rb +64 -0
- data/test/matchers/active_record/association_matcher_test.rb +462 -0
- data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +81 -0
- data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
- data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
- data/test/matchers/active_record/have_db_index_matcher_test.rb +91 -0
- data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
- data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
- data/test/matchers/active_record/validate_format_of_matcher_test.rb +39 -0
- data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
- data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
- data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
- data/test/matchers/controller/assign_to_matcher_test.rb +55 -0
- data/test/matchers/controller/filter_param_matcher_test.rb +40 -0
- 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 +47 -0
- data/test/matchers/controller/respond_with_content_type_matcher_test.rb +32 -0
- data/test/matchers/controller/respond_with_matcher_test.rb +96 -0
- data/test/matchers/controller/route_matcher_test.rb +75 -0
- data/test/matchers/controller/set_session_matcher_test.rb +48 -0
- data/test/matchers/controller/set_the_flash_matcher.rb +95 -0
- data/test/other/autoload_macro_test.rb +18 -0
- data/test/other/context_test.rb +372 -0
- data/test/other/convert_to_should_syntax_test.rb +63 -0
- data/test/other/helpers_test.rb +317 -0
- data/test/other/private_helpers_test.rb +32 -0
- data/test/other/should_test.rb +271 -0
- data/test/rails2_model_builder.rb +130 -0
- data/test/rails2_root/app/controllers/application_controller.rb +22 -0
- data/test/rails2_root/app/controllers/posts_controller.rb +87 -0
- data/test/rails2_root/app/controllers/users_controller.rb +84 -0
- data/test/rails2_root/app/helpers/application_helper.rb +3 -0
- data/test/rails2_root/app/helpers/posts_helper.rb +2 -0
- data/test/rails2_root/app/helpers/users_helper.rb +2 -0
- data/test/rails2_root/app/models/address.rb +7 -0
- data/test/rails2_root/app/models/flea.rb +11 -0
- data/test/rails2_root/app/models/friendship.rb +4 -0
- data/test/rails2_root/app/models/notifier.rb +8 -0
- data/test/rails2_root/app/models/pets/cat.rb +7 -0
- data/test/rails2_root/app/models/pets/dog.rb +10 -0
- data/test/rails2_root/app/models/post.rb +12 -0
- data/test/rails2_root/app/models/product.rb +12 -0
- data/test/rails2_root/app/models/profile.rb +2 -0
- data/test/rails2_root/app/models/registration.rb +2 -0
- data/test/rails2_root/app/models/tag.rb +8 -0
- data/test/rails2_root/app/models/tagging.rb +4 -0
- data/test/rails2_root/app/models/treat.rb +3 -0
- data/test/rails2_root/app/models/user.rb +32 -0
- data/test/rails2_root/app/views/layouts/posts.rhtml +19 -0
- data/test/rails2_root/app/views/layouts/users.rhtml +17 -0
- data/test/rails2_root/app/views/layouts/wide.html.erb +1 -0
- data/test/rails2_root/app/views/notifier/the_email.html.erb +1 -0
- data/test/rails2_root/app/views/posts/edit.rhtml +27 -0
- data/test/rails2_root/app/views/posts/index.rhtml +25 -0
- data/test/rails2_root/app/views/posts/new.rhtml +26 -0
- data/test/rails2_root/app/views/posts/show.rhtml +18 -0
- data/test/rails2_root/app/views/users/edit.rhtml +22 -0
- data/test/rails2_root/app/views/users/index.rhtml +22 -0
- data/test/rails2_root/app/views/users/new.rhtml +21 -0
- data/test/rails2_root/app/views/users/show.rhtml +13 -0
- data/test/rails2_root/config/boot.rb +110 -0
- data/test/rails2_root/config/database.yml +4 -0
- data/test/rails2_root/config/environment.rb +17 -0
- data/test/rails2_root/config/environments/test.rb +23 -0
- data/test/rails2_root/config/initializers/new_rails_defaults.rb +15 -0
- data/test/rails2_root/config/initializers/shoulda.rb +8 -0
- data/test/rails2_root/config/routes.rb +6 -0
- data/test/rails2_root/db/migrate/001_create_users.rb +19 -0
- data/test/rails2_root/db/migrate/002_create_posts.rb +13 -0
- data/test/rails2_root/db/migrate/003_create_taggings.rb +12 -0
- data/test/rails2_root/db/migrate/004_create_tags.rb +11 -0
- data/test/rails2_root/db/migrate/005_create_dogs.rb +12 -0
- data/test/rails2_root/db/migrate/006_create_addresses.rb +14 -0
- data/test/rails2_root/db/migrate/007_create_fleas.rb +11 -0
- data/test/rails2_root/db/migrate/008_create_dogs_fleas.rb +12 -0
- data/test/rails2_root/db/migrate/009_create_products.rb +17 -0
- data/test/rails2_root/db/migrate/010_create_friendships.rb +14 -0
- data/test/rails2_root/db/migrate/011_create_treats.rb +12 -0
- data/test/rails2_root/db/migrate/20090506203502_create_profiles.rb +12 -0
- data/test/rails2_root/db/migrate/20090506203536_create_registrations.rb +14 -0
- data/test/rails2_root/db/migrate/20090513104502_create_cats.rb +12 -0
- data/test/rails2_root/db/schema.rb +0 -0
- data/test/rails2_root/public/404.html +30 -0
- data/test/rails2_root/public/422.html +30 -0
- data/test/rails2_root/public/500.html +30 -0
- data/test/rails2_root/script/console +3 -0
- data/test/rails2_root/script/generate +3 -0
- data/test/rails2_root/test/shoulda_macros/custom_macro.rb +6 -0
- data/test/rails2_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
- data/test/rails2_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -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/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/config.ru +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/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/rspec_test.rb +207 -0
- data/test/test_helper.rb +36 -0
- data/test/unit/address_test.rb +10 -0
- data/test/unit/cat_test.rb +7 -0
- data/test/unit/dog_test.rb +9 -0
- data/test/unit/flea_test.rb +14 -0
- data/test/unit/friendship_test.rb +6 -0
- data/test/unit/post_test.rb +15 -0
- data/test/unit/product_test.rb +23 -0
- data/test/unit/tag_test.rb +11 -0
- data/test/unit/tagging_test.rb +6 -0
- data/test/unit/user_test.rb +46 -0
- metadata +330 -0
@@ -0,0 +1,74 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures that filter_parameter_logging is set for the specified key.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# it { should filter_param(:password) }
|
10
|
+
def filter_param(key)
|
11
|
+
FilterParamMatcher.new(key)
|
12
|
+
end
|
13
|
+
|
14
|
+
class FilterParamMatcher # :nodoc:
|
15
|
+
|
16
|
+
def initialize(key)
|
17
|
+
@key = key.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def matches?(controller)
|
21
|
+
@controller = controller
|
22
|
+
filters_params? && filters_key?
|
23
|
+
end
|
24
|
+
|
25
|
+
def failure_message
|
26
|
+
"Expected #{@key} to be filtered"
|
27
|
+
end
|
28
|
+
|
29
|
+
def negative_failure_message
|
30
|
+
"Did not expect #{@key} to be filtered"
|
31
|
+
end
|
32
|
+
|
33
|
+
def description
|
34
|
+
"filter #{@key}"
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def filters_params?
|
40
|
+
@controller.respond_to?(:filter_parameters) ||
|
41
|
+
request.respond_to?(:filtered_parameters)
|
42
|
+
end
|
43
|
+
|
44
|
+
def filters_key?
|
45
|
+
filtered_value == '[FILTERED]'
|
46
|
+
end
|
47
|
+
|
48
|
+
def filtered_value
|
49
|
+
if request.respond_to?(:filtered_parameters)
|
50
|
+
filtered_request_value
|
51
|
+
else
|
52
|
+
filtered_controller_value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def filtered_controller_value
|
57
|
+
filtered = @controller.send(:filter_parameters,
|
58
|
+
@key.to_s => @key.to_s)
|
59
|
+
filtered[@key.to_s]
|
60
|
+
end
|
61
|
+
|
62
|
+
def filtered_request_value
|
63
|
+
request.env['action_dispatch.request.parameters'] = { @key.to_s => 'value' }
|
64
|
+
request.filtered_parameters[@key.to_s]
|
65
|
+
end
|
66
|
+
|
67
|
+
def request
|
68
|
+
@request ||= ::ActionController::TestRequest.new
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures a controller redirected to the given url.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# it { should redirect_to('http://somewhere.com') }
|
10
|
+
# it { should redirect_to(users_path) }
|
11
|
+
def redirect_to(url_or_description, &block)
|
12
|
+
RedirectToMatcher.new(url_or_description, self, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
class RedirectToMatcher # :nodoc:
|
16
|
+
|
17
|
+
def initialize(url_or_description, context, &block)
|
18
|
+
if block
|
19
|
+
@url_block = block
|
20
|
+
@location = @url_or_description
|
21
|
+
else
|
22
|
+
@url = url_or_description
|
23
|
+
@location = @url
|
24
|
+
end
|
25
|
+
@context = context
|
26
|
+
end
|
27
|
+
|
28
|
+
def in_context(context)
|
29
|
+
@context = context
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def matches?(controller)
|
34
|
+
@controller = controller
|
35
|
+
redirects_to_url?
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :failure_message, :negative_failure_message
|
39
|
+
|
40
|
+
def description
|
41
|
+
"redirect to #{@location}"
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def redirects_to_url?
|
47
|
+
@url = @context.instance_eval(&@url_block) if @url_block
|
48
|
+
begin
|
49
|
+
@context.send(:assert_redirected_to, @url)
|
50
|
+
@negative_failure_message = "Didn't expect to redirect to #{@url}"
|
51
|
+
true
|
52
|
+
rescue Test::Unit::AssertionFailedError => error
|
53
|
+
@failure_message = error.message
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures a controller rendered the given template.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# it { should render_template(:show) }
|
10
|
+
def render_template(template)
|
11
|
+
RenderTemplateMatcher.new(template, self)
|
12
|
+
end
|
13
|
+
|
14
|
+
class RenderTemplateMatcher # :nodoc:
|
15
|
+
|
16
|
+
def initialize(template, context)
|
17
|
+
@template = template.to_s
|
18
|
+
@context = context
|
19
|
+
end
|
20
|
+
|
21
|
+
def matches?(controller)
|
22
|
+
@controller = controller
|
23
|
+
renders_template?
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :failure_message, :negative_failure_message
|
27
|
+
|
28
|
+
def description
|
29
|
+
"render template #{@template}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def in_context(context)
|
33
|
+
@context = context
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def renders_template?
|
40
|
+
begin
|
41
|
+
@context.send(:assert_template, @template)
|
42
|
+
@negative_failure_message = "Didn't expect to render #{@template}"
|
43
|
+
true
|
44
|
+
rescue Test::Unit::AssertionFailedError => error
|
45
|
+
@failure_message = error.message
|
46
|
+
false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures that the controller rendered with the given layout.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# it { should render_with_layout }
|
10
|
+
# it { should render_with_layout(:special) }
|
11
|
+
# it { should_not render_with_layout }
|
12
|
+
def render_with_layout(expected_layout = nil)
|
13
|
+
RenderWithLayout.new(expected_layout)
|
14
|
+
end
|
15
|
+
|
16
|
+
class RenderWithLayout # :nodoc:
|
17
|
+
|
18
|
+
def initialize(expected_layout)
|
19
|
+
@expected_layout = expected_layout.to_s unless expected_layout.nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
# Used to provide access to layouts recorded by
|
23
|
+
# ActionController::TemplateAssertions in Rails 3
|
24
|
+
def in_context(context)
|
25
|
+
@context = context
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def matches?(controller)
|
30
|
+
@controller = controller
|
31
|
+
rendered_with_layout? && rendered_with_expected_layout?
|
32
|
+
end
|
33
|
+
|
34
|
+
def failure_message
|
35
|
+
"Expected #{expectation}, but #{result}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def negative_failure_message
|
39
|
+
"Did not expect #{expectation}, but #{result}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def description
|
43
|
+
description = "render with "
|
44
|
+
if @expected_layout.nil?
|
45
|
+
description << "a layout"
|
46
|
+
else
|
47
|
+
description << "the #{@expected_layout.inspect} layout"
|
48
|
+
end
|
49
|
+
description
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def rendered_with_layout?
|
55
|
+
!rendered_layouts.empty?
|
56
|
+
end
|
57
|
+
|
58
|
+
def rendered_with_expected_layout?
|
59
|
+
return true if @expected_layout.nil?
|
60
|
+
rendered_layouts.include?(@expected_layout)
|
61
|
+
end
|
62
|
+
|
63
|
+
def rendered_layouts
|
64
|
+
if recorded_layouts
|
65
|
+
recorded_layouts.keys.compact.map { |layout| layout.sub(%r{^layouts/}, '') }
|
66
|
+
else
|
67
|
+
layout = @controller.response.layout
|
68
|
+
if layout.nil?
|
69
|
+
[]
|
70
|
+
else
|
71
|
+
[layout.split('/').last]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def recorded_layouts
|
77
|
+
if @context
|
78
|
+
@context.instance_variable_get('@layouts')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def expectation
|
83
|
+
"to #{description}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def result
|
87
|
+
if rendered_with_layout?
|
88
|
+
"rendered with " <<
|
89
|
+
rendered_layouts.map { |layout| layout.inspect }.join(", ")
|
90
|
+
else
|
91
|
+
"rendered without a layout"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures a controller responded with expected 'response' content type.
|
6
|
+
#
|
7
|
+
# You can pass an explicit content type such as 'application/rss+xml'
|
8
|
+
# or its symbolic equivalent :rss
|
9
|
+
# or a regular expression such as /rss/
|
10
|
+
#
|
11
|
+
# Example:
|
12
|
+
#
|
13
|
+
# it { should respond_with_content_type(:xml) }
|
14
|
+
# it { should respond_with_content_type(:csv) }
|
15
|
+
# it { should respond_with_content_type(:atom) }
|
16
|
+
# it { should respond_with_content_type(:yaml) }
|
17
|
+
# it { should respond_with_content_type(:text) }
|
18
|
+
# it { should respond_with_content_type('application/rss+xml') }
|
19
|
+
# it { should respond_with_content_type(/json/) }
|
20
|
+
def respond_with_content_type(content_type)
|
21
|
+
RespondWithContentTypeMatcher.new(content_type)
|
22
|
+
end
|
23
|
+
|
24
|
+
class RespondWithContentTypeMatcher # :nodoc:
|
25
|
+
|
26
|
+
def initialize(content_type)
|
27
|
+
@content_type = if content_type.is_a?(Symbol)
|
28
|
+
lookup_by_extension(content_type)
|
29
|
+
else
|
30
|
+
content_type
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def description
|
35
|
+
"respond with content type of #{@content_type}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def matches?(controller)
|
39
|
+
@controller = controller
|
40
|
+
if @content_type.is_a?(Regexp)
|
41
|
+
response_content_type =~ @content_type
|
42
|
+
else
|
43
|
+
response_content_type == @content_type
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def failure_message
|
48
|
+
"Expected #{expectation}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def negative_failure_message
|
52
|
+
"Did not expect #{expectation}"
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def response_content_type
|
58
|
+
@controller.response.content_type.to_s
|
59
|
+
end
|
60
|
+
|
61
|
+
def lookup_by_extension(extension)
|
62
|
+
Mime::Type.lookup_by_extension(extension.to_s).to_s
|
63
|
+
end
|
64
|
+
|
65
|
+
def expectation
|
66
|
+
"content type to be #{@content_type}, " <<
|
67
|
+
"but was #{response_content_type}"
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures a controller responded with expected 'response' status code.
|
6
|
+
#
|
7
|
+
# You can pass an explicit status number like 200, 301, 404, 500
|
8
|
+
# or its symbolic equivalent :success, :redirect, :missing, :error.
|
9
|
+
# See ActionController::StatusCodes for a full list.
|
10
|
+
#
|
11
|
+
# Example:
|
12
|
+
#
|
13
|
+
# it { should respond_with(:success) }
|
14
|
+
# it { should respond_with(:redirect) }
|
15
|
+
# it { should respond_with(:missing) }
|
16
|
+
# it { should respond_with(:error) }
|
17
|
+
# it { should respond_with(501) }
|
18
|
+
def respond_with(status)
|
19
|
+
RespondWithMatcher.new(status)
|
20
|
+
end
|
21
|
+
|
22
|
+
class RespondWithMatcher # :nodoc:
|
23
|
+
|
24
|
+
def initialize(status)
|
25
|
+
@status = symbol_to_status_code(status)
|
26
|
+
end
|
27
|
+
|
28
|
+
def matches?(controller)
|
29
|
+
@controller = controller
|
30
|
+
correct_status_code? || correct_status_code_range?
|
31
|
+
end
|
32
|
+
|
33
|
+
def failure_message
|
34
|
+
"Expected #{expectation}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def negative_failure_message
|
38
|
+
"Did not expect #{expectation}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def description
|
42
|
+
"respond with #{@status}"
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
def correct_status_code?
|
48
|
+
response_code == @status
|
49
|
+
end
|
50
|
+
|
51
|
+
def correct_status_code_range?
|
52
|
+
@status.is_a?(Range) &&
|
53
|
+
@status.include?(response_code)
|
54
|
+
end
|
55
|
+
|
56
|
+
def response_code
|
57
|
+
@controller.response.response_code
|
58
|
+
end
|
59
|
+
|
60
|
+
def symbol_to_status_code(potential_symbol)
|
61
|
+
case potential_symbol
|
62
|
+
when :success then 200
|
63
|
+
when :redirect then 300..399
|
64
|
+
when :missing then 404
|
65
|
+
when :error then 500..599
|
66
|
+
when Symbol
|
67
|
+
if defined?(::Rack::Utils::SYMBOL_TO_STATUS_CODE)
|
68
|
+
::Rack::Utils::SYMBOL_TO_STATUS_CODE[potential_symbol]
|
69
|
+
else
|
70
|
+
::ActionController::Base::SYMBOL_TO_STATUS_CODE[potential_symbol]
|
71
|
+
end
|
72
|
+
else
|
73
|
+
potential_symbol
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def expectation
|
78
|
+
"response to be a #{@status}, but was #{response_code}"
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures that requesting +path+ using +method+ routes to +options+.
|
6
|
+
#
|
7
|
+
# If you don't specify a controller, it will use the controller from the
|
8
|
+
# example group.
|
9
|
+
#
|
10
|
+
# +to_param+ is called on the +options+ given.
|
11
|
+
#
|
12
|
+
# Examples:
|
13
|
+
#
|
14
|
+
# it { should route(:get, "/posts").
|
15
|
+
# to(:controller => :posts, :action => :index) }
|
16
|
+
# it { should route(:get, "/posts/new").to(:action => :new) }
|
17
|
+
# it { should route(:post, "/posts").to(:action => :create) }
|
18
|
+
# it { should route(:get, "/posts/1").to(:action => :show, :id => 1) }
|
19
|
+
# it { should route(:edit, "/posts/1").to(:action => :show, :id => 1) }
|
20
|
+
# it { should route(:put, "/posts/1").to(:action => :update, :id => 1) }
|
21
|
+
# it { should route(:delete, "/posts/1").
|
22
|
+
# to(:action => :destroy, :id => 1) }
|
23
|
+
# it { should route(:get, "/users/1/posts/1").
|
24
|
+
# to(:action => :show, :id => 1, :user_id => 1) }
|
25
|
+
def route(method, path)
|
26
|
+
RouteMatcher.new(method, path, self)
|
27
|
+
end
|
28
|
+
|
29
|
+
class RouteMatcher # :nodoc:
|
30
|
+
|
31
|
+
def initialize(method, path, context)
|
32
|
+
@method = method
|
33
|
+
@path = path
|
34
|
+
@context = context
|
35
|
+
end
|
36
|
+
|
37
|
+
def to(params)
|
38
|
+
@params = params
|
39
|
+
stringify_params!
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def in_context(context)
|
44
|
+
@context = context
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def matches?(controller)
|
49
|
+
@controller = controller
|
50
|
+
guess_controller!
|
51
|
+
route_recognized?
|
52
|
+
end
|
53
|
+
|
54
|
+
attr_reader :failure_message, :negative_failure_message
|
55
|
+
|
56
|
+
def description
|
57
|
+
"route #{@method.to_s.upcase} #{@path} to/from #{@params.inspect}"
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def guess_controller!
|
63
|
+
@params[:controller] ||= @controller.controller_path
|
64
|
+
end
|
65
|
+
|
66
|
+
def stringify_params!
|
67
|
+
@params.each do |key, value|
|
68
|
+
@params[key] = value.is_a?(Array) ? value.collect {|v| v.to_param } : value.to_param
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def route_recognized?
|
73
|
+
begin
|
74
|
+
@context.send(:assert_routing,
|
75
|
+
{ :method => @method, :path => @path },
|
76
|
+
@params)
|
77
|
+
|
78
|
+
@negative_failure_message = "Didn't expect to #{description}"
|
79
|
+
true
|
80
|
+
rescue ::ActionController::RoutingError => error
|
81
|
+
@failure_message = error.message
|
82
|
+
false
|
83
|
+
rescue Test::Unit::AssertionFailedError => error
|
84
|
+
@failure_message = error.message
|
85
|
+
false
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures that a session key was set to the expected value.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# it { should set_session(:message) }
|
10
|
+
# it { should set_session(:user_id).to(@user.id) }
|
11
|
+
# it { should_not set_session(:user_id) }
|
12
|
+
def set_session(key)
|
13
|
+
SetSessionMatcher.new(key)
|
14
|
+
end
|
15
|
+
|
16
|
+
class SetSessionMatcher # :nodoc:
|
17
|
+
|
18
|
+
def initialize(key)
|
19
|
+
@key = key.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def to(value = nil, &block)
|
23
|
+
@value = value
|
24
|
+
@value_block = block
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def matches?(controller)
|
29
|
+
@controller = controller
|
30
|
+
@value = @context.instance_eval(&@value_block) if @value_block
|
31
|
+
(assigned_value? && assigned_correct_value?) || cleared_value?
|
32
|
+
end
|
33
|
+
|
34
|
+
def failure_message
|
35
|
+
"Expected #{expectation}, but #{result}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def negative_failure_message
|
39
|
+
"Didn't expect #{expectation}, but #{result}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def description
|
43
|
+
description = "set session variable #{@key.inspect}"
|
44
|
+
description << " to #{@value.inspect}" if defined?(@value)
|
45
|
+
description
|
46
|
+
end
|
47
|
+
|
48
|
+
def in_context(context)
|
49
|
+
@context = context
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def assigned_value?
|
56
|
+
!assigned_value.nil?
|
57
|
+
end
|
58
|
+
|
59
|
+
def cleared_value?
|
60
|
+
defined?(@value) && @value.nil? && assigned_value.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
def assigned_correct_value?
|
64
|
+
return true if @value.nil?
|
65
|
+
assigned_value == @value
|
66
|
+
end
|
67
|
+
|
68
|
+
def assigned_value
|
69
|
+
session[@key]
|
70
|
+
end
|
71
|
+
|
72
|
+
def session
|
73
|
+
if @controller.request.respond_to?(:session)
|
74
|
+
@controller.request.session.to_hash
|
75
|
+
else
|
76
|
+
@controller.response.session.data
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def expectation
|
81
|
+
expectation = "session variable #{@key} to be set"
|
82
|
+
expectation << " to #{@value.inspect}" if @value
|
83
|
+
expectation
|
84
|
+
end
|
85
|
+
|
86
|
+
def result
|
87
|
+
if session.empty?
|
88
|
+
"no session variables were set"
|
89
|
+
else
|
90
|
+
"the session was #{session.inspect}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|