faster_shoulda 2.11.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 +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 +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_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 +537 -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/hello_should.rb +37 -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 +263 -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 +325 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class EnsureLengthOfMatcher < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "an attribute with a non-zero minimum length validation" do
|
|
6
|
+
setup do
|
|
7
|
+
@model = define_model(:example, :attr => :string) do
|
|
8
|
+
validates_length_of :attr, :minimum => 4
|
|
9
|
+
end.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
should "accept ensuring the correct minimum length" do
|
|
13
|
+
assert_accepts ensure_length_of(:attr).is_at_least(4), @model
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should "reject ensuring a lower minimum length with any message" do
|
|
17
|
+
assert_rejects ensure_length_of(:attr).
|
|
18
|
+
is_at_least(3).
|
|
19
|
+
with_short_message(/.*/),
|
|
20
|
+
@model
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "reject ensuring a higher minimum length with any message" do
|
|
24
|
+
assert_rejects ensure_length_of(:attr).
|
|
25
|
+
is_at_least(5).
|
|
26
|
+
with_short_message(/.*/),
|
|
27
|
+
@model
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "not override the default message with a blank" do
|
|
31
|
+
assert_accepts ensure_length_of(:attr).
|
|
32
|
+
is_at_least(4).
|
|
33
|
+
with_short_message(nil),
|
|
34
|
+
@model
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "an attribute with a minimum length validation of 0" do
|
|
39
|
+
setup do
|
|
40
|
+
@model = define_model(:example, :attr => :string) do
|
|
41
|
+
validates_length_of :attr, :minimum => 0
|
|
42
|
+
end.new
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
should "accept ensuring the correct minimum length" do
|
|
46
|
+
assert_accepts ensure_length_of(:attr).is_at_least(0), @model
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "an attribute with a maximum length" do
|
|
51
|
+
setup do
|
|
52
|
+
@model = define_model(:example, :attr => :string) do
|
|
53
|
+
validates_length_of :attr, :maximum => 4
|
|
54
|
+
end.new
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
should "accept ensuring the correct maximum length" do
|
|
58
|
+
assert_accepts ensure_length_of(:attr).is_at_most(4), @model
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
should "reject ensuring a lower maximum length with any message" do
|
|
62
|
+
assert_rejects ensure_length_of(:attr).
|
|
63
|
+
is_at_most(3).
|
|
64
|
+
with_long_message(/.*/),
|
|
65
|
+
@model
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "reject ensuring a higher maximum length with any message" do
|
|
69
|
+
assert_rejects ensure_length_of(:attr).
|
|
70
|
+
is_at_most(5).
|
|
71
|
+
with_long_message(/.*/),
|
|
72
|
+
@model
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
should "not override the default message with a blank" do
|
|
76
|
+
assert_accepts ensure_length_of(:attr).
|
|
77
|
+
is_at_most(4).
|
|
78
|
+
with_long_message(nil),
|
|
79
|
+
@model
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context "an attribute with a required exact length" do
|
|
84
|
+
setup do
|
|
85
|
+
@model = define_model(:example, :attr => :string) do
|
|
86
|
+
validates_length_of :attr, :is => 4
|
|
87
|
+
end.new
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
should "accept ensuring the correct length" do
|
|
91
|
+
assert_accepts ensure_length_of(:attr).is_equal_to(4), @model
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
should "reject ensuring a lower maximum length with any message" do
|
|
95
|
+
assert_rejects ensure_length_of(:attr).
|
|
96
|
+
is_equal_to(3).
|
|
97
|
+
with_message(/.*/),
|
|
98
|
+
@model
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
should "reject ensuring a higher maximum length with any message" do
|
|
102
|
+
assert_rejects ensure_length_of(:attr).
|
|
103
|
+
is_equal_to(5).
|
|
104
|
+
with_message(/.*/),
|
|
105
|
+
@model
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
should "not override the default message with a blank" do
|
|
109
|
+
assert_accepts ensure_length_of(:attr).
|
|
110
|
+
is_equal_to(4).
|
|
111
|
+
with_message(nil),
|
|
112
|
+
@model
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context "an attribute with a custom minimum length validation" do
|
|
117
|
+
setup do
|
|
118
|
+
@model = define_model(:example, :attr => :string) do
|
|
119
|
+
validates_length_of :attr, :minimum => 4, :too_short => 'short'
|
|
120
|
+
end.new
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
should "accept ensuring the correct minimum length" do
|
|
124
|
+
assert_accepts ensure_length_of(:attr).
|
|
125
|
+
is_at_least(4).
|
|
126
|
+
with_short_message(/short/),
|
|
127
|
+
@model
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context "an attribute with a custom maximum length validation" do
|
|
133
|
+
setup do
|
|
134
|
+
@model = define_model(:example, :attr => :string) do
|
|
135
|
+
validates_length_of :attr, :maximum => 4, :too_long => 'long'
|
|
136
|
+
end.new
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
should "accept ensuring the correct minimum length" do
|
|
140
|
+
assert_accepts ensure_length_of(:attr).
|
|
141
|
+
is_at_most(4).
|
|
142
|
+
with_long_message(/long/),
|
|
143
|
+
@model
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context "an attribute without a length validation" do
|
|
149
|
+
setup do
|
|
150
|
+
@model = define_model(:example, :attr => :string).new
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
should "reject ensuring a minimum length" do
|
|
154
|
+
assert_rejects ensure_length_of(:attr).is_at_least(1), @model
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class HaveDbColumnMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "have_db_column" do
|
|
6
|
+
setup do
|
|
7
|
+
@matcher = have_db_column(:nickname)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept an existing database column" do
|
|
11
|
+
create_table 'superheros' do |table|
|
|
12
|
+
table.string :nickname
|
|
13
|
+
end
|
|
14
|
+
define_model_class 'Superhero'
|
|
15
|
+
assert_accepts @matcher, Superhero.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "reject a nonexistent database column" do
|
|
19
|
+
define_model :superhero
|
|
20
|
+
assert_rejects @matcher, Superhero.new
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "have_db_column of type string" do
|
|
25
|
+
setup do
|
|
26
|
+
@matcher = have_db_column(:nickname).of_type(:string)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
should "accept a column of correct type" do
|
|
30
|
+
create_table 'superheros' do |table|
|
|
31
|
+
table.string :nickname
|
|
32
|
+
end
|
|
33
|
+
define_model_class 'Superhero'
|
|
34
|
+
assert_accepts @matcher, Superhero.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
should "reject a nonexistent database column" do
|
|
38
|
+
define_model :superhero
|
|
39
|
+
assert_rejects @matcher, Superhero.new
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
should "reject a column of wrong type" do
|
|
43
|
+
create_table 'superheros' do |table|
|
|
44
|
+
table.integer :nickname
|
|
45
|
+
end
|
|
46
|
+
define_model_class 'Superhero'
|
|
47
|
+
assert_rejects @matcher, Superhero.new
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "have_db_column with precision option" do
|
|
52
|
+
setup do
|
|
53
|
+
@matcher = have_db_column(:salary).with_options(:precision => 5)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
should "accept a column of correct precision" do
|
|
57
|
+
create_table 'superheros' do |table|
|
|
58
|
+
table.decimal :salary, :precision => 5
|
|
59
|
+
end
|
|
60
|
+
define_model_class 'Superhero'
|
|
61
|
+
assert_accepts @matcher, Superhero.new
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
should "reject a column of wrong precision" do
|
|
65
|
+
create_table 'superheros' do |table|
|
|
66
|
+
table.decimal :salary, :precision => 15
|
|
67
|
+
end
|
|
68
|
+
define_model_class 'Superhero'
|
|
69
|
+
assert_rejects @matcher, Superhero.new
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "have_db_column with limit option" do
|
|
74
|
+
setup do
|
|
75
|
+
@matcher = have_db_column(:email).
|
|
76
|
+
of_type(:string).
|
|
77
|
+
with_options(:limit => 255)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
should "accept a column of correct limit" do
|
|
81
|
+
create_table 'superheros' do |table|
|
|
82
|
+
table.string :email, :limit => 255
|
|
83
|
+
end
|
|
84
|
+
define_model_class 'Superhero'
|
|
85
|
+
assert_accepts @matcher, Superhero.new
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
should "reject a column of wrong limit" do
|
|
89
|
+
create_table 'superheros' do |table|
|
|
90
|
+
table.string :email, :limit => 500
|
|
91
|
+
end
|
|
92
|
+
define_model_class 'Superhero'
|
|
93
|
+
assert_rejects @matcher, Superhero.new
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "have_db_column with default option" do
|
|
98
|
+
setup do
|
|
99
|
+
@matcher = have_db_column(:admin).
|
|
100
|
+
of_type(:boolean).
|
|
101
|
+
with_options(:default => false)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
should "accept a column of correct default" do
|
|
105
|
+
create_table 'superheros' do |table|
|
|
106
|
+
table.boolean :admin, :default => false
|
|
107
|
+
end
|
|
108
|
+
define_model_class 'Superhero'
|
|
109
|
+
assert_accepts @matcher, Superhero.new
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
should "reject a column of wrong default" do
|
|
113
|
+
create_table 'superheros' do |table|
|
|
114
|
+
table.boolean :admin, :default => true
|
|
115
|
+
end
|
|
116
|
+
define_model_class 'Superhero'
|
|
117
|
+
assert_rejects @matcher, Superhero.new
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
context "have_db_column with null option" do
|
|
122
|
+
setup do
|
|
123
|
+
@matcher = have_db_column(:admin).
|
|
124
|
+
of_type(:boolean).
|
|
125
|
+
with_options(:null => false)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
should "accept a column of correct null" do
|
|
129
|
+
create_table 'superheros' do |table|
|
|
130
|
+
table.boolean :admin, :null => false
|
|
131
|
+
end
|
|
132
|
+
define_model_class 'Superhero'
|
|
133
|
+
assert_accepts @matcher, Superhero.new
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
should "reject a column of wrong null" do
|
|
137
|
+
create_table 'superheros' do |table|
|
|
138
|
+
table.boolean :admin, :null => true
|
|
139
|
+
end
|
|
140
|
+
define_model_class 'Superhero'
|
|
141
|
+
assert_rejects @matcher, Superhero.new
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
context "have_db_column with scale option" do
|
|
146
|
+
setup do
|
|
147
|
+
@matcher = have_db_column(:salary).
|
|
148
|
+
of_type(:decimal).
|
|
149
|
+
with_options(:scale => 2)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
should "accept a column of correct scale" do
|
|
153
|
+
create_table 'superheros' do |table|
|
|
154
|
+
table.decimal :salary, :precision => 10, :scale => 2
|
|
155
|
+
end
|
|
156
|
+
define_model_class 'Superhero'
|
|
157
|
+
assert_accepts @matcher, Superhero.new
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
should "reject a column of wrong scale" do
|
|
161
|
+
create_table 'superheros' do |table|
|
|
162
|
+
table.decimal :salary, :precision => 10, :scale => 4
|
|
163
|
+
end
|
|
164
|
+
define_model_class 'Superhero'
|
|
165
|
+
assert_rejects @matcher, Superhero.new
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class HaveDbIndexMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "have_db_index" do
|
|
6
|
+
setup do
|
|
7
|
+
@matcher = have_db_index(:age)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept an existing index" do
|
|
11
|
+
db_connection = create_table 'superheros' do |table|
|
|
12
|
+
table.integer :age
|
|
13
|
+
end
|
|
14
|
+
db_connection.add_index :superheros, :age
|
|
15
|
+
define_model_class 'Superhero'
|
|
16
|
+
assert_accepts @matcher, Superhero.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
should "reject a nonexistent index" do
|
|
20
|
+
define_model :superhero
|
|
21
|
+
assert_rejects @matcher, Superhero.new
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context "have_db_index with unique option" do
|
|
26
|
+
setup do
|
|
27
|
+
@matcher = have_db_index(:ssn).unique(true)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "accept an index of correct unique" do
|
|
31
|
+
db_connection = create_table 'superheros' do |table|
|
|
32
|
+
table.integer :ssn
|
|
33
|
+
end
|
|
34
|
+
db_connection.add_index :superheros, :ssn, :unique => true
|
|
35
|
+
define_model_class 'Superhero'
|
|
36
|
+
assert_accepts @matcher, Superhero.new
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
should "reject an index of wrong unique" do
|
|
40
|
+
db_connection = create_table 'superheros' do |table|
|
|
41
|
+
table.integer :ssn
|
|
42
|
+
end
|
|
43
|
+
db_connection.add_index :superheros, :ssn, :unique => false
|
|
44
|
+
define_model_class 'Superhero'
|
|
45
|
+
assert_rejects @matcher, Superhero.new
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context "have_db_index on multiple columns" do
|
|
50
|
+
setup do
|
|
51
|
+
@matcher = have_db_index([:geocodable_type, :geocodable_id])
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
should "accept an existing index" do
|
|
55
|
+
db_connection = create_table 'geocodings' do |table|
|
|
56
|
+
table.integer :geocodable_id
|
|
57
|
+
table.string :geocodable_type
|
|
58
|
+
end
|
|
59
|
+
db_connection.add_index :geocodings, [:geocodable_type, :geocodable_id]
|
|
60
|
+
define_model_class 'Geocoding'
|
|
61
|
+
assert_accepts @matcher, Geocoding.new
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
should "reject a nonexistant index" do
|
|
65
|
+
db_connection = create_table 'geocodings' do |table|
|
|
66
|
+
table.integer :geocodable_id
|
|
67
|
+
table.string :geocodable_type
|
|
68
|
+
end
|
|
69
|
+
define_model_class 'Geocoding'
|
|
70
|
+
assert_rejects @matcher, Geocoding.new
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
should "join columns with and describing multiple columns" do
|
|
75
|
+
assert_match /on columns user_id and post_id/,
|
|
76
|
+
have_db_index([:user_id, :post_id]).description
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
should "describe a unique index as unique" do
|
|
80
|
+
assert_match /a unique index/, have_db_index(:user_id).unique(true).description
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
should "describe a non-unique index as non-unique" do
|
|
84
|
+
assert_match /a non-unique index/, have_db_index(:user_id).unique(false).description
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
should "not describe an index's uniqueness when it isn't important" do
|
|
88
|
+
assert_no_match /unique/, have_db_index(:user_id).description
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class HaveReadonlyAttributesMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "an attribute that cannot be set after being saved" do
|
|
6
|
+
setup do
|
|
7
|
+
define_model :example, :attr => :string do
|
|
8
|
+
attr_readonly :attr
|
|
9
|
+
end
|
|
10
|
+
@model = Example.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
should "accept being read-only" do
|
|
14
|
+
assert_accepts have_readonly_attribute(:attr), @model
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "an attribute that can be set after being saved" do
|
|
19
|
+
setup do
|
|
20
|
+
define_model :example, :attr => :string
|
|
21
|
+
@model = Example.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
should "accept being read-only" do
|
|
25
|
+
assert_rejects have_readonly_attribute(:attr), @model
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ValidateAcceptanceOfMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "an attribute which must be accepted" do
|
|
6
|
+
setup do
|
|
7
|
+
@model = define_model(:example) do
|
|
8
|
+
validates_acceptance_of :attr
|
|
9
|
+
end.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
should "require that attribute to be accepted" do
|
|
13
|
+
assert_accepts validate_acceptance_of(:attr), @model
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should "not overwrite the default message with nil" do
|
|
17
|
+
assert_accepts validate_acceptance_of(:attr).with_message(nil), @model
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "an attribute that does not need to be accepted" do
|
|
22
|
+
setup do
|
|
23
|
+
@model = define_model(:example, :attr => :string).new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "not require that attribute to be accepted" do
|
|
27
|
+
assert_rejects validate_acceptance_of(:attr), @model
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "an attribute which must be accepted with a custom message" do
|
|
32
|
+
setup do
|
|
33
|
+
@model = define_model(:example) do
|
|
34
|
+
validates_acceptance_of :attr, :message => 'custom'
|
|
35
|
+
end.new
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "require that attribute to be accepted with that message" do
|
|
39
|
+
assert_accepts validate_acceptance_of(:attr).with_message(/custom/),
|
|
40
|
+
@model
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ValidateFormatOfMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
context "a postal code" do
|
|
7
|
+
setup do
|
|
8
|
+
define_model :example, :attr => :string do
|
|
9
|
+
validates_format_of :attr, :with => /^\d{5}$/
|
|
10
|
+
end
|
|
11
|
+
@model = Example.new
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "be valid" do
|
|
15
|
+
assert_accepts validate_format_of(:attr).with('12345'), @model
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "not be valid with alpha in zip" do
|
|
19
|
+
assert_rejects validate_format_of(:attr).not_with('1234a'), @model, :message=>"is invalid"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "not be valid with to few digits" do
|
|
23
|
+
assert_rejects validate_format_of(:attr).not_with('1234'), @model, :message=>"is invalid"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "not be valid with to many digits" do
|
|
27
|
+
assert_rejects validate_format_of(:attr).not_with('123456'), @model, :message=>"is invalid"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "raise error if you try to call both with and not_with" do
|
|
31
|
+
assert_raise RuntimeError do
|
|
32
|
+
validate_format_of(:attr).not_with('123456').with('12345')
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ValidateNumericalityOfMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a numeric attribute" do
|
|
6
|
+
setup do
|
|
7
|
+
define_model :example, :attr => :string do
|
|
8
|
+
validates_numericality_of :attr
|
|
9
|
+
end
|
|
10
|
+
@model = Example.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
should "only allow numeric values for that attribute" do
|
|
14
|
+
assert_accepts validate_numericality_of(:attr), @model
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
should "not override the default message with a blank" do
|
|
18
|
+
assert_accepts validate_numericality_of(:attr).with_message(nil),
|
|
19
|
+
@model
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "a numeric attribute with a custom validation message" do
|
|
24
|
+
setup do
|
|
25
|
+
define_model :example, :attr => :string do
|
|
26
|
+
validates_numericality_of :attr, :message => 'custom'
|
|
27
|
+
end
|
|
28
|
+
@model = Example.new
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
should "only allow numeric values for that attribute with that message" do
|
|
32
|
+
assert_accepts validate_numericality_of(:attr).
|
|
33
|
+
with_message(/custom/),
|
|
34
|
+
@model
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
should "not allow numeric values for that attribute with another message" do
|
|
38
|
+
assert_rejects validate_numericality_of(:attr), @model
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context "a non-numeric attribute" do
|
|
43
|
+
setup do
|
|
44
|
+
@model = define_model(:example, :attr => :string).new
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
should "not only allow numeric values for that attribute" do
|
|
48
|
+
assert_rejects validate_numericality_of(:attr), @model
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ValidatePresenceOfMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a required attribute" do
|
|
6
|
+
setup do
|
|
7
|
+
define_model :example, :attr => :string do
|
|
8
|
+
validates_presence_of :attr
|
|
9
|
+
end
|
|
10
|
+
@model = Example.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
should "require a value" do
|
|
14
|
+
assert_accepts validate_presence_of(:attr), @model
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
should "not override the default message with a blank" do
|
|
18
|
+
assert_accepts validate_presence_of(:attr).with_message(nil), @model
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "an optional attribute" do
|
|
23
|
+
setup do
|
|
24
|
+
@model = define_model(:example, :attr => :string).new
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
should "not require a value" do
|
|
28
|
+
assert_rejects validate_presence_of(:attr), @model
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "a required has_many association" do
|
|
33
|
+
setup do
|
|
34
|
+
define_model :child
|
|
35
|
+
@model = define_model :parent do
|
|
36
|
+
has_many :children
|
|
37
|
+
validates_presence_of :children
|
|
38
|
+
end.new
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
should "require the attribute to be set" do
|
|
42
|
+
assert_accepts validate_presence_of(:children), @model
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context "an optional has_many association" do
|
|
47
|
+
setup do
|
|
48
|
+
define_model :child
|
|
49
|
+
@model = define_model :parent do
|
|
50
|
+
has_many :children
|
|
51
|
+
end.new
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
should "not require the attribute to be set" do
|
|
55
|
+
assert_rejects validate_presence_of(:children), @model
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "a required has_and_belongs_to_many association" do
|
|
60
|
+
setup do
|
|
61
|
+
define_model :child
|
|
62
|
+
@model = define_model :parent do
|
|
63
|
+
has_and_belongs_to_many :children
|
|
64
|
+
validates_presence_of :children
|
|
65
|
+
end.new
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "require the attribute to be set" do
|
|
69
|
+
assert_accepts validate_presence_of(:children), @model
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "an optional has_and_belongs_to_many association" do
|
|
74
|
+
setup do
|
|
75
|
+
define_model :child
|
|
76
|
+
@model = define_model :parent do
|
|
77
|
+
has_and_belongs_to_many :children
|
|
78
|
+
end.new
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
should "not require the attribute to be set" do
|
|
82
|
+
assert_rejects validate_presence_of(:children), @model
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|