francois-shoulda 2.0.5.4 → 2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +60 -10
- data/Rakefile +7 -7
- data/lib/shoulda.rb +7 -15
- data/lib/shoulda/action_controller.rb +28 -0
- data/lib/shoulda/action_controller/helpers.rb +47 -0
- data/lib/shoulda/action_controller/macros.rb +277 -0
- data/lib/shoulda/action_controller/matchers.rb +37 -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 +70 -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_mailer.rb +1 -1
- data/lib/shoulda/action_mailer/assertions.rb +32 -33
- data/lib/shoulda/action_view.rb +10 -0
- data/lib/shoulda/action_view/macros.rb +56 -0
- data/lib/shoulda/active_record.rb +6 -2
- data/lib/shoulda/active_record/assertions.rb +62 -89
- data/lib/shoulda/active_record/helpers.rb +40 -0
- data/lib/shoulda/active_record/macros.rb +520 -684
- data/lib/shoulda/active_record/matchers.rb +42 -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_index_matcher.rb +105 -0
- data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -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_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/assertions.rb +50 -40
- data/lib/shoulda/autoload_macros.rb +46 -0
- data/lib/shoulda/context.rb +124 -126
- data/lib/shoulda/helpers.rb +5 -7
- data/lib/shoulda/macros.rb +63 -64
- data/lib/shoulda/private_helpers.rb +16 -18
- data/lib/shoulda/rails.rb +5 -11
- data/lib/shoulda/rspec.rb +11 -0
- data/lib/shoulda/tasks/list_tests.rake +6 -1
- data/lib/shoulda/test_unit.rb +19 -0
- data/rails/init.rb +7 -1
- data/test/README +2 -2
- data/test/fail_macros.rb +15 -15
- data/test/fixtures/tags.yml +1 -1
- data/test/functional/posts_controller_test.rb +46 -26
- data/test/functional/users_controller_test.rb +0 -19
- data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
- data/test/matchers/active_record/allow_value_matcher_test.rb +41 -0
- data/test/matchers/active_record/association_matcher_test.rb +258 -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_index_matcher_test.rb +74 -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_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 +27 -0
- data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
- data/test/matchers/controller/route_matcher_test.rb +58 -0
- data/test/matchers/controller/set_session_matcher_test.rb +31 -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/helpers_test.rb +58 -0
- data/test/other/private_helpers_test.rb +1 -1
- data/test/other/should_test.rb +16 -16
- data/test/rails_root/app/controllers/posts_controller.rb +6 -5
- data/test/rails_root/app/models/pets/dog.rb +10 -0
- data/test/rails_root/app/models/treat.rb +3 -0
- data/test/rails_root/app/models/user.rb +4 -3
- data/test/rails_root/app/views/layouts/posts.rhtml +2 -0
- data/test/rails_root/config/database.yml +1 -1
- data/test/rails_root/config/environment.rb +1 -1
- data/test/rails_root/config/environments/{sqlite3.rb → test.rb} +0 -0
- data/test/rails_root/db/migrate/001_create_users.rb +3 -2
- data/test/rails_root/db/migrate/011_create_treats.rb +12 -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 +3 -1
- data/test/unit/address_test.rb +1 -23
- data/test/unit/dog_test.rb +5 -2
- data/test/unit/post_test.rb +7 -3
- data/test/unit/product_test.rb +2 -2
- data/test/unit/tag_test.rb +2 -1
- data/test/unit/user_test.rb +25 -9
- metadata +84 -23
- data/lib/shoulda/controller.rb +0 -30
- data/lib/shoulda/controller/formats/html.rb +0 -201
- data/lib/shoulda/controller/formats/xml.rb +0 -170
- data/lib/shoulda/controller/helpers.rb +0 -64
- data/lib/shoulda/controller/macros.rb +0 -316
- data/lib/shoulda/controller/resource_options.rb +0 -236
- data/test/rails_root/app/models/dog.rb +0 -5
@@ -0,0 +1,158 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
2
|
+
|
3
|
+
class EnsureLengthOfMatcher < Test::Unit::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 File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
2
|
+
|
3
|
+
class HaveDbColumnMatcherTest < Test::Unit::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,74 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
2
|
+
|
3
|
+
class HaveIndexMatcherTest < Test::Unit::TestCase # :nodoc:
|
4
|
+
|
5
|
+
context "have_index" do
|
6
|
+
setup do
|
7
|
+
@matcher = have_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_index with unique option" do
|
26
|
+
setup do
|
27
|
+
@matcher = have_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_index on multiple columns" do
|
50
|
+
setup do
|
51
|
+
@matcher = have_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
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
2
|
+
|
3
|
+
class HaveNamedScopeMatcherTest < Test::Unit::TestCase # :nodoc:
|
4
|
+
|
5
|
+
context "an attribute with a named scope" do
|
6
|
+
setup do
|
7
|
+
define_model :example, :attr => :string do
|
8
|
+
named_scope :xyz, lambda {|n|
|
9
|
+
{ :order => :attr }
|
10
|
+
}
|
11
|
+
end
|
12
|
+
@model = Example.new
|
13
|
+
end
|
14
|
+
|
15
|
+
should "accept having a scope with the correct signature" do
|
16
|
+
assert_accepts have_named_scope("xyz(1)"), @model
|
17
|
+
end
|
18
|
+
|
19
|
+
should "accept having a scope with the correct signature and find options" do
|
20
|
+
assert_accepts have_named_scope("xyz(1)").finding(:order => :attr), @model
|
21
|
+
end
|
22
|
+
|
23
|
+
should "reject having a scope with incorrect find options" do
|
24
|
+
assert_rejects have_named_scope("xyz(1)").
|
25
|
+
finding(:order => 'attr DESC'),
|
26
|
+
@model
|
27
|
+
end
|
28
|
+
|
29
|
+
should "reject having a scope with another name" do
|
30
|
+
assert_rejects have_named_scope("abc(1)"), @model
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
should "evaluate the scope in the correct context" do
|
36
|
+
define_model :example, :attr => :string do
|
37
|
+
named_scope :xyz, lambda {|n|
|
38
|
+
{ :order => n }
|
39
|
+
}
|
40
|
+
end
|
41
|
+
model = Example.new
|
42
|
+
@order = :attr
|
43
|
+
assert_accepts have_named_scope("xyz(@order)").
|
44
|
+
finding(:order => @order).
|
45
|
+
in_context(self),
|
46
|
+
model
|
47
|
+
end
|
48
|
+
|
49
|
+
context "a method that does not return a scope" do
|
50
|
+
setup do
|
51
|
+
klass = Class.new
|
52
|
+
klass.class_eval do
|
53
|
+
def self.xyz
|
54
|
+
'xyz'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
@model = klass.new
|
58
|
+
end
|
59
|
+
|
60
|
+
should "reject having a named scope with that name" do
|
61
|
+
assert_rejects have_named_scope(:xyz), @model
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|