robert-shoulda 2.10.3
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 +10 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +171 -0
- data/Rakefile +72 -0
- data/bin/convert_to_should_syntax +42 -0
- data/lib/shoulda/action_controller/macros.rb +240 -0
- data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
- data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
- data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -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 +81 -0
- data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
- data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
- data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
- data/lib/shoulda/action_controller/matchers.rb +37 -0
- data/lib/shoulda/action_controller.rb +26 -0
- data/lib/shoulda/action_mailer/assertions.rb +38 -0
- data/lib/shoulda/action_mailer.rb +10 -0
- data/lib/shoulda/action_view/macros.rb +61 -0
- data/lib/shoulda/action_view.rb +10 -0
- data/lib/shoulda/active_record/assertions.rb +69 -0
- data/lib/shoulda/active_record/helpers.rb +27 -0
- data/lib/shoulda/active_record/macros.rb +571 -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 +102 -0
- data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -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_named_scope_matcher.rb +128 -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 +67 -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 +57 -0
- data/lib/shoulda/active_record/matchers.rb +43 -0
- data/lib/shoulda/active_record.rb +16 -0
- data/lib/shoulda/assertions.rb +71 -0
- data/lib/shoulda/autoload_macros.rb +46 -0
- data/lib/shoulda/context.rb +413 -0
- data/lib/shoulda/helpers.rb +8 -0
- data/lib/shoulda/macros.rb +133 -0
- data/lib/shoulda/private_helpers.rb +13 -0
- data/lib/shoulda/proc_extensions.rb +14 -0
- data/lib/shoulda/rails.rb +13 -0
- data/lib/shoulda/rspec.rb +11 -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/test_unit.rb +22 -0
- data/lib/shoulda.rb +9 -0
- data/rails/init.rb +7 -0
- data/test/README +36 -0
- data/test/fail_macros.rb +39 -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/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
- data/test/matchers/active_record/allow_value_matcher_test.rb +64 -0
- data/test/matchers/active_record/association_matcher_test.rb +263 -0
- data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -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_named_scope_matcher_test.rb +65 -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 +35 -0
- data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
- data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
- data/test/matchers/controller/respond_with_content_type_matcher_test.rb +32 -0
- data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
- data/test/matchers/controller/route_matcher_test.rb +75 -0
- data/test/matchers/controller/set_session_matcher_test.rb +38 -0
- data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
- data/test/model_builder.rb +106 -0
- data/test/other/autoload_macro_test.rb +18 -0
- data/test/other/context_test.rb +203 -0
- data/test/other/convert_to_should_syntax_test.rb +63 -0
- data/test/other/helpers_test.rb +340 -0
- data/test/other/private_helpers_test.rb +32 -0
- data/test/other/should_test.rb +271 -0
- data/test/rails_root/app/controllers/application_controller.rb +25 -0
- data/test/rails_root/app/controllers/posts_controller.rb +87 -0
- data/test/rails_root/app/controllers/users_controller.rb +84 -0
- data/test/rails_root/app/helpers/application_helper.rb +3 -0
- data/test/rails_root/app/helpers/posts_helper.rb +2 -0
- data/test/rails_root/app/helpers/users_helper.rb +2 -0
- data/test/rails_root/app/models/address.rb +7 -0
- data/test/rails_root/app/models/flea.rb +3 -0
- data/test/rails_root/app/models/friendship.rb +4 -0
- data/test/rails_root/app/models/pets/cat.rb +7 -0
- data/test/rails_root/app/models/pets/dog.rb +10 -0
- data/test/rails_root/app/models/post.rb +12 -0
- data/test/rails_root/app/models/product.rb +12 -0
- data/test/rails_root/app/models/profile.rb +2 -0
- data/test/rails_root/app/models/registration.rb +2 -0
- data/test/rails_root/app/models/tag.rb +8 -0
- data/test/rails_root/app/models/tagging.rb +4 -0
- data/test/rails_root/app/models/treat.rb +3 -0
- data/test/rails_root/app/models/user.rb +32 -0
- data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
- data/test/rails_root/app/views/layouts/users.rhtml +17 -0
- data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
- data/test/rails_root/app/views/posts/edit.rhtml +27 -0
- data/test/rails_root/app/views/posts/index.rhtml +25 -0
- data/test/rails_root/app/views/posts/new.rhtml +26 -0
- data/test/rails_root/app/views/posts/show.rhtml +18 -0
- data/test/rails_root/app/views/users/edit.rhtml +22 -0
- data/test/rails_root/app/views/users/index.rhtml +22 -0
- data/test/rails_root/app/views/users/new.rhtml +21 -0
- data/test/rails_root/app/views/users/show.rhtml +13 -0
- data/test/rails_root/config/boot.rb +110 -0
- data/test/rails_root/config/database.yml +4 -0
- data/test/rails_root/config/environment.rb +18 -0
- data/test/rails_root/config/environments/test.rb +0 -0
- data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
- data/test/rails_root/config/initializers/shoulda.rb +8 -0
- data/test/rails_root/config/routes.rb +6 -0
- data/test/rails_root/db/migrate/001_create_users.rb +19 -0
- data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
- data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
- data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
- data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
- data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
- data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
- data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
- data/test/rails_root/db/migrate/009_create_products.rb +17 -0
- data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
- data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
- data/test/rails_root/db/migrate/20090506203502_create_profiles.rb +12 -0
- data/test/rails_root/db/migrate/20090506203536_create_registrations.rb +14 -0
- data/test/rails_root/db/migrate/20090513104502_create_cats.rb +12 -0
- data/test/rails_root/db/schema.rb +0 -0
- data/test/rails_root/log/test.log +8963 -0
- data/test/rails_root/public/404.html +30 -0
- data/test/rails_root/public/422.html +30 -0
- data/test/rails_root/public/500.html +30 -0
- data/test/rails_root/script/console +3 -0
- data/test/rails_root/script/generate +3 -0
- data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
- data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
- data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
- data/test/rspec_test.rb +207 -0
- data/test/test_helper.rb +28 -0
- data/test/unit/address_test.rb +15 -0
- data/test/unit/cat_test.rb +7 -0
- data/test/unit/dog_test.rb +9 -0
- data/test/unit/flea_test.rb +6 -0
- data/test/unit/friendship_test.rb +6 -0
- data/test/unit/post_test.rb +19 -0
- data/test/unit/product_test.rb +23 -0
- data/test/unit/tag_test.rb +15 -0
- data/test/unit/tagging_test.rb +6 -0
- data/test/unit/user_test.rb +80 -0
- metadata +225 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActionView # :nodoc:
|
|
3
|
+
# = Macro test helpers for your view
|
|
4
|
+
#
|
|
5
|
+
# By using the macro helpers you can quickly and easily create concise and
|
|
6
|
+
# easy to read test suites.
|
|
7
|
+
#
|
|
8
|
+
# This code segment:
|
|
9
|
+
# context "on GET to :new" do
|
|
10
|
+
# setup do
|
|
11
|
+
# get :new
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# should_render_page_with_metadata :title => /index/
|
|
15
|
+
#
|
|
16
|
+
# should "do something else really cool" do
|
|
17
|
+
# assert_select '#really_cool'
|
|
18
|
+
# end
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# Would produce 3 tests for the +show+ action
|
|
22
|
+
module Macros
|
|
23
|
+
|
|
24
|
+
# Macro that creates a test asserting that the rendered view contains a <form> element.
|
|
25
|
+
#
|
|
26
|
+
# Deprecated.
|
|
27
|
+
def should_render_a_form
|
|
28
|
+
warn "[DEPRECATION] should_render_a_form is deprecated."
|
|
29
|
+
should "display a form" do
|
|
30
|
+
assert_select "form", true, "The template doesn't contain a <form> element"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Deprecated.
|
|
35
|
+
#
|
|
36
|
+
# Macro that creates a test asserting that the rendered view contains the selected metatags.
|
|
37
|
+
# Values can be string or Regexps.
|
|
38
|
+
# Example:
|
|
39
|
+
#
|
|
40
|
+
# should_render_page_with_metadata :description => "Description of this page", :keywords => /post/
|
|
41
|
+
#
|
|
42
|
+
# You can also use this method to test the rendered views title.
|
|
43
|
+
#
|
|
44
|
+
# Example:
|
|
45
|
+
# should_render_page_with_metadata :title => /index/
|
|
46
|
+
def should_render_page_with_metadata(options)
|
|
47
|
+
warn "[DEPRECATION] should_render_page_with_metadata is deprecated."
|
|
48
|
+
options.each do |key, value|
|
|
49
|
+
should "have metatag #{key}" do
|
|
50
|
+
if key.to_sym == :title
|
|
51
|
+
assert_select "title", value
|
|
52
|
+
else
|
|
53
|
+
assert_select "meta[name=?][content#{"*" if value.is_a?(Regexp)}=?]", key, value
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActiveRecord # :nodoc:
|
|
3
|
+
module Assertions
|
|
4
|
+
# Asserts that the given object can be saved
|
|
5
|
+
#
|
|
6
|
+
# assert_save User.new(params)
|
|
7
|
+
def assert_save(obj)
|
|
8
|
+
assert obj.save, "Errors: #{pretty_error_messages obj}"
|
|
9
|
+
obj.reload
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Asserts that the given object is valid
|
|
13
|
+
#
|
|
14
|
+
# assert_valid User.new(params)
|
|
15
|
+
def assert_valid(obj)
|
|
16
|
+
assert obj.valid?, "Errors: #{pretty_error_messages obj}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Asserts that an Active Record model validates with the passed
|
|
20
|
+
# <tt>value</tt> by making sure the <tt>error_message_to_avoid</tt> is not
|
|
21
|
+
# contained within the list of errors for that attribute.
|
|
22
|
+
#
|
|
23
|
+
# assert_good_value(User.new, :email, "user@example.com")
|
|
24
|
+
# assert_good_value(User.new, :ssn, "123456789", /length/)
|
|
25
|
+
#
|
|
26
|
+
# If a class is passed as the first argument, a new object will be
|
|
27
|
+
# instantiated before the assertion. If an instance variable exists with
|
|
28
|
+
# the same name as the class (underscored), that object will be used
|
|
29
|
+
# instead.
|
|
30
|
+
#
|
|
31
|
+
# assert_good_value(User, :email, "user@example.com")
|
|
32
|
+
#
|
|
33
|
+
# product = Product.new(:tangible => false)
|
|
34
|
+
# assert_good_value(product, :price, "0")
|
|
35
|
+
def assert_good_value(object_or_klass, attribute, value, error_message_to_avoid = nil)
|
|
36
|
+
object = get_instance_of(object_or_klass)
|
|
37
|
+
matcher = allow_value(value).
|
|
38
|
+
for(attribute).
|
|
39
|
+
with_message(error_message_to_avoid)
|
|
40
|
+
assert_accepts(matcher, object)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Asserts that an Active Record model invalidates the passed
|
|
44
|
+
# <tt>value</tt> by making sure the <tt>error_message_to_expect</tt> is
|
|
45
|
+
# contained within the list of errors for that attribute.
|
|
46
|
+
#
|
|
47
|
+
# assert_bad_value(User.new, :email, "invalid")
|
|
48
|
+
# assert_bad_value(User.new, :ssn, "123", /length/)
|
|
49
|
+
#
|
|
50
|
+
# If a class is passed as the first argument, a new object will be
|
|
51
|
+
# instantiated before the assertion. If an instance variable exists with
|
|
52
|
+
# the same name as the class (underscored), that object will be used
|
|
53
|
+
# instead.
|
|
54
|
+
#
|
|
55
|
+
# assert_bad_value(User, :email, "invalid")
|
|
56
|
+
#
|
|
57
|
+
# product = Product.new(:tangible => true)
|
|
58
|
+
# assert_bad_value(product, :price, "0")
|
|
59
|
+
def assert_bad_value(object_or_klass, attribute, value,
|
|
60
|
+
error_message_to_expect = nil)
|
|
61
|
+
object = get_instance_of(object_or_klass)
|
|
62
|
+
matcher = allow_value(value).
|
|
63
|
+
for(attribute).
|
|
64
|
+
with_message(error_message_to_expect)
|
|
65
|
+
assert_rejects(matcher, object)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Shoulda # :nodoc:
|
|
2
|
+
module ActiveRecord # :nodoc:
|
|
3
|
+
module Helpers
|
|
4
|
+
def pretty_error_messages(obj) # :nodoc:
|
|
5
|
+
obj.errors.map do |a, m|
|
|
6
|
+
msg = "#{a} #{m}"
|
|
7
|
+
msg << " (#{obj.send(a).inspect})" unless a.to_sym == :base
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Helper method that determines the default error message used by Active
|
|
12
|
+
# Record. Works for both existing Rails 2.1 and Rails 2.2 with the newly
|
|
13
|
+
# introduced I18n module used for localization.
|
|
14
|
+
#
|
|
15
|
+
# default_error_message(:blank)
|
|
16
|
+
# default_error_message(:too_short, :count => 5)
|
|
17
|
+
# default_error_message(:too_long, :count => 60)
|
|
18
|
+
def default_error_message(key, values = {})
|
|
19
|
+
if Object.const_defined?(:I18n) # Rails >= 2.2
|
|
20
|
+
I18n.translate("activerecord.errors.messages.#{key}", values)
|
|
21
|
+
else # Rails <= 2.1.x
|
|
22
|
+
::ActiveRecord::Errors.default_error_messages[key] % values[:count]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|