Dynamoid 0.0.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.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +19 -0
- data/Gemfile.lock +58 -0
- data/LICENSE.txt +20 -0
- data/README.markdown +66 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/lib/dynamoid.rb +31 -0
- data/lib/dynamoid/adapter.rb +24 -0
- data/lib/dynamoid/adapter/aws_sdk.rb +99 -0
- data/lib/dynamoid/adapter/local.rb +77 -0
- data/lib/dynamoid/attributes.rb +27 -0
- data/lib/dynamoid/components.rb +24 -0
- data/lib/dynamoid/config.rb +19 -0
- data/lib/dynamoid/config/options.rb +74 -0
- data/lib/dynamoid/document.rb +35 -0
- data/lib/dynamoid/errors.rb +8 -0
- data/lib/dynamoid/fields.rb +32 -0
- data/lib/dynamoid/finders.rb +58 -0
- data/lib/dynamoid/indexes.rb +59 -0
- data/lib/dynamoid/persistence.rb +35 -0
- data/lib/dynamoid/relations.rb +21 -0
- data/spec/app/models/address.rb +5 -0
- data/spec/app/models/user.rb +11 -0
- data/spec/dynamoid/adapter/aws_sdk_spec.rb +123 -0
- data/spec/dynamoid/adapter/local_spec.rb +150 -0
- data/spec/dynamoid/adapter_spec.rb +13 -0
- data/spec/dynamoid/attributes_spec.rb +31 -0
- data/spec/dynamoid/document_spec.rb +38 -0
- data/spec/dynamoid/fields_spec.rb +26 -0
- data/spec/dynamoid/finders_spec.rb +110 -0
- data/spec/dynamoid/indexes_spec.rb +54 -0
- data/spec/dynamoid/persistence_spec.rb +55 -0
- data/spec/dynamoid/relations_spec.rb +6 -0
- data/spec/dynamoid_spec.rb +5 -0
- data/spec/spec_helper.rb +52 -0
- metadata +188 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'dynamoid/adapter/local'
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
3
|
+
|
4
|
+
describe Dynamoid::Adapter::Local do
|
5
|
+
|
6
|
+
unless ENV['ACCESS_KEY'] && ENV['SECRET_KEY']
|
7
|
+
|
8
|
+
# BatchGetItem
|
9
|
+
it 'performs BatchGetItem with singular keys' do
|
10
|
+
Dynamoid::Adapter.create_table('table1', :id)
|
11
|
+
Dynamoid::Adapter.put_item('table1', {:id => '1', :name => 'Josh'})
|
12
|
+
Dynamoid::Adapter.create_table('table2', :id)
|
13
|
+
Dynamoid::Adapter.put_item('table2', {:id => '1', :name => 'Justin'})
|
14
|
+
|
15
|
+
results = Dynamoid::Adapter.batch_get_item('table1' => '1', 'table2' => '1')
|
16
|
+
results.size.should == 2
|
17
|
+
results['table1'].should include({:name => 'Josh', :id => '1'})
|
18
|
+
results['table2'].should include({:name => 'Justin', :id => '1'})
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'performs BatchGetItem with multiple keys' do
|
22
|
+
Dynamoid::Adapter.create_table('table1', :id)
|
23
|
+
Dynamoid::Adapter.put_item('table1', {:id => '1', :name => 'Josh'})
|
24
|
+
Dynamoid::Adapter.put_item('table1', {:id => '2', :name => 'Justin'})
|
25
|
+
|
26
|
+
results = Dynamoid::Adapter.batch_get_item('table1' => ['1', '2'])
|
27
|
+
results.size.should == 1
|
28
|
+
results['table1'].should include({:name => 'Josh', :id => '1'})
|
29
|
+
results['table1'].should include({:name => 'Justin', :id => '2'})
|
30
|
+
end
|
31
|
+
|
32
|
+
# CreateTable
|
33
|
+
it 'performs CreateTable' do
|
34
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
35
|
+
|
36
|
+
Dynamoid::Adapter.list_tables.should include 'Test Table'
|
37
|
+
end
|
38
|
+
|
39
|
+
# DeleteItem
|
40
|
+
it 'performs DeleteItem' do
|
41
|
+
Dynamoid::Adapter.create_table('table1', :id)
|
42
|
+
Dynamoid::Adapter.put_item('table1', {:id => '1', :name => 'Josh'})
|
43
|
+
|
44
|
+
Dynamoid::Adapter.delete_item('table1', '1')
|
45
|
+
|
46
|
+
Dynamoid::Adapter.data['table1'][:data].should be_empty
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'performs DeleteItem for an item that does not exist' do
|
50
|
+
Dynamoid::Adapter.create_table('table1', :id)
|
51
|
+
|
52
|
+
Dynamoid::Adapter.delete_item('table1', '1')
|
53
|
+
|
54
|
+
Dynamoid::Adapter.data['table1'][:data].should be_empty
|
55
|
+
end
|
56
|
+
|
57
|
+
# DeleteTable
|
58
|
+
it 'performs DeleteTable' do
|
59
|
+
Dynamoid::Adapter.create_table('table1', :id)
|
60
|
+
|
61
|
+
Dynamoid::Adapter.delete_table('table1')
|
62
|
+
|
63
|
+
Dynamoid::Adapter.data['table1'].should be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
# DescribeTable
|
67
|
+
|
68
|
+
# GetItem
|
69
|
+
it "performs GetItem for an item that does not exist" do
|
70
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
71
|
+
|
72
|
+
Dynamoid::Adapter.get_item('Test Table', '1').should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it "performs GetItem for an item that does exist" do
|
76
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
77
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '1', :name => 'Josh'})
|
78
|
+
|
79
|
+
Dynamoid::Adapter.get_item('Test Table', '1').should == {:id => '1', :name => 'Josh'}
|
80
|
+
end
|
81
|
+
|
82
|
+
# ListTables
|
83
|
+
it 'performs ListTables' do
|
84
|
+
Dynamoid::Adapter.create_table('Table1', :id)
|
85
|
+
Dynamoid::Adapter.create_table('Table2', :id)
|
86
|
+
|
87
|
+
Dynamoid::Adapter.list_tables.should include 'Table1'
|
88
|
+
Dynamoid::Adapter.list_tables.should include 'Table2'
|
89
|
+
end
|
90
|
+
|
91
|
+
# PutItem
|
92
|
+
it 'performs PutItem for an item that does not exist' do
|
93
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
94
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '1', :name => 'Josh'})
|
95
|
+
|
96
|
+
Dynamoid::Adapter.data['Test Table'].should == { :id => :id, :data => { '1' => { :id=> '1', :name=>"Josh" }}}
|
97
|
+
end
|
98
|
+
|
99
|
+
# Query
|
100
|
+
it 'performs query on a table and returns items' do
|
101
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
102
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '1', :name => 'Josh'})
|
103
|
+
|
104
|
+
Dynamoid::Adapter.query('Test Table', '1').should == { :id=> '1', :name=>"Josh" }
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'performs query on a table and returns items if there are multiple items' do
|
108
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
109
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '1', :name => 'Josh'})
|
110
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '2', :name => 'Justin'})
|
111
|
+
|
112
|
+
Dynamoid::Adapter.query('Test Table', '1').should == { :id=> '1', :name=>"Josh" }
|
113
|
+
end
|
114
|
+
|
115
|
+
# Scan
|
116
|
+
it 'performs scan on a table and returns items' do
|
117
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
118
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '1', :name => 'Josh'})
|
119
|
+
|
120
|
+
Dynamoid::Adapter.scan('Test Table', :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'performs scan on a table and returns items if there are multiple items but only one match' do
|
124
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
125
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '1', :name => 'Josh'})
|
126
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '2', :name => 'Justin'})
|
127
|
+
|
128
|
+
Dynamoid::Adapter.scan('Test Table', :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'performs scan on a table and returns multiple items if there are multiple matches' do
|
132
|
+
Dynamoid::Adapter.create_table('Test Table', :id)
|
133
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '1', :name => 'Josh'})
|
134
|
+
Dynamoid::Adapter.put_item('Test Table', {:id => '2', :name => 'Josh'})
|
135
|
+
|
136
|
+
Dynamoid::Adapter.scan('Test Table', :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }, { :id=> '2', :name=>"Josh" }]
|
137
|
+
end
|
138
|
+
|
139
|
+
# UpdateItem
|
140
|
+
|
141
|
+
# UpdateTable
|
142
|
+
|
143
|
+
protected
|
144
|
+
|
145
|
+
def setup_value(table, key, value)
|
146
|
+
Dynamoid::Adapter.data[table][key] = value
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Dynamoid::Adapter" do
|
4
|
+
|
5
|
+
it 'extends itself automatically' do
|
6
|
+
lambda {Dynamoid::Adapter.list_tables}.should_not raise_error
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'raises nomethod if we try a method that is not on the child' do
|
10
|
+
lambda {Dynamoid::Adapter.foobar}.should raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Dynamoid::Attributes" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@address = Address.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should write an attribute correctly' do
|
10
|
+
@address.write_attribute(:city, 'Chicago')
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should write an attribute with the alias' do
|
14
|
+
@address[:city] = 'Chicago'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should read a written attribute' do
|
18
|
+
@address.write_attribute(:city, 'Chicago')
|
19
|
+
@address.read_attribute(:city).should == 'Chicago'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should read a written attribute with the alias' do
|
23
|
+
@address.write_attribute(:city, 'Chicago')
|
24
|
+
@address[:city].should == 'Chicago'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns all attributes' do
|
28
|
+
Address.attributes.should == [:id, :city]
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Dynamoid::Document" do
|
4
|
+
|
5
|
+
it 'initializes a new document' do
|
6
|
+
@address = Address.new
|
7
|
+
|
8
|
+
@address.new_record.should be_true
|
9
|
+
@address.attributes.should == {:id => nil, :city => nil}
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'initializes a new document with attributes' do
|
13
|
+
@address = Address.new(:city => 'Chicago')
|
14
|
+
|
15
|
+
@address.new_record.should be_true
|
16
|
+
|
17
|
+
@address.attributes.should == {:id => nil, :city => 'Chicago'}
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'creates a new document' do
|
21
|
+
@address = Address.create(:city => 'Chicago')
|
22
|
+
|
23
|
+
@address.new_record.should be_false
|
24
|
+
@address.id.should_not be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'tests equivalency with itself' do
|
28
|
+
@addres.should == @address
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'is not equivalent to another document' do
|
32
|
+
@address.should_not == Address.create
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'is not equivalent to another object' do
|
36
|
+
@address.should_not == "test"
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Dynamoid::Fields" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@address = Address.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'declares read attributes' do
|
10
|
+
@address.city.should be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'declares write attributes' do
|
14
|
+
@address.city = 'Chicago'
|
15
|
+
@address.city.should == 'Chicago'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'declares a query attribute' do
|
19
|
+
@address.city?.should be_false
|
20
|
+
|
21
|
+
@address.city = 'Chicago'
|
22
|
+
|
23
|
+
@address.city?.should be_true
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Dynamoid::Finders" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@address = Address.create(:city => 'Chicago')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'finds an existing address' do
|
10
|
+
found = Address.find(@address.id)
|
11
|
+
|
12
|
+
found.should == @address
|
13
|
+
found.city.should == 'Chicago'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'is not a new object' do
|
17
|
+
found = Address.find(@address.id)
|
18
|
+
|
19
|
+
found.new_record.should_not be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'finds multiple ids' do
|
23
|
+
@address2 = Address.create(:city => 'Illinois')
|
24
|
+
|
25
|
+
Address.find(@address.id, @address2.id).should include @address, @address2
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with users' do
|
29
|
+
before do
|
30
|
+
User.create_indexes
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'finds using method_missing for attributes' do
|
34
|
+
array = Address.find_by_city('Chicago')
|
35
|
+
|
36
|
+
array.should == @address
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'finds using method_missing for multiple attributes' do
|
40
|
+
@user = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
41
|
+
|
42
|
+
array = User.find_all_by_name_and_email('Josh', 'josh@joshsymonds.com')
|
43
|
+
|
44
|
+
array.should == [@user]
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'finds using method_missing for single attributes and multiple results' do
|
48
|
+
@user1 = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
49
|
+
@user2 = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
50
|
+
|
51
|
+
array = User.find_all_by_name('Josh')
|
52
|
+
|
53
|
+
array.size.should == 2
|
54
|
+
array.should include @user1
|
55
|
+
array.should include @user2
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'finds using method_missing for multiple attributes and multiple results' do
|
59
|
+
@user1 = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
60
|
+
@user2 = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
61
|
+
|
62
|
+
array = User.find_all_by_name_and_email('Josh', 'josh@joshsymonds.com')
|
63
|
+
|
64
|
+
array.size.should == 2
|
65
|
+
array.should include @user1
|
66
|
+
array.should include @user2
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'finds using method_missing for multiple attributes and no results' do
|
70
|
+
@user1 = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
71
|
+
@user2 = User.create(:name => 'Justin', :email => 'justin@joshsymonds.com')
|
72
|
+
|
73
|
+
array = User.find_all_by_name_and_email('Gaga','josh@joshsymonds.com')
|
74
|
+
|
75
|
+
array.should be_empty
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'finds using method_missing for a single attribute and no results' do
|
79
|
+
@user1 = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
80
|
+
@user2 = User.create(:name => 'Justin', :email => 'justin@joshsymonds.com')
|
81
|
+
|
82
|
+
array = User.find_all_by_name('Gaga')
|
83
|
+
|
84
|
+
array.should be_empty
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should find on a query that is not indexed' do
|
88
|
+
@user = User.create(:password => 'Test')
|
89
|
+
|
90
|
+
array = User.find_all_by_password('Test')
|
91
|
+
|
92
|
+
array.should == [@user]
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should find on a query on multiple attributes that are not indexed' do
|
96
|
+
@user = User.create(:password => 'Test', :name => 'Josh')
|
97
|
+
|
98
|
+
array = User.find_all_by_password_and_name('Test', 'Josh')
|
99
|
+
|
100
|
+
array.should == [@user]
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should return an empty array when fields exist but nothing is found' do
|
104
|
+
array = User.find_all_by_password('Test')
|
105
|
+
|
106
|
+
array.should be_empty
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Dynamoid::Indexes" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
User.create_indexes
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'raises an error if a field does not exist' do
|
10
|
+
lambda {User.send(:index, :test)}.should raise_error(Dynamoid::Errors::InvalidField)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'adds indexes to the index array' do
|
14
|
+
User.indexes.should == [[:name], [:email], [:email, :name]]
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'reorders index names alphabetically' do
|
18
|
+
User.indexes.last.should == [:email, :name]
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'creates a name for a table index' do
|
22
|
+
User.index_table_name([:email, :name]).should == 'dynamoid_tests_index_user_emails_and_names'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'creates a key name for a table index' do
|
26
|
+
User.index_key_name([:email, :name]).should == 'user_emails_and_names'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'creates a table after an index is created' do
|
30
|
+
User.send(:index, :password)
|
31
|
+
|
32
|
+
User.table_exists?(User.index_table_name([:password])).should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'assembles a hashed value for the key of an index' do
|
36
|
+
@user = User.create(:name => 'Josh', :email => 'josh@joshsymonds.com')
|
37
|
+
|
38
|
+
@user.key_for_index([:email, :name]).should == (Digest::SHA2.new << 'Josh' << 'josh@joshsymonds.com').to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'saves indexes to their tables' do
|
42
|
+
@user = User.create(:name => 'Josh')
|
43
|
+
|
44
|
+
Dynamoid::Adapter.get_item("dynamoid_tests_index_user_names", @user.key_for_index([:name])).should == {@user.class.index_key_name([:name]).to_sym => @user.key_for_index([:name]), :ids => Set[@user.id]}
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'saves multiple indexes with the same value as an array' do
|
48
|
+
@user1 = User.create(:name => 'Josh')
|
49
|
+
@user2 = User.create(:name => 'Josh')
|
50
|
+
|
51
|
+
Dynamoid::Adapter.get_item("dynamoid_tests_index_user_names", @user1.key_for_index([:name])).should == {@user1.class.index_key_name([:name]).to_sym => @user1.key_for_index([:name]), :ids => Set[@user2.id, @user1.id]}
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Dynamoid::Persistence" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@address = Address.new
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'without AWS keys' do
|
10
|
+
unless ENV['ACCESS_KEY'] && ENV['SECRET_KEY']
|
11
|
+
before do
|
12
|
+
Dynamoid::Adapter.delete_table(Address.table_name) if Dynamoid::Adapter.list_tables.include?(Address.table_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'creates a table' do
|
16
|
+
Address.create_table(Address.table_name)
|
17
|
+
|
18
|
+
Dynamoid::Adapter.list_tables.should include 'dynamoid_tests_addresses'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'checks if a table already exists' do
|
22
|
+
Address.create_table(Address.table_name)
|
23
|
+
|
24
|
+
Address.table_exists?(Address.table_name).should be_true
|
25
|
+
Address.table_exists?('crazytable').should be_false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
it 'assigns itself an id on save' do
|
32
|
+
@address.save
|
33
|
+
|
34
|
+
Dynamoid::Adapter.get_item("dynamoid_tests_addresses", @address.id)[:id].should == @address.id
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'assigns itself an id on save only if it does not have one' do
|
38
|
+
@address.id = 'test123'
|
39
|
+
@address.save
|
40
|
+
|
41
|
+
Dynamoid::Adapter.get_item("dynamoid_tests_addresses", 'test123').should_not be_empty
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'has a table name' do
|
45
|
+
Address.table_name.should == 'dynamoid_tests_addresses'
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'saves indexes along with itself' do
|
49
|
+
@user = User.new(:name => 'Josh')
|
50
|
+
|
51
|
+
@user.expects(:save_indexes).once.returns(true)
|
52
|
+
@user.save
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|