simple_record 1.0.10 → 1.1.17

Sign up to get free protection for your applications and to get access to all the features.
data/lib/stats.rb ADDED
@@ -0,0 +1,16 @@
1
+ module SimpleRecord
2
+ class Stats
3
+ attr_accessor :selects, :puts
4
+
5
+ def initialize
6
+ @selects = 0
7
+ @puts = 0
8
+ end
9
+
10
+ def clear
11
+ self.selects = 0
12
+ self.puts = 0
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
2
+ require 'my_model'
3
+
4
+ class MyChildModel < SimpleRecord::Base
5
+ belongs_to :my_model
6
+ has_attributes :name, :child_attr
7
+
8
+ end
9
+
10
+
11
+ =begin
12
+
13
+
14
+ puts 'word'
15
+
16
+ mm = MyModel.new
17
+ puts 'word2'
18
+
19
+ mcm = MyChildModel.new
20
+
21
+ puts 'mcm instance methods=' + MyChildModel.instance_methods(true).inspect
22
+ #puts 'mcm=' + mcm.instance_methods(false)
23
+ puts 'mcm class vars = ' + mcm.class.class_variables.inspect
24
+ puts mcm.class == MyChildModel
25
+ puts 'saved? ' + mm.save.to_s
26
+ puts mm.errors.inspect
27
+
28
+ puts "mm attributes=" + MyModel.defined_attributes.inspect
29
+ puts "mcm attributes=" + MyChildModel.defined_attributes.inspect
30
+
31
+ mcm2 = MyChildModel.new
32
+ puts "mcm2 attributes=" + MyChildModel.defined_attributes.inspect
33
+
34
+ =end
data/test/my_model.rb ADDED
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
2
+
3
+ class MyModel < SimpleRecord::Base
4
+
5
+ has_strings :name, :nickname
6
+ has_ints :age, :save_count
7
+ has_booleans :cool
8
+ has_dates :birthday
9
+
10
+
11
+ #callbacks
12
+ before_create :set_nickname
13
+
14
+ after_save :bump_save_count
15
+
16
+ def set_nickname
17
+ self.nickname = name if self.nickname.blank?
18
+ end
19
+
20
+ def bump_save_count
21
+ puts 'save_count=' + save_count.to_s
22
+ if save_count.nil?
23
+ self.save_count = 1
24
+ else
25
+ self.save_count += 1
26
+ end
27
+ puts 'save_count=' + self.save_count.to_s
28
+ end
29
+
30
+ def validate
31
+ errors.add("name", "can't be empty.") if name.blank?
32
+ end
33
+
34
+ def validate_on_create
35
+ errors.add("save_count", "should be zero.") if !save_count.blank? && save_count > 0
36
+ end
37
+
38
+ def validate_on_update
39
+ puts 'save_count = ' + save_count.to_s
40
+ errors.add("save_count", "should not be zero.") if save_count.blank? || save_count == 0
41
+ end
42
+
43
+ def atts
44
+ @@attributes
45
+ end
46
+
47
+ end
@@ -0,0 +1,15 @@
1
+
2
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/results_array")
3
+
4
+ array = SimpleRecord::ResultsArray.new()
5
+ #array.extend(ResultsArray)
6
+
7
+ 500.times do |i|
8
+ array << "_ob_" + i.to_s
9
+ end
10
+
11
+ array.each do |v|
12
+ puts v.to_s
13
+ end
14
+
15
+ puts array[10]
data/test/temp_test.rb ADDED
@@ -0,0 +1,63 @@
1
+ # rubymine won't run 1.9 tests
2
+
3
+ require 'minitest/unit'
4
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
5
+ require "yaml"
6
+ require 'right_aws'
7
+ require 'my_model'
8
+ require 'my_child_model'
9
+
10
+
11
+ def setup
12
+ @config = YAML::load(File.read('test-config.yml'))
13
+ puts 'akey=' + @config['amazon']['access_key']
14
+ puts 'skey=' + @config['amazon']['secret_key']
15
+ RightAws::ActiveSdb.establish_connection(@config['amazon']['access_key'], @config['amazon']['secret_key'], :port=>80, :protocol=>"http")
16
+ SimpleRecord::Base.set_domain_prefix("simplerecord_tests_")
17
+ end
18
+
19
+ def teardown
20
+ RightAws::ActiveSdb.close_connection()
21
+ end
22
+
23
+ def test_dates
24
+ mm = MyModel.new
25
+ mm.name = "Travis"
26
+ mm.age = 32
27
+ mm.cool = true
28
+ mm.created = DateTime.now - 10
29
+ mm.updated = DateTime.now
30
+ mm.birthday = Time.now - (3600 * 24 * 365 * 10)
31
+ puts 'before save=' + mm.inspect
32
+ mm.save
33
+ puts 'after save=' + mm.inspect
34
+
35
+ mms = MyModel.find(:all, :conditions => ["created > ?", DateTime.now - 1])
36
+ puts 'mms=' + mms.inspect
37
+
38
+ end
39
+
40
+ def test_date_comparisons
41
+
42
+ t = SimpleRecord::Base.pad_and_offset(Time.now)
43
+ puts t
44
+ dt = SimpleRecord::Base.pad_and_offset(DateTime.now)
45
+ puts dt
46
+ dt_tomorrow = SimpleRecord::Base.pad_and_offset(DateTime.now + 1)
47
+
48
+
49
+ puts 'compare=' + (t <=> dt).to_s
50
+ puts 'compare=' + (t <=> dt_tomorrow).to_s
51
+
52
+ dts = DateTime.parse(dt_tomorrow)
53
+ puts dts.to_s
54
+ ts = Time.parse(dt)
55
+ puts ts.to_s
56
+ end
57
+
58
+ setup
59
+
60
+ #test_dates
61
+ test_date_comparisons
62
+
63
+ teardown
@@ -1,4 +1,4 @@
1
- require 'minitest/unit'
1
+ require 'test/unit'
2
2
  require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
3
3
  require "yaml"
4
4
  require 'right_aws'
@@ -8,36 +8,50 @@ require 'my_child_model'
8
8
  class TestSimpleRecord < Test::Unit::TestCase
9
9
 
10
10
  def setup
11
- @config = YAML::load(File.read('test-config.yml'))
12
- puts 'akey=' + @config['amazon']['access_key']
13
- puts 'skey=' + @config['amazon']['secret_key']
14
- RightAws::ActiveSdb.establish_connection(@config['amazon']['access_key'], @config['amazon']['secret_key'], :port=>80, :protocol=>"http")
11
+ @config = YAML::load(File.open(File.expand_path("~/.amazon/simple_record_tests.yml")))
12
+ #puts @config.inspect
13
+ SimpleRecord.establish_connection(@config['amazon']['access_key'], @config['amazon']['secret_key'], :port=>80, :protocol=>"http")
15
14
  SimpleRecord::Base.set_domain_prefix("simplerecord_tests_")
16
15
  end
17
16
 
18
17
  def teardown
19
- RightAws::ActiveSdb.close_connection()
18
+ SimpleRecord.close_connection()
20
19
  end
21
20
 
21
+
22
22
  def test_save_get
23
23
  mm = MyModel.new
24
24
  mm.name = "Travis"
25
25
  mm.age = 32
26
26
  mm.cool = true
27
27
  mm.save
28
+
29
+ assert !mm.created.nil?
30
+ assert !mm.updated.nil?
31
+ assert !mm.id.nil?
32
+ assert mm.age == 32
33
+ assert mm.cool = true
34
+ assert mm.name = "Travis"
35
+
28
36
  id = mm.id
29
37
  puts 'id=' + id.to_s
30
38
  # Get the object back
31
39
  mm2 = MyModel.find(id)
32
- puts 'got=' + mm2.name + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
33
- puts mm2.cool.class.name
40
+ #puts 'got=' + mm2.name + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
41
+ #puts mm2.cool.class.name
34
42
  assert mm2.id == mm.id
35
43
  assert mm2.age == mm.age
36
44
  assert mm2.cool == mm.cool
45
+ assert mm2.age == 32
46
+ assert mm2.cool = true
47
+ assert mm2.name = "Travis"
48
+ assert mm2.created.is_a? DateTime
37
49
  end
38
50
 
39
51
  def test_bad_query
40
- mm2 = MyModel.find(:all, :conditions=>["name =4?", "1"])
52
+ assert_raise RightAws::AwsError do
53
+ mm2 = MyModel.find(:all, :conditions=>["name =4?", "1"])
54
+ end
41
55
  end
42
56
 
43
57
  def test_batch_save
@@ -56,7 +70,7 @@ class TestSimpleRecord < Test::Unit::TestCase
56
70
  items.each do |item|
57
71
  puts 'id=' + item.id
58
72
  new_item = MyModel.find(item.id)
59
- puts 'new=' + new_item.inspect
73
+ #puts 'new=' + new_item.inspect
60
74
  assert item.id == new_item.id
61
75
  assert item.name == new_item.name
62
76
  assert item.cool == new_item.cool
@@ -82,39 +96,209 @@ class TestSimpleRecord < Test::Unit::TestCase
82
96
  end
83
97
 
84
98
  def test_callbacks
85
- # these DO NOT work right now, all objects get all callbacks
86
- # I tried like this, seem to be getting somewhere.
87
- #
88
- # class << self;
89
- # @@callbacks.each do |callback|
90
- # #we first have to make an initialized array for each of the callbacks, to prevent problems if they are not called
91
- # puts 'setting callback ' + callback.to_s + ' on ' + self.inspect
92
- # eval %{
93
- #
94
- # # add the methods to the class
95
- # def #{callback}(*args)
96
- # args.each do |arg|
97
- # cb_names = self.instance_variable_get(:@#{callback}_names)
98
- # cb_names = [] if cb_names.nil?
99
- # cb_names << arg.to_s if cb_names.index(arg.to_s).nil?
100
- # self.instance_variable_set(:@#{callback}_names, cb_names)
101
- # end
102
- ## asdf @@#{callback}_names=args.map{|arg| arg.to_s}
103
- # end
99
+
100
+
101
+ mm = MyModel.new
102
+ assert !mm.save
103
+ assert mm.errors.count == 1 # name is required
104
+
105
+ # test queued callback before_create
106
+ mm.name = "Travis"
107
+ assert mm.save
108
+ # now nickname should be set on before_create
109
+ assert mm.nickname == mm.name
110
+
111
+ mm2 = MyModel.find(mm.id)
112
+ assert mm2.nickname = mm.nickname
113
+ assert mm2.name = mm.name
114
+
115
+
116
+ end
117
+
118
+ def test_dirty
119
+ mm = MyModel.new
120
+ mm.name = "Travis"
121
+ mm.age = 32
122
+ mm.cool = true
123
+ mm.save
124
+ id = mm.id
125
+ puts 'id=' + id.to_s
126
+ # Get the object back
127
+ mm2 = MyModel.find(id)
128
+ puts 'got=' + mm2.name + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
129
+ assert mm2.id == mm.id
130
+ assert mm2.age == mm.age
131
+ assert mm2.cool == mm.cool
132
+
133
+ mm2.name = "Travis 2"
134
+ mm2.save(:dirty=>true)
135
+
136
+ # todo: how do we assert this?
137
+
138
+ end
139
+
140
+ # http://api.rubyonrails.org/classes/ActiveRecord/Dirty.html#M002136
141
+ def test_changed
142
+ mm = MyModel.new
143
+ mm.name = "Travis"
144
+ mm.age = 32
145
+ mm.cool = true
146
+ mm.save
147
+
148
+ puts 'changed?=' + mm.changed?.to_s
149
+ assert !mm.changed?
150
+ assert mm.changed.size == 0
151
+ assert mm.changes.size == 0
152
+ assert !mm.name_changed?
153
+
154
+ mm.name = "Jim"
155
+ assert mm.changed?
156
+ assert mm.changed.size == 1
157
+ assert mm.changed[0] == "name"
158
+
159
+ assert mm.changes.size == 1
160
+ puts 'CHANGES=' + mm.changes.inspect
161
+ assert mm.changes["name"][0] == "Travis"
162
+ assert mm.changes["name"][1] == "Jim"
163
+
164
+ assert mm.name_changed?
165
+ assert mm.name_was == "Travis"
166
+ assert mm.name_change[0] == "Travis"
167
+ assert mm.name_change[1] == "Jim"
168
+
169
+ end
170
+
171
+ def test_count
172
+
173
+ SimpleRecord.stats.clear
174
+
175
+ count = MyModel.find(:count) # select 1
176
+ assert count > 0
177
+
178
+ mms = MyModel.find(:all) # select 2
179
+ assert mms.size > 0 # select 3
180
+ assert mms.size == count, "size != count! size=" + mms.size.to_s + " count=" + count.to_s
181
+ assert SimpleRecord.stats.selects == 3, "should have been 3 select, but was actually #{SimpleRecord.stats.selects}" # count should not have been called twice
182
+
183
+ count = MyModel.find(:count, :conditions=>["name=?", "Travis"])
184
+ assert count > 0
185
+
186
+ mms = MyModel.find(:all, :conditions=>["name=?", "Travis"])
187
+ assert mms.size > 0
188
+ assert mms.size == count
189
+
190
+ end
191
+
192
+ def test_select
193
+ # just passes through to find
194
+ MyModel.select(:count)
195
+ end
196
+
197
+ def test_attributes_correct
198
+ # child should contain child class attributes + parent class attributes
199
+
200
+ #MyModel.defined_attributes.each do |a|
104
201
  #
105
- # # now we run the methods in the callback array for this class
106
- #send :define_method, "run_#{callback}" do
107
- ## def run_#{callback}
108
- # cb_names = self.instance_variable_get(:@#{callback}_names)
109
- # cb_names.each { |name|
110
- # unless eval(name)
111
- # return false
112
- # end
113
- # }
114
- # return true
115
- # end
116
- # }
117
- # end
118
- # end
202
+ #end
203
+ #MyChildModel.defined_attributes.inspect
204
+
205
+ end
206
+
207
+ # ensures that it uses next token and what not
208
+ def test_big_result
209
+ mms = MyModel.find(:all)
210
+ puts 'mms.size=' + mms.size.to_s
211
+ i = 0
212
+ mms.each do |x|
213
+ puts 'deleting=' + i.to_s
214
+ x.delete
215
+ i+=1
216
+ end
217
+ num_made = 110
218
+ num_made.times do |i|
219
+ mm = MyModel.create(:name=>"Travis", :age=>i, :cool=>true)
220
+ end
221
+ rs = MyModel.find(:all) # should get 100 at a time
222
+ assert rs.size == num_made
223
+ i = 0
224
+ rs.each do |x|
225
+ #puts 'x=' + x.id
226
+ i+=1
227
+ end
228
+ assert i == num_made
119
229
  end
230
+
231
+ def test_results_array
232
+ mms = MyModel.find(:all) # select 2
233
+ assert !mms.first.nil?
234
+ assert !mms.last.nil?
235
+ assert !mms.empty?
236
+ assert mms.include?(mms[0])
237
+
238
+ assert mms[2, 2].size == 2
239
+ assert mms[2..5].size == 4
240
+ assert mms[2...5].size == 3
241
+
242
+ end
243
+
244
+ def test_random_index
245
+ create_my_models(120)
246
+ mms = MyModel.find(:all)
247
+ o = mms[85]
248
+ puts 'o=' + o.inspect
249
+ assert !o.nil?
250
+ o = mms[111]
251
+ puts 'o=' + o.inspect
252
+ assert !o.nil?
253
+ end
254
+
255
+ # Use to populate db
256
+ def create_my_models(count)
257
+ batch = []
258
+ count.times do |i|
259
+ mm = MyModel.new(:name=>"model_" + i.to_s)
260
+ batch << mm
261
+ end
262
+ MyModel.batch_save batch
263
+
264
+
265
+ end
266
+
267
+ def test_objects_in_constructor
268
+ mm = MyModel.new(:name=>"model1")
269
+ mm.save
270
+ mcm = MyChildModel.new(:name=>"johnny", :my_model=>mm)
271
+ mcm.save
272
+
273
+ assert !mcm.my_model.nil?
274
+
275
+ mcm = MyChildModel.find(mcm.id)
276
+ assert !mcm.my_model.nil?
277
+
278
+ end
279
+
280
+ def test_validations
281
+ mm = MyModel.new()
282
+ assert mm.invalid?
283
+ assert mm.errors.size == 1
284
+ mm.name = "abcd"
285
+ assert mm.valid?
286
+ assert mm.errors.size == 0
287
+
288
+ mm.save_count = 2
289
+ assert mm.invalid?
290
+
291
+ mm.save_count = nil
292
+
293
+ assert mm.save, mm.errors.inspect
294
+
295
+ assert mm.valid?, mm.errors.inspect
296
+ assert mm.save_count == 1
297
+
298
+ end
299
+
300
+ def test_funny_names
301
+ MyModel.find(:all, :order=>"order")
302
+ end
303
+
120
304
  end