simply_stored 0.5.4 → 0.6.0
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/CHANGELOG.md +9 -0
- data/Gemfile.lock +13 -5
- data/README.md +41 -0
- data/lib/simply_stored/couch/belongs_to.rb +6 -8
- data/lib/simply_stored/couch/ext/couch_potato.rb +26 -0
- data/lib/simply_stored/couch/has_many.rb +1 -1
- data/lib/simply_stored/couch.rb +2 -30
- data/lib/simply_stored/instance_methods.rb +14 -8
- data/lib/simply_stored.rb +12 -10
- metadata +175 -56
- data/test/active_model_compatibility_test.rb +0 -23
- data/test/belongs_to_test.rb +0 -173
- data/test/conflict_handling_test.rb +0 -96
- data/test/finder_test.rb +0 -188
- data/test/fixtures/couch.rb +0 -286
- data/test/has_and_belongs_to_many_test.rb +0 -639
- data/test/has_many_test.rb +0 -489
- data/test/has_one_test.rb +0 -154
- data/test/instance_lifecycle_test.rb +0 -249
- data/test/mass_assignment_protection_test.rb +0 -77
- data/test/s3_test.rb +0 -256
- data/test/soft_deletable_test.rb +0 -468
- data/test/test_helper.rb +0 -19
- data/test/validations_test.rb +0 -142
- data/test/views_test.rb +0 -33
data/test/belongs_to_test.rb
DELETED
@@ -1,173 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + '/fixtures/couch')
|
3
|
-
|
4
|
-
class BelongsToTest < Test::Unit::TestCase
|
5
|
-
context "with associations" do
|
6
|
-
setup do
|
7
|
-
CouchPotato::Config.database_name = 'simply_stored_test'
|
8
|
-
recreate_db
|
9
|
-
end
|
10
|
-
|
11
|
-
context "with belongs_to" do
|
12
|
-
should "generate a view for the association" do
|
13
|
-
assert Post.respond_to?(:association_post_belongs_to_user)
|
14
|
-
end
|
15
|
-
|
16
|
-
should "raise an error if another property with the same name already exists" do
|
17
|
-
assert_raise(RuntimeError) do
|
18
|
-
class ::DoubleBelongsToUser
|
19
|
-
include SimplyStored::Couch
|
20
|
-
property :user
|
21
|
-
belongs_to :user
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
should "add the foreign key id to the referencing object" do
|
27
|
-
user = User.create(:title => "Mr.")
|
28
|
-
post = Post.create(:user => user)
|
29
|
-
|
30
|
-
post = Post.find(post.id)
|
31
|
-
assert_equal user.id, post.user_id
|
32
|
-
end
|
33
|
-
|
34
|
-
should "set also the foreign key id to nil if setting the referencing object to nil" do
|
35
|
-
user = User.create(:title => "Mr.")
|
36
|
-
post = Post.create(:user => user)
|
37
|
-
post.user = nil
|
38
|
-
post.save!
|
39
|
-
assert_nil post.reload.user
|
40
|
-
assert_nil post.reload.user_id
|
41
|
-
end
|
42
|
-
|
43
|
-
should "fetch the object from the database when requested through the getter" do
|
44
|
-
user = User.create(:title => "Mr.")
|
45
|
-
post = Post.create(:user => user)
|
46
|
-
|
47
|
-
post = Post.find(post.id)
|
48
|
-
assert_equal user, post.user
|
49
|
-
end
|
50
|
-
|
51
|
-
should "mark the referencing object as dirty" do
|
52
|
-
user = User.create(:title => "Mr.")
|
53
|
-
post = Post.create
|
54
|
-
post.user = user
|
55
|
-
assert post.dirty?
|
56
|
-
end
|
57
|
-
|
58
|
-
should "allow assigning a different object and store the id accordingly" do
|
59
|
-
user = User.create(:title => "Mr.")
|
60
|
-
user2 = User.create(:title => "Mrs.")
|
61
|
-
post = Post.create(:user => user)
|
62
|
-
post.user = user2
|
63
|
-
post.save
|
64
|
-
|
65
|
-
post = Post.find(post.id)
|
66
|
-
assert_equal user2, post.user
|
67
|
-
end
|
68
|
-
|
69
|
-
should "check the class and raise an error if not matching in belongs_to setter" do
|
70
|
-
post = Post.create
|
71
|
-
assert_raise(ArgumentError, 'expected Post got String') do
|
72
|
-
post.user = 'foo'
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
should 'not query for the object twice in getter' do
|
77
|
-
user = User.create(:title => "Mr.")
|
78
|
-
post = Post.create(:user => user)
|
79
|
-
post = Post.find(post.id)
|
80
|
-
User.expects(:find).returns "user"
|
81
|
-
post.user
|
82
|
-
User.expects(:find).never
|
83
|
-
post.user
|
84
|
-
end
|
85
|
-
|
86
|
-
should 'use cache in getter' do
|
87
|
-
post = Post.create
|
88
|
-
post.instance_variable_set("@user", 'foo')
|
89
|
-
assert_equal 'foo', post.user
|
90
|
-
end
|
91
|
-
|
92
|
-
should "ignore the cache if force_reload is given as an option" do
|
93
|
-
user = User.create(:name => 'Dude', :title => 'Mr.')
|
94
|
-
post = Post.create(:user => user)
|
95
|
-
post.reload
|
96
|
-
post.instance_variable_set("@user", 'foo')
|
97
|
-
assert_not_equal 'foo', post.user(:force_reload => true)
|
98
|
-
end
|
99
|
-
|
100
|
-
should 'set cache in setter' do
|
101
|
-
post = Post.create
|
102
|
-
user = User.create
|
103
|
-
assert_nil post.instance_variable_get("@user")
|
104
|
-
post.user = user
|
105
|
-
assert_equal user, post.instance_variable_get("@user")
|
106
|
-
end
|
107
|
-
|
108
|
-
should "not hit the database when the id column is empty" do
|
109
|
-
User.expects(:find).never
|
110
|
-
post = Post.create
|
111
|
-
post.user
|
112
|
-
end
|
113
|
-
|
114
|
-
should "know when the associated object changed" do
|
115
|
-
post = Post.create(:user => User.create(:title => "Mr."))
|
116
|
-
user2 = User.create(:title => "Mr.")
|
117
|
-
post.user = user2
|
118
|
-
assert post.user_changed?
|
119
|
-
end
|
120
|
-
|
121
|
-
should "not be changed when an association has not changed" do
|
122
|
-
post = Post.create(:user => User.create(:title => "Mr."))
|
123
|
-
assert !post.user_changed?
|
124
|
-
end
|
125
|
-
|
126
|
-
should "not be changed when assigned the same object" do
|
127
|
-
user = User.create(:title => "Mr.")
|
128
|
-
post = Post.create(:user => user)
|
129
|
-
post.user = user
|
130
|
-
assert !post.user_changed?
|
131
|
-
end
|
132
|
-
|
133
|
-
should "not be changed after saving" do
|
134
|
-
user = User.create(:title => "Mr.")
|
135
|
-
post = Post.new
|
136
|
-
post.user = user
|
137
|
-
assert post.user_changed?
|
138
|
-
post.save!
|
139
|
-
assert !post.user_changed?
|
140
|
-
end
|
141
|
-
|
142
|
-
should "handle a foreign_key of '' as nil" do
|
143
|
-
post = Post.create
|
144
|
-
post.user_id = ''
|
145
|
-
|
146
|
-
assert_nothing_raised do
|
147
|
-
assert_nil post.user
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
context "with aliased associations" do
|
152
|
-
should "allow different names for the same class" do
|
153
|
-
editor = User.create(:name => 'Editor', :title => 'Dr.')
|
154
|
-
author = User.create(:name => 'author', :title => 'Dr.')
|
155
|
-
assert_not_nil editor.id, editor.errors.inspect
|
156
|
-
assert_not_nil author.id, author.errors.inspect
|
157
|
-
|
158
|
-
doc = Document.create(:editor => editor, :author => author)
|
159
|
-
doc.save!
|
160
|
-
assert_equal editor.id, doc.editor_id
|
161
|
-
assert_equal author.id, doc.author_id
|
162
|
-
doc = Document.find(doc.id)
|
163
|
-
assert_not_nil doc.editor, doc.inspect
|
164
|
-
assert_not_nil doc.author
|
165
|
-
assert_equal editor.id, doc.editor.id
|
166
|
-
assert_equal author.id, doc.author.id
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
|
173
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + '/fixtures/couch')
|
3
|
-
|
4
|
-
class ConflictHandlingTest < Test::Unit::TestCase
|
5
|
-
context "when handling conflicts" do
|
6
|
-
setup do
|
7
|
-
CouchPotato::Config.database_name = 'simply_stored_test'
|
8
|
-
recreate_db
|
9
|
-
@original = User.create(:name => 'Mickey Mouse', :title => "Dr.", :homepage => 'www.gmx.de')
|
10
|
-
@copy = User.find(@original.id)
|
11
|
-
User.auto_conflict_resolution_on_save = true
|
12
|
-
end
|
13
|
-
|
14
|
-
should "be able to save without modifications" do
|
15
|
-
assert @copy.save
|
16
|
-
end
|
17
|
-
|
18
|
-
should "be able to save when modification happen on different attributes" do
|
19
|
-
@original.name = "Pluto"
|
20
|
-
assert @original.save
|
21
|
-
|
22
|
-
@copy.title = 'Prof.'
|
23
|
-
assert_nothing_raised do
|
24
|
-
assert @copy.save
|
25
|
-
end
|
26
|
-
|
27
|
-
assert_equal "Pluto", @copy.reload.name
|
28
|
-
assert_equal "Prof.", @copy.reload.title
|
29
|
-
assert_equal "www.gmx.de", @copy.reload.homepage
|
30
|
-
end
|
31
|
-
|
32
|
-
should "be able to save when modification happen on different, multiple attributes - remote" do
|
33
|
-
@original.name = "Pluto"
|
34
|
-
@original.homepage = 'www.google.com'
|
35
|
-
assert @original.save
|
36
|
-
|
37
|
-
@copy.title = 'Prof.'
|
38
|
-
assert_nothing_raised do
|
39
|
-
assert @copy.save
|
40
|
-
end
|
41
|
-
|
42
|
-
assert_equal "Pluto", @copy.reload.name
|
43
|
-
assert_equal "Prof.", @copy.reload.title
|
44
|
-
assert_equal "www.google.com", @copy.reload.homepage
|
45
|
-
end
|
46
|
-
|
47
|
-
should "be able to save when modification happen on different, multiple attributes locally" do
|
48
|
-
@original.name = "Pluto"
|
49
|
-
assert @original.save
|
50
|
-
|
51
|
-
@copy.title = 'Prof.'
|
52
|
-
@copy.homepage = 'www.google.com'
|
53
|
-
assert_nothing_raised do
|
54
|
-
assert @copy.save
|
55
|
-
end
|
56
|
-
|
57
|
-
assert_equal "Pluto", @copy.reload.name
|
58
|
-
assert_equal "Prof.", @copy.reload.title
|
59
|
-
assert_equal "www.google.com", @copy.reload.homepage
|
60
|
-
end
|
61
|
-
|
62
|
-
should "re-raise the conflict if there is no merge possible" do
|
63
|
-
@original.name = "Pluto"
|
64
|
-
assert @original.save
|
65
|
-
|
66
|
-
@copy.name = 'Prof.'
|
67
|
-
assert_raise(RestClient::Conflict) do
|
68
|
-
assert @copy.save
|
69
|
-
end
|
70
|
-
|
71
|
-
assert_equal "Prof.", @copy.name
|
72
|
-
assert_equal "Pluto", @copy.reload.name
|
73
|
-
end
|
74
|
-
|
75
|
-
should "re-raise the conflict if retried several times" do
|
76
|
-
exception = RestClient::Conflict.new
|
77
|
-
CouchPotato.database.expects(:save_document).raises(exception).times(3)
|
78
|
-
|
79
|
-
@copy.name = 'Prof.'
|
80
|
-
assert_raise(RestClient::Conflict) do
|
81
|
-
assert @copy.save
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
should "not try to merge and re-save if auto_conflict_resolution_on_save is disabled" do
|
86
|
-
User.auto_conflict_resolution_on_save = false
|
87
|
-
exception = RestClient::Conflict.new
|
88
|
-
CouchPotato.database.expects(:save_document).raises(exception).times(1)
|
89
|
-
|
90
|
-
@copy.name = 'Prof.'
|
91
|
-
assert_raise(RestClient::Conflict) do
|
92
|
-
assert @copy.save
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
data/test/finder_test.rb
DELETED
@@ -1,188 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + '/fixtures/couch')
|
3
|
-
|
4
|
-
class FinderTest < Test::Unit::TestCase
|
5
|
-
context "when finding instances" do
|
6
|
-
setup do
|
7
|
-
CouchPotato::Config.database_name = 'simply_stored_test'
|
8
|
-
recreate_db
|
9
|
-
end
|
10
|
-
|
11
|
-
context "with find(:all)" do
|
12
|
-
setup do
|
13
|
-
User.create(:title => "Mr.")
|
14
|
-
User.create(:title => "Mrs.")
|
15
|
-
end
|
16
|
-
|
17
|
-
should "return all instances" do
|
18
|
-
assert_equal 2, User.find(:all).size
|
19
|
-
end
|
20
|
-
|
21
|
-
should "allow a limit" do
|
22
|
-
assert_equal 1, User.find(:all, :limit => 1).size
|
23
|
-
end
|
24
|
-
|
25
|
-
should "allow to order the results" do
|
26
|
-
assert_not_equal User.find(:all).map(&:id), User.find(:all, :order => :desc).map(&:id)
|
27
|
-
assert_equal User.find(:all).map(&:id).reverse, User.find(:all, :order => :desc).map(&:id)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "to find all instances" do
|
32
|
-
should 'generate a default find_all view' do
|
33
|
-
assert User.respond_to?(:all_documents)
|
34
|
-
end
|
35
|
-
|
36
|
-
should 'return all the users when calling all' do
|
37
|
-
User.create(:title => "Mr.")
|
38
|
-
User.create(:title => "Mrs.")
|
39
|
-
assert_equal 2, User.all.size
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context "to find one instance" do
|
44
|
-
should 'return one user when calling first' do
|
45
|
-
user = User.create(:title => "Mr.")
|
46
|
-
assert_equal user, User.first
|
47
|
-
end
|
48
|
-
|
49
|
-
should 'understand the order' do
|
50
|
-
assert_nothing_raised do
|
51
|
-
User.first(:order => :desc)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
should 'find the last as a reverse first' do
|
56
|
-
User.expects(:find).with(:first, :order => :desc)
|
57
|
-
User.last
|
58
|
-
end
|
59
|
-
|
60
|
-
should 'return nil when no user found' do
|
61
|
-
assert_nil User.first
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context "when finding with just an identifier" do
|
66
|
-
should "find just one instance" do
|
67
|
-
user = User.create(:title => "Mr.")
|
68
|
-
assert User.find(user.id).kind_of?(User)
|
69
|
-
end
|
70
|
-
|
71
|
-
should 'raise an error when no record was found' do
|
72
|
-
assert_raises(SimplyStored::RecordNotFound) do
|
73
|
-
User.find('abc')
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
should 'tell you which class failed to load something' do
|
78
|
-
exception = nil
|
79
|
-
begin
|
80
|
-
User.find('abc')
|
81
|
-
rescue SimplyStored::RecordNotFound => e
|
82
|
-
exception = e
|
83
|
-
end
|
84
|
-
assert_equal "User could not be found with \"abc\"", exception.message
|
85
|
-
end
|
86
|
-
|
87
|
-
should 'raise an error when nil was specified' do
|
88
|
-
assert_raises(SimplyStored::Error) do
|
89
|
-
User.find(nil)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
should 'raise an error when the record was not of the expected type' do
|
94
|
-
post = Post.create
|
95
|
-
assert_raises(SimplyStored::RecordNotFound) do
|
96
|
-
User.find(post.id)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context "with a find_by prefix" do
|
102
|
-
setup do
|
103
|
-
recreate_db
|
104
|
-
end
|
105
|
-
|
106
|
-
should "create a view for the called finder" do
|
107
|
-
User.find_by_name("joe")
|
108
|
-
assert User.respond_to?(:by_name)
|
109
|
-
end
|
110
|
-
|
111
|
-
should 'not create the view when it already exists' do
|
112
|
-
User.expects(:view).never
|
113
|
-
User.find_by_name_and_created_at("joe", 'foo')
|
114
|
-
end
|
115
|
-
|
116
|
-
should "create a method to prevent future loops through method_missing" do
|
117
|
-
assert !User.respond_to?(:find_by_title)
|
118
|
-
User.find_by_title("Mr.")
|
119
|
-
assert User.respond_to?(:find_by_title)
|
120
|
-
end
|
121
|
-
|
122
|
-
should "call the generated view and return the result" do
|
123
|
-
user = User.create(:homepage => "http://www.peritor.com", :title => "Mr.")
|
124
|
-
assert_equal user, User.find_by_homepage("http://www.peritor.com")
|
125
|
-
end
|
126
|
-
|
127
|
-
should 'find only one instance when using find_by' do
|
128
|
-
User.create(:title => "Mr.")
|
129
|
-
assert User.find_by_title("Mr.").is_a?(User)
|
130
|
-
end
|
131
|
-
|
132
|
-
should "raise an error if the parameters don't match" do
|
133
|
-
assert_raise(ArgumentError) do
|
134
|
-
User.find_by_title()
|
135
|
-
end
|
136
|
-
|
137
|
-
assert_raise(ArgumentError) do
|
138
|
-
User.find_by_title(1,2,3,4,5)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
context "with a find_all_by prefix" do
|
144
|
-
should "create a view for the called finder" do
|
145
|
-
User.find_all_by_name("joe")
|
146
|
-
assert User.respond_to?(:by_name)
|
147
|
-
end
|
148
|
-
|
149
|
-
should 'not create the view when it already exists' do
|
150
|
-
User.expects(:view).never
|
151
|
-
User.find_all_by_name_and_created_at("joe", "foo")
|
152
|
-
end
|
153
|
-
|
154
|
-
should "create a method to prevent future loops through method_missing" do
|
155
|
-
assert !User.respond_to?(:find_all_by_foo_attribute)
|
156
|
-
User.find_all_by_foo_attribute("Mr.")
|
157
|
-
assert User.respond_to?(:find_all_by_foo_attribute)
|
158
|
-
end
|
159
|
-
|
160
|
-
should "call the generated view and return the result" do
|
161
|
-
user = User.create(:homepage => "http://www.peritor.com", :title => "Mr.")
|
162
|
-
assert_equal [user], User.find_all_by_homepage("http://www.peritor.com")
|
163
|
-
end
|
164
|
-
|
165
|
-
should "return an emtpy array if none found" do
|
166
|
-
recreate_db
|
167
|
-
assert_equal [], User.find_all_by_title('Mr. Magoooo')
|
168
|
-
end
|
169
|
-
|
170
|
-
should 'find all instances when using find_all_by' do
|
171
|
-
User.create(:title => "Mr.")
|
172
|
-
User.create(:title => "Mr.")
|
173
|
-
assert_equal 2, User.find_all_by_title("Mr.").size
|
174
|
-
end
|
175
|
-
|
176
|
-
should "raise an error if the parameters don't match" do
|
177
|
-
assert_raise(ArgumentError) do
|
178
|
-
User.find_all_by_title()
|
179
|
-
end
|
180
|
-
|
181
|
-
assert_raise(ArgumentError) do
|
182
|
-
User.find_all_by_title(1,2,3,4,5)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
end
|