langalex-couch_potato 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/CREDITS +3 -0
- data/MIT-LICENSE.txt +19 -0
- data/init.rb +5 -0
- data/lib/core_ext/object.rb +5 -0
- data/lib/core_ext/time.rb +14 -0
- data/lib/couch_potato/active_record/compatibility.rb +9 -0
- data/lib/couch_potato/ordering.rb +88 -0
- data/lib/couch_potato/persistence/belongs_to_property.rb +44 -0
- data/lib/couch_potato/persistence/bulk_save_queue.rb +47 -0
- data/lib/couch_potato/persistence/callbacks.rb +96 -0
- data/lib/couch_potato/persistence/collection.rb +51 -0
- data/lib/couch_potato/persistence/external_collection.rb +54 -0
- data/lib/couch_potato/persistence/external_has_many_property.rb +68 -0
- data/lib/couch_potato/persistence/find.rb +21 -0
- data/lib/couch_potato/persistence/finder.rb +109 -0
- data/lib/couch_potato/persistence/inline_collection.rb +14 -0
- data/lib/couch_potato/persistence/inline_has_many_property.rb +39 -0
- data/lib/couch_potato/persistence/json.rb +46 -0
- data/lib/couch_potato/persistence/properties.rb +40 -0
- data/lib/couch_potato/persistence/simple_property.rb +33 -0
- data/lib/couch_potato/persistence.rb +186 -0
- data/lib/couch_potato/versioning.rb +46 -0
- data/lib/couch_potato.rb +20 -0
- data/spec/attributes_spec.rb +22 -0
- data/spec/belongs_to_spec.rb +37 -0
- data/spec/callbacks_spec.rb +229 -0
- data/spec/create_spec.rb +68 -0
- data/spec/destroy_spec.rb +24 -0
- data/spec/find_spec.rb +88 -0
- data/spec/finder_spec.rb +115 -0
- data/spec/has_many_spec.rb +178 -0
- data/spec/inline_collection_spec.rb +15 -0
- data/spec/ordering_spec.rb +94 -0
- data/spec/property_spec.rb +46 -0
- data/spec/reload_spec.rb +46 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/update_spec.rb +33 -0
- data/spec/versioning_spec.rb +149 -0
- metadata +132 -0
data/spec/create_spec.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "create" do
|
4
|
+
describe "succeeds" do
|
5
|
+
before(:each) do
|
6
|
+
@comment = Comment.new :title => 'my_title'
|
7
|
+
@comment.save!
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should assign an id" do
|
11
|
+
@comment._id.should_not be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should assign a revision" do
|
15
|
+
@comment._rev.should_not be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should store the class" do
|
19
|
+
CouchPotato::Persistence.Db.get(@comment.id)['ruby_class'].should == 'Comment'
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should set created at" do
|
23
|
+
DateTime.parse(CouchPotato::Persistence.Db.get(@comment.id)['created_at']).should >= 1.second.ago
|
24
|
+
@comment.created_at.should >= 10.seconds.ago
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should set updated at" do
|
28
|
+
DateTime.parse(CouchPotato::Persistence.Db.get(@comment.id)['updated_at']).should >= 1.second.ago
|
29
|
+
@comment.updated_at.should >= 10.seconds.ago
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "fails" do
|
34
|
+
before(:each) do
|
35
|
+
CouchPotato::Persistence.Db.delete!
|
36
|
+
@comment = Comment.new
|
37
|
+
@comment.save
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not assign an id" do
|
41
|
+
@comment._id.should be_nil
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not assign a revision" do
|
45
|
+
@comment._rev.should be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should not store anything" do
|
49
|
+
CouchPotato::Persistence.Db.documents['rows'].should be_empty
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not set created at" do
|
53
|
+
@comment.created_at.should be_nil
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should set updated at" do
|
57
|
+
@comment.updated_at.should be_nil
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "with bank" do
|
61
|
+
it "should raise an exception" do
|
62
|
+
lambda {
|
63
|
+
@comment.save!
|
64
|
+
}.should raise_error
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe 'destroy' do
|
4
|
+
before(:each) do
|
5
|
+
@comment = Comment.create! :title => 'title'
|
6
|
+
@comment_id = @comment.id
|
7
|
+
@comment.destroy
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should unset the id" do
|
11
|
+
@comment._id.should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should unset the revision" do
|
15
|
+
@comment._rev.should be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should remove the document from the database" do
|
19
|
+
lambda {
|
20
|
+
CouchPotato::Persistence.Db.get(@comment_id).should
|
21
|
+
}.should raise_error(RestClient::ResourceNotFound)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/spec/find_spec.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "find" do
|
4
|
+
before(:each) do
|
5
|
+
@comment = Comment.create! :title => 'title'
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should find by id" do
|
9
|
+
Comment.find(@comment.id).should == @comment
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should assign the id" do
|
13
|
+
Comment.find(@comment.id)._id.should == @comment._id
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should assign the revision" do
|
17
|
+
Comment.find(@comment.id)._rev.should == @comment._rev
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should reurn nil of nothing found" do
|
21
|
+
Comment.find(@comment.id.succ).should be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'first' do
|
26
|
+
before(:each) do
|
27
|
+
CouchPotato::Persistence.Db.delete!
|
28
|
+
@comment = Comment.create! :title => 'title'
|
29
|
+
Comment.create! :title => 'title3'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should find the first matching object" do
|
33
|
+
Comment.first(:title =>'title').should == @comment
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return nil if nothing found" do
|
37
|
+
Comment.first(:title =>'title2').should be_nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'last' do
|
42
|
+
before(:each) do
|
43
|
+
CouchPotato::Persistence.Db.delete!
|
44
|
+
Comment.create! :title => 'title'
|
45
|
+
@comment = Comment.create! :title => 'title'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should find the last matching object" do
|
49
|
+
Comment.last(:title =>'title').should == @comment
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return nil if nothing found" do
|
53
|
+
Comment.last(:title =>'title2').should be_nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
describe 'all' do
|
59
|
+
before(:each) do
|
60
|
+
CouchPotato::Persistence.Db.delete!
|
61
|
+
@comment = Comment.create! :title => 'title'
|
62
|
+
@comment2 = Comment.create! :title => 'title'
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should find the matching objects" do
|
66
|
+
Comment.all(:title =>'title').should == [@comment, @comment2]
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should return [] if nothing found" do
|
70
|
+
Comment.all(:title =>'title2').should == []
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'count' do
|
75
|
+
before(:each) do
|
76
|
+
CouchPotato::Persistence.Db.delete!
|
77
|
+
@comment = Comment.create! :title => 'title'
|
78
|
+
@comment2 = Comment.create! :title => 'title'
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should count the matching objects" do
|
82
|
+
Comment.count(:title =>'title').should == 2
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should not count non matching objects" do
|
86
|
+
Comment.count(:title =>'title2').should == 0
|
87
|
+
end
|
88
|
+
end
|
data/spec/finder_spec.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
class OtherComment
|
4
|
+
include CouchPotato::Persistence
|
5
|
+
|
6
|
+
belongs_to :commenter
|
7
|
+
end
|
8
|
+
|
9
|
+
describe CouchPotato::Persistence::Finder, 'find' do
|
10
|
+
before(:each) do
|
11
|
+
CouchPotato::Persistence.Db.delete!
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "couchdb 0.9+" do
|
15
|
+
it "should find items by an array of values" do
|
16
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
17
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
18
|
+
c3 = Comment.create! :title => 'test', :commenter_id => '3'
|
19
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => ['2', '3']
|
20
|
+
comments.should == [c2, c3]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should find items by an array of values combined with other attributes" do
|
24
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
25
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
26
|
+
c3 = Comment.create! :title => 'test2', :commenter_id => '3'
|
27
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => ['2', '3'], :title => 'test'
|
28
|
+
comments.should == [c2]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should find objects with a given attribute value pair" do
|
33
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
34
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
35
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '1'
|
36
|
+
comments.should == [c1]
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should find items by range" do
|
40
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
41
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
42
|
+
c3 = Comment.create! :title => 'test', :commenter_id => '3'
|
43
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '2'..'3'
|
44
|
+
comments.should == [c2, c3]
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should find items by range and other atributes" do
|
48
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
49
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
50
|
+
c3 = Comment.create! :title => 'test', :commenter_id => '3'
|
51
|
+
c4 = Comment.create! :title => 'test2', :commenter_id => '3'
|
52
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '2'..'3', :title => 'test'
|
53
|
+
comments.should == [c2, c3]
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should find objects with multiple given attribute value pair" do
|
57
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
58
|
+
c2 = Comment.create! :title => 'test2', :commenter_id => '1'
|
59
|
+
c3 = Comment.create! :title => 'test', :commenter_id => '2'
|
60
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '1', :title => 'test'
|
61
|
+
comments.should == [c1]
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should find them when the view has been created already" do
|
65
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
66
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
67
|
+
CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '1'
|
68
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '1'
|
69
|
+
comments.should == [c1]
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should not find instances of other classes" do
|
73
|
+
OtherComment.create! :commenter_id => '1'
|
74
|
+
comments = CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '1'
|
75
|
+
comments.should be_empty
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should update the design document correctly when running multiple finds" do
|
79
|
+
CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '1'
|
80
|
+
lambda {
|
81
|
+
CouchPotato::Persistence::Finder.new.find Comment, :commenter_id => '1', :title => 'test'
|
82
|
+
}.should_not raise_error(RestClient::RequestFailed)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe CouchPotato::Persistence::Finder, 'count' do
|
87
|
+
before(:each) do
|
88
|
+
CouchPotato::Persistence.Db.delete!
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should count objects with a given attribute value pair" do
|
92
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
93
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
94
|
+
CouchPotato::Persistence::Finder.new.count(Comment, :commenter_id => '1').should == 1
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should count objects with multiple given attribute value pair" do
|
98
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
99
|
+
c2 = Comment.create! :title => 'test2', :commenter_id => '1'
|
100
|
+
c3 = Comment.create! :title => 'test', :commenter_id => '2'
|
101
|
+
CouchPotato::Persistence::Finder.new.count(Comment, :commenter_id => '1', :title => 'test').should == 1
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should count them when the view has been created already" do
|
105
|
+
c1 = Comment.create! :title => 'test', :commenter_id => '1'
|
106
|
+
c2 = Comment.create! :title => 'test', :commenter_id => '2'
|
107
|
+
CouchPotato::Persistence::Finder.new.count Comment, :commenter_id => '1'
|
108
|
+
CouchPotato::Persistence::Finder.new.count(Comment, :commenter_id => '1').should == 1
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should not count instances of other classes" do
|
112
|
+
OtherComment.create! :commenter_id => '1'
|
113
|
+
CouchPotato::Persistence::Finder.new.count(Comment, :commenter_id => '1').should == 0
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe 'has_many stored inline' do
|
4
|
+
before(:each) do
|
5
|
+
@user = User.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should build child objects" do
|
9
|
+
@user.comments.build(:title => 'my title')
|
10
|
+
@user.comments.first.class.should == Comment
|
11
|
+
@user.comments.first.title.should == 'my title'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should add child objects" do
|
15
|
+
@user.comments << Comment.new(:title => 'my title')
|
16
|
+
@user.comments.first.class.should == Comment
|
17
|
+
@user.comments.first.title.should == 'my title'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should persist child objects" do
|
21
|
+
@user.comments.build(:title => 'my title')
|
22
|
+
@user.save!
|
23
|
+
@user = User.find @user._id
|
24
|
+
@user.comments.first.class.should == Comment
|
25
|
+
@user.comments.first.title.should == 'my title'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'has_many stored separately' do
|
30
|
+
before(:each) do
|
31
|
+
@commenter = Commenter.new
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should build child objects" do
|
35
|
+
@commenter.comments.build(:title => 'my title')
|
36
|
+
@commenter.comments.first.class.should == Comment
|
37
|
+
@commenter.comments.first.title.should == 'my title'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should create child objects" do
|
41
|
+
@commenter.save!
|
42
|
+
@commenter.comments.create(:title => 'my title')
|
43
|
+
@commenter = Commenter.find @commenter._id
|
44
|
+
@commenter.comments.first.class.should == Comment
|
45
|
+
@commenter.comments.first.title.should == 'my title'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should create! child objects" do
|
49
|
+
@commenter.save!
|
50
|
+
@commenter.comments.create!(:title => 'my title')
|
51
|
+
@commenter = Commenter.find @commenter._id
|
52
|
+
@commenter.comments.first.class.should == Comment
|
53
|
+
@commenter.comments.first.title.should == 'my title'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should add child objects" do
|
57
|
+
@commenter.comments << Comment.new(:title => 'my title')
|
58
|
+
@commenter.comments.first.class.should == Comment
|
59
|
+
@commenter.comments.first.title.should == 'my title'
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "create" do
|
63
|
+
it "should persist child objects" do
|
64
|
+
@commenter.comments.build(:title => 'my title')
|
65
|
+
@commenter.save!
|
66
|
+
@commenter = Commenter.find @commenter._id
|
67
|
+
@commenter.comments.first.class.should == Comment
|
68
|
+
@commenter.comments.first.title.should == 'my title'
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should set the _id in child objects" do
|
72
|
+
@commenter.comments.build(:title => 'my title')
|
73
|
+
@commenter.save!
|
74
|
+
@commenter.comments.first._id.should_not be_nil
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should set the _rev in child objects" do
|
78
|
+
@commenter.comments.build(:title => 'my title')
|
79
|
+
@commenter.save!
|
80
|
+
@commenter.comments.first._rev.should_not be_nil
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should set updated_at in child objects" do
|
84
|
+
@commenter.comments.build(:title => 'my title')
|
85
|
+
@commenter.save!
|
86
|
+
@commenter.comments.first.updated_at.should_not be_nil
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should set created_at in child objects" do
|
90
|
+
@commenter.comments.build(:title => 'my title')
|
91
|
+
@commenter.save!
|
92
|
+
@commenter.comments.first.created_at.should_not be_nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "update" do
|
97
|
+
it "should persist child objects" do
|
98
|
+
comment = @commenter.comments.build(:title => 'my title')
|
99
|
+
@commenter.save!
|
100
|
+
comment.title = 'new title'
|
101
|
+
@commenter.save!
|
102
|
+
@commenter = Commenter.find @commenter._id
|
103
|
+
@commenter.comments.first.title.should == 'new title'
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should set the _rev in child objects" do
|
107
|
+
comment = @commenter.comments.build(:title => 'my title')
|
108
|
+
@commenter.save!
|
109
|
+
old_rev = comment._rev
|
110
|
+
comment.title = 'new title'
|
111
|
+
@commenter.save!
|
112
|
+
@commenter.comments.first._rev.should_not == old_rev
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should set updated_at in child objects" do
|
116
|
+
comment = @commenter.comments.build(:title => 'my title')
|
117
|
+
@commenter.save!
|
118
|
+
old_updated_at = comment.updated_at
|
119
|
+
comment.title = 'new title'
|
120
|
+
@commenter.save!
|
121
|
+
@commenter.comments.first.updated_at.should > old_updated_at
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
describe "destroy" do
|
127
|
+
|
128
|
+
class AdminComment
|
129
|
+
include CouchPotato::Persistence
|
130
|
+
belongs_to :admin
|
131
|
+
end
|
132
|
+
|
133
|
+
class AdminFriend
|
134
|
+
include CouchPotato::Persistence
|
135
|
+
belongs_to :admin
|
136
|
+
end
|
137
|
+
|
138
|
+
class Admin
|
139
|
+
include CouchPotato::Persistence
|
140
|
+
has_many :admin_comments, :stored => :separately, :dependent => :destroy
|
141
|
+
has_many :admin_friends, :stored => :separately
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should destroy all dependent objects" do
|
145
|
+
admin = Admin.create!
|
146
|
+
comment = admin.admin_comments.create!
|
147
|
+
id = comment._id
|
148
|
+
admin.destroy
|
149
|
+
lambda {
|
150
|
+
CouchPotato::Persistence.Db.get(id).should
|
151
|
+
}.should raise_error(RestClient::ResourceNotFound)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should unset _id in dependent objects" do
|
155
|
+
admin = Admin.create!
|
156
|
+
comment = admin.admin_comments.create!
|
157
|
+
id = comment._id
|
158
|
+
admin.destroy
|
159
|
+
comment._id.should be_nil
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should unset _rev in dependent objects" do
|
163
|
+
admin = Admin.create!
|
164
|
+
comment = admin.admin_comments.create!
|
165
|
+
id = comment._id
|
166
|
+
admin.destroy
|
167
|
+
comment._rev.should be_nil
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should nullify independent objects" do
|
171
|
+
admin = Admin.create!
|
172
|
+
friend = admin.admin_friends.create!
|
173
|
+
id = friend._id
|
174
|
+
admin.destroy
|
175
|
+
AdminFriend.get(id).admin.should be_nil
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe CouchPotato::Persistence::InlineCollection do
|
4
|
+
it "should build elements with the item class" do
|
5
|
+
collection = CouchPotato::Persistence::InlineCollection.new Comment
|
6
|
+
collection.build :title => 'mytitle'
|
7
|
+
collection[0].class.should == Comment
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should build elements with the given attributes" do
|
11
|
+
collection = CouchPotato::Persistence::InlineCollection.new Comment
|
12
|
+
collection.build :title => 'mytitle'
|
13
|
+
collection[0].title.should == 'mytitle'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe CouchPotato::Ordering do
|
5
|
+
|
6
|
+
class Album
|
7
|
+
include CouchPotato::Persistence
|
8
|
+
has_many :photos
|
9
|
+
end
|
10
|
+
|
11
|
+
class Photo
|
12
|
+
include CouchPotato::Persistence
|
13
|
+
include CouchPotato::Ordering
|
14
|
+
set_ordering_scope :album_id
|
15
|
+
belongs_to :album
|
16
|
+
end
|
17
|
+
|
18
|
+
before(:each) do
|
19
|
+
CouchPotato::Persistence.Db.delete!
|
20
|
+
@album = Album.create!
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "create" do
|
24
|
+
it "should add a position" do
|
25
|
+
photo = @album.photos.create!
|
26
|
+
photo.position.should == 1
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should increase the position when adding a second item" do
|
30
|
+
@album.photos.create!
|
31
|
+
photo = @album.photos.create!
|
32
|
+
photo.position.should == 2
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'insert' do
|
37
|
+
it "should increse the position of the items that are now lower than this" do
|
38
|
+
photo1 = @album.photos.create!
|
39
|
+
photo2 = @album.photos.create! :position => 1
|
40
|
+
CouchPotato::Persistence.Db.get(photo1._id)['position'].should == 2
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "decrease position" do
|
45
|
+
it "should increase the position of the items that are now lower than this" do
|
46
|
+
photo1 = @album.photos.create!
|
47
|
+
photo2 = @album.photos.create!
|
48
|
+
photo2.position = 1
|
49
|
+
photo2.save!
|
50
|
+
CouchPotato::Persistence.Db.get(photo1._id)['position'].should == 2
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "increase position" do
|
55
|
+
it "should decrease the position of the items that are now higher than this" do
|
56
|
+
photo1 = @album.photos.create!
|
57
|
+
photo2 = @album.photos.create!
|
58
|
+
photo1.position = 2
|
59
|
+
photo1.save!
|
60
|
+
CouchPotato::Persistence.Db.get(photo2._id)['position'].should == 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should order by position" do
|
65
|
+
@album.photos.create!
|
66
|
+
@album.photos.create! :position => 1
|
67
|
+
@album = Album.get @album._id
|
68
|
+
@album.photos.map(&:position).should == [1,2]
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "destroy" do
|
72
|
+
it "should decrease the position of the lower items" do
|
73
|
+
photo1 = @album.photos.create!
|
74
|
+
photo2 = @album.photos.create!
|
75
|
+
photo1.destroy
|
76
|
+
CouchPotato::Persistence.Db.get(photo2._id)['position'].should == 1
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "scoping" do
|
81
|
+
it "should only update objects within the scope" do
|
82
|
+
photo1 = @album.photos.create!
|
83
|
+
photo2 = @album.photos.create!
|
84
|
+
album2 = Album.create!
|
85
|
+
album2.photos.create!
|
86
|
+
|
87
|
+
photo2.position = 1
|
88
|
+
photo2.save!
|
89
|
+
|
90
|
+
album2.photos.first.position.should == 1
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe 'properties' do
|
4
|
+
it "should return the property names" do
|
5
|
+
Comment.property_names.should == [:title, :commenter]
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should persist a string" do
|
9
|
+
c = Comment.new :title => 'my title'
|
10
|
+
c.save!
|
11
|
+
c = Comment.find c.id
|
12
|
+
c.title.should == 'my title'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should persist a number" do
|
16
|
+
c = Comment.new :title => 3
|
17
|
+
c.save!
|
18
|
+
c = Comment.find c.id
|
19
|
+
c.title.should == 3
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should persist a hash" do
|
23
|
+
c = Comment.new :title => {'key' => 'value'}
|
24
|
+
c.save!
|
25
|
+
c = Comment.find c.id
|
26
|
+
c.title.should == {'key' => 'value'}
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "predicate" do
|
30
|
+
it "should return true if property set" do
|
31
|
+
Comment.new(:title => 'title').title?.should be_true
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return false if property nil" do
|
35
|
+
Comment.new.title?.should be_false
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return false if property false" do
|
39
|
+
Comment.new(:title => false).title?.should be_false
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return false if property blank" do
|
43
|
+
Comment.new(:title => '').title?.should be_false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/spec/reload_spec.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe 'reload' do
|
4
|
+
class Table
|
5
|
+
include CouchPotato::Persistence
|
6
|
+
property :rows
|
7
|
+
has_many :cols, :stored => :inline
|
8
|
+
has_many :ext_cols, :stored => :separately
|
9
|
+
end
|
10
|
+
|
11
|
+
class ExtCol
|
12
|
+
include CouchPotato::Persistence
|
13
|
+
belongs_to :table
|
14
|
+
property :name
|
15
|
+
end
|
16
|
+
|
17
|
+
class Col
|
18
|
+
include CouchPotato::Persistence
|
19
|
+
property :name
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should reload simple properties" do
|
23
|
+
table = Table.create! :rows => 3
|
24
|
+
table.rows = 4
|
25
|
+
table.reload
|
26
|
+
table.rows.should == 3
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should reload inline has_many associations" do
|
30
|
+
table = Table.new
|
31
|
+
table.cols.build :name => 'col1'
|
32
|
+
table.save!
|
33
|
+
table.cols.build :name => 'col2'
|
34
|
+
table.reload
|
35
|
+
table.cols.size.should == 1
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should reload external has_many associations" do
|
39
|
+
table = Table.new
|
40
|
+
table.ext_cols.build :name => 'col1'
|
41
|
+
table.save!
|
42
|
+
table.ext_cols.build :name => 'col2'
|
43
|
+
table.reload
|
44
|
+
table.ext_cols.size.should == 1
|
45
|
+
end
|
46
|
+
end
|
data/spec/spec.opts
ADDED