anonymous_active_record 1.0.1 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module AnonymousActiveRecord
2
- VERSION = '1.0.1'.freeze
4
+ VERSION = '1.0.6'
3
5
  end
@@ -0,0 +1,1025 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe AnonymousActiveRecord do
4
+ it 'has a version number' do
5
+ expect(AnonymousActiveRecord::VERSION).not_to be nil
6
+ end
7
+
8
+ describe '.generate' do
9
+ context 'minimal params' do
10
+ subject { described_class.generate }
11
+
12
+ it 'does not error' do
13
+ expect { subject }.not_to raise_error
14
+ end
15
+
16
+ context 'instance' do
17
+ subject { super().new }
18
+
19
+ it 'can be instantiated' do
20
+ expect(subject).to be_a(ActiveRecord::Base)
21
+ end
22
+
23
+ context 'timestamps' do
24
+ it 'has' do
25
+ expect(subject.created_at).to be_nil
26
+ expect(subject.updated_at).to be_nil
27
+ end
28
+ end
29
+
30
+ context 'saving' do
31
+ subject do
32
+ i = super()
33
+ i.save
34
+ i
35
+ end
36
+
37
+ it 'does not error' do
38
+ expect { subject }.not_to raise_error
39
+ end
40
+
41
+ it 'does not have name' do
42
+ expect(subject).not_to respond_to(:name)
43
+ end
44
+
45
+ it 'sets timestamps' do
46
+ expect(subject.created_at).not_to be_nil
47
+ expect(subject.updated_at).not_to be_nil
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'all params' do
54
+ subject do
55
+ described_class.generate(
56
+ table_name: table_name,
57
+ klass_namespaces: klass_namespaces,
58
+ klass_basename: klass_basename,
59
+ columns: columns,
60
+ indexes: indexes,
61
+ timestamps: timestamps,
62
+ connection_params: connection_params
63
+ )
64
+ end
65
+
66
+ let!(:farm_animal) do
67
+ module Farm
68
+ module Animal
69
+ end
70
+ end
71
+ end
72
+ let(:table_name) { 'dogs' }
73
+ let(:klass_namespaces) { %w[Farm Animal] }
74
+ let(:klass_basename) { 'my' }
75
+ let(:columns) { ['name'] }
76
+ let(:indexes) { [{ columns: ['name'] }] }
77
+ let(:timestamps) { true }
78
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
79
+
80
+ it 'does not error' do
81
+ expect { subject }.not_to raise_error
82
+ end
83
+
84
+ context 'instance' do
85
+ subject { super().new }
86
+
87
+ it 'can be instantiated' do
88
+ expect(subject).to be_a(ActiveRecord::Base)
89
+ end
90
+
91
+ context 'name' do
92
+ it 'has' do
93
+ expect(subject.name).to be_nil
94
+ end
95
+ end
96
+
97
+ context 'timestamps' do
98
+ it 'has' do
99
+ expect(subject.created_at).to be_nil
100
+ expect(subject.updated_at).to be_nil
101
+ end
102
+ end
103
+
104
+ context 'saving' do
105
+ subject do
106
+ i = super()
107
+ i.name = 'Bobo'
108
+ i.save
109
+ i
110
+ end
111
+
112
+ it 'does not error' do
113
+ expect { subject }.not_to raise_error
114
+ end
115
+
116
+ it 'sets name' do
117
+ expect(subject.name).to eq('Bobo')
118
+ end
119
+
120
+ it 'sets timestamps' do
121
+ expect(subject.created_at).not_to be_nil
122
+ expect(subject.updated_at).not_to be_nil
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ context 'designating type' do
129
+ subject do
130
+ described_class.generate(
131
+ table_name: table_name,
132
+ klass_namespaces: klass_namespaces,
133
+ klass_basename: klass_basename,
134
+ columns: columns,
135
+ indexes: indexes,
136
+ timestamps: timestamps,
137
+ connection_params: connection_params
138
+ )
139
+ end
140
+
141
+ let!(:farm_animal) do
142
+ module Farm
143
+ module Animal
144
+ end
145
+ end
146
+ end
147
+ let(:table_name) { 'dogs' }
148
+ let(:klass_namespaces) { %w[Farm Animal] }
149
+ let(:klass_basename) { 'my' }
150
+ let(:columns) { [{ name: 'name', type: 'string' }, { name: 'baked_at', type: 'time' }] }
151
+ let(:indexes) { [] }
152
+ let(:timestamps) { true }
153
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
154
+
155
+ it 'does not error' do
156
+ expect { subject }.not_to raise_error
157
+ end
158
+
159
+ context 'instance' do
160
+ subject { super().new }
161
+
162
+ it 'can be instantiated' do
163
+ expect(subject).to be_a(ActiveRecord::Base)
164
+ end
165
+
166
+ context 'name' do
167
+ it 'has' do
168
+ expect(subject.name).to be_nil
169
+ end
170
+ end
171
+
172
+ context 'baked_at' do
173
+ it 'has' do
174
+ expect(subject.baked_at).to be_nil
175
+ end
176
+ end
177
+
178
+ context 'timestamps' do
179
+ it 'has' do
180
+ expect(subject.created_at).to be_nil
181
+ expect(subject.updated_at).to be_nil
182
+ end
183
+ end
184
+
185
+ context 'saving' do
186
+ subject do
187
+ i = super()
188
+ i.name = 'Bobo'
189
+ i.baked_at = Time.now
190
+ i.save
191
+ i
192
+ end
193
+
194
+ it 'does not error' do
195
+ expect { subject }.not_to raise_error
196
+ end
197
+
198
+ it 'sets name' do
199
+ expect(subject.name).to eq('Bobo')
200
+ end
201
+
202
+ it 'sets baked_at' do
203
+ expect([ActiveRecord::Type::Time::Value, Time]).to include(subject.baked_at.class)
204
+ end
205
+
206
+ it 'sets timestamps' do
207
+ expect(subject.created_at).not_to be_nil
208
+ expect(subject.updated_at).not_to be_nil
209
+ end
210
+ end
211
+ end
212
+ end
213
+
214
+ context 'designating default' do
215
+ subject do
216
+ described_class.generate(
217
+ table_name: table_name,
218
+ klass_namespaces: klass_namespaces,
219
+ klass_basename: klass_basename,
220
+ columns: columns,
221
+ indexes: indexes,
222
+ timestamps: timestamps,
223
+ connection_params: connection_params
224
+ )
225
+ end
226
+
227
+ let!(:farm_animal) do
228
+ module Farm
229
+ module Animal
230
+ end
231
+ end
232
+ end
233
+ let(:table_name) { 'dogs' }
234
+ let(:klass_namespaces) { %w[Farm Animal] }
235
+ let(:klass_basename) { 'my' }
236
+ let(:columns) do
237
+ [{ name: 'name', type: 'string', default: 'Bird Man' }, { name: 'number', type: 'integer', default: 0 }]
238
+ end
239
+ let(:indexes) { [] }
240
+ let(:timestamps) { true }
241
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
242
+
243
+ it 'does not error' do
244
+ expect { subject }.not_to raise_error
245
+ end
246
+
247
+ context 'instance' do
248
+ subject { super().new }
249
+
250
+ it 'can be instantiated' do
251
+ expect(subject).to be_a(ActiveRecord::Base)
252
+ end
253
+
254
+ context 'name' do
255
+ it 'has' do
256
+ expect(subject.name).to eq('Bird Man')
257
+ end
258
+ end
259
+
260
+ context 'number' do
261
+ it 'has' do
262
+ expect(subject.number).to eq(0)
263
+ end
264
+ end
265
+
266
+ context 'timestamps' do
267
+ it 'has' do
268
+ expect(subject.created_at).to be_nil
269
+ expect(subject.updated_at).to be_nil
270
+ end
271
+ end
272
+
273
+ context 'saving' do
274
+ subject do
275
+ i = super()
276
+ i.name = 'Bobo'
277
+ i.number += 111
278
+ i.save
279
+ i
280
+ end
281
+
282
+ it 'does not error' do
283
+ expect { subject }.not_to raise_error
284
+ end
285
+
286
+ it 'sets name' do
287
+ expect(subject.name).to eq('Bobo')
288
+ end
289
+
290
+ it 'sets number' do
291
+ expect(subject.number).to eq(111)
292
+ end
293
+
294
+ it 'sets timestamps' do
295
+ expect(subject.created_at).not_to be_nil
296
+ expect(subject.updated_at).not_to be_nil
297
+ end
298
+ end
299
+ end
300
+ end
301
+
302
+ context 'with unique index as options' do
303
+ subject do
304
+ described_class.generate(
305
+ table_name: table_name,
306
+ klass_namespaces: klass_namespaces,
307
+ klass_basename: klass_basename,
308
+ columns: columns,
309
+ indexes: indexes,
310
+ timestamps: timestamps,
311
+ connection_params: connection_params
312
+ )
313
+ end
314
+
315
+ let!(:farm_animal) do
316
+ module Farm
317
+ module Animal
318
+ end
319
+ end
320
+ end
321
+ let(:table_name) { 'dogs' }
322
+ let(:klass_namespaces) { %w[Farm Animal] }
323
+ let(:klass_basename) { 'my' }
324
+ let(:columns) { [{ name: 'name', type: 'string' }, { name: 'baked_at', type: 'time' }] }
325
+ let(:indexes) { [{ columns: ['name'], unique: true }, { columns: ['baked_at'] }] }
326
+ let(:timestamps) { true }
327
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
328
+
329
+ it 'does not error' do
330
+ expect { subject }.not_to raise_error
331
+ end
332
+
333
+ context 'instance' do
334
+ subject { super().new }
335
+
336
+ it 'can be instantiated' do
337
+ expect(subject).to be_a(ActiveRecord::Base)
338
+ end
339
+
340
+ context 'name' do
341
+ it 'has' do
342
+ expect(subject.name).to be_nil
343
+ end
344
+ end
345
+
346
+ context 'baked_at' do
347
+ it 'has' do
348
+ expect(subject.baked_at).to be_nil
349
+ end
350
+ end
351
+
352
+ context 'timestamps' do
353
+ it 'has' do
354
+ expect(subject.created_at).to be_nil
355
+ expect(subject.updated_at).to be_nil
356
+ end
357
+ end
358
+
359
+ context 'saving' do
360
+ subject do
361
+ i = super()
362
+ i.name = 'Bobo'
363
+ i.baked_at = Time.now
364
+ i.save
365
+ i
366
+ end
367
+
368
+ it 'does not error' do
369
+ expect { subject }.not_to raise_error
370
+ end
371
+
372
+ it 'sets name' do
373
+ expect(subject.name).to eq('Bobo')
374
+ end
375
+
376
+ it 'sets baked_at' do
377
+ expect([ActiveRecord::Type::Time::Value, Time]).to include(subject.baked_at.class)
378
+ end
379
+
380
+ it 'sets timestamps' do
381
+ expect(subject.created_at).not_to be_nil
382
+ expect(subject.updated_at).not_to be_nil
383
+ end
384
+ end
385
+
386
+ context 'uniqueness enforced by index' do
387
+ subject do
388
+ i = model.new
389
+ i.name = 'Bobo'
390
+ i.baked_at = Time.now
391
+ i.save!
392
+ end
393
+
394
+ let(:model) do
395
+ described_class.generate(
396
+ table_name: table_name,
397
+ klass_namespaces: klass_namespaces,
398
+ klass_basename: klass_basename,
399
+ columns: columns,
400
+ indexes: indexes,
401
+ timestamps: timestamps,
402
+ connection_params: connection_params
403
+ )
404
+ end
405
+
406
+ before do
407
+ i = model.new
408
+ i.name = 'Bobo'
409
+ i.baked_at = Time.now
410
+ i.save
411
+ end
412
+
413
+ it 'raises error' do
414
+ block_is_expected.to raise_error(ActiveRecord::RecordNotUnique)
415
+ end
416
+ end
417
+ end
418
+ end
419
+
420
+ context 'with unique index as implicit' do
421
+ subject do
422
+ described_class.generate(
423
+ table_name: table_name,
424
+ klass_namespaces: klass_namespaces,
425
+ klass_basename: klass_basename,
426
+ columns: columns,
427
+ indexes: indexes,
428
+ timestamps: timestamps,
429
+ connection_params: connection_params
430
+ )
431
+ end
432
+
433
+ let!(:farm_animal) do
434
+ module Farm
435
+ module Animal
436
+ end
437
+ end
438
+ end
439
+ let(:table_name) { 'dogs' }
440
+ let(:klass_namespaces) { %w[Farm Animal] }
441
+ let(:klass_basename) { 'my' }
442
+ let(:columns) { [{ name: 'name', type: 'string' }, { name: 'baked_at', type: 'time' }] }
443
+ let(:indexes) { [[['name'], { unique: true }], 'baked_at'] }
444
+ let(:timestamps) { true }
445
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
446
+
447
+ it 'does not error' do
448
+ expect { subject }.not_to raise_error
449
+ end
450
+
451
+ context 'instance' do
452
+ subject { super().new }
453
+
454
+ it 'can be instantiated' do
455
+ expect(subject).to be_a(ActiveRecord::Base)
456
+ end
457
+
458
+ context 'name' do
459
+ it 'has' do
460
+ expect(subject.name).to be_nil
461
+ end
462
+ end
463
+
464
+ context 'baked_at' do
465
+ it 'has' do
466
+ expect(subject.baked_at).to be_nil
467
+ end
468
+ end
469
+
470
+ context 'timestamps' do
471
+ it 'has' do
472
+ expect(subject.created_at).to be_nil
473
+ expect(subject.updated_at).to be_nil
474
+ end
475
+ end
476
+
477
+ context 'saving' do
478
+ subject do
479
+ i = super()
480
+ i.name = 'Bobo'
481
+ i.baked_at = Time.now
482
+ i.save
483
+ i
484
+ end
485
+
486
+ it 'does not error' do
487
+ expect { subject }.not_to raise_error
488
+ end
489
+
490
+ it 'sets name' do
491
+ expect(subject.name).to eq('Bobo')
492
+ end
493
+
494
+ it 'sets baked_at' do
495
+ expect([ActiveRecord::Type::Time::Value, Time]).to include(subject.baked_at.class)
496
+ end
497
+
498
+ it 'sets timestamps' do
499
+ expect(subject.created_at).not_to be_nil
500
+ expect(subject.updated_at).not_to be_nil
501
+ end
502
+ end
503
+
504
+ context 'uniqueness enforced by index' do
505
+ subject do
506
+ i = model.new
507
+ i.name = 'Bobo'
508
+ i.baked_at = Time.now
509
+ i.save!
510
+ end
511
+
512
+ let(:model) do
513
+ described_class.generate(
514
+ table_name: table_name,
515
+ klass_namespaces: klass_namespaces,
516
+ klass_basename: klass_basename,
517
+ columns: columns,
518
+ indexes: indexes,
519
+ timestamps: timestamps,
520
+ connection_params: connection_params
521
+ )
522
+ end
523
+
524
+ before do
525
+ i = model.new
526
+ i.name = 'Bobo'
527
+ i.baked_at = Time.now
528
+ i.save
529
+ end
530
+
531
+ it 'raises error' do
532
+ block_is_expected.to raise_error(ActiveRecord::RecordNotUnique)
533
+ end
534
+ end
535
+ end
536
+ end
537
+
538
+ context 'no timestamps' do
539
+ subject do
540
+ described_class.generate(
541
+ table_name: table_name,
542
+ klass_basename: klass_basename,
543
+ columns: columns,
544
+ timestamps: timestamps,
545
+ connection_params: connection_params
546
+ )
547
+ end
548
+
549
+ let(:table_name) { 'dogs' }
550
+ let(:klass_basename) { 'my' }
551
+ let(:columns) { ['name'] }
552
+ let(:timestamps) { false }
553
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
554
+
555
+ it 'does not error' do
556
+ expect { subject }.not_to raise_error
557
+ end
558
+
559
+ context 'instance' do
560
+ subject { super().new }
561
+
562
+ it 'can be instantiated' do
563
+ expect(subject).to be_a(ActiveRecord::Base)
564
+ end
565
+
566
+ context 'timestamps' do
567
+ it 'has not' do
568
+ expect(subject).not_to respond_to(:created_at)
569
+ expect(subject).not_to respond_to(:updated_at)
570
+ end
571
+ end
572
+
573
+ context 'saving' do
574
+ subject do
575
+ i = super()
576
+ i.name = 'Bobo'
577
+ i.save
578
+ i
579
+ end
580
+
581
+ it 'does not error' do
582
+ expect { subject }.not_to raise_error
583
+ end
584
+
585
+ it 'sets name' do
586
+ expect(subject.name).to eq('Bobo')
587
+ end
588
+
589
+ it 'has no timestamps' do
590
+ expect(subject).not_to respond_to(:created_at)
591
+ expect(subject).not_to respond_to(:updated_at)
592
+ end
593
+ end
594
+ end
595
+ end
596
+
597
+ context 'with block' do
598
+ subject do
599
+ described_class.generate(
600
+ table_name: table_name,
601
+ klass_basename: klass_basename,
602
+ columns: columns,
603
+ timestamps: timestamps,
604
+ connection_params: connection_params
605
+ ) do
606
+ def eat_pie
607
+ 'eating'
608
+ end
609
+
610
+ def flowery_name
611
+ "🌸#{name}🌸"
612
+ end
613
+ end
614
+ end
615
+
616
+ let(:table_name) { 'dogs' }
617
+ let(:klass_basename) { 'my' }
618
+ let(:columns) { ['name'] }
619
+ let(:timestamps) { false }
620
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
621
+
622
+ it 'does not error' do
623
+ expect { subject }.not_to raise_error
624
+ end
625
+
626
+ context 'instance' do
627
+ subject { super().new(name: 'Marty McFly') }
628
+
629
+ it 'can be instantiated' do
630
+ expect(subject).to be_a(ActiveRecord::Base)
631
+ end
632
+
633
+ context 'block' do
634
+ it 'defines method' do
635
+ expect(subject.eat_pie).to eq('eating')
636
+ end
637
+
638
+ it 'has access to class context' do
639
+ expect(subject.flowery_name).to eq('🌸Marty McFly🌸')
640
+ end
641
+ end
642
+
643
+ context 'timestamps' do
644
+ it 'has not' do
645
+ expect(subject).not_to respond_to(:created_at)
646
+ expect(subject).not_to respond_to(:updated_at)
647
+ end
648
+ end
649
+
650
+ context 'saving' do
651
+ subject do
652
+ i = super()
653
+ i.name = 'Bobo'
654
+ i.save
655
+ i
656
+ end
657
+
658
+ it 'does not error' do
659
+ expect { subject }.not_to raise_error
660
+ end
661
+
662
+ it 'sets name' do
663
+ expect(subject.name).to eq('Bobo')
664
+ end
665
+
666
+ it 'has access to class context' do
667
+ expect(subject.flowery_name).to eq('🌸Bobo🌸')
668
+ end
669
+
670
+ it 'has no timestamps' do
671
+ expect(subject).not_to respond_to(:created_at)
672
+ expect(subject).not_to respond_to(:updated_at)
673
+ end
674
+ end
675
+ end
676
+ end
677
+
678
+ context 'testing a module' do
679
+ let!(:has_balloon) do
680
+ module HasBalloon
681
+ def has_balloon?
682
+ name == 'Spot' # only Spot has a balloon
683
+ end
684
+ end
685
+ end
686
+ let(:ar_with_balloon) do
687
+ described_class.generate(columns: ['name']) do
688
+ include HasBalloon
689
+ def flowery_name
690
+ "#{b_f}#{name}#{b_f}"
691
+ end
692
+
693
+ def b_f
694
+ has_balloon? ? '🎈' : '🌸'
695
+ end
696
+ end
697
+ end
698
+
699
+ it 'can test the module' do
700
+ expect(ar_with_balloon.new(name: 'Spot').flowery_name).to eq('🎈Spot🎈')
701
+ expect(ar_with_balloon.new(name: 'Not Spot').flowery_name).to eq('🌸Not Spot🌸')
702
+ end
703
+ end
704
+ end
705
+
706
+ describe '.factory' do
707
+ context 'minimal params' do
708
+ context 'returns array' do
709
+ subject { described_class.factory }
710
+
711
+ it 'be an array' do
712
+ expect(subject).to be_a(Array)
713
+ end
714
+
715
+ it 'has length 0' do
716
+ expect(subject.length).to eq(0)
717
+ end
718
+ end
719
+ end
720
+
721
+ context 'all params' do
722
+ subject do
723
+ described_class.factory(
724
+ source_data: source_data,
725
+ table_name: table_name,
726
+ klass_namespaces: klass_namespaces,
727
+ klass_basename: klass_basename,
728
+ columns: columns,
729
+ indexes: indexes,
730
+ timestamps: timestamps,
731
+ connection_params: connection_params
732
+ )
733
+ end
734
+
735
+ let!(:farm_animal) do
736
+ module Zoo
737
+ module Animal
738
+ end
739
+ end
740
+ end
741
+ let(:table_name) { 'dogs' }
742
+ let(:klass_namespaces) { %w[Zoo Animal] }
743
+ let(:klass_basename) { 'my' }
744
+ let(:columns) { ['name'] }
745
+ let(:indexes) { [{ columns: ['name'] }] }
746
+ let(:timestamps) { true }
747
+ let(:source_data) { [{ name: 'Gru Banksy' }, { name: 'Herlina Termalina' }] }
748
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
749
+
750
+ context 'returns array' do
751
+ it 'be an array' do
752
+ expect(subject).to be_a(Array)
753
+ end
754
+
755
+ it 'has length 2' do
756
+ expect(subject.length).to eq(2)
757
+ end
758
+ end
759
+
760
+ context 'sets attributes' do
761
+ subject { super().map(&:name) }
762
+
763
+ it 'be an array' do
764
+ expect(subject).to eq(['Gru Banksy', 'Herlina Termalina'])
765
+ end
766
+ end
767
+ end
768
+
769
+ context 'no timestamps' do
770
+ subject do
771
+ described_class.factory(
772
+ source_data: source_data,
773
+ table_name: table_name,
774
+ klass_basename: klass_basename,
775
+ columns: columns,
776
+ indexes: indexes,
777
+ timestamps: timestamps,
778
+ connection_params: connection_params
779
+ )
780
+ end
781
+
782
+ let(:table_name) { 'dogs' }
783
+ let(:klass_basename) { 'my' }
784
+ let(:columns) { ['name'] }
785
+ let(:indexes) { [{ columns: ['name'] }] }
786
+ let(:timestamps) { false }
787
+ let(:source_data) { [{ name: 'Gru Banksy' }, { name: 'Herlina Termalina' }] }
788
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
789
+
790
+ context 'returns array' do
791
+ it 'be an array' do
792
+ expect(subject).to be_a(Array)
793
+ end
794
+
795
+ it 'has length 2' do
796
+ expect(subject.length).to eq(2)
797
+ end
798
+ end
799
+
800
+ context 'does not have timestamps' do
801
+ subject { super().map { |anon| anon.respond_to?(:created_at) } }
802
+
803
+ it 'be an array' do
804
+ expect(subject).to eq([false, false])
805
+ end
806
+ end
807
+ end
808
+
809
+ context 'with block' do
810
+ subject do
811
+ described_class.factory(
812
+ source_data: source_data,
813
+ table_name: table_name,
814
+ klass_basename: klass_basename,
815
+ columns: columns,
816
+ indexes: indexes,
817
+ timestamps: timestamps,
818
+ connection_params: connection_params
819
+ ) do
820
+ def eat_pie
821
+ 'eating'
822
+ end
823
+
824
+ def flowery_name
825
+ "🌸#{name}🌸"
826
+ end
827
+ end
828
+ end
829
+
830
+ let(:table_name) { 'dogs' }
831
+ let(:klass_basename) { 'my' }
832
+ let(:columns) { ['name'] }
833
+ let(:indexes) { [{ columns: ['name'] }] }
834
+ let(:timestamps) { false }
835
+ let(:source_data) { [{ name: 'Gru Banksy' }, { name: 'Herlina Termalina' }] }
836
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
837
+
838
+ context 'returns array' do
839
+ it 'be an array' do
840
+ expect(subject).to be_a(Array)
841
+ end
842
+
843
+ it 'has length 2' do
844
+ expect(subject.length).to eq(2)
845
+ end
846
+ end
847
+
848
+ context 'defines method' do
849
+ subject { super().map(&:eat_pie) }
850
+
851
+ it 'defines method' do
852
+ expect(subject).to eq(%w[eating eating])
853
+ end
854
+ end
855
+
856
+ context 'sets attributes' do
857
+ subject { super().map(&:flowery_name) }
858
+
859
+ it 'be an array' do
860
+ expect(subject).to eq(['🌸Gru Banksy🌸', '🌸Herlina Termalina🌸'])
861
+ end
862
+ end
863
+ end
864
+ end
865
+
866
+ describe '.factory!' do
867
+ context 'minimal params' do
868
+ context 'returns array' do
869
+ subject { described_class.factory! }
870
+
871
+ it 'be an array' do
872
+ expect(subject).to be_a(Array)
873
+ end
874
+
875
+ it 'has length 0' do
876
+ expect(subject.length).to eq(0)
877
+ end
878
+ end
879
+ end
880
+
881
+ context 'all params' do
882
+ subject do
883
+ described_class.factory!(
884
+ source_data: source_data,
885
+ table_name: table_name,
886
+ klass_namespaces: klass_namespaces,
887
+ klass_basename: klass_basename,
888
+ columns: columns,
889
+ indexes: indexes,
890
+ timestamps: timestamps,
891
+ connection_params: connection_params
892
+ )
893
+ end
894
+
895
+ let!(:farm_animal) do
896
+ module Zoo
897
+ module Animal
898
+ end
899
+ end
900
+ end
901
+ let(:table_name) { 'dogs' }
902
+ let(:klass_namespaces) { %w[Zoo Animal] }
903
+ let(:klass_basename) { 'my' }
904
+ let(:columns) { ['name'] }
905
+ let(:indexes) { [{ columns: ['name'] }] }
906
+ let(:timestamps) { true }
907
+ let(:source_data) { [{ name: 'Gru Banksy' }, { name: 'Herlina Termalina' }] }
908
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
909
+
910
+ context 'returns array' do
911
+ it 'be an array' do
912
+ expect(subject).to be_a(Array)
913
+ end
914
+
915
+ it 'has length 2' do
916
+ expect(subject.length).to eq(2)
917
+ end
918
+ end
919
+
920
+ context 'sets attributes' do
921
+ subject { super().map(&:name) }
922
+
923
+ it 'be an array' do
924
+ expect(subject).to eq(['Gru Banksy', 'Herlina Termalina'])
925
+ end
926
+ end
927
+ end
928
+
929
+ context 'no timestamps' do
930
+ subject do
931
+ described_class.factory!(
932
+ source_data: source_data,
933
+ table_name: table_name,
934
+ klass_basename: klass_basename,
935
+ columns: columns,
936
+ indexes: indexes,
937
+ timestamps: timestamps,
938
+ connection_params: connection_params
939
+ )
940
+ end
941
+
942
+ let(:table_name) { 'dogs' }
943
+ let(:klass_basename) { 'my' }
944
+ let(:columns) { ['name'] }
945
+ let(:indexes) { [{ columns: ['name'] }] }
946
+ let(:timestamps) { false }
947
+ let(:source_data) { [{ name: 'Gru Banksy' }, { name: 'Herlina Termalina' }] }
948
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
949
+
950
+ context 'returns array' do
951
+ it 'be an array' do
952
+ expect(subject).to be_a(Array)
953
+ end
954
+
955
+ it 'has length 2' do
956
+ expect(subject.length).to eq(2)
957
+ end
958
+ end
959
+
960
+ context 'does not have timestamps' do
961
+ subject { super().map { |anon| anon.respond_to?(:created_at) } }
962
+
963
+ it 'be an array' do
964
+ expect(subject).to eq([false, false])
965
+ end
966
+ end
967
+ end
968
+
969
+ context 'with block' do
970
+ subject do
971
+ described_class.factory!(
972
+ source_data: source_data,
973
+ table_name: table_name,
974
+ klass_basename: klass_basename,
975
+ columns: columns,
976
+ indexes: indexes,
977
+ timestamps: timestamps,
978
+ connection_params: connection_params
979
+ ) do
980
+ def eat_pie
981
+ 'eating'
982
+ end
983
+
984
+ def flowery_name
985
+ "🌸#{name}🌸"
986
+ end
987
+ end
988
+ end
989
+
990
+ let(:table_name) { 'dogs' }
991
+ let(:klass_basename) { 'my' }
992
+ let(:columns) { ['name'] }
993
+ let(:indexes) { [{ columns: ['name'] }] }
994
+ let(:timestamps) { false }
995
+ let(:source_data) { [{ name: 'Gru Banksy' }, { name: 'Herlina Termalina' }] }
996
+ let(:connection_params) { AnonymousActiveRecord::DEFAULT_CONNECTION_PARAMS }
997
+
998
+ context 'returns array' do
999
+ it 'be an array' do
1000
+ expect(subject).to be_a(Array)
1001
+ end
1002
+
1003
+ it 'has length 2' do
1004
+ expect(subject.length).to eq(2)
1005
+ end
1006
+ end
1007
+
1008
+ context 'defines method' do
1009
+ subject { super().map(&:eat_pie) }
1010
+
1011
+ it 'defines method' do
1012
+ expect(subject).to eq(%w[eating eating])
1013
+ end
1014
+ end
1015
+
1016
+ context 'sets attributes' do
1017
+ subject { super().map(&:flowery_name) }
1018
+
1019
+ it 'be an array' do
1020
+ expect(subject).to eq(['🌸Gru Banksy🌸', '🌸Herlina Termalina🌸'])
1021
+ end
1022
+ end
1023
+ end
1024
+ end
1025
+ end