remarkable_activerecord 3.1.9 → 3.1.10
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/lib/remarkable_activerecord/base.rb +5 -1
- data/lib/remarkable_activerecord/describe.rb +1 -2
- metadata +20 -42
- data/spec/accept_nested_attributes_for_matcher_spec.rb +0 -130
- data/spec/allow_mass_assignment_of_matcher_spec.rb +0 -106
- data/spec/allow_values_for_matcher_spec.rb +0 -80
- data/spec/association_matcher_spec.rb +0 -671
- data/spec/describe_spec.rb +0 -102
- data/spec/have_column_matcher_spec.rb +0 -78
- data/spec/have_default_scope_matcher_spec.rb +0 -52
- data/spec/have_index_matcher_spec.rb +0 -87
- data/spec/have_readonly_attributes_matcher_spec.rb +0 -47
- data/spec/have_scope_matcher_spec.rb +0 -85
- data/spec/model_builder.rb +0 -101
- data/spec/rcov.opts +0 -2
- data/spec/spec.opts +0 -4
- data/spec/spec_helper.rb +0 -27
- data/spec/validate_acceptance_of_matcher_spec.rb +0 -68
- data/spec/validate_associated_matcher_spec.rb +0 -126
- data/spec/validate_confirmation_of_matcher_spec.rb +0 -58
- data/spec/validate_exclusion_of_matcher_spec.rb +0 -87
- data/spec/validate_inclusion_of_matcher_spec.rb +0 -87
- data/spec/validate_length_of_matcher_spec.rb +0 -218
- data/spec/validate_numericality_of_matcher_spec.rb +0 -186
- data/spec/validate_presence_of_matcher_spec.rb +0 -84
- data/spec/validate_uniqueness_of_matcher_spec.rb +0 -182
@@ -1,671 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe 'association_matcher' do
|
4
|
-
include ModelBuilder
|
5
|
-
|
6
|
-
describe 'belong_to' do
|
7
|
-
|
8
|
-
# Defines a model, create a validation and returns a raw matcher
|
9
|
-
def define_and_validate(options={})
|
10
|
-
columns = options.delete(:association_columns) || { :projects_count => :integer }
|
11
|
-
define_model :company, columns
|
12
|
-
define_model :super_company, columns
|
13
|
-
|
14
|
-
columns = options.delete(:model_columns) || { :company_id => :integer, :company_type => :string }
|
15
|
-
@model = define_model :project, columns do
|
16
|
-
belongs_to :company, options
|
17
|
-
belongs_to :unknown
|
18
|
-
belongs_to :accountable, :polymorphic => true
|
19
|
-
end
|
20
|
-
|
21
|
-
belong_to :company
|
22
|
-
end
|
23
|
-
|
24
|
-
describe 'messages' do
|
25
|
-
it 'should contain a description' do
|
26
|
-
matcher = define_and_validate
|
27
|
-
matcher.description.should == 'belong to company'
|
28
|
-
|
29
|
-
matcher.class_name('Company')
|
30
|
-
matcher.description.should == 'belong to company with class name "Company"'
|
31
|
-
|
32
|
-
matcher.foreign_key('company_id')
|
33
|
-
matcher.description.should == 'belong to company with class name "Company" and with foreign key "company_id"'
|
34
|
-
|
35
|
-
matcher = belong_to(:company).dependent(:destroy)
|
36
|
-
matcher.description.should == 'belong to company with dependent :destroy'
|
37
|
-
|
38
|
-
matcher.readonly
|
39
|
-
matcher.description.should == 'belong to company with dependent :destroy and with readonly records'
|
40
|
-
|
41
|
-
matcher.as(:interface)
|
42
|
-
matcher.description.should == 'belong to company with dependent :destroy, through the polymorphic interface :interface, and with readonly records'
|
43
|
-
|
44
|
-
matcher.counter_cache('projects_count')
|
45
|
-
matcher.description.should == 'belong to company with dependent :destroy, through the polymorphic interface :interface, ' <<
|
46
|
-
'with readonly records, and with counter cache "projects_count"'
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'should set association_exists? message' do
|
50
|
-
define_and_validate
|
51
|
-
matcher = belong_to('whatever')
|
52
|
-
matcher.matches?(@model)
|
53
|
-
matcher.failure_message.should == 'Expected Project records belong to whatever, but the association does not exist'
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should set macro_matches? message' do
|
57
|
-
define_and_validate
|
58
|
-
matcher = have_one('company')
|
59
|
-
matcher.matches?(@model)
|
60
|
-
matcher.failure_message.should == 'Expected Project records have one company, got Project records belong to company'
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'should set klass_exists? message' do
|
64
|
-
define_and_validate
|
65
|
-
matcher = belong_to('unknown')
|
66
|
-
matcher.matches?(@model)
|
67
|
-
matcher.failure_message.should == 'Expected Project records belong to unknown, but the association class does not exist'
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'should set foreign_key_exists? message' do
|
71
|
-
matcher = define_and_validate(:model_columns => {})
|
72
|
-
matcher.matches?(@model)
|
73
|
-
matcher.failure_message.should == 'Expected foreign key "company_id" to exist on "projects", but does not'
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should set polymorphic_exists? message' do
|
77
|
-
matcher = define_and_validate(:model_columns => { :company_id => :integer }, :polymorphic => true)
|
78
|
-
matcher.polymorphic.matches?(@model)
|
79
|
-
matcher.failure_message.should == 'Expected "projects" to have "company_type" as column, but does not'
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should set counter_cache_exists? message' do
|
83
|
-
matcher = define_and_validate(:association_columns => {}, :counter_cache => true)
|
84
|
-
matcher.counter_cache.matches?(@model)
|
85
|
-
matcher.failure_message.should == 'Expected "companies" to have "projects_count" as column, but does not'
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'should set options_matches? message when polymorphic is given' do
|
89
|
-
matcher = define_and_validate(:polymorphic => false)
|
90
|
-
matcher.polymorphic.matches?(@model)
|
91
|
-
matcher.failure_message.should == 'Expected Project records belong to company with options {:polymorphic=>"true"}, got {:polymorphic=>"false"}'
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'should set options_matches? message when counter_cache is given' do
|
95
|
-
matcher = define_and_validate(:counter_cache => true)
|
96
|
-
matcher.counter_cache(false).matches?(@model)
|
97
|
-
matcher.failure_message.should == 'Expected Project records belong to company with options {:counter_cache=>"false"}, got {:counter_cache=>"true"}'
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe 'matchers' do
|
102
|
-
describe 'without options' do
|
103
|
-
before(:each){ define_and_validate }
|
104
|
-
|
105
|
-
it { should belong_to(:company) }
|
106
|
-
it { should_not belong_to(:unknown) }
|
107
|
-
it { should_not belong_to(:project) }
|
108
|
-
it { should_not have_one(:company) }
|
109
|
-
it { should_not have_many(:company) }
|
110
|
-
end
|
111
|
-
|
112
|
-
describe 'with class name option' do
|
113
|
-
it { should define_and_validate.class_name('Company') }
|
114
|
-
it { should define_and_validate(:class_name => 'SuperCompany').class_name('SuperCompany') }
|
115
|
-
|
116
|
-
it { should_not define_and_validate.class_name('SuperCompany') }
|
117
|
-
it { should_not define_and_validate(:class_name => 'Company').class_name('SuperCompany') }
|
118
|
-
end
|
119
|
-
|
120
|
-
describe 'with foreign_key option' do
|
121
|
-
it { should define_and_validate.foreign_key(:company_id) }
|
122
|
-
it { should_not define_and_validate.foreign_key(:association_id) }
|
123
|
-
|
124
|
-
# Checks whether fk exists or not
|
125
|
-
it { should define_and_validate(:foreign_key => :association_id,
|
126
|
-
:model_columns => { :association_id => :integer }).foreign_key(:association_id) }
|
127
|
-
|
128
|
-
it { should_not define_and_validate(:foreign_key => :association_id).foreign_key(:association_id) }
|
129
|
-
it { should_not define_and_validate(:model_columns => { :association_id => :integer }).foreign_key(:association_id) }
|
130
|
-
end
|
131
|
-
|
132
|
-
describe 'with dependent option' do
|
133
|
-
it { should define_and_validate(:dependent => :delete).dependent(:delete) }
|
134
|
-
it { should define_and_validate(:dependent => :destroy).dependent(:destroy) }
|
135
|
-
|
136
|
-
it { should_not define_and_validate(:dependent => :delete).dependent(:destroy) }
|
137
|
-
it { should_not define_and_validate(:dependent => :destroy).dependent(:delete) }
|
138
|
-
end
|
139
|
-
|
140
|
-
describe 'with counter_cache option' do
|
141
|
-
# Checks whether fk exists or not
|
142
|
-
it { should define_and_validate(:counter_cache => :association_count,
|
143
|
-
:association_columns => { :association_count => :integer }).counter_cache(:association_count) }
|
144
|
-
|
145
|
-
it { should_not define_and_validate(:counter_cache => :association_count).counter_cache(:association_count) }
|
146
|
-
it { should_not define_and_validate(:association_columns => { :association_count => :integer }).counter_cache(:association_count) }
|
147
|
-
end
|
148
|
-
|
149
|
-
describe "with polymorphic option" do
|
150
|
-
before(:each){ define_and_validate(:model_columns => {:accountable_id => :integer, :accountable_type => :string}) }
|
151
|
-
it { should belong_to(:accountable).polymorphic }
|
152
|
-
end
|
153
|
-
|
154
|
-
create_optional_boolean_specs(:readonly, self)
|
155
|
-
create_optional_boolean_specs(:validate, self)
|
156
|
-
create_optional_boolean_specs(:autosave, self) if RAILS_VERSION =~ /^2.3/
|
157
|
-
create_optional_boolean_specs(:polymorphic, self)
|
158
|
-
create_optional_boolean_specs(:counter_cache, self)
|
159
|
-
end
|
160
|
-
|
161
|
-
describe 'macros' do
|
162
|
-
before(:each){ define_and_validate(:validate => true, :readonly => true) }
|
163
|
-
|
164
|
-
should_belong_to :company
|
165
|
-
should_belong_to :company, :readonly => true
|
166
|
-
should_belong_to :company, :validate => true
|
167
|
-
should_belong_to :company, :class_name => "Company"
|
168
|
-
should_belong_to :company, :foreign_key => :company_id
|
169
|
-
|
170
|
-
should_belong_to :company do |m|
|
171
|
-
m.readonly
|
172
|
-
m.validate
|
173
|
-
m.class_name = "Company"
|
174
|
-
m.foreign_key = :company_id
|
175
|
-
end
|
176
|
-
|
177
|
-
should_not_belong_to :unknown
|
178
|
-
should_not_belong_to :project
|
179
|
-
should_not_have_one :company
|
180
|
-
should_not_have_many :companies
|
181
|
-
|
182
|
-
should_not_belong_to :company, :readonly => false
|
183
|
-
should_not_belong_to :company, :validate => false
|
184
|
-
should_not_belong_to :company, :class_name => "Anything"
|
185
|
-
should_not_belong_to :company, :foreign_key => :anything_id
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
describe 'have_and_belong_to_many' do
|
190
|
-
|
191
|
-
# Defines a model, create a validation and returns a raw matcher
|
192
|
-
def define_and_validate(options={})
|
193
|
-
define_model :label
|
194
|
-
define_model :super_label
|
195
|
-
|
196
|
-
columns = options.delete(:association_columns) || [ :label_id, :project_id ]
|
197
|
-
create_table(options.delete(:association_table) || :labels_projects) do |table|
|
198
|
-
columns.each { |name| table.column(name, :integer) }
|
199
|
-
end
|
200
|
-
|
201
|
-
@model = define_model :project, options.delete(:model_columns) || {} do
|
202
|
-
has_and_belongs_to_many :labels, options
|
203
|
-
end
|
204
|
-
|
205
|
-
have_and_belong_to_many :labels
|
206
|
-
end
|
207
|
-
|
208
|
-
describe 'messages' do
|
209
|
-
it 'should contain a description' do
|
210
|
-
matcher = define_and_validate
|
211
|
-
matcher.description.should == 'have and belong to many labels'
|
212
|
-
|
213
|
-
matcher.class_name('Label')
|
214
|
-
matcher.description.should == 'have and belong to many labels with class name "Label"'
|
215
|
-
|
216
|
-
matcher.foreign_key('label_id')
|
217
|
-
matcher.description.should == 'have and belong to many labels with class name "Label" and with foreign key "label_id"'
|
218
|
-
|
219
|
-
matcher = have_and_belong_to_many(:labels).autosave
|
220
|
-
matcher.description.should == 'have and belong to many labels autosaving associated records'
|
221
|
-
|
222
|
-
matcher.uniq
|
223
|
-
matcher.description.should == 'have and belong to many labels with unique records and autosaving associated records'
|
224
|
-
end
|
225
|
-
|
226
|
-
it 'should set association_exists? message' do
|
227
|
-
define_and_validate
|
228
|
-
matcher = have_and_belong_to_many('whatever')
|
229
|
-
matcher.matches?(@model)
|
230
|
-
matcher.failure_message.should == 'Expected Project records have and belong to many whatever, but the association does not exist'
|
231
|
-
end
|
232
|
-
|
233
|
-
it 'should set macro_matches? message' do
|
234
|
-
define_and_validate
|
235
|
-
matcher = have_many('labels')
|
236
|
-
matcher.matches?(@model)
|
237
|
-
matcher.failure_message.should == 'Expected Project records have many labels, got Project records have and belong to many labels'
|
238
|
-
end
|
239
|
-
|
240
|
-
it 'should set join_table_exists? message' do
|
241
|
-
matcher = define_and_validate(:association_table => 'another_name')
|
242
|
-
matcher.matches?(@model)
|
243
|
-
matcher.failure_message.should == 'Expected join table "labels_projects" to exist, but does not'
|
244
|
-
end
|
245
|
-
|
246
|
-
it 'should set foreign_key_exists? message' do
|
247
|
-
matcher = define_and_validate(:association_columns => [])
|
248
|
-
matcher.matches?(@model)
|
249
|
-
matcher.failure_message.should == 'Expected foreign key "project_id" to exist on "labels_projects", but does not'
|
250
|
-
end
|
251
|
-
|
252
|
-
it 'should set options_matches? message' do
|
253
|
-
matcher = define_and_validate(:uniq => false)
|
254
|
-
matcher.uniq.matches?(@model)
|
255
|
-
matcher.failure_message.should == 'Expected Project records have and belong to many labels with options {:uniq=>"true"}, got {:uniq=>"false"}'
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
describe 'matchers' do
|
260
|
-
describe 'without options' do
|
261
|
-
before(:each){ define_and_validate }
|
262
|
-
|
263
|
-
it { should have_and_belong_to_many(:labels) }
|
264
|
-
it { should_not belong_to(:label) }
|
265
|
-
it { should_not have_one(:label) }
|
266
|
-
it { should_not have_many(:labels) }
|
267
|
-
it { should_not have_and_belong_to_many(:companies) }
|
268
|
-
end
|
269
|
-
|
270
|
-
describe 'with class name option' do
|
271
|
-
it { should define_and_validate.class_name('Label') }
|
272
|
-
|
273
|
-
it { should define_and_validate(:class_name => 'SuperLabel',
|
274
|
-
:association_table => 'projects_super_labels').class_name('SuperLabel') }
|
275
|
-
|
276
|
-
it { should_not define_and_validate.class_name('SuperLabel') }
|
277
|
-
end
|
278
|
-
|
279
|
-
describe 'with foreign_key option' do
|
280
|
-
it { should define_and_validate.foreign_key(:project_id) }
|
281
|
-
it { should_not define_and_validate.foreign_key(:association_id) }
|
282
|
-
|
283
|
-
# Checks whether fk exists or not
|
284
|
-
it { should define_and_validate(:foreign_key => :association_id,
|
285
|
-
:association_columns => [ :association_id ]).foreign_key(:association_id) }
|
286
|
-
|
287
|
-
it { should_not define_and_validate(:foreign_key => :association_id).foreign_key(:association_id) }
|
288
|
-
it { should_not define_and_validate(:association_columns => [ :association_id ]).foreign_key(:association_id) }
|
289
|
-
end
|
290
|
-
|
291
|
-
describe 'with join table option' do
|
292
|
-
it { should define_and_validate.join_table('labels_projects') }
|
293
|
-
it { should define_and_validate(:join_table => 'my_table',
|
294
|
-
:association_table => 'my_table').join_table('my_table') }
|
295
|
-
|
296
|
-
it { should define_and_validate(:join_table => :my_table,
|
297
|
-
:association_table => :my_table).join_table(:my_table) }
|
298
|
-
|
299
|
-
it { should_not define_and_validate.join_table('projects_labels') }
|
300
|
-
|
301
|
-
it { should_not define_and_validate(:join_table => 'my_table',
|
302
|
-
:association_table => 'another_table').join_table('my_table') }
|
303
|
-
it { should_not define_and_validate(:join_table => 'another_table',
|
304
|
-
:association_table => 'my_table').join_table('my_table') }
|
305
|
-
it { should_not define_and_validate(:join_table => 'my_table',
|
306
|
-
:association_table => 'my_table').join_table('another_table') }
|
307
|
-
end
|
308
|
-
|
309
|
-
create_optional_boolean_specs(:uniq, self)
|
310
|
-
create_optional_boolean_specs(:readonly, self)
|
311
|
-
create_optional_boolean_specs(:validate, self)
|
312
|
-
create_optional_boolean_specs(:autosave, self) if RAILS_VERSION =~ /^2.3/
|
313
|
-
end
|
314
|
-
|
315
|
-
describe 'macros' do
|
316
|
-
before(:each){ define_and_validate(:validate => true, :readonly => true) }
|
317
|
-
|
318
|
-
should_have_and_belong_to_many :labels
|
319
|
-
should_have_and_belong_to_many :labels, :readonly => true
|
320
|
-
should_have_and_belong_to_many :labels, :validate => true
|
321
|
-
should_have_and_belong_to_many :labels, :class_name => "Label"
|
322
|
-
should_have_and_belong_to_many :labels, :foreign_key => :project_id
|
323
|
-
|
324
|
-
should_have_and_belong_to_many :labels do |m|
|
325
|
-
m.readonly
|
326
|
-
m.validate
|
327
|
-
m.class_name "Label"
|
328
|
-
m.foreign_key :project_id
|
329
|
-
end
|
330
|
-
|
331
|
-
should_not_have_and_belong_to_many :companies
|
332
|
-
should_not_have_one :label
|
333
|
-
should_not_have_many :labels
|
334
|
-
|
335
|
-
should_not_have_and_belong_to_many :labels, :readonly => false
|
336
|
-
should_not_have_and_belong_to_many :labels, :validate => false
|
337
|
-
should_not_have_and_belong_to_many :labels, :class_name => "Anything"
|
338
|
-
should_not_have_and_belong_to_many :labels, :foreign_key => :anything_id
|
339
|
-
end
|
340
|
-
end
|
341
|
-
|
342
|
-
describe 'have_many' do
|
343
|
-
|
344
|
-
# Defines a model, create a validation and returns a raw matcher
|
345
|
-
def define_and_validate(options={})
|
346
|
-
columns = options.delete(:association_columns) || { :task_id => :integer, :project_id => :integer, :todo_id => :integer }
|
347
|
-
define_model :task, columns
|
348
|
-
define_model :todo, columns
|
349
|
-
|
350
|
-
define_model :project_task, columns do
|
351
|
-
belongs_to :task
|
352
|
-
belongs_to :project
|
353
|
-
belongs_to :todo
|
354
|
-
end unless options.delete(:skip_source)
|
355
|
-
|
356
|
-
@model = define_model :project, options.delete(:model_columns) || {} do
|
357
|
-
has_many :project_tasks unless options.delete(:skip_through)
|
358
|
-
has_many :tasks, options
|
359
|
-
end
|
360
|
-
|
361
|
-
have_many :tasks
|
362
|
-
end
|
363
|
-
|
364
|
-
describe 'messages' do
|
365
|
-
it 'should contain a description' do
|
366
|
-
matcher = define_and_validate
|
367
|
-
matcher.description.should == 'have many tasks'
|
368
|
-
|
369
|
-
matcher.class_name('Task')
|
370
|
-
matcher.description.should == 'have many tasks with class name "Task"'
|
371
|
-
|
372
|
-
matcher.foreign_key('task_id')
|
373
|
-
matcher.description.should == 'have many tasks with class name "Task" and with foreign key "task_id"'
|
374
|
-
|
375
|
-
matcher = have_many(:tasks).autosave
|
376
|
-
matcher.description.should == 'have many tasks autosaving associated records'
|
377
|
-
|
378
|
-
matcher.uniq
|
379
|
-
matcher.description.should == 'have many tasks with unique records and autosaving associated records'
|
380
|
-
end
|
381
|
-
|
382
|
-
it 'should set association_exists? message' do
|
383
|
-
define_and_validate
|
384
|
-
matcher = have_many('whatever')
|
385
|
-
matcher.matches?(@model)
|
386
|
-
matcher.failure_message.should == 'Expected Project records have many whatever, but the association does not exist'
|
387
|
-
end
|
388
|
-
|
389
|
-
it 'should set macro_matches? message' do
|
390
|
-
define_and_validate
|
391
|
-
matcher = have_and_belong_to_many('tasks')
|
392
|
-
matcher.matches?(@model)
|
393
|
-
matcher.failure_message.should == 'Expected Project records have and belong to many tasks, got Project records have many tasks'
|
394
|
-
end
|
395
|
-
|
396
|
-
it 'should set foreign_key_exists? message' do
|
397
|
-
matcher = define_and_validate(:association_columns => {})
|
398
|
-
matcher.matches?(@model)
|
399
|
-
matcher.failure_message.should == 'Expected foreign key "project_id" to exist on "tasks", but does not'
|
400
|
-
end
|
401
|
-
|
402
|
-
it 'should set through_exists? message' do
|
403
|
-
matcher = define_and_validate(:through => :project_tasks, :skip_through => true)
|
404
|
-
matcher.through(:project_tasks).matches?(@model)
|
405
|
-
matcher.failure_message.should == 'Expected Project records have many tasks through :project_tasks, through association does not exist'
|
406
|
-
end
|
407
|
-
|
408
|
-
it 'should set source_exists? message' do
|
409
|
-
matcher = define_and_validate(:through => :project_tasks, :skip_source => true)
|
410
|
-
matcher.through(:project_tasks).matches?(@model)
|
411
|
-
matcher.failure_message.should == 'Expected Project records have many tasks through :project_tasks, source association does not exist'
|
412
|
-
end
|
413
|
-
|
414
|
-
it 'should set options_matches? message when dependent is given' do
|
415
|
-
matcher = define_and_validate(:dependent => :destroy)
|
416
|
-
matcher.dependent(:nullify).matches?(@model)
|
417
|
-
matcher.failure_message.should == 'Expected Project records have many tasks with options {:dependent=>"nullify"}, got {:dependent=>"destroy"}'
|
418
|
-
end
|
419
|
-
|
420
|
-
it 'should set options_matches? message when source is given' do
|
421
|
-
matcher = define_and_validate(:through => :project_tasks, :source => :todo)
|
422
|
-
matcher.through(:project_tasks).source(:task).matches?(@model)
|
423
|
-
matcher.failure_message.should match(/:source=>"task"/)
|
424
|
-
matcher.failure_message.should match(/:source=>"todo"/)
|
425
|
-
end
|
426
|
-
end
|
427
|
-
|
428
|
-
describe 'matchers' do
|
429
|
-
describe 'without options' do
|
430
|
-
before(:each){ define_and_validate }
|
431
|
-
|
432
|
-
it { should have_many(:tasks) }
|
433
|
-
it { should_not belong_to(:task) }
|
434
|
-
it { should_not have_one(:task) }
|
435
|
-
it { should_not have_and_belong_to_many(:tasks) }
|
436
|
-
end
|
437
|
-
|
438
|
-
describe 'with class name option' do
|
439
|
-
before(:each){ define_model :super_task, :project_id => :integer }
|
440
|
-
|
441
|
-
it { should define_and_validate.class_name('Task') }
|
442
|
-
it { should define_and_validate(:class_name => 'SuperTask').class_name('SuperTask') }
|
443
|
-
|
444
|
-
it { should_not define_and_validate.class_name('SuperTask') }
|
445
|
-
it { should_not define_and_validate(:class_name => 'SuperTask').class_name('Task') }
|
446
|
-
end
|
447
|
-
|
448
|
-
describe 'with foreign_key option' do
|
449
|
-
it { should define_and_validate.foreign_key(:project_id) }
|
450
|
-
it { should_not define_and_validate.foreign_key(:association_id) }
|
451
|
-
|
452
|
-
# Checks whether fk exists or not
|
453
|
-
it { should define_and_validate(:foreign_key => :association_id,
|
454
|
-
:association_columns => { :association_id => :integer }).foreign_key(:association_id) }
|
455
|
-
|
456
|
-
it { should_not define_and_validate(:foreign_key => :association_id).foreign_key(:association_id) }
|
457
|
-
it { should_not define_and_validate(:association_columns => { :association_id => :integer }).foreign_key(:association_id) }
|
458
|
-
end
|
459
|
-
|
460
|
-
describe 'with dependent option' do
|
461
|
-
it { should define_and_validate(:dependent => :delete_all).dependent(:delete_all) }
|
462
|
-
it { should define_and_validate(:dependent => :destroy).dependent(:destroy) }
|
463
|
-
|
464
|
-
it { should_not define_and_validate(:dependent => :delete_all).dependent(:destroy) }
|
465
|
-
it { should_not define_and_validate(:dependent => :destroy).dependent(:delete_all) }
|
466
|
-
end
|
467
|
-
|
468
|
-
describe 'with through option' do
|
469
|
-
it { should define_and_validate(:through => :project_tasks) }
|
470
|
-
it { should define_and_validate(:through => :project_tasks).through(:project_tasks) }
|
471
|
-
|
472
|
-
it { should_not define_and_validate(:through => :project_tasks).through(:something) }
|
473
|
-
it { should_not define_and_validate(:through => :project_tasks, :skip_through => true).through(:project_tasks) }
|
474
|
-
end
|
475
|
-
|
476
|
-
describe 'with source option' do
|
477
|
-
it { should define_and_validate(:through => :project_tasks, :source => :todo).source(:todo) }
|
478
|
-
it { should_not define_and_validate(:through => :project_tasks, :source => :todo).source(:task) }
|
479
|
-
end
|
480
|
-
|
481
|
-
create_optional_boolean_specs(:uniq, self)
|
482
|
-
create_optional_boolean_specs(:readonly, self)
|
483
|
-
create_optional_boolean_specs(:validate, self)
|
484
|
-
create_optional_boolean_specs(:autosave, self) if RAILS_VERSION =~ /^2.3/
|
485
|
-
end
|
486
|
-
|
487
|
-
describe 'macros' do
|
488
|
-
before(:each){ define_and_validate(:through => :project_tasks, :readonly => true, :validate => true) }
|
489
|
-
|
490
|
-
should_have_many :tasks
|
491
|
-
should_have_many :tasks, :readonly => true
|
492
|
-
should_have_many :tasks, :validate => true
|
493
|
-
should_have_many :tasks, :through => :project_tasks
|
494
|
-
|
495
|
-
should_have_many :tasks do |m|
|
496
|
-
m.readonly
|
497
|
-
m.validate
|
498
|
-
m.through = :project_tasks
|
499
|
-
end
|
500
|
-
|
501
|
-
should_not_have_many :tasks, :readonly => false
|
502
|
-
should_not_have_many :tasks, :validate => false
|
503
|
-
should_not_have_many :tasks, :through => :another_thing
|
504
|
-
end
|
505
|
-
end
|
506
|
-
|
507
|
-
describe 'have_one' do
|
508
|
-
|
509
|
-
# Defines a model, create a validation and returns a raw matcher
|
510
|
-
def define_and_validate(options={})
|
511
|
-
columns = options.delete(:association_columns) || { :manager_id => :integer, :project_id => :integer, :boss_id => :integer }
|
512
|
-
define_model :manager, columns
|
513
|
-
define_model :boss, columns
|
514
|
-
|
515
|
-
define_model :project_manager, columns do
|
516
|
-
belongs_to :manager
|
517
|
-
belongs_to :project
|
518
|
-
belongs_to :boss
|
519
|
-
end unless options.delete(:skip_source)
|
520
|
-
|
521
|
-
@model = define_model :project, options.delete(:model_columns) || {} do
|
522
|
-
has_many :project_managers unless options.delete(:skip_through)
|
523
|
-
has_one :manager, options
|
524
|
-
has_one :unknown
|
525
|
-
end
|
526
|
-
|
527
|
-
have_one :manager
|
528
|
-
end
|
529
|
-
|
530
|
-
describe 'messages' do
|
531
|
-
it 'should contain a description' do
|
532
|
-
matcher = define_and_validate
|
533
|
-
matcher.description.should == 'have one manager'
|
534
|
-
|
535
|
-
matcher.class_name('Manager')
|
536
|
-
matcher.description.should == 'have one manager with class name "Manager"'
|
537
|
-
|
538
|
-
matcher.foreign_key('manager_id')
|
539
|
-
matcher.description.should == 'have one manager with class name "Manager" and with foreign key "manager_id"'
|
540
|
-
end
|
541
|
-
|
542
|
-
it 'should set association_exists? message' do
|
543
|
-
define_and_validate
|
544
|
-
matcher = have_one('whatever')
|
545
|
-
matcher.matches?(@model)
|
546
|
-
matcher.failure_message.should == 'Expected Project records have one whatever, but the association does not exist'
|
547
|
-
end
|
548
|
-
|
549
|
-
it 'should set klass_exists? message' do
|
550
|
-
define_and_validate
|
551
|
-
matcher = have_one('unknown')
|
552
|
-
matcher.matches?(@model)
|
553
|
-
matcher.failure_message.should == 'Expected Project records have one unknown, but the association class does not exist'
|
554
|
-
end
|
555
|
-
|
556
|
-
it 'should set macro_matches? message' do
|
557
|
-
define_and_validate
|
558
|
-
matcher = belong_to('manager')
|
559
|
-
matcher.matches?(@model)
|
560
|
-
matcher.failure_message.should == 'Expected Project records belong to manager, got Project records have one manager'
|
561
|
-
end
|
562
|
-
|
563
|
-
it 'should set foreign_key_exists? message' do
|
564
|
-
matcher = define_and_validate(:association_columns => {})
|
565
|
-
matcher.matches?(@model)
|
566
|
-
matcher.failure_message.should == 'Expected foreign key "project_id" to exist on "managers", but does not'
|
567
|
-
end
|
568
|
-
|
569
|
-
it 'should set through_exists? message' do
|
570
|
-
matcher = define_and_validate(:through => :project_managers, :skip_through => true)
|
571
|
-
matcher.through(:project_managers).matches?(@model)
|
572
|
-
matcher.failure_message.should == 'Expected Project records have one manager through :project_managers, through association does not exist'
|
573
|
-
end
|
574
|
-
|
575
|
-
it 'should set source_exists? message' do
|
576
|
-
matcher = define_and_validate(:through => :project_managers, :skip_source => true)
|
577
|
-
matcher.through(:project_managers).matches?(@model)
|
578
|
-
matcher.failure_message.should == 'Expected Project records have one manager through :project_managers, source association does not exist'
|
579
|
-
end
|
580
|
-
|
581
|
-
it 'should set options_matches? message when dependent is given' do
|
582
|
-
matcher = define_and_validate(:dependent => :destroy)
|
583
|
-
matcher.dependent(:nullify).matches?(@model)
|
584
|
-
matcher.failure_message.should == 'Expected Project records have one manager with options {:dependent=>"nullify"}, got {:dependent=>"destroy"}'
|
585
|
-
end
|
586
|
-
|
587
|
-
it 'should set options_matches? message when source is given' do
|
588
|
-
matcher = define_and_validate(:through => :project_managers, :source => :boss)
|
589
|
-
matcher.through(:project_managers).source(:manager).matches?(@model)
|
590
|
-
matcher.failure_message.should match(/:source=>"manager"/)
|
591
|
-
matcher.failure_message.should match(/:source=>"boss"/)
|
592
|
-
end
|
593
|
-
end
|
594
|
-
|
595
|
-
describe 'matchers' do
|
596
|
-
describe 'without options' do
|
597
|
-
before(:each){ define_and_validate }
|
598
|
-
|
599
|
-
it { should have_one(:manager) }
|
600
|
-
it { should_not have_one(:unknown) }
|
601
|
-
it { should_not belong_to(:manager) }
|
602
|
-
it { should_not have_many(:managers) }
|
603
|
-
it { should_not have_and_belong_to_many(:managers) }
|
604
|
-
end
|
605
|
-
|
606
|
-
describe 'with class name option' do
|
607
|
-
before(:each){ define_model :super_manager, :project_id => :integer }
|
608
|
-
|
609
|
-
it { should define_and_validate.class_name('Manager') }
|
610
|
-
it { should define_and_validate(:class_name => 'SuperManager').class_name('SuperManager') }
|
611
|
-
|
612
|
-
it { should_not define_and_validate.class_name('SuperManager') }
|
613
|
-
it { should_not define_and_validate(:class_name => 'SuperManager').class_name('Manager') }
|
614
|
-
end
|
615
|
-
|
616
|
-
describe 'with foreign_key option' do
|
617
|
-
it { should define_and_validate.foreign_key(:project_id) }
|
618
|
-
it { should_not define_and_validate.foreign_key(:association_id) }
|
619
|
-
|
620
|
-
# Checks whether fk exists or not
|
621
|
-
it { should define_and_validate(:foreign_key => :association_id,
|
622
|
-
:association_columns => { :association_id => :integer }).foreign_key(:association_id) }
|
623
|
-
|
624
|
-
it { should_not define_and_validate(:foreign_key => :association_id).foreign_key(:association_id) }
|
625
|
-
it { should_not define_and_validate(:association_columns => { :association_id => :integer }).foreign_key(:association_id) }
|
626
|
-
end
|
627
|
-
|
628
|
-
describe 'with dependent option' do
|
629
|
-
it { should define_and_validate(:dependent => :delete).dependent(:delete) }
|
630
|
-
it { should define_and_validate(:dependent => :destroy).dependent(:destroy) }
|
631
|
-
|
632
|
-
it { should_not define_and_validate(:dependent => :delete).dependent(:destroy) }
|
633
|
-
it { should_not define_and_validate(:dependent => :destroy).dependent(:delete) }
|
634
|
-
end
|
635
|
-
|
636
|
-
describe 'with through option' do
|
637
|
-
it { should define_and_validate(:through => :project_managers) }
|
638
|
-
it { should define_and_validate(:through => :project_managers).through(:project_managers) }
|
639
|
-
|
640
|
-
it { should_not define_and_validate(:through => :project_managers).through(:something) }
|
641
|
-
it { should_not define_and_validate(:through => :project_managers, :skip_through => true).through(:project_managers) }
|
642
|
-
end
|
643
|
-
|
644
|
-
describe 'with source option' do
|
645
|
-
it { should define_and_validate(:through => :project_managers, :source => :boss).source(:boss) }
|
646
|
-
it { should_not define_and_validate(:through => :project_managers, :source => :boss).source(:manager) }
|
647
|
-
end
|
648
|
-
|
649
|
-
create_optional_boolean_specs(:validate, self)
|
650
|
-
create_optional_boolean_specs(:autosave, self) if RAILS_VERSION =~ /^2.3/
|
651
|
-
end
|
652
|
-
|
653
|
-
describe 'macros' do
|
654
|
-
before(:each){ define_and_validate(:through => :project_managers, :validate => true) }
|
655
|
-
|
656
|
-
should_have_one :manager
|
657
|
-
should_have_one :manager, :validate => true
|
658
|
-
should_have_one :manager, :through => :project_managers
|
659
|
-
|
660
|
-
should_have_one :manager do |m|
|
661
|
-
m.validate
|
662
|
-
m.through = :project_managers
|
663
|
-
end
|
664
|
-
|
665
|
-
should_not_have_one :unknown
|
666
|
-
should_not_have_one :manager, :validate => false
|
667
|
-
should_not_have_one :manager, :through => :another_thing
|
668
|
-
end
|
669
|
-
end
|
670
|
-
|
671
|
-
end
|