forked from appoxy/simple_record
/
test_simple_record.rb
693 lines (545 loc) · 19.1 KB
/
test_simple_record.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
require 'test/unit'
require File.join(File.dirname(__FILE__), "/../lib/simple_record")
require File.join(File.dirname(__FILE__), "./test_helpers")
require_relative "test_base"
require "yaml"
require 'aws'
require_relative 'my_model'
require_relative 'my_child_model'
require_relative 'model_with_enc'
require_relative 'my_simple_model'
# Tests for SimpleRecord
#
class TestSimpleRecord < TestBase
def test_save_get
mm = MyModel.new
mm.name = "Travis"
mm.age = 32
mm.cool = true
mm.save
sleep 1
assert !mm.created.nil?
assert !mm.updated.nil?
assert !mm.id.nil?
assert mm.age == 32
assert mm.cool == true
assert mm.name == "Travis"
id = mm.id
puts 'id=' + id.to_s
# Get the object back
mm2 = MyModel.find(id)
#puts 'got=' + mm2.name + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
#puts mm2.cool.class.name
assert mm2.id == mm.id
assert mm2.age == mm.age
assert mm2.cool == mm.cool
assert mm2.age == 32
assert mm2.cool == true
assert mm2.name == "Travis"
assert mm2.created.is_a? DateTime
# test nilification
mm2.age = nil
mm2.save
puts mm2.errors.inspect
sleep 1
mm2 = MyModel.find(id)
puts mm2.inspect
assert mm2.age.nil?, "doh, age should be nil, but it's " + mm2.age.inspect
end
def test_updates
mm = MyModel.new
mm.name = "Travis"
mm.age = 32
mm.cool = true
mm.s1 = "Initial value"
mm.save
id = mm.id
sleep 1
mm = MyModel.find(id)
mm.name = "Travis2"
mm.age = 10
mm.cool = false
mm.s1 = "" # test blank string
puts 'mm=' + mm.inspect
mm.save
sleep 1
puts 'mm2=' + mm.inspect
assert mm.s1 == "", "mm.s1 is not empty string, it is " + mm.s1.inspect
mm = MyModel.find(id)
assert mm.name == "Travis2", "Name was not Travis2, it was #{mm.name}"
assert mm.age == 10
assert mm.cool == false
assert mm.s1 == "", "mm.s1 is not empty string, it is #{mm.s1.inspect}"
end
def test_funky_values
mm = MyModel.new(:name=>"Funky")
mm.s1 = "other/2009-11-10/04/84.eml" # reported here: http://groups.google.com/group/simple-record/browse_thread/thread/3659e82491d03a2c?hl=en
assert mm.save
assert mm.errors.size == 0
mm2 = MyModel.find(mm.id)
puts 'mm2=' + mm2.inspect
end
def test_create
mm = MyModel.create(:name=>"Travis", :age=>32, :cool=>true)
puts 'mm=' + mm.inspect
assert !mm.id.nil?
end
def test_bad_query
assert_raise Aws::AwsError do
mm2 = MyModel.find(:all, :conditions=>["name =4?", "1"])
end
end
def test_batch_save
items = []
mm = MyModel.new
mm.name = "Travis"
mm.age = 32
mm.cool = true
items << mm
mm = MyModel.new
mm.name = "Tritt"
mm.age = 44
mm.cool = false
items << mm
MyModel.batch_save(items)
sleep 2
items.each do |item|
puts 'id=' + item.id
new_item = MyModel.find(item.id)
#puts 'new=' + new_item.inspect
assert item.id == new_item.id
assert item.name == new_item.name
assert item.cool == new_item.cool
end
end
# Testing getting the association ID without materializing the obejct
def test_get_belongs_to_id
mm = MyModel.new
mm.name = "Parent"
mm.age = 55
mm.cool = true
mm.save
child = MyChildModel.new
child.name = "Child"
child.my_model = mm
puts 'c1=' + child.inspect
puts 'mmid1=' + child.my_model_id.to_s
assert child.my_model_id == mm.id
child.save
puts 'mmid2=' + child.my_model_id.to_s
puts "child=" + child.inspect
sleep 1
child = MyChildModel.find(child.id)
puts "child find=" + child.inspect
puts "child.my_model_id = " + child.my_model_id.to_s
assert !child.my_model_id.nil?
assert !child.my_model.nil?
assert child.my_model_id == mm.id
end
def test_callbacks
mm = MyModel.new
assert !mm.save
assert mm.errors.count == 1 # name is required
# test queued callback before_create
mm.name = "Travis"
assert mm.save
sleep 1
# now nickname should be set on before_create
assert mm.nickname == mm.name
mm2 = MyModel.find(mm.id)
assert_equal mm2.nickname, mm.nickname
assert_equal mm2.name, mm.name
end
def test_dirty
mm = MyModel.new
mm.name = "Travis"
mm.age = 32
mm.cool = true
mm.save
id = mm.id
puts 'id=' + id.to_s
sleep 1
# Get the object back
mm2 = MyModel.find(id)
puts 'mm2=' + mm2.inspect
puts 'got=' + mm2.name.to_s + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
assert mm2.id == mm.id
assert mm2.age == mm.age
assert mm2.cool == mm.cool
mm2.name = "Travis 2"
mm2.save(:dirty=>true)
# todo: how do we assert this? perhaps change a value directly in sdb and see that it doesn't get overwritten.
# or check stats and ensure only 1 attribute was put
# Test to ensure that if an item is not dirty, sdb doesn't get hit
puts SimpleRecord.stats.saves.to_s
SimpleRecord.stats.clear
mm2.save(:dirty=>true)
puts SimpleRecord.stats.saves.to_s
assert SimpleRecord.stats.saves == 0
mmc = MyChildModel.new
mmc.my_model = mm
mmc.x = mm
mmc.save
sleep 1
mmc2 = MyChildModel.find(mmc.id)
assert mmc2.my_model_id == mmc.my_model_id, "mm2.my_model_id=#{mmc2.my_model_id} mmc.my_model_id=#{mmc.my_model_id}"
puts 'setting my_model to nil'
mmc2.my_model = nil
mmc2.x = nil
puts 'saving my_model to nil'
SimpleRecord.stats.clear
assert mmc2.save(:dirty=>true)
assert SimpleRecord.stats.saves == 1, "saves is #{SimpleRecord.stats.saves}" # 1 put only for updated, should have a count of attributes saved in stats
assert SimpleRecord.stats.deletes == 1, "deletes is #{SimpleRecord.stats.deletes}"
assert mmc2.id == mmc.id
assert mmc2.my_model_id == nil
assert mmc2.my_model == nil, "my_model not nil? #{mmc2.my_model.inspect}"
sleep 1
mmc3 = MyChildModel.find(mmc.id)
puts "mmc3 1 =" + mmc3.inspect
assert mmc3.my_model_id == nil, "my_model_id not nil? #{mmc3.my_model_id.inspect}"
assert mmc3.my_model == nil
mm3 = MyModel.new(:name=>"test")
assert mm3.save
sleep 1
mmc3.my_model = mm3
assert mmc3.my_model_changed?
assert mmc3.save(:dirty=>true)
assert mmc3.my_model_id == mm3.id
assert mmc3.my_model.id == mm3.id
sleep 1
mmc3 = MyChildModel.find(mmc3.id)
puts "mmc3=" + mmc3.inspect
assert mmc3.my_model_id == mm3.id, "my_model_id=#{mmc3.my_model_id.inspect} mm3.id=#{mm3.id.inspect}"
assert mmc3.my_model.id == mm3.id
mmc3 = MyChildModel.find(mmc3.id)
mmc3.my_model_id = mm2.id
assert mmc3.my_model_id == mm2.id
assert mmc3.changed?
assert mmc3.my_model_changed?
assert mmc3.my_model.id == mm2.id
end
# http://api.rubyonrails.org/classes/ActiveRecord/Dirty.html#M002136
def test_changed
mm = MySimpleModel.new
mm.name = "Travis"
mm.age = 32
mm.cool = true
mm.save
puts 'changed?=' + mm.changed?.to_s
p mm.changed
assert !mm.changed?
assert mm.changed.size == 0
assert mm.changes.size == 0
assert !mm.name_changed?
mm.name = "Jim"
assert mm.changed?
assert mm.changed.size == 1
assert mm.changed[0] == "name"
assert mm.changes.size == 1
puts 'CHANGES=' + mm.changes.inspect
assert mm.changes["name"][0] == "Travis"
assert mm.changes["name"][1] == "Jim"
assert mm.name_changed?
assert mm.name_was == "Travis", "was #{mm.name_was}"
assert mm.name_change[0] == "Travis"
assert mm.name_change[1] == "Jim"
end
def test_count
SimpleRecord.stats.clear
count = MyModel.find(:count) # select 1
assert count > 0
mms = MyModel.find(:all) # select 2
puts 'mms=' + mms.inspect
assert mms.size > 0 # select 3
puts 'mms=' + mms.inspect
assert mms.size == count, "size != count! size=" + mms.size.to_s + " count=" + count.to_s
assert SimpleRecord.stats.selects == 3, "should have been 3 select, but was actually #{SimpleRecord.stats.selects}" # count should not have been called twice
count = MyModel.find(:count, :conditions=>["name=?", "Travis"])
assert count > 0
mms = MyModel.find(:all, :conditions=>["name=?", "Travis"])
assert mms.size > 0
assert mms.size == count
end
def test_attributes_correct
# child should contain child class attributes + parent class attributes
#MyModel.defined_attributes.each do |a|
#
#end
#MyChildModel.defined_attributes.inspect
end
def test_results_array
mms = MyModel.find(:all) # select 2
assert !mms.first.nil?
assert !mms.last.nil?
assert !mms.empty?
assert mms.include?(mms[0])
assert mms[2, 2].size == 2
assert mms[2..5].size == 4
assert mms[2...5].size == 3
end
def test_random_index
create_my_models(120)
mms = MyModel.find(:all)
o = mms[85]
puts 'o=' + o.inspect
assert !o.nil?
o = mms[111]
puts 'o=' + o.inspect
assert !o.nil?
end
def test_objects_in_constructor
mm = MyModel.new(:name=>"model1")
mm.save
# my_model should be treated differently since it's a belong_to
mcm = MyChildModel.new(:name=>"johnny", :my_model=>mm)
mcm.save
sleep 1
assert mcm.my_model != nil
mcm = MyChildModel.find(mcm.id)
puts 'mcm=' + mcm.inspect
assert mcm.my_model != nil
end
def test_nil_attr_deletion
mm = MyModel.new
mm.name = "Chad"
mm.age = 30
mm.cool = false
mm.save
sleep 1
# Should have 1 age attribute
sdb_atts = @@sdb.get_attributes('simplerecord_tests_my_models', mm.id, 'age')
puts 'sdb_atts=' + sdb_atts.inspect
assert sdb_atts[:attributes].size == 1, "hmmm, not size 1: " + sdb_atts[:attributes].size.to_s
mm.age = nil
mm.save
sleep 1
# Should be NIL
assert mm.age == nil, "age is #{mm.age}"
# Should have NO age attributes
assert @@sdb.get_attributes('simplerecord_tests_my_models', mm.id, 'age')[:attributes].size == 0
end
def test_null
puts Time.now.to_i.to_s
TestHelpers.clear_out_my_models
mm = MyModel.new(:name=>"birthay is null")
mm.save
mm2 = MyModel.new(:name=>"birthday is not null")
mm2.birthday = Time.now
mm2.save
sleep 2
mms = MyModel.find(:all, :conditions=>["birthday is null"])
mms.each do |m|
puts m.inspect
end
assert mms.size == 1
assert mms[0].id = mm.id
mms = MyModel.find(:all, :conditions=>["birthday is not null"])
mms.each do |m|
puts m.inspect
end
assert mms.size == 1
assert mms[0].id = mm2.id
end
# Test to add support for IN
def test_in_clause
# mms = MyModel.find(:all)
# mms2 = MyModel.find(:all, :conditions=>["id in ?"])
end
def test_base_attributes
mm = MyModel.new()
mm.name = "test name"
mm.base_string = "in base class"
mm.save_with_validation!
sleep 1
mm2 = MyModel.find(mm.id)
assert mm2.base_string == mm.base_string
mm2.base_string = "changed base string"
mm2.save_with_validation!
sleep 1
mm3 = MyModel.find(mm2.id)
assert mm3.base_string == mm2.base_string
puts mm3.inspect
end
def test_dates
mm = MyModel.new()
mm.name = "test name"
mm.date1 = Date.today
mm.date2 = Time.now
mm.date3 = DateTime.now
mm.save
sleep 1
mm = MyModel.find(:first, :conditions=>["date1 >= ?", 1.days.ago.to_date])
puts 'mm=' + mm.inspect
assert mm.is_a? MyModel
mm = MyModel.find(:first, :conditions=>["date2 >= ?", 1.minutes.ago])
puts 'mm=' + mm.inspect
assert mm.is_a? MyModel
mm = MyModel.find(:first, :conditions=>["date3 >= ?", 1.minutes.ago])
puts 'mm=' + mm.inspect
assert mm.is_a? MyModel
end
def test_attr_encrypted
require_relative 'model_with_enc'
ssn = "123456789"
password = "my_password"
ob = ModelWithEnc.new
ob.name = "my name"
ob.ssn = ssn
ob.password = password
puts "ob before save=" + ob.inspect
assert ssn == ob.ssn, "#{ssn} != #{ob.ssn} apparently!?"
puts "#{ob.password.class.name} ob.password=#{ob.password} password=#{password}"
assert password != ob.password # we know this doesn't work right
assert ob.password == password, "#{ob.password.class.name} ob.password=#{ob.password} password=#{password}"
ob.save
# try also with constructor, just to be safe
ob = ModelWithEnc.create(:ssn=>ssn, :name=>"my name", :password=>password)
assert ssn == ob.ssn, "#{ssn} != #{ob.ssn} apparently!?"
puts "#{ob.password.class.name} ob.password=#{ob.password} password=#{password}"
assert password != ob.password # we know this doesn't work right
assert ob.password == password, "#{ob.password.class.name} ob.password=#{ob.password} password=#{password}"
puts "ob after save=" + ob.inspect
assert ssn == ob.ssn
assert ob.password == password, "#{ob.password.class.name} ob.password=#{ob.password} password=#{password}"
sleep 2
ob2 = ModelWithEnc.find(ob.id)
puts 'ob2=' + ob2.inspect
assert ob2.name == ob.name, "#{ob2.name} vs #{ob.name}"
assert ob2.ssn == ob.ssn, "#{ob2.ssn} vs #{ob.ssn}"
assert ob2.ssn == ssn, "#{ob2.ssn} vs #{ssn}"
assert ob2.password == password, "#{ob2.password} vs #{password}"
assert ob2.attributes["password"] != password
assert ob2.password == ob.password, "#{ob2.password} vs #{ob.password}"
end
def test_non_persistent_attributes
mm = MyModel.new({:some_np_att=>"word"})
mm = MyModel.new({"some_other_np_att"=>"up"})
end
def test_atts_using_strings_and_symbols
mm = MyModel.new({:name=>"myname"})
mm2 = MyModel.new({"name"=>"myname"})
assert_equal(mm.name, mm2.name)
mm.save
mm2.save
sleep 1
mm = MyModel.find(mm.id)
mm2 = MyModel.find(mm2.id)
assert_equal mm.name, mm2.name
end
def test_constructor_using_belongs_to_ids
mm = MyModel.new({:name=>"myname"})
mm.save
sleep 1
mm2 = MyChildModel.new({"name"=>"myname2", :my_model_id=>mm.id})
puts 'mm2=' + mm2.inspect
assert_equal mm.id, mm2.my_model_id, "#{mm.id} != #{mm2.my_model_id}"
mm3 = mm2.my_model
puts 'mm3=' + mm3.inspect
assert_equal mm.name, mm3.name
mm3 = MyChildModel.create(:my_model_id=>mm.id, :name=>"myname3")
sleep 2
mm4 = MyChildModel.find(mm3.id)
assert_equal mm4.my_model_id, mm.id
assert !mm4.my_model.nil?
end
def test_update_attributes
mm = MyModel.new({:name=>"myname"})
mm.save
now = Time.now
mm.update_attributes(:name=>"name2", :age=>21, "date2"=>now)
assert mm.name == "name2", "Name is #{mm.name}"
assert mm.age == 21
# assert mm.date2.to_time.utc == now.utc, "#{mm.date2.class.name} #{mm.date2.to_time.inspect} != #{now.inspect}"
sleep 1
mm = MyModel.find(mm.id)
assert mm.name == "name2", "Name is #{mm.name}"
assert mm.age == 21, "Age is not 21, it is #{mm.age}"
# assert mm.date2 == now, "Date is not correct, it is #{mm.date2}"
end
def test_explicit_class_name
mm = MyModel.new({:name=>"myname"})
mm.save
sleep 1
mm2 = MyChildModel.new({"name"=>"myname2"})
mm2.x = mm
assert mm2.x.id == mm.id
mm2.save
sleep 1
mm3 = MyChildModel.find(mm2.id)
puts "mm3.x=" + mm3.x.inspect
assert mm3.x.id == mm.id
end
def test_storage_format
mm = MyModel.new({:name=>"myname"})
mm.date1 = Time.now
mm.date2 = DateTime.now
mm.save
sleep 1
raw = @@sdb.get_attributes(MyModel.domain, mm.id)
puts "raw=" + raw.inspect
assert raw[:attributes]["updated"][0].size == "2010-01-06T16:04:23".size
assert raw[:attributes]["date1"][0].size == "2010-01-06T16:04:23".size
assert raw[:attributes]["date2"][0].size == "2010-01-06T16:04:23".size
end
def test_empty_initialize
mm = MyModel.new
mme = ModelWithEnc.new
mme = ModelWithEnc.new(:ssn=>"", :password=>"") # this caused encryptor errors
mme = ModelWithEnc.new(:ssn=>nil, :password=>nil)
end
def test_string_ints
mm = MyModel.new
mm.name = "whatever"
mm.age = "1"
puts mm.inspect
mm2 = MyModel.new
mm2.name = "whatever2"
mm2.age = 1
params = {:name=>"scooby", :age=>"123"}
mm3 = MyModel.new(params)
assert mm.age == 1, "mm.age=#{mm.age}"
assert mm2.age == 1
assert mm3.age == 123
mm.save!
mm2.save!
mm3.save!
sleep 1
assert mm.age == 1
assert mm2.age == 1
assert mm3.age == 123
mmf1 = MyModel.find(mm.id)
mmf2 = MyModel.find(mm2.id)
mmf3 = MyModel.find(mm3.id)
assert mmf1.age == 1
assert mmf2.age == 1
assert mmf3.age == 123
mmf1.update_attributes({:age=>"456"})
mmf1.age == 456
end
def test_box_usage
mm = MyModel.new
mm.name = "whatever"
mm.age = "1"
mm.save
sleep 1
mms = MyModel.all
assert mms.box_usage && mms.box_usage > 0
assert mms.request_id
end
def test_multi_value_attributes
val = ['a', 'b', 'c']
val2 = [1, 2, 3]
mm = MyModel.new
mm.name = val
mm.age = val2
assert_equal val, mm.name
assert_equal val2, mm.age
mm.save
sleep 1
mm = MyModel.find(mm.id)
# Values are not returned in order
assert_equal val, mm.name.sort
assert_equal val2, mm.age.sort
end
end