activerecord-simpledb-adapter 0.1.1 → 0.1.2
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/README.md +1 -1
- data/activerecord-simpledb-adapter.gemspec +7 -2
- data/lib/active_record/connection_adapters/simpledb_adapter.rb +42 -26
- data/spec/active_record/connection_adapters/simpledb_adapter_spec.rb +28 -0
- data/spec/active_record/core_actions_spec.rb +47 -0
- data/spec/active_record/locking_spec.rb +50 -0
- data/spec/active_record/record_attributes_spec.rb +106 -0
- data/spec/active_record/validates_spec.rb +36 -0
- data/spec/active_record/where_spec.rb +27 -0
- data/spec/spec_helper.rb +2 -2
- metadata +15 -5
- data/spec/activerecord-simpledb-adapter_spec.rb +0 -149
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{activerecord-simpledb-adapter}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ilia Ablamonov", "Alex Gorkunov", "Cloud Castle Inc."]
|
@@ -30,7 +30,12 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.rubygems_version = %q{1.3.7}
|
31
31
|
s.summary = %q{ActiveRecord SimpleDB adapter}
|
32
32
|
s.test_files = [
|
33
|
-
"spec/
|
33
|
+
"spec/active_record/connection_adapters/simpledb_adapter_spec.rb",
|
34
|
+
"spec/active_record/core_actions_spec.rb",
|
35
|
+
"spec/active_record/locking_spec.rb",
|
36
|
+
"spec/active_record/record_attributes_spec.rb",
|
37
|
+
"spec/active_record/validates_spec.rb",
|
38
|
+
"spec/active_record/where_spec.rb",
|
34
39
|
"spec/spec_helper.rb"
|
35
40
|
]
|
36
41
|
|
@@ -58,6 +58,22 @@ class Aws::SdbInterface
|
|
58
58
|
end
|
59
59
|
|
60
60
|
module ActiveRecord
|
61
|
+
|
62
|
+
class SimpleDBLogger
|
63
|
+
def initialize(logger)
|
64
|
+
@logger = logger
|
65
|
+
end
|
66
|
+
|
67
|
+
def info *args
|
68
|
+
#skip noisy info messages from aws interface
|
69
|
+
end
|
70
|
+
|
71
|
+
def method_missing m, *args
|
72
|
+
@logger.send(m, args)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
61
77
|
class Base
|
62
78
|
def self.simpledb_connection(config) # :nodoc:
|
63
79
|
require 'aws'
|
@@ -72,7 +88,7 @@ module ActiveRecord
|
|
72
88
|
:server => config[:host],
|
73
89
|
:port => config[:port],
|
74
90
|
:protocol => config[:protocol],
|
75
|
-
:logger => logger
|
91
|
+
:logger => SimpleDBLogger.new(logger)
|
76
92
|
},
|
77
93
|
config
|
78
94
|
end
|
@@ -318,8 +334,8 @@ module ActiveRecord
|
|
318
334
|
end
|
319
335
|
|
320
336
|
def execute sql, name = nil, skip_logging = false
|
321
|
-
|
322
|
-
|
337
|
+
log sql.inspect, "SimpleDB" do
|
338
|
+
case sql[:action]
|
323
339
|
when :insert
|
324
340
|
item_name = get_id sql[:attrs]
|
325
341
|
item_name = sql[:attrs][:id] = generate_id unless item_name
|
@@ -333,6 +349,7 @@ module ActiveRecord
|
|
333
349
|
@connection.delete_attributes domain_name, item_name, nil, sql[:wheres]
|
334
350
|
else
|
335
351
|
raise "Unsupported action: #{sql[:action].inspect}"
|
352
|
+
end
|
336
353
|
end
|
337
354
|
end
|
338
355
|
|
@@ -342,30 +359,29 @@ module ActiveRecord
|
|
342
359
|
alias :create :insert_sql
|
343
360
|
|
344
361
|
def select sql, name = nil
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
362
|
+
log sql, "SimpleDB" do
|
363
|
+
result = []
|
364
|
+
response = @connection.select(sql, nil, true)
|
365
|
+
collection_name = get_collection_column_and_name(sql)
|
366
|
+
columns = columns_definition(collection_name)
|
367
|
+
|
368
|
+
response[:items].each do |item|
|
369
|
+
item.each do |id, attrs|
|
370
|
+
ritem = {}
|
371
|
+
ritem['id'] = id unless id == 'Domain' && attrs['Count'] # unless count(*) result
|
372
|
+
attrs.each {|k, vs|
|
373
|
+
column = columns[k]
|
374
|
+
if column.present?
|
375
|
+
ritem[column.name] = column.unquote_number(vs.first)
|
376
|
+
else
|
377
|
+
ritem[k] = vs.first
|
378
|
+
end
|
379
|
+
}
|
380
|
+
result << ritem
|
381
|
+
end
|
365
382
|
end
|
383
|
+
result
|
366
384
|
end
|
367
|
-
# puts "Box usage: #{response[:box_usage].to_f}"
|
368
|
-
result
|
369
385
|
end
|
370
386
|
|
371
387
|
# Executes the update statement and returns the number of rows affected.
|
@@ -414,7 +430,7 @@ module ActiveRecord
|
|
414
430
|
raise PreparedStatementInvalid, "collection column '#{@@ccn.values.join(" or ")}' not found in the WHERE section in query"
|
415
431
|
end
|
416
432
|
end
|
417
|
-
|
418
433
|
end
|
434
|
+
|
419
435
|
end
|
420
436
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SimpleDBAdapter establish connection" do
|
4
|
+
|
5
|
+
it "should connect to database" do
|
6
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
7
|
+
ActiveRecord::Base.connection.should_not be_nil
|
8
|
+
ActiveRecord::Base.connection.class.should == ActiveRecord::ConnectionAdapters::SimpleDBAdapter
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should be active after connection to database" do
|
12
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
13
|
+
ActiveRecord::Base.connection.should be_active
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should not be active after disconnection to database" do
|
17
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
18
|
+
ActiveRecord::Base.connection.disconnect!
|
19
|
+
ActiveRecord::Base.connection.should_not be_active
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be active after reconnection to database" do
|
23
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
24
|
+
ActiveRecord::Base.connection.reconnect!
|
25
|
+
ActiveRecord::Base.connection.should be_active
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SimpleDBAdapter ActiveRecord core actions" do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
7
|
+
ActiveRecord::Base.establish_connection($config)
|
8
|
+
ActiveRecord::Base.connection.create_domain($config[:domain_name])
|
9
|
+
Person.create!(Person.valid_params)
|
10
|
+
end
|
11
|
+
|
12
|
+
after :each do
|
13
|
+
ActiveRecord::Base.connection.delete_domain($config[:domain_name])
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should be correct work with .all statement" do
|
17
|
+
Person.all.should_not be_empty
|
18
|
+
Person.all.first.is_a?(Person).should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be correct work with .first statement" do
|
22
|
+
Person.first.is_a?(Person).should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be correct work with .last statement" do
|
26
|
+
Person.last.is_a?(Person).should be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be correct work with .count statement" do
|
30
|
+
Person.count.should > 0
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be correct work with .find statement" do
|
34
|
+
p1 = Person.create!
|
35
|
+
p2 = Person.find p1.id
|
36
|
+
p1.should == p2
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be correct work with .destroy statement" do
|
40
|
+
p1 = Person.new
|
41
|
+
p1.save
|
42
|
+
id = p1.id
|
43
|
+
p1.destroy
|
44
|
+
p2 = Person.find_by_id id
|
45
|
+
p2.should be_nil
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SimpleDBAdapter ActiveRecord with optimistic locking" do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
7
|
+
ActiveRecord::Base.establish_connection($config)
|
8
|
+
ActiveRecord::Base.connection.create_domain($config[:domain_name])
|
9
|
+
end
|
10
|
+
|
11
|
+
after :each do
|
12
|
+
ActiveRecord::Base.connection.delete_domain($config[:domain_name])
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be have not nil lock version value after save" do
|
16
|
+
p = Person.new
|
17
|
+
p.save
|
18
|
+
p.reload
|
19
|
+
p.lock_version.should_not be_nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should change lock version value after sevarals saves" do
|
23
|
+
p = Person.new
|
24
|
+
p.save
|
25
|
+
old_lock_version = p.lock_version
|
26
|
+
p.login = "blabla"
|
27
|
+
p.save
|
28
|
+
p.reload
|
29
|
+
p.lock_version.should_not == old_lock_version
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should raise error when tried save model with non-actual values (changed another place and time)" do
|
33
|
+
p = Person.new
|
34
|
+
p.save
|
35
|
+
p1 = Person.find p.id
|
36
|
+
p1.login = "blabla"
|
37
|
+
p.login = "bla"
|
38
|
+
p1.save
|
39
|
+
lambda {p.save!}.should raise_error(ActiveRecord::StaleObjectError)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should raise error when tried destroy item with changed state" do
|
43
|
+
p = Person.new
|
44
|
+
p.save
|
45
|
+
p1 = Person.find p.id
|
46
|
+
p1.login = "blabla"
|
47
|
+
p1.save
|
48
|
+
lambda {p.destroy}.should raise_error(ActiveRecord::StaleObjectError)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SimpleDBAdapter ActiveRecord attributes" do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
7
|
+
ActiveRecord::Base.establish_connection($config)
|
8
|
+
ActiveRecord::Base.connection.create_domain($config[:domain_name])
|
9
|
+
end
|
10
|
+
|
11
|
+
after :each do
|
12
|
+
ActiveRecord::Base.connection.delete_domain($config[:domain_name])
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should correct auto-generated properites (id, created_at, updated_at)" do
|
16
|
+
p = Person.new
|
17
|
+
p.id.should be_nil
|
18
|
+
p.created_at.should be_nil
|
19
|
+
p.updated_at.should be_nil
|
20
|
+
p.save!
|
21
|
+
p.id.should_not be_nil
|
22
|
+
p.created_at.should_not be_nil
|
23
|
+
p.updated_at.should_not be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be different ids for different model instances after create" do
|
27
|
+
p1 = Person.create!
|
28
|
+
p2 = Person.create!
|
29
|
+
p1.id.should_not == p2.id
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should correct saved and loaded" do
|
33
|
+
p = Person.create!(Person.valid_params)
|
34
|
+
|
35
|
+
r = Person.find p.id
|
36
|
+
Person.valid_params.each do |key, value|
|
37
|
+
r.try(key).should == value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should correct save and load integer values" do
|
42
|
+
p = Person.new
|
43
|
+
p.year = 2010
|
44
|
+
p.save
|
45
|
+
p.year = p.year + 1
|
46
|
+
p.save
|
47
|
+
p.reload
|
48
|
+
p.year.is_a?(Fixnum).should be_true
|
49
|
+
p.year.should == 2011
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should correct save and load float values" do
|
53
|
+
p = Person.new
|
54
|
+
p.price = 10.04
|
55
|
+
p.save
|
56
|
+
p.price = p.price + 1.2
|
57
|
+
p.save
|
58
|
+
p.reload
|
59
|
+
p.price.is_a?(Float).should be_true
|
60
|
+
p.price.should == 11.24
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should corrert save and load negative values" do
|
64
|
+
p = Person.new
|
65
|
+
p.price = -10.04
|
66
|
+
p.year = -200
|
67
|
+
p.save
|
68
|
+
p.price = p.price - 1.02
|
69
|
+
p.year = p.year - 2
|
70
|
+
p.save
|
71
|
+
p.reload
|
72
|
+
p.price.should == -11.06
|
73
|
+
p.year.should == -202
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should correct save and load boolean values" do
|
77
|
+
p = Person.new
|
78
|
+
p.active = true
|
79
|
+
p.save
|
80
|
+
p.reload
|
81
|
+
p.active.should be_true
|
82
|
+
p.active = false
|
83
|
+
p.save
|
84
|
+
p.reload
|
85
|
+
p.active.should be_false
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should correct save and load string values" do
|
89
|
+
p = Person.new
|
90
|
+
p.login = "superman"
|
91
|
+
p.save
|
92
|
+
p.login = p.login + "123"
|
93
|
+
p.save
|
94
|
+
p.reload
|
95
|
+
p.login.should == "superman123"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should update updated_at property when invoke .touch" do
|
99
|
+
p1 = Person.new
|
100
|
+
p1.save
|
101
|
+
p2 = Person.find p1.id
|
102
|
+
p1.touch
|
103
|
+
p1.updated_at.class.should == Time
|
104
|
+
p1.updated_at.should > p2.updated_at
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SimpleDBAdapter ActiveRecord validates" do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
7
|
+
ActiveRecord::Base.establish_connection($config)
|
8
|
+
ActiveRecord::Base.connection.create_domain($config[:domain_name])
|
9
|
+
end
|
10
|
+
|
11
|
+
after :each do
|
12
|
+
ActiveRecord::Base.connection.delete_domain($config[:domain_name])
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be correct work with validates presense of" do
|
16
|
+
class PersonWithValidates < Person
|
17
|
+
validates_presence_of :login
|
18
|
+
end
|
19
|
+
|
20
|
+
lambda {
|
21
|
+
PersonWithValidates.create!
|
22
|
+
}.should raise_error(ActiveRecord::RecordInvalid, "Validation failed: Login can't be blank")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be correct work with validates uniqueness of" do
|
26
|
+
class PersonWithValidates < Person
|
27
|
+
validates_uniqueness_of :login
|
28
|
+
end
|
29
|
+
|
30
|
+
PersonWithValidates.create!(Person.valid_params)
|
31
|
+
|
32
|
+
lambda {
|
33
|
+
PersonWithValidates.create!(Person.valid_params)
|
34
|
+
}.should raise_error(ActiveRecord::RecordInvalid, "Validation failed: Login has already been taken")
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SimpleDBAdapter ActiveRecord where statement" do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
7
|
+
ActiveRecord::Base.establish_connection($config)
|
8
|
+
ActiveRecord::Base.connection.create_domain($config[:domain_name])
|
9
|
+
Person.create!(Person.valid_params)
|
10
|
+
end
|
11
|
+
|
12
|
+
after :each do
|
13
|
+
ActiveRecord::Base.connection.delete_domain($config[:domain_name])
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should be return items by conditions with different type values" do
|
17
|
+
Person.valid_params.each do |name, value|
|
18
|
+
result = Person.where(name => value).first
|
19
|
+
result.try(name).should == value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be return items by condition with table name prefix" do
|
24
|
+
result = Person.where("people.state" => 'paid').first
|
25
|
+
result.state.should == 'paid'
|
26
|
+
end
|
27
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -38,7 +38,7 @@ class Person < ActiveRecord::Base
|
|
38
38
|
t.string :login
|
39
39
|
t.integer :year, :limit => 4
|
40
40
|
t.boolean :active
|
41
|
-
t.string :
|
41
|
+
t.string :state
|
42
42
|
t.float :price
|
43
43
|
t.integer :lock_version
|
44
44
|
|
@@ -51,7 +51,7 @@ class Person < ActiveRecord::Base
|
|
51
51
|
:year => 2010,
|
52
52
|
:active => true,
|
53
53
|
:price => 10.04,
|
54
|
-
:
|
54
|
+
:state => 'paid'
|
55
55
|
}
|
56
56
|
end
|
57
57
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-simpledb-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ilia Ablamonov
|
@@ -205,7 +205,12 @@ files:
|
|
205
205
|
- lib/activerecord-simpledb-adapter.rb
|
206
206
|
- lib/arel/visitors/simpledb.rb
|
207
207
|
- lib/tasks/simpledb.rake
|
208
|
-
- spec/
|
208
|
+
- spec/active_record/connection_adapters/simpledb_adapter_spec.rb
|
209
|
+
- spec/active_record/core_actions_spec.rb
|
210
|
+
- spec/active_record/locking_spec.rb
|
211
|
+
- spec/active_record/record_attributes_spec.rb
|
212
|
+
- spec/active_record/validates_spec.rb
|
213
|
+
- spec/active_record/where_spec.rb
|
209
214
|
- spec/spec_helper.rb
|
210
215
|
has_rdoc: true
|
211
216
|
homepage: http://github.com/cloudcastle/activerecord-simpledb-adapter
|
@@ -242,5 +247,10 @@ signing_key:
|
|
242
247
|
specification_version: 3
|
243
248
|
summary: ActiveRecord SimpleDB adapter
|
244
249
|
test_files:
|
245
|
-
- spec/
|
250
|
+
- spec/active_record/connection_adapters/simpledb_adapter_spec.rb
|
251
|
+
- spec/active_record/core_actions_spec.rb
|
252
|
+
- spec/active_record/locking_spec.rb
|
253
|
+
- spec/active_record/record_attributes_spec.rb
|
254
|
+
- spec/active_record/validates_spec.rb
|
255
|
+
- spec/active_record/where_spec.rb
|
246
256
|
- spec/spec_helper.rb
|
@@ -1,149 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "model with active_record_simple_db" do
|
4
|
-
|
5
|
-
before :each do
|
6
|
-
ActiveRecord::Base.establish_connection($config)
|
7
|
-
ActiveRecord::Base.connection.create_domain($config[:domain_name])
|
8
|
-
end
|
9
|
-
|
10
|
-
after :each do
|
11
|
-
ActiveRecord::Base.connection.delete_domain($config[:domain_name])
|
12
|
-
end
|
13
|
-
#test .new
|
14
|
-
it "should be without id, created_at and updated_at when model is new" do
|
15
|
-
p = Person.new
|
16
|
-
p.id.should be_nil
|
17
|
-
p.created_at.should be_nil
|
18
|
-
p.updated_at.should be_nil
|
19
|
-
end
|
20
|
-
|
21
|
-
#test .create and .save
|
22
|
-
it "should be with id, created_at and updated_at when saved when new model was saved or created immediately" do
|
23
|
-
p1 = Person.new
|
24
|
-
p1.save
|
25
|
-
p1.id.should_not be_nil
|
26
|
-
p1.created_at.should_not be_nil
|
27
|
-
p1.updated_at.should_not be_nil
|
28
|
-
p2 = Person.create!
|
29
|
-
p2.id.should_not be_nil
|
30
|
-
p2.created_at.should_not be_nil
|
31
|
-
p2.updated_at.should_not be_nil
|
32
|
-
end
|
33
|
-
|
34
|
-
#test correct saving/loading properties
|
35
|
-
it "should correct save and load all properties" do
|
36
|
-
p = Person.create!(Person.valid_params)
|
37
|
-
|
38
|
-
r = Person.find p.id
|
39
|
-
Person.valid_params.each do |key, value|
|
40
|
-
r.try(key).should == value
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
#test validates instructions
|
45
|
-
it "should be correct work with validates instruction" do
|
46
|
-
class PersonWithValidates < Person
|
47
|
-
validates_presence_of :login
|
48
|
-
validates_uniqueness_of :login
|
49
|
-
end
|
50
|
-
|
51
|
-
lambda {
|
52
|
-
PersonWithValidates.create!
|
53
|
-
}.should raise_error(ActiveRecord::RecordInvalid, "Validation failed: Login can't be blank")
|
54
|
-
|
55
|
-
PersonWithValidates.create!(Person.valid_params)
|
56
|
-
|
57
|
-
lambda {
|
58
|
-
PersonWithValidates.create!(Person.valid_params)
|
59
|
-
}.should raise_error(ActiveRecord::RecordInvalid, "Validation failed: Login has already been taken")
|
60
|
-
end
|
61
|
-
|
62
|
-
#test .create
|
63
|
-
it "should be different ids for different model instances" do
|
64
|
-
p1 = Person.create!
|
65
|
-
p2 = Person.create!
|
66
|
-
p1.id.should_not == p2.id
|
67
|
-
end
|
68
|
-
|
69
|
-
#test .find
|
70
|
-
it "should be found entry by id" do
|
71
|
-
p1 = Person.create!
|
72
|
-
p2 = Person.find p1.id
|
73
|
-
p1.should == p2
|
74
|
-
end
|
75
|
-
|
76
|
-
#test .all
|
77
|
-
it "should return collection of models when invoke .all" do
|
78
|
-
p = Person.new
|
79
|
-
p.save
|
80
|
-
r = Person.all
|
81
|
-
r.should_not be_nil
|
82
|
-
r.should_not be_empty
|
83
|
-
end
|
84
|
-
|
85
|
-
#test .first
|
86
|
-
it "should return valid entry when invoke .first" do
|
87
|
-
p = Person.new
|
88
|
-
p.save
|
89
|
-
p1 = Person.first
|
90
|
-
p1.should_not be_nil
|
91
|
-
end
|
92
|
-
|
93
|
-
#test .first
|
94
|
-
it "should return valid entry when invoke .last" do
|
95
|
-
p = Person.new
|
96
|
-
p.save
|
97
|
-
p1 = Person.last
|
98
|
-
p1.should_not be_nil
|
99
|
-
end
|
100
|
-
|
101
|
-
#test .touch
|
102
|
-
it "should update updated_at property when invoke .touch" do
|
103
|
-
p1 = Person.new
|
104
|
-
p1.save
|
105
|
-
p2 = Person.find p1.id
|
106
|
-
p1.touch
|
107
|
-
p1.updated_at.should > p2.updated_at
|
108
|
-
end
|
109
|
-
|
110
|
-
#test .destroy
|
111
|
-
it "should be destroy entry when invoke destroy" do
|
112
|
-
p1 = Person.new
|
113
|
-
p1.save
|
114
|
-
id = p1.id
|
115
|
-
p1.destroy
|
116
|
-
p2 = Person.find_by_id id
|
117
|
-
p2.should be_nil
|
118
|
-
end
|
119
|
-
|
120
|
-
#test optimistic locking
|
121
|
-
it "should be throw exception when invoke destroy twice for same object" do
|
122
|
-
p1 = Person.new
|
123
|
-
p1.save
|
124
|
-
p2 = Person.find p1.id
|
125
|
-
p1.year = 2008
|
126
|
-
p1.save
|
127
|
-
lambda {p2.destroy}.should raise_error(ActiveRecord::StaleObjectError)
|
128
|
-
end
|
129
|
-
|
130
|
-
#test where selection
|
131
|
-
it "should be correct work with where statment with equalities" do
|
132
|
-
p1 = Person.new
|
133
|
-
p1.year = 2008
|
134
|
-
p1.save
|
135
|
-
p2 = Person.new
|
136
|
-
p2.year = 2010
|
137
|
-
p2.save
|
138
|
-
p = Person.where(:year => 2010).all
|
139
|
-
p.should_not be_empty
|
140
|
-
end
|
141
|
-
|
142
|
-
it "should be correct work with where statment with \"from\" column" do
|
143
|
-
p1 = Person.new
|
144
|
-
p1.from = 'test'
|
145
|
-
p1.save
|
146
|
-
p = Person.where(:from => 'test').all
|
147
|
-
p.should_not be_empty
|
148
|
-
end
|
149
|
-
end
|