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,52 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', '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 File.join(File.dirname(__FILE__), '..', '..', '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
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class ValidateUniquenessOfMatcherTest < ActiveSupport::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a unique attribute" do
|
|
6
|
+
setup do
|
|
7
|
+
@model = define_model(:example, :attr => :string,
|
|
8
|
+
:other => :integer) do
|
|
9
|
+
validates_uniqueness_of :attr
|
|
10
|
+
end.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context "with an existing value" do
|
|
14
|
+
setup do
|
|
15
|
+
@existing = Example.create!(:attr => 'value', :other => 1)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "require a unique value for that attribute" do
|
|
19
|
+
assert_accepts validate_uniqueness_of(:attr), @model
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "pass when the subject is an existing record" do
|
|
23
|
+
assert_accepts validate_uniqueness_of(:attr), @existing
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "fail when a scope is specified" do
|
|
27
|
+
assert_rejects validate_uniqueness_of(:attr).scoped_to(:other), @model
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "without an existing value" do
|
|
32
|
+
setup do
|
|
33
|
+
assert_nil Example.find(:first)
|
|
34
|
+
@matcher = validate_uniqueness_of(:attr)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
should "fail to require a unique value" do
|
|
38
|
+
assert_rejects @matcher, @model
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
should "alert the tester that an existing value is not present" do
|
|
42
|
+
@matcher.matches?(@model)
|
|
43
|
+
assert @matcher.negative_failure_message =~ /^Can't find first .*/
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context "a unique attribute with a custom error and an existing value" do
|
|
49
|
+
setup do
|
|
50
|
+
@model = define_model(:example, :attr => :string) do
|
|
51
|
+
validates_uniqueness_of :attr, :message => 'Bad value'
|
|
52
|
+
end.new
|
|
53
|
+
Example.create!
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
should "fail when checking the default message" do
|
|
57
|
+
assert_rejects validate_uniqueness_of(:attr), @model
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
should "fail when checking a message that doesn't match" do
|
|
61
|
+
assert_rejects validate_uniqueness_of(:attr).with_message(/abc/i), @model
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
should "pass when checking a message that matches" do
|
|
65
|
+
assert_accepts validate_uniqueness_of(:attr).with_message(/bad/i), @model
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context "a scoped unique attribute with an existing value" do
|
|
70
|
+
setup do
|
|
71
|
+
@model = define_model(:example, :attr => :string,
|
|
72
|
+
:scope1 => :integer,
|
|
73
|
+
:scope2 => :integer) do
|
|
74
|
+
validates_uniqueness_of :attr, :scope => [:scope1, :scope2]
|
|
75
|
+
end.new
|
|
76
|
+
@existing = Example.create!(:attr => 'value', :scope1 => 1, :scope2 => 2)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
should "pass when the correct scope is specified" do
|
|
80
|
+
assert_accepts validate_uniqueness_of(:attr).scoped_to(:scope1, :scope2),
|
|
81
|
+
@model
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
should "pass when the subject is an existing record" do
|
|
85
|
+
assert_accepts validate_uniqueness_of(:attr).scoped_to(:scope1, :scope2),
|
|
86
|
+
@existing
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
should "fail when a different scope is specified" do
|
|
90
|
+
assert_rejects validate_uniqueness_of(:attr).scoped_to(:scope1), @model
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
should "fail when no scope is specified" do
|
|
94
|
+
assert_rejects validate_uniqueness_of(:attr), @model
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
should "fail when a non-existent attribute is specified as a scope" do
|
|
98
|
+
assert_rejects validate_uniqueness_of(:attr).scoped_to(:fake), @model
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
context "a non-unique attribute with an existing value" do
|
|
103
|
+
setup do
|
|
104
|
+
@model = define_model(:example, :attr => :string).new
|
|
105
|
+
Example.create!(:attr => 'value')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
should "not require a unique value for that attribute" do
|
|
109
|
+
assert_rejects validate_uniqueness_of(:attr), @model
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context "a case sensitive unique attribute with an existing value" do
|
|
114
|
+
setup do
|
|
115
|
+
@model = define_model(:example, :attr => :string) do
|
|
116
|
+
validates_uniqueness_of :attr, :case_sensitive => true
|
|
117
|
+
end.new
|
|
118
|
+
Example.create!(:attr => 'value')
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
should "not require a unique, case-insensitive value for that attribute" do
|
|
122
|
+
assert_rejects validate_uniqueness_of(:attr).case_insensitive, @model
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
should "require a unique, case-sensitive value for that attribute" do
|
|
126
|
+
assert_accepts validate_uniqueness_of(:attr), @model
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
context "a case sensitive unique integer attribute with an existing value" do
|
|
131
|
+
setup do
|
|
132
|
+
@model = define_model(:example, :attr => :integer) do
|
|
133
|
+
validates_uniqueness_of :attr, :case_sensitive => true
|
|
134
|
+
end.new
|
|
135
|
+
Example.create!(:attr => 'value')
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
should "require a unique, case-insensitive value for that attribute" do
|
|
139
|
+
assert_accepts validate_uniqueness_of(:attr).case_insensitive, @model
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
should "require a unique, case-sensitive value for that attribute" do
|
|
143
|
+
assert_accepts validate_uniqueness_of(:attr), @model
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class AssignToMatcherTest < ActionController::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller that assigns to an instance variable" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { @var = 'value' }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept assigning to that variable" do
|
|
11
|
+
assert_accepts assign_to(:var), @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept assigning to that variable with the correct class" do
|
|
15
|
+
assert_accepts assign_to(:var).with_kind_of(String), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "reject assigning to that variable with another class" do
|
|
19
|
+
assert_rejects assign_to(:var).with_kind_of(Fixnum), @controller
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "accept assigning the correct value to that variable" do
|
|
23
|
+
assert_accepts assign_to(:var).with('value'), @controller
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "reject assigning another value to that variable" do
|
|
27
|
+
assert_rejects assign_to(:var).with('other'), @controller
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "reject assigning to another variable" do
|
|
31
|
+
assert_rejects assign_to(:other), @controller
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class FilterParamMatcherTest < ActionController::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller that filters no parameters" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = define_controller(:examples).new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "reject filtering any parameter" do
|
|
11
|
+
assert_rejects filter_param(:any), @controller
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "a controller that filters a parameter" do
|
|
16
|
+
setup do
|
|
17
|
+
@controller = define_controller :examples do
|
|
18
|
+
filter_parameter_logging :password
|
|
19
|
+
end.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "accept filtering that parameter" do
|
|
23
|
+
assert_accepts filter_param(:password), @controller
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "reject filtering another parameter" do
|
|
27
|
+
assert_rejects filter_param(:other), @controller
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class RenderWithLayoutMatcherTest < ActionController::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller that renders with a layout" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { render :layout => 'wide' }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept rendering with any layout" do
|
|
11
|
+
assert_accepts render_with_layout, @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept rendering with that layout" do
|
|
15
|
+
assert_accepts render_with_layout(:wide), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "reject rendering with another layout" do
|
|
19
|
+
assert_rejects render_with_layout(:other), @controller
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "a controller that renders without a layout" do
|
|
24
|
+
setup do
|
|
25
|
+
@controller = build_response { render :layout => false }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "reject rendering with a layout" do
|
|
29
|
+
assert_rejects render_with_layout, @controller
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class RespondWithContentTypeMatcherTest < ActionController::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller responding with content type :xml" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { render :xml => { :user => "thoughtbot" }.to_xml }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept responding with content type :xml" do
|
|
11
|
+
assert_accepts respond_with_content_type(:xml), @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept responding with content type 'application/xml'" do
|
|
15
|
+
assert_accepts respond_with_content_type('application/xml'), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "accept responding with content type /xml/" do
|
|
19
|
+
assert_accepts respond_with_content_type(/xml/), @controller
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "reject responding with another content type" do
|
|
23
|
+
assert_rejects respond_with_content_type(:json), @controller
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
should "generate the correct test name" do
|
|
28
|
+
assert_equal "respond with content type of application/xml",
|
|
29
|
+
respond_with_content_type(:xml).description
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class RespondWithMatcherTest < ActionController::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller responding with success" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { render :text => "text", :status => 200 }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept responding with 200" do
|
|
11
|
+
assert_accepts respond_with(200), @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept responding with :success" do
|
|
15
|
+
assert_accepts respond_with(:success), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "reject responding with another status" do
|
|
19
|
+
assert_rejects respond_with(:error), @controller
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "a controller responding with redirect" do
|
|
24
|
+
setup do
|
|
25
|
+
@controller = build_response { render :text => "text", :status => 301 }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "accept responding with 301" do
|
|
29
|
+
assert_accepts respond_with(301), @controller
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
should "accept responding with :redirect" do
|
|
33
|
+
assert_accepts respond_with(:redirect), @controller
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
should "reject responding with another status" do
|
|
37
|
+
assert_rejects respond_with(:error), @controller
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "a controller responding with missing" do
|
|
42
|
+
setup do
|
|
43
|
+
@controller = build_response { render :text => "text", :status => 404 }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
should "accept responding with 404" do
|
|
47
|
+
assert_accepts respond_with(404), @controller
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
should "accept responding with :missing" do
|
|
51
|
+
assert_accepts respond_with(:missing), @controller
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
should "reject responding with another status" do
|
|
55
|
+
assert_rejects respond_with(:success), @controller
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "a controller responding with error" do
|
|
60
|
+
setup do
|
|
61
|
+
@controller = build_response { render :text => "text", :status => 500 }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
should "accept responding with 500" do
|
|
65
|
+
assert_accepts respond_with(500), @controller
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "accept responding with :error" do
|
|
69
|
+
assert_accepts respond_with(:error), @controller
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
should "reject responding with another status" do
|
|
73
|
+
assert_rejects respond_with(:success), @controller
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context "a controller responding with not implemented" do
|
|
78
|
+
setup do
|
|
79
|
+
@controller = build_response { render :text => "text", :status => 501 }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
should "accept responding with 501" do
|
|
83
|
+
assert_accepts respond_with(501), @controller
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
should "accept responding with :not_implemented" do
|
|
87
|
+
assert_accepts respond_with(:not_implemented), @controller
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
should "reject responding with another status" do
|
|
91
|
+
assert_rejects respond_with(:success), @controller
|
|
92
|
+
end
|
|
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
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class RouteToMatcherTest < ActionController::TestCase # :nodoc:
|
|
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
|
+
|
|
22
|
+
context "given a controller with a defined route" do
|
|
23
|
+
setup do
|
|
24
|
+
@controller = define_controller('Examples').new
|
|
25
|
+
define_routes do |map|
|
|
26
|
+
map.connect 'examples/:id', :controller => 'examples',
|
|
27
|
+
:action => 'example'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
should "accept routing the correct path to the correct parameters" do
|
|
32
|
+
assert_accepts route(:get, '/examples/1').
|
|
33
|
+
to(:action => 'example', :id => '1'),
|
|
34
|
+
@controller
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
should "accept a symbol controller" do
|
|
38
|
+
assert_accepts route(:get, '/examples/1').
|
|
39
|
+
to(:controller => :examples,
|
|
40
|
+
:action => 'example',
|
|
41
|
+
:id => '1'),
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
should "accept a symbol action" do
|
|
46
|
+
assert_accepts route(:get, '/examples/1').
|
|
47
|
+
to(:action => :example, :id => '1'),
|
|
48
|
+
@controller
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
should "accept a non-string parameter" do
|
|
52
|
+
assert_accepts route(:get, '/examples/1').
|
|
53
|
+
to(:action => 'example', :id => 1),
|
|
54
|
+
@controller
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
should "reject an undefined route" do
|
|
58
|
+
assert_rejects route(:get, '/bad_route').to(:var => 'value'), @controller
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
should "reject a route for another controller" do
|
|
62
|
+
@other = define_controller('Other').new
|
|
63
|
+
assert_rejects route(:get, '/examples/1').
|
|
64
|
+
to(:action => 'example', :id => '1'),
|
|
65
|
+
@other
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "reject a route for different parameters" do
|
|
69
|
+
assert_rejects route(:get, '/examples/1').
|
|
70
|
+
to(:action => 'other', :id => '1'),
|
|
71
|
+
@controller
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class SetSessionMatcherTest < ActionController::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller that sets a session variable" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response do
|
|
8
|
+
session[:var] = 'value'
|
|
9
|
+
session[:false_var] = false
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
should "accept assigning to that variable" do
|
|
14
|
+
assert_accepts set_session(:var), @controller
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
should "accept assigning the correct value to that variable" do
|
|
18
|
+
assert_accepts set_session(:var).to('value'), @controller
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
should "reject assigning another value to that variable" do
|
|
22
|
+
assert_rejects set_session(:var).to('other'), @controller
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
should "reject assigning to another variable" do
|
|
26
|
+
assert_rejects set_session(:other), @controller
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
should "accept assigning nil to another variable" do
|
|
30
|
+
assert_accepts set_session(:other).to(nil), @controller
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
should "accept assigning false to that variable" do
|
|
34
|
+
assert_accepts set_session(:false_var).to(false), @controller
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class SetTheFlashMatcherTest < ActionController::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller that sets a flash message" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { flash[:notice] = 'value' }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept setting any flash message" do
|
|
11
|
+
assert_accepts set_the_flash, @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept setting the exact flash message" do
|
|
15
|
+
assert_accepts set_the_flash.to('value'), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "accept setting a matched flash message" do
|
|
19
|
+
assert_accepts set_the_flash.to(/value/), @controller
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "reject setting a different flash message" do
|
|
23
|
+
assert_rejects set_the_flash.to('other'), @controller
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "reject setting a different pattern" do
|
|
27
|
+
assert_rejects set_the_flash.to(/other/), @controller
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "a controller that doesn't set a flash message" do
|
|
32
|
+
setup do
|
|
33
|
+
@controller = build_response
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
should "reject setting any flash message" do
|
|
37
|
+
assert_rejects set_the_flash, @controller
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|