active_type 0.6.0 → 0.6.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -0
  3. data/active_type.gemspec +1 -1
  4. data/gemfiles/Gemfile.3.2.mysql2.lock +1 -1
  5. data/gemfiles/Gemfile.3.2.sqlite3.lock +1 -1
  6. data/gemfiles/Gemfile.4.0.sqlite3.lock +1 -1
  7. data/gemfiles/Gemfile.4.1.sqlite3.lock +1 -1
  8. data/gemfiles/Gemfile.4.2.1.mysql2.lock +1 -1
  9. data/gemfiles/Gemfile.4.2.1.pg.lock +1 -1
  10. data/gemfiles/Gemfile.4.2.1.sqlite3.lock +1 -1
  11. data/gemfiles/Gemfile.5.0.0.mysql2.lock +1 -1
  12. data/gemfiles/Gemfile.5.0.0.pg.lock +1 -1
  13. data/gemfiles/Gemfile.5.0.0.sqlite3.lock +1 -1
  14. data/lib/active_type/version.rb +1 -1
  15. metadata +3 -53
  16. data/spec/active_type/extended_record/single_table_inheritance_spec.rb +0 -62
  17. data/spec/active_type/extended_record_spec.rb +0 -233
  18. data/spec/active_type/nested_attributes_spec.rb +0 -704
  19. data/spec/active_type/object_spec.rb +0 -463
  20. data/spec/active_type/record_spec.rb +0 -274
  21. data/spec/active_type/util_spec.rb +0 -142
  22. data/spec/integration/holidays_spec.rb +0 -102
  23. data/spec/integration/shape_spec.rb +0 -110
  24. data/spec/integration/sign_in_spec.rb +0 -101
  25. data/spec/integration/sign_up_spec.rb +0 -102
  26. data/spec/shared_examples/accessors.rb +0 -24
  27. data/spec/shared_examples/belongs_to.rb +0 -17
  28. data/spec/shared_examples/coercible_columns.rb +0 -248
  29. data/spec/shared_examples/constructor.rb +0 -30
  30. data/spec/shared_examples/defaults.rb +0 -60
  31. data/spec/shared_examples/dirty_tracking.rb +0 -40
  32. data/spec/shared_examples/dupable.rb +0 -31
  33. data/spec/shared_examples/mass_assignment.rb +0 -26
  34. data/spec/spec_helper.rb +0 -28
  35. data/spec/support/database.rb +0 -53
  36. data/spec/support/database.sample.yml +0 -3
  37. data/spec/support/error_on.rb +0 -12
  38. data/spec/support/i18n.rb +0 -1
  39. data/spec/support/protected_params.rb +0 -20
  40. data/spec/support/time_zone.rb +0 -1
@@ -1,704 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module NestedAttributesSpec
4
-
5
- class Record < ActiveRecord::Base
6
- attr_accessor :fail_on_save, :error
7
-
8
- before_save :check_fail
9
-
10
- validate :check_error
11
-
12
- private
13
-
14
- def check_fail
15
- if fail_on_save == true
16
- if ActiveRecord::VERSION::MAJOR >= 5
17
- throw :abort
18
- else
19
- false
20
- end
21
- end
22
- end
23
-
24
- def check_error
25
- if error.present?
26
- errors.add(:base, error)
27
- end
28
- end
29
- end
30
-
31
- end
32
-
33
- class GlobalRecord < ActiveRecord::Base
34
- self.table_name = 'records'
35
- end
36
-
37
-
38
- describe "ActiveType::Object" do
39
-
40
- context '.nests_many' do
41
-
42
- let(:extra_options) { {} }
43
-
44
- subject do
45
- extra = extra_options
46
- Class.new(ActiveType::Object) do
47
- nests_many :records, extra.merge(:scope => NestedAttributesSpec::Record)
48
-
49
- def bad(attributes)
50
- attributes[:persisted_string] =~ /bad/
51
- end
52
-
53
- def reject_all
54
- true
55
- end
56
-
57
- end.new
58
- end
59
-
60
- def should_assign_and_persist(assign, persist = assign)
61
- expect(subject.records.map(&:persisted_string)).to eq(assign)
62
- expect(subject.save).to eq(true)
63
- expect(NestedAttributesSpec::Record.all.map(&:persisted_string)).to match_array(persist)
64
- end
65
-
66
-
67
- context 'with no records assigned' do
68
-
69
- it 'can save' do
70
- expect(subject.save).to eq(true)
71
- end
72
-
73
- end
74
-
75
- context 'assigning nil' do
76
-
77
- it 'will do nothing' do
78
- subject.records_attributes = nil
79
- expect(subject.records).to be_nil
80
- end
81
-
82
- end
83
-
84
- context 'when assigning records without ids' do
85
-
86
- it 'builds single nested records' do
87
- subject.records_attributes = { 1 => {:persisted_string => "string"} }
88
-
89
- should_assign_and_persist(["string"])
90
- end
91
-
92
- it 'builds multiple nested records when given a hash of attributes, ordered by key' do
93
- subject.records_attributes = {
94
- 3 => {:persisted_string => "string 3"},
95
- 1 => {:persisted_string => "string 1"},
96
- 2 => {:persisted_string => "string 2"},
97
- }
98
-
99
- should_assign_and_persist(["string 1", "string 2", "string 3"])
100
- end
101
-
102
- it 'builds multiple nested records when given an array of attributes' do
103
- subject.records_attributes = [
104
- {:persisted_string => "string 1"},
105
- {:persisted_string => "string 2"},
106
- {:persisted_string => "string 3"},
107
- ]
108
-
109
- should_assign_and_persist(["string 1", "string 2", "string 3"])
110
- end
111
-
112
- it 'does not build records that match a :reject_if proc' do
113
- extra_options.merge!(:reject_if => proc { |attributes| attributes['persisted_string'] =~ /bad/ })
114
- subject.records_attributes = {
115
- 1 => {:persisted_string => "good value"},
116
- 2 => {:persisted_string => "bad value"},
117
- }
118
-
119
- should_assign_and_persist(["good value"])
120
- end
121
-
122
- it 'does not build records that match a :reject_if method taking attributes' do
123
- extra_options.merge!(:reject_if => :bad)
124
- subject.records_attributes = {
125
- 1 => {:persisted_string => "good value"},
126
- 2 => {:persisted_string => "bad value"},
127
- }
128
-
129
- should_assign_and_persist(["good value"])
130
- end
131
-
132
- it 'does not build records that match a :reject_if method taking attributes' do
133
- extra_options.merge!(:reject_if => :bad)
134
- subject.records_attributes = {
135
- 1 => {:persisted_string => "good value"},
136
- 2 => {:persisted_string => "bad value"},
137
- }
138
-
139
- should_assign_and_persist(["good value"])
140
- end
141
-
142
- it 'does not build records that match a :reject_if method taking no attributes' do
143
- extra_options.merge!(:reject_if => :reject_all)
144
- subject.records_attributes = {
145
- 1 => {:persisted_string => "good value"},
146
- 2 => {:persisted_string => "bad value"},
147
- }
148
-
149
- should_assign_and_persist([])
150
- end
151
-
152
- it 'does not build records that match a :reject_if all_blank' do
153
- extra_options.merge!(:reject_if => :all_blank)
154
- subject.records_attributes = {
155
- 1 => {:persisted_string => "good value"},
156
- 2 => {},
157
- }
158
-
159
- should_assign_and_persist(["good value"])
160
- end
161
-
162
- it 'appends to existing records' do
163
- subject.records = [NestedAttributesSpec::Record.create!(:persisted_string => "existing string")]
164
- subject.records_attributes = { 1 => {:persisted_string => "new string"} }
165
-
166
- should_assign_and_persist(["existing string", "new string"])
167
- end
168
-
169
- it 'leaves unassigned records alone' do
170
- NestedAttributesSpec::Record.create!(:persisted_string => "unassigned")
171
- subject.records_attributes = { 1 => {:persisted_string => "string"} }
172
-
173
- should_assign_and_persist(["string"], ["unassigned", "string"])
174
- end
175
-
176
- it 'does not destroy records on _destroy => trueish by default' do
177
- existing = NestedAttributesSpec::Record.create!(:persisted_string => 'do not delete this')
178
-
179
- subject.records_attributes = [
180
- { :id => existing.id, :_destroy => "true" },
181
- ]
182
- should_assign_and_persist(["do not delete this"], ["do not delete this"])
183
- expect(subject.records.size).to eq(1)
184
- end
185
-
186
- it 'destroys records on _destroy => trueish if allowed' do
187
- extra_options.merge!(:allow_destroy => true)
188
- existing = [
189
- NestedAttributesSpec::Record.create!(:persisted_string => 'delete this'),
190
- NestedAttributesSpec::Record.create!(:persisted_string => 'delete this'),
191
- NestedAttributesSpec::Record.create!(:persisted_string => 'delete this'),
192
- NestedAttributesSpec::Record.create!(:persisted_string => 'keep this'),
193
- ]
194
-
195
- subject.records = existing.first(2) # assign some
196
-
197
- subject.records_attributes = [
198
- { :id => existing[0].id, :_destroy => "true" },
199
- { :id => existing[1].id, :_destroy => 1 },
200
- { :id => existing[2].id, :_destroy => "1" },
201
- { :id => existing[3].id, :_destroy => "0" },
202
- ]
203
- should_assign_and_persist(["delete this", "delete this", "delete this", "keep this"], ["keep this"])
204
- expect(subject.records.size).to eq(1)
205
- end
206
-
207
- end
208
-
209
- context 'when assigning records with ids' do
210
-
211
- it 'updates the record with the id if already assigned' do
212
- subject.records = [
213
- NestedAttributesSpec::Record.new(:persisted_string => "existing 1"),
214
- NestedAttributesSpec::Record.new(:persisted_string => "existing 2"),
215
- NestedAttributesSpec::Record.new(:persisted_string => "existing 3"),
216
- ]
217
- subject.records[0].id = 100
218
- subject.records[1].id = 101
219
- subject.records[2].id = 102
220
-
221
- subject.records_attributes = { 1 => {:id => 101, :persisted_string => "updated"} }
222
-
223
- should_assign_and_persist(["existing 1", "updated", "existing 3"])
224
- end
225
-
226
- it 'does not update records matching a reject_if proc' do
227
- extra_options.merge!(:reject_if => :bad)
228
- subject.records = [
229
- NestedAttributesSpec::Record.new(:persisted_string => "existing 1"),
230
- NestedAttributesSpec::Record.new(:persisted_string => "existing 2"),
231
- ]
232
- subject.records[0].id = 100
233
- subject.records[1].id = 101
234
-
235
- subject.records_attributes = [
236
- {:id => 100, :persisted_string => "good"},
237
- {:id => 101, :persisted_string => "bad"}
238
- ]
239
-
240
- should_assign_and_persist(["good", "existing 2"])
241
- end
242
-
243
- it 'fetches the record with the id if not already assigned' do
244
- record = NestedAttributesSpec::Record.create!(:persisted_string => "existing string 1")
245
- subject.records = [
246
- NestedAttributesSpec::Record.new(:persisted_string => "existing string 2"),
247
- ]
248
- subject.records[0].id = record.id + 1
249
-
250
- subject.records_attributes = { 1 => {:id => record.id, :persisted_string => "updated string"} }
251
-
252
- should_assign_and_persist(["existing string 2", "updated string"])
253
- end
254
-
255
- it 'raises an error if the child record does not exist' do
256
- expect do
257
- subject.records_attributes = { 1 => {:id => 1, :persisted_string => "updated string"} }
258
- end.to raise_error(ActiveType::NestedAttributes::RecordNotFound, "could not find a child record with id '1' for 'records'")
259
- end
260
-
261
- end
262
-
263
- context 'save failure' do
264
-
265
- it 'returns false on #save and does not save the child' do
266
- # it should also cause a rollback, but that will not work with sqlite3
267
- subject.records = [
268
- NestedAttributesSpec::Record.new(:fail_on_save => true),
269
- ]
270
-
271
- expect(subject.save).to be_falsey
272
- expect(NestedAttributesSpec::Record.count).to eq(0)
273
-
274
- # note that other children would be saved and not be rolled back
275
- # this is also true for regular nested attributes
276
- end
277
-
278
- end
279
-
280
- context 'validations' do
281
-
282
- describe '#valid?' do
283
-
284
- it 'is true if there are no records assigned' do
285
- expect(subject.valid?).to eq(true)
286
- end
287
-
288
- it 'is true if all records are valid' do
289
- subject.records = [
290
- NestedAttributesSpec::Record.new,
291
- NestedAttributesSpec::Record.new,
292
- ]
293
-
294
- expect(subject.valid?).to eq(true)
295
- end
296
-
297
- it 'is false if one child has an error' do
298
- subject.records = [
299
- NestedAttributesSpec::Record.new,
300
- NestedAttributesSpec::Record.new(:error => 'some error'),
301
- ]
302
-
303
- expect(subject.valid?).to be_falsey
304
- end
305
-
306
- it 'is copies the error to the record' do
307
- subject.records = [
308
- NestedAttributesSpec::Record.new,
309
- NestedAttributesSpec::Record.new(:error => 'some error'),
310
- ]
311
-
312
- subject.valid?
313
- expect(subject.errors["records.base"]).to eq(['some error'])
314
- end
315
-
316
- end
317
-
318
- end
319
-
320
- end
321
-
322
-
323
- context '.nests_one' do
324
-
325
- let(:extra_options) { {} }
326
-
327
- subject do
328
- extra = extra_options
329
- Class.new(ActiveType::Object) do
330
- nests_one :record, extra.merge(:scope => NestedAttributesSpec::Record)
331
-
332
- def bad(attributes)
333
- attributes[:persisted_string] =~ /bad/
334
- end
335
- end.new
336
- end
337
-
338
- def should_assign_and_persist(assign, persist = assign)
339
- if assign
340
- expect(subject.record).to be_present
341
- expect(subject.record.persisted_string).to eq(assign)
342
- else
343
- expect(subject.record).to be_nil
344
- end
345
- expect(subject.save).to eq(true)
346
- expect(NestedAttributesSpec::Record.all.map(&:persisted_string)).to eq(persist ? [persist] : [])
347
- end
348
-
349
-
350
- context 'with no record assigned' do
351
-
352
- it 'can save' do
353
- expect(subject.save).to eq(true)
354
- end
355
-
356
- end
357
-
358
- context 'assigning nil' do
359
-
360
- it 'will do nothing' do
361
- subject.record_attributes = nil
362
- expect(subject.record).to be_nil
363
- end
364
-
365
- end
366
-
367
- context 'when assigning a records without an id' do
368
-
369
- it 'builds a nested records' do
370
- subject.record_attributes = { :persisted_string => "string" }
371
-
372
- should_assign_and_persist("string")
373
- end
374
-
375
- it 'does not build a record that matchs a :reject_if proc' do
376
- extra_options.merge!(:reject_if => proc { |attributes| attributes['persisted_string'] =~ /bad/ })
377
- subject.record_attributes = { :persisted_string => "bad" }
378
-
379
- should_assign_and_persist(nil)
380
- end
381
-
382
-
383
- it 'updates an assigned record' do
384
- subject.record = NestedAttributesSpec::Record.create!(:persisted_string => "existing string")
385
- subject.record_attributes = { :persisted_string => "new string" }
386
-
387
- should_assign_and_persist("new string")
388
- end
389
-
390
- it 'does not update a record that matchs a :reject_if proc' do
391
- extra_options.merge!(:reject_if => proc { |attributes| attributes['persisted_string'] =~ /bad/ })
392
- subject.record = NestedAttributesSpec::Record.create!(:persisted_string => "existing string")
393
- subject.record_attributes = { :persisted_string => "bad" }
394
-
395
- should_assign_and_persist("existing string")
396
- end
397
-
398
-
399
- end
400
-
401
- context 'when assigning a records with an id' do
402
-
403
- let(:record) { record = NestedAttributesSpec::Record.create!(:persisted_string => "existing string") }
404
-
405
- it 'updates the record if already assigned' do
406
- subject.record = record
407
-
408
- subject.record_attributes = { :id => record.id, :persisted_string => "updated string"}
409
-
410
- should_assign_and_persist("updated string")
411
- end
412
-
413
- it 'fetches the record with the id if not already assigned' do
414
- subject.record_attributes = { :id => record.id, :persisted_string => "updated string" }
415
-
416
- should_assign_and_persist("updated string")
417
- end
418
-
419
- it 'does not destroy records on _destroy => true by default' do
420
- subject.record_attributes = { :id => record.id, :_destroy => true }
421
-
422
- should_assign_and_persist("existing string", "existing string")
423
- end
424
-
425
- it 'destroys records on _destroy => true if allowed' do
426
- extra_options.merge!(:allow_destroy => true)
427
- subject.record_attributes = { :id => record.id, :_destroy => true }
428
-
429
- should_assign_and_persist("existing string", nil)
430
- expect(subject.record).to eq(nil)
431
- end
432
-
433
- it 'raises an error if the assigned record does not match the id' do
434
- expect do
435
- subject.record = NestedAttributesSpec::Record.create!
436
- subject.record_attributes = { :id => record.id, :persisted_string => "updated string" }
437
- end.to raise_error(ActiveType::NestedAttributes::AssignmentError, "child record 'record' did not match id '#{record.id}'")
438
- end
439
-
440
- it 'raises an error if a record with the id cannot be found' do
441
- expect do
442
- subject.record_attributes = { :id => 1, :persisted_string => "updated string" }
443
- end.to raise_error(ActiveType::NestedAttributes::RecordNotFound, "could not find a child record with id '1' for 'record'")
444
- end
445
-
446
- end
447
-
448
- context 'validations' do
449
-
450
- describe '#valid?' do
451
-
452
- it 'is true if there is no record assigned' do
453
- expect(subject.valid?).to eq(true)
454
- end
455
-
456
- it 'is true if the assigned record is valid' do
457
- subject.record = NestedAttributesSpec::Record.new
458
-
459
- expect(subject.valid?).to eq(true)
460
- end
461
-
462
- it 'is false the assigned record has an error' do
463
- subject.record = NestedAttributesSpec::Record.new(:error => 'some error')
464
-
465
- expect(subject.valid?).to be_falsey
466
- end
467
-
468
- it 'is copies the error to the record' do
469
- subject.record = NestedAttributesSpec::Record.new(:error => 'some error')
470
-
471
- subject.valid?
472
- expect(subject.errors["record.base"]).to eq(['some error'])
473
- end
474
-
475
- end
476
-
477
- end
478
-
479
- end
480
-
481
- context '.nests_one/nests_many' do
482
-
483
- context 'inheritance' do
484
-
485
- let(:base_class) do
486
- Class.new(ActiveType::Object) do
487
- nests_one :record, :scope => NestedAttributesSpec::Record
488
- end
489
- end
490
-
491
- it 'works across inheritance hierarchy' do
492
- subject = Class.new(base_class) do
493
- nests_one :another_record, :scope => NestedAttributesSpec::Record
494
- end.new
495
-
496
- subject.record_attributes = { :persisted_string => "string" }
497
- subject.another_record_attributes = {:persisted_string => "another string"}
498
-
499
- expect(subject.record.persisted_string).to eq("string")
500
- expect(subject.another_record.persisted_string).to eq("another string")
501
- expect(subject.save).to eq(true)
502
- expect(NestedAttributesSpec::Record.all.map(&:persisted_string)).to match_array(["string", "another string"])
503
- end
504
-
505
- it 'allows overriding of the accessor' do
506
- subject = Class.new(base_class) do
507
- def record_attributes=(attributes)
508
- reached
509
- super
510
- end
511
-
512
- def reached
513
- end
514
- end.new
515
-
516
- expect(subject).to receive(:reached)
517
- subject.record_attributes = { :persisted_string => "string" }
518
-
519
- expect(subject.record.persisted_string).to eq("string")
520
- expect(subject.save).to eq(true)
521
- expect(NestedAttributesSpec::Record.all.map(&:persisted_string)).to match_array(["string"])
522
- end
523
-
524
- end
525
-
526
- context 'when not giving a scope' do
527
-
528
- subject do
529
- Class.new(ActiveType::Object) do
530
- nests_many :global_records
531
- nests_one :global_record
532
- end.new
533
- end
534
-
535
- it 'infers the scope from the association name' do
536
- subject.global_records_attributes = { 1 => { :persisted_string => "string" } }
537
- subject.global_record_attributes = { :persisted_string => "string" }
538
-
539
- expect(subject.global_records.first).to be_a(GlobalRecord)
540
- expect(subject.global_record).to be_a(GlobalRecord)
541
- end
542
-
543
- end
544
-
545
- context 'when giving a scope via a proc' do
546
-
547
- subject do
548
- Class.new(ActiveType::Object) do
549
- nests_many :records, :scope => proc { NestedAttributesSpec::Record.where("persisted_string <> 'invisible'") }
550
- nests_one :record, :scope => proc { NestedAttributesSpec::Record }
551
-
552
- attribute :default_value, :string
553
- nests_many :default_records, :scope => proc { NestedAttributesSpec::Record.where(:persisted_string => default_value) }
554
- end.new
555
- end
556
-
557
- it 'uses the scope' do
558
- subject.records_attributes = { 1 => { :persisted_string => "string" } }
559
- subject.record_attributes = { :persisted_string => "string" }
560
-
561
- expect(subject.records.first).to be_a(NestedAttributesSpec::Record)
562
- expect(subject.record).to be_a(NestedAttributesSpec::Record)
563
- end
564
-
565
- it 'evals the scope lazily in the instance' do
566
- subject.default_value = "default value"
567
- subject.default_records_attributes = [{}]
568
-
569
- expect(subject.default_records.map(&:persisted_string)).to eq(["default value"])
570
- end
571
-
572
- it 'caches the scope' do
573
- subject.default_value = "default value"
574
- subject.default_records_attributes = [{}]
575
- subject.default_value = "another default value"
576
- subject.default_records_attributes = [{}]
577
-
578
- expect(subject.default_records.map(&:persisted_string)).to eq(["default value", "default value"])
579
- end
580
-
581
- it 'caches the scope per instance' do
582
- subject.default_value = "default value"
583
- subject.default_records_attributes = [{}]
584
-
585
- another_subject = subject.class.new
586
- another_subject.default_value = "another default value"
587
- another_subject.default_records_attributes = [{}]
588
-
589
- expect(another_subject.default_records.map(&:persisted_string)).to eq(["another default value"])
590
- end
591
-
592
- it 'raises an error if the child record is not found via the scope' do
593
- record = NestedAttributesSpec::Record.create!(:persisted_string => 'invisible')
594
-
595
- expect do
596
- subject.records_attributes = { 1 => { :id => record.id, :persisted_string => "updated string" } }
597
- end.to raise_error(ActiveType::NestedAttributes::RecordNotFound, "could not find a child record with id '#{record.id}' for 'records'")
598
- end
599
- end
600
-
601
- context 'separate scopes for build and find' do
602
-
603
- subject do
604
- find_scope = proc { NestedAttributesSpec::Record.where(:persisted_string => 'findable') }
605
- build_scope = proc { NestedAttributesSpec::Record.where(:persisted_string => 'buildable') }
606
- Class.new(ActiveType::Object) do
607
- nests_many :records, :build_scope => build_scope, :find_scope => find_scope
608
- nests_one :record, :build_scope => build_scope, :find_scope => find_scope
609
- end.new
610
- end
611
-
612
- it 'nests_many uses the find_scope to find records' do
613
- record = NestedAttributesSpec::Record.create!(:persisted_string => 'findable')
614
- hidden_record = NestedAttributesSpec::Record.create!(:persisted_string => 'hidden')
615
-
616
- expect do
617
- subject.records_attributes = [{ :id => record.id, :persisted_string => 'updated' }]
618
- end.to_not raise_error
619
-
620
- expect do
621
- subject.records_attributes = [{ :id => hidden_record.id, :persisted_string => 'updated' }]
622
- end.to raise_error(ActiveType::NestedAttributes::RecordNotFound)
623
- end
624
-
625
- it 'nests_many uses the build_scope to find records' do
626
- subject.records_attributes = [{}]
627
- expect(subject.records.first.persisted_string).to eq('buildable')
628
- end
629
-
630
- it 'nests_one uses the find_scope to find records' do
631
- record = NestedAttributesSpec::Record.create!(:persisted_string => 'findable')
632
- hidden_record = NestedAttributesSpec::Record.create!(:persisted_string => 'hidden')
633
-
634
- expect do
635
- subject.record_attributes = { :id => record.id, :persisted_string => 'updated' }
636
- end.to_not raise_error
637
-
638
- subject.record = nil
639
- expect do
640
- subject.record_attributes = { :id => hidden_record.id, :persisted_string => 'updated' }
641
- end.to raise_error(ActiveType::NestedAttributes::RecordNotFound)
642
- end
643
-
644
- it 'nests_one uses the build_scope to find records' do
645
- subject.record_attributes = {}
646
- expect(subject.record.persisted_string).to eq('buildable')
647
- end
648
-
649
- end
650
-
651
- context 'defaults' do
652
-
653
- subject do
654
- Class.new(ActiveType::Object) do
655
- nests_many :records, :default => proc { [default_record] }
656
- nests_one :record, :default => proc { default_record }
657
-
658
- nests_many :global_records
659
-
660
- nests_many :other_records, :scope => proc { NestedAttributesSpec::Record }
661
- nests_one :other_record, :scope => proc { NestedAttributesSpec::Record }
662
-
663
- nests_many :records_without_default, :default => nil
664
-
665
- def default_record
666
- NestedAttributesSpec::Record.new(:persisted_string => "default")
667
- end
668
- end.new
669
- end
670
-
671
- it 'accepts a :default value' do
672
- expect(subject.records.map(&:persisted_string)).to eq(["default"])
673
- expect(subject.record.persisted_string).to eq("default")
674
- end
675
-
676
- it 'computes the value lazily' do
677
- allow(subject).to receive_messages :default_record => NestedAttributesSpec::Record.new(:persisted_string => "other default")
678
- expect(subject.records.map(&:persisted_string)).to eq(["other default"])
679
- expect(subject.record.persisted_string).to eq("other default")
680
- end
681
-
682
- end
683
-
684
- end
685
-
686
- end
687
-
688
- describe "ActiveType::Record" do
689
-
690
- it 'supports nested attributes' do
691
- expect(ActiveType::Record).to respond_to(:nests_one)
692
- expect(ActiveType::Record).to respond_to(:nests_many)
693
- end
694
-
695
- end
696
-
697
- describe "ActiveType::Record" do
698
-
699
- it 'supports nested attributes' do
700
- expect(ActiveType::Record[NestedAttributesSpec::Record]).to respond_to(:nests_one)
701
- expect(ActiveType::Record[NestedAttributesSpec::Record]).to respond_to(:nests_many)
702
- end
703
-
704
- end