couchobject 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -0
- data/Manifest.txt +30 -6
- data/README.txt +580 -42
- data/TODO +2 -2
- data/config/hoe.rb +1 -1
- data/lib/couch_object.rb +7 -2
- data/lib/couch_object/database.rb +19 -34
- data/lib/couch_object/document.rb +13 -6
- data/lib/couch_object/error_classes.rb +110 -0
- data/lib/couch_object/persistable.rb +954 -36
- data/lib/couch_object/persistable/has_many_relations_array.rb +91 -0
- data/lib/couch_object/persistable/meta_classes.rb +568 -0
- data/lib/couch_object/persistable/overloaded_methods.rb +209 -0
- data/lib/couch_object/server.rb +1 -1
- data/lib/couch_object/utils.rb +44 -0
- data/lib/couch_object/version.rb +1 -1
- data/lib/couch_object/view.rb +129 -6
- data/script/console +0 -0
- data/script/destroy +0 -0
- data/script/generate +0 -0
- data/script/txt2html +0 -0
- data/spec/database_spec.rb +23 -31
- data/spec/database_spec.rb.orig +173 -0
- data/spec/document_spec.rb +21 -3
- data/spec/integration/database_integration_spec.rb +46 -15
- data/spec/integration/integration_helper.rb +3 -3
- data/spec/persistable/callback.rb +44 -0
- data/spec/persistable/callback_spec.rb +44 -0
- data/spec/persistable/cloning.rb +77 -0
- data/spec/persistable/cloning_spec.rb +77 -0
- data/spec/persistable/comparing_objects.rb +350 -0
- data/spec/persistable/comparing_objects_spec.rb +350 -0
- data/spec/persistable/deleting.rb +113 -0
- data/spec/persistable/deleting_spec.rb +113 -0
- data/spec/persistable/error_messages.rb +32 -0
- data/spec/persistable/error_messages_spec.rb +32 -0
- data/spec/persistable/loading.rb +339 -0
- data/spec/persistable/loading_spec.rb +339 -0
- data/spec/persistable/new_methods.rb +70 -0
- data/spec/persistable/new_methods_spec.rb +70 -0
- data/spec/persistable/persistable_helper.rb +194 -0
- data/spec/persistable/relations.rb +470 -0
- data/spec/persistable/relations_spec.rb +470 -0
- data/spec/persistable/saving.rb +137 -0
- data/spec/persistable/saving_spec.rb +137 -0
- data/spec/persistable/setting_storage_location.rb +65 -0
- data/spec/persistable/setting_storage_location_spec.rb +65 -0
- data/spec/persistable/timestamps.rb +76 -0
- data/spec/persistable/timestamps_spec.rb +76 -0
- data/spec/persistable/unsaved_changes.rb +211 -0
- data/spec/persistable/unsaved_changes_spec.rb +211 -0
- data/spec/server_spec.rb +5 -5
- data/spec/utils_spec.rb +60 -0
- data/spec/view_spec.rb +40 -7
- data/website/index.html +22 -7
- data/website/index.txt +13 -5
- metadata +93 -61
- data/bin/couch_ruby_view_requestor +0 -81
- data/lib/couch_object/model.rb +0 -5
- data/lib/couch_object/proc_condition.rb +0 -14
- data/spec/model_spec.rb +0 -5
- data/spec/persistable_spec.rb +0 -91
- data/spec/proc_condition_spec.rb +0 -26
@@ -0,0 +1,173 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe CouchObject::Database do
|
4
|
+
before(:each) do
|
5
|
+
@server = mock("Couch server")
|
6
|
+
@uri = "http://localhost:8888"
|
7
|
+
@response = mock("Net::HTTP::Response")
|
8
|
+
CouchObject::Server.should_receive(:new).with(@uri).and_return(@server)
|
9
|
+
@response.stub!(:code).and_return(200)
|
10
|
+
@response.stub!(:body).and_return("[\"db1\", \"db2\"]")
|
11
|
+
@document_response = {
|
12
|
+
"_id" => "123BAC",
|
13
|
+
"_rev" => "946B7D1C",
|
14
|
+
"attributes" => {
|
15
|
+
"wheels" => 3
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a database" do
|
21
|
+
@server.should_receive(:put).with("/foo", "").and_return(@response)
|
22
|
+
CouchObject::Database.create(@uri, "foo")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should delete a database" do
|
26
|
+
@server.should_receive(:delete).with("/foo").and_return(@response)
|
27
|
+
CouchObject::Database.delete!(@uri, "foo")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should get all databases" do
|
31
|
+
@server.should_receive(:get).with("/_all_dbs").and_return(@response)
|
32
|
+
CouchObject::Database.all_databases(@uri)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should return all databases as an array" do
|
36
|
+
@server.should_receive(:get).with("/_all_dbs").and_return(@response)
|
37
|
+
dbs = CouchObject::Database.all_databases(@uri)
|
38
|
+
dbs.should == ["db1", "db2"]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should open a connection to the server" do
|
42
|
+
db = CouchObject::Database.new(@uri, "foo")
|
43
|
+
db.server.should == @server
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should have a name" do
|
47
|
+
db = CouchObject::Database.new(@uri, "foo")
|
48
|
+
db.name.should == "foo"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should lint the database name from slashes with ::open" do
|
52
|
+
db = CouchObject::Database.open("http://localhost:8888/foo")
|
53
|
+
class << db
|
54
|
+
attr_accessor :dbname
|
55
|
+
end
|
56
|
+
db.dbname.should == "foo"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should GET" do
|
60
|
+
db = CouchObject::Database.new(@uri, "foo")
|
61
|
+
@server.should_receive(:get).with("/foo/123").and_return(@response)
|
62
|
+
db.get("123")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should POST" do
|
66
|
+
db = CouchObject::Database.new(@uri, "foo")
|
67
|
+
@server.should_receive(:post).with("/foo/123", "postdata").and_return(@response)
|
68
|
+
db.post("123", "postdata")
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should PUT" do
|
72
|
+
db = CouchObject::Database.new(@uri, "foo")
|
73
|
+
@server.should_receive(:put).with("/foo/123", "postdata").and_return(@response)
|
74
|
+
db.put("123", "postdata")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should DELETE" do
|
78
|
+
db = CouchObject::Database.new(@uri, "foo")
|
79
|
+
@server.should_receive(:delete).with("/foo/123").and_return(@response)
|
80
|
+
db.delete("123")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should open a new connection from a full uri spec" do
|
84
|
+
proc{ CouchObject::Database.open("http://localhost:8888/foo") }.should_not raise_error
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should know the database name" do
|
88
|
+
db = CouchObject::Database.new(@uri, "foo")
|
89
|
+
db.name.should == "foo"
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should know the full uri" do
|
93
|
+
db = CouchObject::Database.new(@uri, "foo")
|
94
|
+
db.url.should == "http://localhost:8888/foo"
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should load a document from id with #[]" do
|
98
|
+
db = CouchObject::Database.new(@uri, "foo")
|
99
|
+
db.should_receive(:get).with("123").twice.and_return(@document_response)
|
100
|
+
proc{ db["123"] }.should_not raise_error
|
101
|
+
db["123"].should == @document_response
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should accept symbols for #[] too" do
|
105
|
+
db = CouchObject::Database.new(@uri, "foo")
|
106
|
+
db.should_receive(:get).with("foo").and_return(@document_response)
|
107
|
+
db[:foo]
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should get a document by id" do
|
111
|
+
db = CouchObject::Database.new(@uri, "foo")
|
112
|
+
db.should_receive(:get).with("foo").twice.and_return(@document_response)
|
113
|
+
proc{ db.document("foo") }.should_not raise_error
|
114
|
+
db.document("foo").should == @document_response
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should get a document by id and revision" do
|
118
|
+
db = CouchObject::Database.new(@uri, "foo")
|
119
|
+
db.should_receive(:get).with("foo?rev=123").twice.and_return(@document_response)
|
120
|
+
proc{ db.document("foo", "123") }.should_not raise_error
|
121
|
+
db.document("foo", "123").should == @document_response
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should query the view" do
|
125
|
+
db = CouchObject::Database.new(@uri, "foo")
|
126
|
+
CouchObject::View.should_receive(:new).with(db, "myview").and_return(view = mock("View mock"))
|
127
|
+
view.should_receive(:query).and_return(nil)
|
128
|
+
db.views("myview")
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should get a list of all documents" do
|
132
|
+
db = CouchObject::Database.new(@uri, "foo")
|
133
|
+
resp = mock("response")
|
134
|
+
resp.stub!(:body).and_return(JSON.unparse("rows" => [{"_rev"=>123, "_id"=>"123ABC"}]))
|
135
|
+
resp.stub!(:to_document).and_return(
|
136
|
+
CouchObject::Document.new("rows" => [{"_rev"=>123, "_id"=>"123ABC"}])
|
137
|
+
)
|
138
|
+
db.should_receive(:get).with("_all_docs").and_return(resp)
|
139
|
+
db.all_documents.should == [{"_rev"=>123, "_id"=>"123ABC"}]
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should store a document" do
|
143
|
+
db = CouchObject::Database.new(@uri, "foo")
|
144
|
+
doc = CouchObject::Document.new({"foo" => "bar"})
|
145
|
+
db.should_receive(:post).with("", JSON.unparse("foo" => "bar"))
|
146
|
+
db.store(doc)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should return the rows when filtering" do
|
150
|
+
db = CouchObject::Database.new(@uri, "foo")
|
151
|
+
rowdata = { "_rev"=>1,
|
152
|
+
"_id"=>"1",
|
153
|
+
"value"=> {
|
154
|
+
"_id"=>"1",
|
155
|
+
"_rev"=>1,
|
156
|
+
"foo"=>"bar"
|
157
|
+
}
|
158
|
+
}
|
159
|
+
resp = mock("response")
|
160
|
+
resp.stub!(:body).and_return(JSON.unparse("rows" => [rowdata]))
|
161
|
+
resp.stub!(:parse).and_return(resp)
|
162
|
+
resp.stub!(:to_document).and_return(
|
163
|
+
CouchObject::Document.new("rows" => [rowdata])
|
164
|
+
)
|
165
|
+
db.should_receive(:post).with(
|
166
|
+
"_temp_view", "proc { |doc|\n (doc[\"foo\"] == \"bar\")\n}").and_return(resp)
|
167
|
+
rows = db.filter{|doc| doc["foo"] == "bar"}
|
168
|
+
rows.size.should == 1
|
169
|
+
rows.first["value"]["foo"].should == "bar"
|
170
|
+
end
|
171
|
+
|
172
|
+
#it "should url encode paths"
|
173
|
+
end
|
data/spec/document_spec.rb
CHANGED
@@ -10,10 +10,14 @@ describe CouchObject::Document do
|
|
10
10
|
"foo" => "bar",
|
11
11
|
"baz" => {"quux" => [1,2,3]},
|
12
12
|
}
|
13
|
+
|
13
14
|
@response = mock("Response mock")
|
14
15
|
@response.stub!(:code).and_return(200)
|
15
16
|
@response.stub!(:body).and_return("")
|
16
17
|
@response.stub!(:to_document).and_return(CouchObject::Document.new(@test_data))
|
18
|
+
|
19
|
+
@db.stub!(:post).and_return(@response)
|
20
|
+
@db.stub!(:put).and_return(@response)
|
17
21
|
end
|
18
22
|
|
19
23
|
it "should initialize with a bunch of attributes" do
|
@@ -71,11 +75,25 @@ describe CouchObject::Document do
|
|
71
75
|
doc.save(@db)
|
72
76
|
end
|
73
77
|
|
78
|
+
it "should set id and rev on create with POST" do
|
79
|
+
doc = CouchObject::Document.new({"foo" => "bar"})
|
80
|
+
doc.save(@db)
|
81
|
+
doc.id.should == '123'
|
82
|
+
doc.revision.should == '666'
|
83
|
+
end
|
84
|
+
|
74
85
|
it "should PUT to the database with create" do
|
75
|
-
doc = CouchObject::Document.new(
|
76
|
-
doc.should_receive(:to_json).and_return("JSON")
|
77
|
-
@db.should_receive(:put).with(
|
86
|
+
doc = CouchObject::Document.new({"foo" => "bar", "_id" => "quux"})
|
87
|
+
doc.should_receive(:to_json).with(no_args).and_return("JSON")
|
88
|
+
@db.should_receive(:put).with("quux", "JSON").and_return(@response)
|
89
|
+
doc.save(@db)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should set id and rev on save with PUT" do
|
93
|
+
doc = CouchObject::Document.new({"foo" => "bar", "_id" => "quux"})
|
78
94
|
doc.save(@db)
|
95
|
+
doc.id.should == '123'
|
96
|
+
doc.revision.should == '666'
|
79
97
|
end
|
80
98
|
|
81
99
|
it "should send the current revision along when updating a doc" do
|
@@ -9,7 +9,7 @@ describe "Database operations" do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should create a database " do
|
12
|
-
all_dbs = proc{ CouchObject::Database.all_databases("http://localhost:
|
12
|
+
all_dbs = proc{ CouchObject::Database.all_databases("http://localhost:5984") }
|
13
13
|
all_dbs.call.include?("couchobject_test").should == false
|
14
14
|
|
15
15
|
create_test_db.should == {"ok" => true}
|
@@ -18,12 +18,12 @@ describe "Database operations" do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should delete a database" do
|
21
|
-
all_dbs = proc{ CouchObject::Database.all_databases("http://localhost:
|
21
|
+
all_dbs = proc{ CouchObject::Database.all_databases("http://localhost:5984") }
|
22
22
|
all_dbs.call.include?("couchobject_test").should == false
|
23
23
|
|
24
24
|
create_test_db.should == {"ok" => true}
|
25
25
|
CouchObject::Database.delete!(
|
26
|
-
"http://localhost:
|
26
|
+
"http://localhost:5984",
|
27
27
|
"couchobject_test"
|
28
28
|
).should == {"ok" => true}
|
29
29
|
|
@@ -33,7 +33,7 @@ describe "Database operations" do
|
|
33
33
|
it "should open a db connection and know the dbname and uri" do
|
34
34
|
db = open_test_db
|
35
35
|
db.name.should == "couchobject_test"
|
36
|
-
db.url.should == "http://localhost:
|
36
|
+
db.url.should == "http://localhost:5984/couchobject_test"
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should GET a non existing document and return 404" do
|
@@ -68,24 +68,55 @@ describe "Database operations" do
|
|
68
68
|
response = db.post("", JSON.unparse({"foo" => ["bar", "baz"]}))
|
69
69
|
created_doc = response.to_document
|
70
70
|
|
71
|
-
resp = db.delete(created_doc.id)
|
71
|
+
resp = db.delete(created_doc.id, created_doc.revision)
|
72
72
|
resp.code.should == 202
|
73
73
|
|
74
74
|
resp = db.get(created_doc.id)
|
75
75
|
resp.code.should == 404
|
76
76
|
end
|
77
77
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
describe "A Database and some UT8" do
|
82
|
+
include IntegrationSpecHelper
|
83
|
+
# Translated form couch_test.js
|
84
|
+
|
85
|
+
before(:each) do
|
86
|
+
delete_test_db
|
87
|
+
end
|
88
|
+
|
89
|
+
def do_check_text(db, text)
|
90
|
+
resp = db.post("", JSON.unparse("text" => text))
|
91
|
+
resp.code.should == 201
|
88
92
|
|
93
|
+
r = db.get(resp.to_document.id)
|
94
|
+
r.code.should == 200
|
95
|
+
r.to_document.text.should == text
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should deal with plain ascii nicely" do
|
99
|
+
db = create_and_open_test_db
|
100
|
+
do_check_text(db, "Ascii: hello")
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should deal with Russian cyrillic" do
|
104
|
+
db = create_and_open_test_db
|
105
|
+
do_check_text(db, "Russian: На берегу пустынных волн")
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should deal withn Math expressions" do
|
109
|
+
db = create_and_open_test_db
|
110
|
+
do_check_text(db, "Math: ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i),")
|
89
111
|
end
|
90
112
|
|
113
|
+
it "should deal with Greek" do
|
114
|
+
db = create_and_open_test_db
|
115
|
+
do_check_text(db, "Geek: STARGΛ̊TE SG-1")
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should braille" do
|
119
|
+
db = create_and_open_test_db
|
120
|
+
do_check_text(db, "Braille: ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌")
|
121
|
+
end
|
91
122
|
end
|
@@ -2,15 +2,15 @@ require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
2
|
|
3
3
|
module IntegrationSpecHelper
|
4
4
|
def create_test_db(name="couchobject_test")
|
5
|
-
CouchObject::Database.create
|
5
|
+
CouchObject::Database.create("http://localhost:5984", name)
|
6
6
|
end
|
7
7
|
|
8
8
|
def open_test_db(name="couchobject_test")
|
9
|
-
CouchObject::Database.open("http://localhost:
|
9
|
+
CouchObject::Database.open("http://localhost:5984/#{name}")
|
10
10
|
end
|
11
11
|
|
12
12
|
def delete_test_db(name="couchobject_test")
|
13
|
-
CouchObject::Database.delete!("http://localhost:
|
13
|
+
CouchObject::Database.delete!("http://localhost:5984", "couchobject_test")
|
14
14
|
end
|
15
15
|
|
16
16
|
def create_and_open_test_db(name="couchobject_test")
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/persistable_helper.rb'
|
2
|
+
|
3
|
+
describe CouchObject::Persistable, "behaviour related to cloning and copying:" do
|
4
|
+
before(:each) do
|
5
|
+
@db = mock("mock db")
|
6
|
+
|
7
|
+
content = HTTPResponse.new(JSON.unparse({
|
8
|
+
"_id" => "123BAC",
|
9
|
+
"_rev" => "946B7D1C",
|
10
|
+
"class" => WithCallbacks,
|
11
|
+
"created_at" => Time.new,
|
12
|
+
"updated_at" => Time.new,
|
13
|
+
"attributes" => {}
|
14
|
+
}))
|
15
|
+
|
16
|
+
@empty_response = {}
|
17
|
+
@ok_response = {"ok" => true}
|
18
|
+
@document_response = CouchObject::Response.new(content)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "all callback should be called" do
|
22
|
+
CouchObject::Database.should_receive(:open).exactly(3).and_return(@db)
|
23
|
+
@db.should_receive(:post).and_return(@document_response)
|
24
|
+
@db.should_receive(:put).and_return(@document_response)
|
25
|
+
@db.should_receive(:delete).and_return(@document_response)
|
26
|
+
|
27
|
+
wc = WithCallbacks.new
|
28
|
+
wc.save
|
29
|
+
wc.save
|
30
|
+
wc.delete
|
31
|
+
|
32
|
+
wc.calls.should == ["before_save",
|
33
|
+
"before_create",
|
34
|
+
"after_create",
|
35
|
+
"after_save",
|
36
|
+
"before_save",
|
37
|
+
"before_update",
|
38
|
+
"after_update",
|
39
|
+
"after_save",
|
40
|
+
"before_delete",
|
41
|
+
"after_delete"]
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/persistable_helper.rb'
|
2
|
+
|
3
|
+
describe CouchObject::Persistable, "behaviour related to cloning and copying:" do
|
4
|
+
before(:each) do
|
5
|
+
@db = mock("mock db")
|
6
|
+
|
7
|
+
content = HTTPResponse.new(JSON.unparse({
|
8
|
+
"_id" => "123BAC",
|
9
|
+
"_rev" => "946B7D1C",
|
10
|
+
"class" => WithCallbacks,
|
11
|
+
"created_at" => Time.new,
|
12
|
+
"updated_at" => Time.new,
|
13
|
+
"attributes" => {}
|
14
|
+
}))
|
15
|
+
|
16
|
+
@empty_response = {}
|
17
|
+
@ok_response = {"ok" => true}
|
18
|
+
@document_response = CouchObject::Response.new(content)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "all callback should be called" do
|
22
|
+
CouchObject::Database.should_receive(:open).exactly(3).and_return(@db)
|
23
|
+
@db.should_receive(:post).and_return(@document_response)
|
24
|
+
@db.should_receive(:put).and_return(@document_response)
|
25
|
+
@db.should_receive(:delete).and_return(@document_response)
|
26
|
+
|
27
|
+
wc = WithCallbacks.new
|
28
|
+
wc.save
|
29
|
+
wc.save
|
30
|
+
wc.delete
|
31
|
+
|
32
|
+
wc.calls.should == ["before_save",
|
33
|
+
"before_create",
|
34
|
+
"after_create",
|
35
|
+
"after_save",
|
36
|
+
"before_save",
|
37
|
+
"before_update",
|
38
|
+
"after_update",
|
39
|
+
"after_save",
|
40
|
+
"before_delete",
|
41
|
+
"after_delete"]
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/persistable_helper.rb'
|
2
|
+
|
3
|
+
describe CouchObject::Persistable, "behaviour related to cloning and copying:" do
|
4
|
+
before(:each) do
|
5
|
+
@bike = Bike.new
|
6
|
+
|
7
|
+
@db = mock("mock db")
|
8
|
+
|
9
|
+
content = HTTPResponse.new(JSON.unparse({
|
10
|
+
"_id" => "123BAC",
|
11
|
+
"_rev" => "946B7D1C",
|
12
|
+
"created_at" => Time.new,
|
13
|
+
"updated_at" => Time.new,
|
14
|
+
"attributes" => {
|
15
|
+
"wheels" => 3
|
16
|
+
}
|
17
|
+
}))
|
18
|
+
|
19
|
+
@empty_response = {}
|
20
|
+
@ok_response = {"ok" => true}
|
21
|
+
@document_response = CouchObject::Response.new(content)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "clones and dupes should not have an ID and a revision number" do
|
25
|
+
CouchObject::Database.should_receive(:open).and_return(@db)
|
26
|
+
@db.should_receive(:post).
|
27
|
+
with("", @bike.to_json).and_return(@document_response)
|
28
|
+
@bike.set_location = "foo"
|
29
|
+
@bike.save
|
30
|
+
|
31
|
+
new_bike = @bike.clone
|
32
|
+
second_new_bike = @bike.dup
|
33
|
+
|
34
|
+
# clone
|
35
|
+
new_bike.id.should_not == @bike.id
|
36
|
+
new_bike.revision.should_not == @bike.revision
|
37
|
+
|
38
|
+
# dup
|
39
|
+
second_new_bike.id.should_not == @bike.id
|
40
|
+
second_new_bike.revision.should_not == @bike.revision
|
41
|
+
end
|
42
|
+
|
43
|
+
it "clones and dupes should share the same location" do
|
44
|
+
CouchObject::Database.should_receive(:open).and_return(@db)
|
45
|
+
@db.should_receive(:post).
|
46
|
+
with("", @bike.to_json).and_return(@document_response)
|
47
|
+
@bike.set_location = "foo"
|
48
|
+
@bike.save
|
49
|
+
|
50
|
+
new_bike = @bike.clone
|
51
|
+
second_new_bike = @bike.dup
|
52
|
+
|
53
|
+
# clone
|
54
|
+
new_bike.location.should == @bike.location
|
55
|
+
|
56
|
+
# dup
|
57
|
+
second_new_bike.location.should == @bike.location
|
58
|
+
end
|
59
|
+
|
60
|
+
it "clones should share attributes" do
|
61
|
+
CouchObject::Database.should_receive(:open).and_return(@db)
|
62
|
+
@db.should_receive(:post).
|
63
|
+
with("", @bike.to_json).and_return(@document_response)
|
64
|
+
@bike.set_location = "foo"
|
65
|
+
@bike.save
|
66
|
+
|
67
|
+
new_bike = @bike.clone
|
68
|
+
second_new_bike = @bike.dup
|
69
|
+
|
70
|
+
# clone
|
71
|
+
new_bike.wheels.should == @bike.wheels
|
72
|
+
|
73
|
+
# dup
|
74
|
+
second_new_bike.wheels.should == @bike.wheels
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|