shoulda-matchers 1.4.2 → 1.5.0
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/.travis.yml +11 -3
- data/Appraisals +3 -3
- data/Gemfile +1 -1
- data/Gemfile.lock +69 -70
- data/MIT-LICENSE +1 -1
- data/NEWS.md +22 -4
- data/README.md +3 -1
- data/Rakefile +9 -5
- data/features/step_definitions/rails_steps.rb +7 -7
- data/features/support/env.rb +1 -1
- data/gemfiles/3.0.gemfile +1 -1
- data/gemfiles/3.0.gemfile.lock +25 -22
- data/gemfiles/3.1.gemfile +1 -1
- data/gemfiles/3.1.gemfile.lock +27 -24
- data/gemfiles/3.2.gemfile +1 -1
- data/gemfiles/3.2.gemfile.lock +56 -52
- data/lib/shoulda/matchers/action_controller.rb +3 -2
- data/lib/shoulda/matchers/action_controller/assign_to_matcher.rb +10 -8
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +2 -4
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +3 -4
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +3 -4
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +6 -6
- data/lib/shoulda/matchers/action_controller/respond_with_content_type_matcher.rb +5 -2
- data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +2 -2
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +12 -12
- data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -4
- data/lib/shoulda/matchers/action_controller/set_the_flash_matcher.rb +10 -11
- data/lib/shoulda/matchers/action_controller/strong_parameters_matcher.rb +121 -0
- data/lib/shoulda/matchers/action_mailer/have_sent_email_matcher.rb +7 -4
- data/lib/shoulda/matchers/active_model.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +8 -8
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +5 -4
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_model/exception_message_finder.rb +0 -1
- data/lib/shoulda/matchers/active_model/helpers.rb +16 -7
- data/lib/shoulda/matchers/active_model/only_integer_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +8 -6
- data/lib/shoulda/matchers/active_model/validate_format_of_matcher.rb +19 -10
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +4 -4
- data/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb +19 -21
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +7 -7
- data/lib/shoulda/matchers/active_model/validation_message_finder.rb +1 -1
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +5 -5
- data/lib/shoulda/matchers/active_record/association_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +11 -7
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +5 -5
- data/lib/shoulda/matchers/active_record/query_the_database_matcher.rb +5 -2
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +3 -3
- data/lib/shoulda/matchers/assertion_error.rb +4 -1
- data/lib/shoulda/matchers/independent/delegate_matcher.rb +17 -7
- data/lib/shoulda/matchers/integrations/rspec.rb +19 -33
- data/lib/shoulda/matchers/version.rb +1 -1
- data/shoulda-matchers.gemspec +6 -4
- data/spec/shoulda/matchers/action_controller/assign_to_matcher_spec.rb +66 -0
- data/spec/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +22 -0
- data/spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +42 -0
- data/spec/shoulda/matchers/action_controller/render_template_matcher_spec.rb +78 -0
- data/spec/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +58 -0
- data/spec/shoulda/matchers/action_controller/respond_with_content_type_matcher_spec.rb +31 -0
- data/spec/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +31 -0
- data/spec/shoulda/matchers/action_controller/route_matcher_spec.rb +65 -0
- data/spec/shoulda/matchers/action_controller/set_session_matcher_spec.rb +51 -0
- data/spec/shoulda/matchers/action_controller/set_the_flash_matcher_spec.rb +153 -0
- data/spec/shoulda/matchers/action_controller/strong_parameters_matcher_spec.rb +142 -0
- data/spec/shoulda/matchers/action_mailer/have_sent_email_spec.rb +324 -0
- data/spec/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +111 -0
- data/spec/shoulda/matchers/active_model/allow_value_matcher_spec.rb +124 -0
- data/spec/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +43 -0
- data/spec/shoulda/matchers/active_model/ensure_exclusion_of_matcher_spec.rb +74 -0
- data/spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb +171 -0
- data/spec/shoulda/matchers/active_model/ensure_length_of_matcher_spec.rb +113 -0
- data/spec/shoulda/{active_model → matchers/active_model}/exception_message_finder_spec.rb +2 -2
- data/spec/shoulda/matchers/active_model/helpers_spec.rb +158 -0
- data/spec/shoulda/matchers/active_model/only_integer_matcher_spec.rb +52 -0
- data/spec/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +41 -0
- data/spec/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +41 -0
- data/spec/shoulda/matchers/active_model/validate_format_of_matcher_spec.rb +75 -0
- data/spec/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +73 -0
- data/spec/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +127 -0
- data/spec/shoulda/matchers/active_model/validate_uniqueness_of_matcher_spec.rb +175 -0
- data/spec/shoulda/{active_model → matchers/active_model}/validation_message_finder_spec.rb +0 -1
- data/spec/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +106 -0
- data/spec/shoulda/matchers/active_record/association_matcher_spec.rb +534 -0
- data/spec/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +111 -0
- data/spec/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +78 -0
- data/spec/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +41 -0
- data/spec/shoulda/{active_record → matchers/active_record}/query_the_database_matcher_spec.rb +10 -10
- data/spec/shoulda/matchers/active_record/serialize_matcher_spec.rb +86 -0
- data/spec/shoulda/{independent → matchers/independent}/delegate_matcher_spec.rb +55 -34
- data/spec/spec_helper.rb +1 -2
- data/spec/support/active_model_versions.rb +4 -0
- data/spec/support/activemodel_helpers.rb +19 -0
- data/spec/support/controller_builder.rb +38 -12
- data/spec/support/model_builder.rb +8 -2
- metadata +106 -98
- data/spec/fixtures/addresses.yml +0 -3
- data/spec/fixtures/friendships.yml +0 -0
- data/spec/fixtures/posts.yml +0 -5
- data/spec/fixtures/products.yml +0 -0
- data/spec/fixtures/taggings.yml +0 -0
- data/spec/fixtures/tags.yml +0 -9
- data/spec/fixtures/users.yml +0 -6
- data/spec/shoulda/action_controller/assign_to_matcher_spec.rb +0 -63
- data/spec/shoulda/action_controller/filter_param_matcher_spec.rb +0 -20
- data/spec/shoulda/action_controller/redirect_to_matcher_spec.rb +0 -40
- data/spec/shoulda/action_controller/render_template_matcher_spec.rb +0 -69
- data/spec/shoulda/action_controller/render_with_layout_matcher_spec.rb +0 -55
- data/spec/shoulda/action_controller/respond_with_content_type_matcher_spec.rb +0 -28
- data/spec/shoulda/action_controller/respond_with_matcher_spec.rb +0 -83
- data/spec/shoulda/action_controller/route_matcher_spec.rb +0 -65
- data/spec/shoulda/action_controller/set_session_matcher_spec.rb +0 -46
- data/spec/shoulda/action_controller/set_the_flash_matcher_spec.rb +0 -130
- data/spec/shoulda/action_mailer/have_sent_email_spec.rb +0 -333
- data/spec/shoulda/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
- data/spec/shoulda/active_model/allow_value_matcher_spec.rb +0 -131
- data/spec/shoulda/active_model/disallow_value_matcher_spec.rb +0 -65
- data/spec/shoulda/active_model/ensure_exclusion_of_matcher_spec.rb +0 -79
- data/spec/shoulda/active_model/ensure_inclusion_of_matcher_spec.rb +0 -181
- data/spec/shoulda/active_model/ensure_length_of_matcher_spec.rb +0 -138
- data/spec/shoulda/active_model/helpers_spec.rb +0 -129
- data/spec/shoulda/active_model/only_integer_matcher_spec.rb +0 -69
- data/spec/shoulda/active_model/validate_acceptance_of_matcher_spec.rb +0 -43
- data/spec/shoulda/active_model/validate_confirmation_of_matcher_spec.rb +0 -48
- data/spec/shoulda/active_model/validate_format_of_matcher_spec.rb +0 -79
- data/spec/shoulda/active_model/validate_numericality_of_matcher_spec.rb +0 -112
- data/spec/shoulda/active_model/validate_presence_of_matcher_spec.rb +0 -135
- data/spec/shoulda/active_model/validate_uniqueness_of_matcher_spec.rb +0 -154
- data/spec/shoulda/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -84
- data/spec/shoulda/active_record/association_matcher_spec.rb +0 -642
- data/spec/shoulda/active_record/have_db_column_matcher_spec.rb +0 -185
- data/spec/shoulda/active_record/have_db_index_matcher_spec.rb +0 -105
- data/spec/shoulda/active_record/have_readonly_attributes_matcher_spec.rb +0 -46
- data/spec/shoulda/active_record/serialize_matcher_spec.rb +0 -81
@@ -1,642 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Shoulda::Matchers::ActiveRecord::AssociationMatcher do
|
4
|
-
context "belong_to" do
|
5
|
-
before do
|
6
|
-
@matcher = belong_to(:parent)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should accept a good association with the default foreign key" do
|
10
|
-
define_model :parent
|
11
|
-
define_model :child, :parent_id => :integer do
|
12
|
-
belongs_to :parent
|
13
|
-
end
|
14
|
-
Child.new.should @matcher
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should reject a nonexistent association" do
|
18
|
-
define_model :child
|
19
|
-
Child.new.should_not @matcher
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should reject an association of the wrong type" do
|
23
|
-
define_model :parent, :child_id => :integer
|
24
|
-
child_class = define_model :child do
|
25
|
-
has_one :parent
|
26
|
-
end
|
27
|
-
Child.new.should_not @matcher
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should reject an association that has a nonexistent foreign key" do
|
31
|
-
define_model :parent
|
32
|
-
define_model :child do
|
33
|
-
belongs_to :parent
|
34
|
-
end
|
35
|
-
Child.new.should_not @matcher
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should accept an association with an existing custom foreign key" do
|
39
|
-
define_model :parent
|
40
|
-
define_model :child, :guardian_id => :integer do
|
41
|
-
belongs_to :parent, :foreign_key => 'guardian_id'
|
42
|
-
end
|
43
|
-
Child.new.should @matcher
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should accept a polymorphic association" do
|
47
|
-
define_model :child, :parent_type => :string,
|
48
|
-
:parent_id => :integer do
|
49
|
-
belongs_to :parent, :polymorphic => true
|
50
|
-
end
|
51
|
-
Child.new.should @matcher
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should accept an association with a valid :dependent option" do
|
55
|
-
define_model :parent
|
56
|
-
define_model :child, :parent_id => :integer do
|
57
|
-
belongs_to :parent, :dependent => :destroy
|
58
|
-
end
|
59
|
-
Child.new.should @matcher.dependent(:destroy)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should reject an association with a bad :dependent option" do
|
63
|
-
define_model :parent
|
64
|
-
define_model :child, :parent_id => :integer do
|
65
|
-
belongs_to :parent
|
66
|
-
end
|
67
|
-
Child.new.should_not @matcher.dependent(:destroy)
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should accept an association with a valid :conditions option" do
|
71
|
-
define_model :parent, :adopter => :boolean
|
72
|
-
define_model :child, :parent_id => :integer do
|
73
|
-
belongs_to :parent, :conditions => { :adopter => true }
|
74
|
-
end
|
75
|
-
Child.new.should @matcher.conditions(:adopter => true)
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should reject an association with a bad :conditions option" do
|
79
|
-
define_model :parent, :adopter => :boolean
|
80
|
-
define_model :child, :parent_id => :integer do
|
81
|
-
belongs_to :parent
|
82
|
-
end
|
83
|
-
Child.new.should_not @matcher.conditions(:adopter => true)
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should accept an association with a valid :class_name option" do
|
87
|
-
define_model :tree_parent, :adopter => :boolean
|
88
|
-
define_model :child, :parent_id => :integer do
|
89
|
-
belongs_to :parent, :class_name => 'TreeParent'
|
90
|
-
end
|
91
|
-
Child.new.should @matcher.class_name('TreeParent')
|
92
|
-
end
|
93
|
-
|
94
|
-
it "should reject an association with a bad :class_name option" do
|
95
|
-
define_model :parent, :adopter => :boolean
|
96
|
-
define_model :child, :parent_id => :integer do
|
97
|
-
belongs_to :parent
|
98
|
-
end
|
99
|
-
Child.new.should_not @matcher.class_name('TreeChild')
|
100
|
-
end
|
101
|
-
|
102
|
-
context 'should accept an association with a false :validate option' do
|
103
|
-
before do
|
104
|
-
define_model :parent, :adopter => :boolean
|
105
|
-
define_model :child, :parent_id => :integer do
|
106
|
-
belongs_to :parent, :validate => false
|
107
|
-
end
|
108
|
-
end
|
109
|
-
subject { Child.new }
|
110
|
-
specify { subject.should @matcher.validate(false) }
|
111
|
-
specify { subject.should_not @matcher.validate(true) }
|
112
|
-
specify { subject.should_not @matcher.validate }
|
113
|
-
end
|
114
|
-
|
115
|
-
context 'should accept an association with a true :validate option' do
|
116
|
-
before do
|
117
|
-
define_model :parent, :adopter => :boolean
|
118
|
-
define_model :child, :parent_id => :integer do
|
119
|
-
belongs_to :parent, :validate => true
|
120
|
-
end
|
121
|
-
end
|
122
|
-
subject { Child.new }
|
123
|
-
specify { subject.should_not @matcher.validate(false) }
|
124
|
-
specify { subject.should @matcher.validate(true) }
|
125
|
-
specify { subject.should @matcher.validate }
|
126
|
-
end
|
127
|
-
|
128
|
-
context 'should accept an association without a :validate option' do
|
129
|
-
before do
|
130
|
-
define_model :parent, :adopter => :boolean
|
131
|
-
define_model :child, :parent_id => :integer do
|
132
|
-
belongs_to :parent
|
133
|
-
end
|
134
|
-
end
|
135
|
-
subject { Child.new }
|
136
|
-
specify { subject.should @matcher.validate(false) }
|
137
|
-
specify { subject.should_not @matcher.validate(true) }
|
138
|
-
specify { subject.should_not @matcher.validate }
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
context "have_many" do
|
144
|
-
before do
|
145
|
-
@matcher = have_many(:children)
|
146
|
-
end
|
147
|
-
|
148
|
-
it "should accept a valid association without any options" do
|
149
|
-
define_model :child, :parent_id => :integer
|
150
|
-
define_model :parent do
|
151
|
-
has_many :children
|
152
|
-
end
|
153
|
-
Parent.new.should @matcher
|
154
|
-
end
|
155
|
-
|
156
|
-
it "should accept a valid association with a :through option" do
|
157
|
-
define_model :child
|
158
|
-
define_model :conception, :child_id => :integer,
|
159
|
-
:parent_id => :integer do
|
160
|
-
belongs_to :child
|
161
|
-
end
|
162
|
-
define_model :parent do
|
163
|
-
has_many :conceptions
|
164
|
-
has_many :children, :through => :conceptions
|
165
|
-
end
|
166
|
-
Parent.new.should @matcher
|
167
|
-
end
|
168
|
-
|
169
|
-
it "should accept a valid association with an :as option" do
|
170
|
-
define_model :child, :guardian_type => :string,
|
171
|
-
:guardian_id => :integer
|
172
|
-
define_model :parent do
|
173
|
-
has_many :children, :as => :guardian
|
174
|
-
end
|
175
|
-
Parent.new.should @matcher
|
176
|
-
end
|
177
|
-
|
178
|
-
it "should reject an association that has a nonexistent foreign key" do
|
179
|
-
define_model :child
|
180
|
-
define_model :parent do
|
181
|
-
has_many :children
|
182
|
-
end
|
183
|
-
Parent.new.should_not @matcher
|
184
|
-
end
|
185
|
-
|
186
|
-
it "should reject an association with a bad :as option" do
|
187
|
-
define_model :child, :caretaker_type => :string,
|
188
|
-
:caretaker_id => :integer
|
189
|
-
define_model :parent do
|
190
|
-
has_many :children, :as => :guardian
|
191
|
-
end
|
192
|
-
Parent.new.should_not @matcher
|
193
|
-
end
|
194
|
-
|
195
|
-
it "should reject an association that has a bad :through option" do
|
196
|
-
define_model :child, :parent_id => :integer
|
197
|
-
define_model :parent do
|
198
|
-
has_many :children
|
199
|
-
end
|
200
|
-
@matcher.through(:conceptions).matches?(Parent.new).should be_false
|
201
|
-
@matcher.failure_message.should =~ /does not have any relationship to conceptions/
|
202
|
-
end
|
203
|
-
|
204
|
-
it "should reject an association that has the wrong :through option" do
|
205
|
-
define_model :child
|
206
|
-
define_model :conception, :child_id => :integer,
|
207
|
-
:parent_id => :integer do
|
208
|
-
belongs_to :child
|
209
|
-
end
|
210
|
-
define_model :parent do
|
211
|
-
has_many :conceptions
|
212
|
-
has_many :relationships
|
213
|
-
has_many :children, :through => :conceptions
|
214
|
-
end
|
215
|
-
@matcher.through(:relationships).matches?(Parent.new).should be_false
|
216
|
-
@matcher.failure_message.should =~ /through relationships, but got it through conceptions/
|
217
|
-
end
|
218
|
-
|
219
|
-
it "should accept an association with a valid :dependent option" do
|
220
|
-
define_model :child, :parent_id => :integer
|
221
|
-
define_model :parent do
|
222
|
-
has_many :children, :dependent => :destroy
|
223
|
-
end
|
224
|
-
Parent.new.should @matcher.dependent(:destroy)
|
225
|
-
end
|
226
|
-
|
227
|
-
it "should reject an association with a bad :dependent option" do
|
228
|
-
define_model :child, :parent_id => :integer
|
229
|
-
define_model :parent do
|
230
|
-
has_many :children
|
231
|
-
end
|
232
|
-
Parent.new.should_not @matcher.dependent(:destroy)
|
233
|
-
end
|
234
|
-
|
235
|
-
it "should accept an association with a valid :order option" do
|
236
|
-
define_model :child, :parent_id => :integer
|
237
|
-
define_model :parent do
|
238
|
-
has_many :children, :order => :id
|
239
|
-
end
|
240
|
-
Parent.new.should @matcher.order(:id)
|
241
|
-
end
|
242
|
-
|
243
|
-
it "should reject an association with a bad :order option" do
|
244
|
-
define_model :child, :parent_id => :integer
|
245
|
-
define_model :parent do
|
246
|
-
has_many :children
|
247
|
-
end
|
248
|
-
Parent.new.should_not @matcher.order(:id)
|
249
|
-
end
|
250
|
-
|
251
|
-
it "should accept an association with a valid :conditions option" do
|
252
|
-
define_model :child, :parent_id => :integer, :adopted => :boolean
|
253
|
-
define_model :parent do
|
254
|
-
has_many :children, :conditions => { :adopted => true }
|
255
|
-
end
|
256
|
-
Parent.new.should @matcher.conditions({ :adopted => true })
|
257
|
-
end
|
258
|
-
|
259
|
-
it "should reject an association with a bad :conditions option" do
|
260
|
-
define_model :child, :parent_id => :integer, :adopted => :boolean
|
261
|
-
define_model :parent do
|
262
|
-
has_many :children
|
263
|
-
end
|
264
|
-
Parent.new.should_not @matcher.conditions({ :adopted => true })
|
265
|
-
end
|
266
|
-
|
267
|
-
it "should accept an association with a valid :class_name option" do
|
268
|
-
define_model :node, :parent_id => :integer, :adopted => :boolean
|
269
|
-
define_model :parent do
|
270
|
-
has_many :children, :class_name => 'Node'
|
271
|
-
end
|
272
|
-
Parent.new.should @matcher.class_name('Node')
|
273
|
-
end
|
274
|
-
|
275
|
-
it "should reject an association with a bad :class_name option" do
|
276
|
-
define_model :child, :parent_id => :integer, :adopted => :boolean
|
277
|
-
define_model :parent do
|
278
|
-
has_many :children
|
279
|
-
end
|
280
|
-
Parent.new.should_not @matcher.class_name('Node')
|
281
|
-
end
|
282
|
-
|
283
|
-
context 'should accept an association with a false :validate option' do
|
284
|
-
before do
|
285
|
-
define_model :child, :parent_id => :integer, :adopted => :boolean
|
286
|
-
define_model :parent do
|
287
|
-
has_many :children, :validate => false
|
288
|
-
end
|
289
|
-
end
|
290
|
-
subject { Parent.new }
|
291
|
-
specify { subject.should @matcher.validate(false) }
|
292
|
-
specify { subject.should_not @matcher.validate(true) }
|
293
|
-
specify { subject.should_not @matcher.validate }
|
294
|
-
end
|
295
|
-
|
296
|
-
context 'should accept an association with a true :validate option' do
|
297
|
-
before do
|
298
|
-
define_model :child, :parent_id => :integer, :adopted => :boolean
|
299
|
-
define_model :parent do
|
300
|
-
has_many :children, :validate => true
|
301
|
-
end
|
302
|
-
end
|
303
|
-
subject { Parent.new }
|
304
|
-
specify { subject.should_not @matcher.validate(false) }
|
305
|
-
specify { subject.should @matcher.validate(true) }
|
306
|
-
specify { subject.should @matcher.validate }
|
307
|
-
end
|
308
|
-
|
309
|
-
context 'should accept an association without a :validate option' do
|
310
|
-
before do
|
311
|
-
define_model :child, :parent_id => :integer, :adopted => :boolean
|
312
|
-
define_model :parent do
|
313
|
-
has_many :children
|
314
|
-
end
|
315
|
-
end
|
316
|
-
subject { Parent.new }
|
317
|
-
specify { subject.should @matcher.validate(false) }
|
318
|
-
specify { subject.should_not @matcher.validate(true) }
|
319
|
-
specify { subject.should_not @matcher.validate }
|
320
|
-
end
|
321
|
-
|
322
|
-
it "should accept an association with a nonstandard reverse foreign key, using :inverse_of" do
|
323
|
-
define_model :child, :ancestor_id => :integer do
|
324
|
-
belongs_to :ancestor, :inverse_of => :children, :class_name => :Parent
|
325
|
-
end
|
326
|
-
define_model :parent do
|
327
|
-
has_many :children, :inverse_of => :ancestor
|
328
|
-
end
|
329
|
-
Parent.new.should @matcher
|
330
|
-
end
|
331
|
-
|
332
|
-
it "should reject an association with a nonstandard reverse foreign key, if :inverse_of is not correct" do
|
333
|
-
define_model :child, :mother_id => :integer do
|
334
|
-
belongs_to :mother, :inverse_of => :children, :class_name => :Parent
|
335
|
-
end
|
336
|
-
define_model :parent do
|
337
|
-
has_many :children, :inverse_of => :ancestor
|
338
|
-
end
|
339
|
-
Parent.new.should_not @matcher
|
340
|
-
end
|
341
|
-
end
|
342
|
-
|
343
|
-
context "have_one" do
|
344
|
-
before do
|
345
|
-
@matcher = have_one(:detail)
|
346
|
-
end
|
347
|
-
|
348
|
-
it "should accept a valid association without any options" do
|
349
|
-
define_model :detail, :person_id => :integer
|
350
|
-
define_model :person do
|
351
|
-
has_one :detail
|
352
|
-
end
|
353
|
-
Person.new.should @matcher
|
354
|
-
end
|
355
|
-
|
356
|
-
it "should accept a valid association with an :as option" do
|
357
|
-
define_model :detail, :detailable_id => :integer,
|
358
|
-
:detailable_type => :string
|
359
|
-
define_model :person do
|
360
|
-
has_one :detail, :as => :detailable
|
361
|
-
end
|
362
|
-
Person.new.should @matcher
|
363
|
-
end
|
364
|
-
|
365
|
-
it "should reject an association that has a nonexistent foreign key" do
|
366
|
-
define_model :detail
|
367
|
-
define_model :person do
|
368
|
-
has_one :detail
|
369
|
-
end
|
370
|
-
Person.new.should_not @matcher
|
371
|
-
end
|
372
|
-
|
373
|
-
it "should accept an association with an existing custom foreign key" do
|
374
|
-
define_model :detail, :detailed_person_id => :integer
|
375
|
-
define_model :person do
|
376
|
-
has_one :detail, :foreign_key => :detailed_person_id
|
377
|
-
end
|
378
|
-
Person.new.should @matcher.with_foreign_key(:detailed_person_id)
|
379
|
-
end
|
380
|
-
|
381
|
-
it "should reject an association with a bad :as option" do
|
382
|
-
define_model :detail, :detailable_id => :integer,
|
383
|
-
:detailable_type => :string
|
384
|
-
define_model :person do
|
385
|
-
has_one :detail, :as => :describable
|
386
|
-
end
|
387
|
-
Person.new.should_not @matcher
|
388
|
-
end
|
389
|
-
|
390
|
-
it "should accept an association with a valid :dependent option" do
|
391
|
-
define_model :detail, :person_id => :integer
|
392
|
-
define_model :person do
|
393
|
-
has_one :detail, :dependent => :destroy
|
394
|
-
end
|
395
|
-
Person.new.should @matcher.dependent(:destroy)
|
396
|
-
end
|
397
|
-
|
398
|
-
it "should reject an association with a bad :dependent option" do
|
399
|
-
define_model :detail, :person_id => :integer
|
400
|
-
define_model :person do
|
401
|
-
has_one :detail
|
402
|
-
end
|
403
|
-
Person.new.should_not @matcher.dependent(:destroy)
|
404
|
-
end
|
405
|
-
|
406
|
-
it "should accept an association with a valid :order option" do
|
407
|
-
define_model :detail, :person_id => :integer
|
408
|
-
define_model :person do
|
409
|
-
has_one :detail, :order => :id
|
410
|
-
end
|
411
|
-
Person.new.should @matcher.order(:id)
|
412
|
-
end
|
413
|
-
|
414
|
-
it "should reject an association with a bad :order option" do
|
415
|
-
define_model :detail, :person_id => :integer
|
416
|
-
define_model :person do
|
417
|
-
has_one :detail
|
418
|
-
end
|
419
|
-
Person.new.should_not @matcher.order(:id)
|
420
|
-
end
|
421
|
-
|
422
|
-
it "should accept an association with a valid :conditions option" do
|
423
|
-
define_model :detail, :person_id => :integer, :disabled => :boolean
|
424
|
-
define_model :person do
|
425
|
-
has_one :detail, :conditions => { :disabled => true}
|
426
|
-
end
|
427
|
-
Person.new.should @matcher.conditions(:disabled => true)
|
428
|
-
end
|
429
|
-
|
430
|
-
it "should reject an association with a bad :conditions option" do
|
431
|
-
define_model :detail, :person_id => :integer, :disabled => :boolean
|
432
|
-
define_model :person do
|
433
|
-
has_one :detail
|
434
|
-
end
|
435
|
-
Person.new.should_not @matcher.conditions(:disabled => true)
|
436
|
-
end
|
437
|
-
|
438
|
-
it "should accept an association with a valid :class_name option" do
|
439
|
-
define_model :person_detail, :person_id => :integer, :disabled => :boolean
|
440
|
-
define_model :person do
|
441
|
-
has_one :detail, :class_name => 'PersonDetail'
|
442
|
-
end
|
443
|
-
Person.new.should @matcher.class_name('PersonDetail')
|
444
|
-
end
|
445
|
-
|
446
|
-
it "should reject an association with a bad :class_name option" do
|
447
|
-
define_model :detail, :person_id => :integer, :disabled => :boolean
|
448
|
-
define_model :person do
|
449
|
-
has_one :detail
|
450
|
-
end
|
451
|
-
Person.new.should_not @matcher.class_name('PersonDetail')
|
452
|
-
end
|
453
|
-
|
454
|
-
it "should accept an association with a through" do
|
455
|
-
define_model :detail
|
456
|
-
|
457
|
-
define_model :account do
|
458
|
-
has_one :detail
|
459
|
-
end
|
460
|
-
|
461
|
-
define_model :person do
|
462
|
-
has_one :account
|
463
|
-
has_one :detail, :through => :account
|
464
|
-
end
|
465
|
-
|
466
|
-
Person.new.should @matcher.through(:account)
|
467
|
-
end
|
468
|
-
|
469
|
-
it "should reject an association with a through" do
|
470
|
-
define_model :detail
|
471
|
-
|
472
|
-
define_model :person do
|
473
|
-
has_one :detail
|
474
|
-
end
|
475
|
-
|
476
|
-
Person.new.should_not @matcher.through(:account)
|
477
|
-
end
|
478
|
-
|
479
|
-
context 'should accept an association with a false :validate option' do
|
480
|
-
before do
|
481
|
-
define_model :detail, :person_id => :integer, :disabled => :boolean
|
482
|
-
define_model :person do
|
483
|
-
has_one :detail, :validate => false
|
484
|
-
end
|
485
|
-
end
|
486
|
-
subject { Person.new }
|
487
|
-
specify { subject.should @matcher.validate(false) }
|
488
|
-
specify { subject.should_not @matcher.validate(true) }
|
489
|
-
specify { subject.should_not @matcher.validate }
|
490
|
-
end
|
491
|
-
|
492
|
-
context 'should accept an association with a true :validate option' do
|
493
|
-
before do
|
494
|
-
define_model :detail, :person_id => :integer, :disabled => :boolean
|
495
|
-
define_model :person do
|
496
|
-
has_one :detail, :validate => true
|
497
|
-
end
|
498
|
-
end
|
499
|
-
subject { Person.new }
|
500
|
-
specify { subject.should_not @matcher.validate(false) }
|
501
|
-
specify { subject.should @matcher.validate(true) }
|
502
|
-
specify { subject.should @matcher.validate }
|
503
|
-
end
|
504
|
-
|
505
|
-
context 'should accept an association without a :validate option' do
|
506
|
-
before do
|
507
|
-
define_model :detail, :person_id => :integer, :disabled => :boolean
|
508
|
-
define_model :person do
|
509
|
-
has_one :detail
|
510
|
-
end
|
511
|
-
end
|
512
|
-
subject { Person.new }
|
513
|
-
specify { subject.should @matcher.validate(false) }
|
514
|
-
specify { subject.should_not @matcher.validate(true) }
|
515
|
-
specify { subject.should_not @matcher.validate }
|
516
|
-
end
|
517
|
-
|
518
|
-
end
|
519
|
-
|
520
|
-
context "have_and_belong_to_many" do
|
521
|
-
before do
|
522
|
-
@matcher = have_and_belong_to_many(:relatives)
|
523
|
-
end
|
524
|
-
|
525
|
-
it "should accept a valid association" do
|
526
|
-
define_model :relatives
|
527
|
-
define_model :person do
|
528
|
-
has_and_belongs_to_many :relatives
|
529
|
-
end
|
530
|
-
define_model :people_relative, :person_id => :integer,
|
531
|
-
:relative_id => :integer
|
532
|
-
Person.new.should @matcher
|
533
|
-
end
|
534
|
-
|
535
|
-
it "should reject a nonexistent association" do
|
536
|
-
define_model :relatives
|
537
|
-
define_model :person
|
538
|
-
define_model :people_relative, :person_id => :integer,
|
539
|
-
:relative_id => :integer
|
540
|
-
Person.new.should_not @matcher
|
541
|
-
end
|
542
|
-
|
543
|
-
it "should reject an association with a nonexistent join table" do
|
544
|
-
define_model :relatives
|
545
|
-
define_model :person do
|
546
|
-
has_and_belongs_to_many :relatives
|
547
|
-
end
|
548
|
-
Person.new.should_not @matcher
|
549
|
-
end
|
550
|
-
|
551
|
-
it "should reject an association of the wrong type" do
|
552
|
-
define_model :relatives, :person_id => :integer
|
553
|
-
define_model :person do
|
554
|
-
has_many :relatives
|
555
|
-
end
|
556
|
-
Person.new.should_not @matcher
|
557
|
-
end
|
558
|
-
|
559
|
-
it "should accept an association with a valid :conditions option" do
|
560
|
-
define_model :relatives, :adopted => :boolean
|
561
|
-
define_model :person do
|
562
|
-
has_and_belongs_to_many :relatives, :conditions => { :adopted => true }
|
563
|
-
end
|
564
|
-
define_model :people_relative, :person_id => :integer,
|
565
|
-
:relative_id => :integer
|
566
|
-
Person.new.should @matcher.conditions(:adopted => true)
|
567
|
-
end
|
568
|
-
|
569
|
-
it "should reject an association with a bad :conditions option" do
|
570
|
-
define_model :relatives, :adopted => :boolean
|
571
|
-
define_model :person do
|
572
|
-
has_and_belongs_to_many :relatives
|
573
|
-
end
|
574
|
-
define_model :people_relative, :person_id => :integer,
|
575
|
-
:relative_id => :integer
|
576
|
-
Person.new.should_not @matcher.conditions(:adopted => true)
|
577
|
-
end
|
578
|
-
|
579
|
-
it "should accept an association with a valid :class_name option" do
|
580
|
-
define_model :person_relatives, :adopted => :boolean
|
581
|
-
define_model :person do
|
582
|
-
has_and_belongs_to_many :relatives, :class_name => 'PersonRelatives'
|
583
|
-
end
|
584
|
-
define_model :people_person_relative, :person_id => :integer,
|
585
|
-
:person_relative_id => :integer
|
586
|
-
Person.new.should @matcher.class_name('PersonRelatives')
|
587
|
-
end
|
588
|
-
|
589
|
-
it "should reject an association with a bad :class_name option" do
|
590
|
-
define_model :relatives, :adopted => :boolean
|
591
|
-
define_model :person do
|
592
|
-
has_and_belongs_to_many :relatives
|
593
|
-
end
|
594
|
-
define_model :people_relative, :person_id => :integer,
|
595
|
-
:relative_id => :integer
|
596
|
-
Person.new.should_not @matcher.class_name('PersonRelatives')
|
597
|
-
end
|
598
|
-
|
599
|
-
context 'should accept an association with a false :validate option' do
|
600
|
-
before do
|
601
|
-
define_model :relatives, :adopted => :boolean
|
602
|
-
define_model :person do
|
603
|
-
has_and_belongs_to_many :relatives, :validate => false
|
604
|
-
end
|
605
|
-
define_model :people_relative, :person_id => :integer, :relative_id => :integer
|
606
|
-
end
|
607
|
-
subject { Person.new }
|
608
|
-
specify { subject.should @matcher.validate(false) }
|
609
|
-
specify { subject.should_not @matcher.validate(true) }
|
610
|
-
specify { subject.should_not @matcher.validate }
|
611
|
-
end
|
612
|
-
|
613
|
-
context 'should accept an association with a true :validate option' do
|
614
|
-
before do
|
615
|
-
define_model :relatives, :adopted => :boolean
|
616
|
-
define_model :person do
|
617
|
-
has_and_belongs_to_many :relatives, :validate => true
|
618
|
-
end
|
619
|
-
define_model :people_relative, :person_id => :integer, :relative_id => :integer
|
620
|
-
end
|
621
|
-
subject { Person.new }
|
622
|
-
specify { subject.should_not @matcher.validate(false) }
|
623
|
-
specify { subject.should @matcher.validate(true) }
|
624
|
-
specify { subject.should @matcher.validate }
|
625
|
-
end
|
626
|
-
|
627
|
-
context 'should accept an association without a :validate option' do
|
628
|
-
before do
|
629
|
-
define_model :relatives, :adopted => :boolean
|
630
|
-
define_model :person do
|
631
|
-
has_and_belongs_to_many :relatives
|
632
|
-
end
|
633
|
-
define_model :people_relative, :person_id => :integer, :relative_id => :integer
|
634
|
-
end
|
635
|
-
subject { Person.new }
|
636
|
-
specify { subject.should @matcher.validate(false) }
|
637
|
-
specify { subject.should_not @matcher.validate(true) }
|
638
|
-
specify { subject.should_not @matcher.validate }
|
639
|
-
end
|
640
|
-
|
641
|
-
end
|
642
|
-
end
|