ripple 0.6.1 → 0.7.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/Rakefile +61 -48
- data/lib/ripple.rb +5 -1
- data/lib/ripple/core_ext/casting.rb +3 -0
- data/lib/ripple/document.rb +6 -2
- data/lib/ripple/document/associations.rb +154 -0
- data/lib/ripple/document/{persistence/callbacks.rb → associations/embedded.rb} +20 -24
- data/lib/ripple/document/associations/instantiators.rb +41 -0
- data/lib/{riak/util/translation.rb → ripple/document/associations/linked.rb} +14 -11
- data/lib/ripple/document/associations/many.rb +52 -0
- data/lib/ripple/document/associations/many_embedded_proxy.rb +49 -0
- data/lib/{riak/i18n.rb → ripple/document/associations/one.rb} +18 -2
- data/lib/ripple/document/associations/one_embedded_proxy.rb +41 -0
- data/lib/ripple/document/associations/proxy.rb +125 -0
- data/lib/ripple/document/attribute_methods.rb +8 -1
- data/lib/ripple/document/attribute_methods/read.rb +4 -0
- data/lib/ripple/document/attribute_methods/write.rb +4 -0
- data/lib/ripple/document/bucket_access.rb +1 -1
- data/lib/ripple/document/callbacks.rb +75 -0
- data/lib/ripple/document/finders.rb +50 -3
- data/lib/ripple/document/persistence.rb +14 -6
- data/lib/ripple/document/validations.rb +35 -7
- data/lib/ripple/document/validations/associated_validator.rb +37 -0
- data/lib/ripple/embedded_document.rb +8 -2
- data/lib/{riak/map_reduce_error.rb → ripple/embedded_document/conversion.rb} +19 -5
- data/lib/{riak/invalid_response.rb → ripple/embedded_document/finders.rb} +17 -8
- data/lib/ripple/embedded_document/persistence.rb +75 -13
- data/lib/ripple/locale/en.yml +7 -1
- data/{spec/riak/net_http_backend_spec.rb → lib/ripple/railtie.rb} +17 -13
- data/spec/fixtures/config.yml +3 -0
- data/spec/integration/ripple/associations_spec.rb +81 -0
- data/spec/integration/ripple/persistence_spec.rb +54 -0
- data/spec/ripple/associations/many_embedded_proxy_spec.rb +124 -0
- data/spec/ripple/associations/one_embedded_proxy_spec.rb +130 -0
- data/spec/ripple/associations/proxy_spec.rb +78 -0
- data/spec/ripple/associations_spec.rb +111 -0
- data/spec/ripple/attribute_methods_spec.rb +37 -16
- data/spec/ripple/bucket_access_spec.rb +3 -14
- data/spec/ripple/callbacks_spec.rb +53 -9
- data/spec/ripple/document_spec.rb +22 -6
- data/spec/ripple/embedded_document/conversion_spec.rb +35 -0
- data/spec/{riak/headers_spec.rb → ripple/embedded_document/finders_spec.rb} +17 -14
- data/spec/ripple/embedded_document/persistence_spec.rb +86 -0
- data/spec/ripple/embedded_document_spec.rb +1 -26
- data/spec/ripple/finders_spec.rb +66 -30
- data/spec/ripple/persistence_spec.rb +33 -21
- data/spec/ripple/properties_spec.rb +1 -7
- data/spec/ripple/ripple_spec.rb +10 -0
- data/spec/ripple/timestamps_spec.rb +12 -19
- data/spec/ripple/validations_spec.rb +48 -6
- data/spec/spec_helper.rb +4 -10
- data/spec/support/associations/proxies.rb +16 -0
- data/spec/support/integration.rb +4 -0
- data/spec/support/mocks.rb +3 -0
- data/spec/support/models/address.rb +8 -0
- data/spec/support/models/box.rb +6 -0
- data/spec/support/models/cardboard_box.rb +3 -0
- data/spec/support/models/clock.rb +6 -0
- data/spec/support/models/customer.rb +4 -0
- data/spec/support/models/email.rb +4 -0
- data/spec/support/models/family.rb +14 -0
- data/spec/support/models/favorite.rb +4 -0
- data/spec/support/models/invoice.rb +6 -0
- data/spec/support/models/late_invoice.rb +3 -0
- data/spec/support/models/note.rb +4 -0
- data/spec/support/models/page.rb +4 -0
- data/spec/support/models/paid_invoice.rb +4 -0
- data/spec/support/models/tree.rb +3 -0
- data/spec/support/models/user.rb +6 -0
- data/spec/support/models/widget.rb +6 -0
- metadata +111 -138
- data/.document +0 -5
- data/.gitignore +0 -26
- data/CONTRIBUTORS.textile +0 -5
- data/LICENSE +0 -13
- data/README.textile +0 -128
- data/RELEASE_NOTES.textile +0 -68
- data/VERSION +0 -1
- data/lib/riak.rb +0 -46
- data/lib/riak/bucket.rb +0 -157
- data/lib/riak/client.rb +0 -139
- data/lib/riak/client/curb_backend.rb +0 -82
- data/lib/riak/client/http_backend.rb +0 -209
- data/lib/riak/client/net_http_backend.rb +0 -49
- data/lib/riak/failed_request.rb +0 -37
- data/lib/riak/link.rb +0 -73
- data/lib/riak/locale/en.yml +0 -37
- data/lib/riak/map_reduce.rb +0 -248
- data/lib/riak/robject.rb +0 -258
- data/lib/riak/util/escape.rb +0 -12
- data/lib/riak/util/fiber1.8.rb +0 -48
- data/lib/riak/util/headers.rb +0 -44
- data/lib/riak/util/multipart.rb +0 -52
- data/lib/riak/walk_spec.rb +0 -117
- data/ripple.gemspec +0 -169
- data/spec/fixtures/cat.jpg +0 -0
- data/spec/fixtures/multipart-blank.txt +0 -7
- data/spec/fixtures/multipart-with-body.txt +0 -16
- data/spec/riak/bucket_spec.rb +0 -230
- data/spec/riak/client_spec.rb +0 -174
- data/spec/riak/curb_backend_spec.rb +0 -50
- data/spec/riak/escape_spec.rb +0 -17
- data/spec/riak/http_backend_spec.rb +0 -131
- data/spec/riak/link_spec.rb +0 -82
- data/spec/riak/map_reduce_spec.rb +0 -352
- data/spec/riak/multipart_spec.rb +0 -36
- data/spec/riak/object_spec.rb +0 -532
- data/spec/riak/walk_spec_spec.rb +0 -208
- data/spec/spec.opts +0 -1
- data/spec/support/http_backend_implementation_examples.rb +0 -215
- data/spec/support/mock_server.rb +0 -58
|
@@ -14,9 +14,7 @@
|
|
|
14
14
|
require File.expand_path("../../spec_helper", __FILE__)
|
|
15
15
|
|
|
16
16
|
describe Ripple::EmbeddedDocument do
|
|
17
|
-
|
|
18
|
-
Object.module_eval { class Address; include Ripple::EmbeddedDocument; end }
|
|
19
|
-
end
|
|
17
|
+
require 'support/models/address'
|
|
20
18
|
|
|
21
19
|
it "should have a model name when included" do
|
|
22
20
|
Address.should respond_to(:model_name)
|
|
@@ -26,27 +24,4 @@ describe Ripple::EmbeddedDocument do
|
|
|
26
24
|
it "should be embeddable" do
|
|
27
25
|
Address.should be_embeddable
|
|
28
26
|
end
|
|
29
|
-
|
|
30
|
-
describe "persistence" do
|
|
31
|
-
before :each do
|
|
32
|
-
@root = mock("root document")
|
|
33
|
-
@root.stub!(:new?).and_return(true)
|
|
34
|
-
@addr = Address.new
|
|
35
|
-
@addr._root_document = @root
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should delegate new? to the root document" do
|
|
39
|
-
@root.should_receive(:new?).and_return(true)
|
|
40
|
-
@addr.should be_new
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "should delegate save to the root document" do
|
|
44
|
-
@root.should_receive(:save).and_return(true)
|
|
45
|
-
@addr.save.should be_true
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
after :all do
|
|
50
|
-
Object.send(:remove_const, :Address)
|
|
51
|
-
end
|
|
52
27
|
end
|
data/spec/ripple/finders_spec.rb
CHANGED
|
@@ -14,15 +14,9 @@
|
|
|
14
14
|
require File.expand_path("../../spec_helper", __FILE__)
|
|
15
15
|
|
|
16
16
|
describe Ripple::Document::Finders do
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
include Ripple::Document
|
|
21
|
-
property :shape, String
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
17
|
+
require 'support/models/box'
|
|
18
|
+
require 'support/models/cardboard_box'
|
|
19
|
+
|
|
26
20
|
before :each do
|
|
27
21
|
@http = mock("HTTP Backend")
|
|
28
22
|
@client = Ripple.client
|
|
@@ -32,7 +26,11 @@ describe Ripple::Document::Finders do
|
|
|
32
26
|
end
|
|
33
27
|
|
|
34
28
|
it "should return an empty array if no keys are passed to find" do
|
|
35
|
-
Box.find().should
|
|
29
|
+
Box.find().should be_nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should raise Ripple::DocumentNotFound if an empty array is passed to find!" do
|
|
33
|
+
lambda { Box.find!() }.should raise_error(Ripple::DocumentNotFound, "Couldn't find document without a key")
|
|
36
34
|
end
|
|
37
35
|
|
|
38
36
|
describe "finding single documents" do
|
|
@@ -46,16 +44,57 @@ describe Ripple::Document::Finders do
|
|
|
46
44
|
box.should_not be_new_record
|
|
47
45
|
end
|
|
48
46
|
|
|
47
|
+
it "should find the first document using the first key with the bucket's keys" do
|
|
48
|
+
box = Box.new
|
|
49
|
+
keys = ['some_boxes_key']
|
|
50
|
+
Box.stub!(:find).and_return(box)
|
|
51
|
+
@bucket.stub!(:keys).and_return(keys)
|
|
52
|
+
@bucket.should_receive(:keys)
|
|
53
|
+
keys.should_receive(:first)
|
|
54
|
+
Box.first.should == box
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should use find! when using first!" do
|
|
58
|
+
box = Box.new
|
|
59
|
+
Box.stub!(:find!).and_return(box)
|
|
60
|
+
@bucket.stub!(:keys).and_return(['key'])
|
|
61
|
+
Box.first!.should == box
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should not raise an exception when finding an existing document with find!" do
|
|
65
|
+
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
|
|
66
|
+
lambda { Box.find!("square") }.should_not raise_error(Ripple::DocumentNotFound)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should return the document when calling find!" do
|
|
70
|
+
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
|
|
71
|
+
box = Box.find!("square")
|
|
72
|
+
box.should be_kind_of(Box)
|
|
73
|
+
end
|
|
74
|
+
|
|
49
75
|
it "should return nil when no object exists at that key" do
|
|
50
76
|
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
|
|
51
77
|
box = Box.find("square")
|
|
52
78
|
box.should be_nil
|
|
53
79
|
end
|
|
54
80
|
|
|
81
|
+
it "should raise DocumentNotFound when using find! if no object exists at that key" do
|
|
82
|
+
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
|
|
83
|
+
lambda { Box.find!("square") }.should raise_error(Ripple::DocumentNotFound, "Couldn't find document with key: square")
|
|
84
|
+
end
|
|
85
|
+
|
|
55
86
|
it "should re-raise the failed request exception if not a 404" do
|
|
56
87
|
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 500, {}, "500 internal server error"))
|
|
57
88
|
lambda { Box.find("square") }.should raise_error(Riak::FailedRequest)
|
|
58
89
|
end
|
|
90
|
+
|
|
91
|
+
it "should handle a key with a nil value" do
|
|
92
|
+
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => nil})
|
|
93
|
+
box = Box.find("square")
|
|
94
|
+
box.should be_kind_of(Box)
|
|
95
|
+
box.key.should == "square"
|
|
96
|
+
end
|
|
97
|
+
|
|
59
98
|
end
|
|
60
99
|
|
|
61
100
|
describe "finding multiple documents" do
|
|
@@ -68,13 +107,22 @@ describe Ripple::Document::Finders do
|
|
|
68
107
|
boxes.last.shape.should == "rectangle"
|
|
69
108
|
end
|
|
70
109
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
110
|
+
describe "when using find with missing keys" do
|
|
111
|
+
before :each do
|
|
112
|
+
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
|
|
113
|
+
@http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should return nil for documents that no longer exist" do
|
|
117
|
+
boxes = Box.find("square", "rectangle")
|
|
118
|
+
boxes.should have(2).items
|
|
119
|
+
boxes.first.shape.should == "square"
|
|
120
|
+
boxes.last.should be_nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should raise Ripple::DocumentNotFound when calling find! if some of the documents do not exist" do
|
|
124
|
+
lambda { Box.find!("square", "rectangle") }.should raise_error(Ripple::DocumentNotFound, "Couldn't find documents with keys: rectangle")
|
|
125
|
+
end
|
|
78
126
|
end
|
|
79
127
|
end
|
|
80
128
|
|
|
@@ -124,25 +172,13 @@ describe Ripple::Document::Finders do
|
|
|
124
172
|
end
|
|
125
173
|
|
|
126
174
|
describe "single-bucket inheritance" do
|
|
127
|
-
before :all do
|
|
128
|
-
Object.module_eval { class CardboardBox < Box; end }
|
|
129
|
-
end
|
|
130
|
-
|
|
131
175
|
it "should instantiate as the proper type if defined in the document" do
|
|
132
176
|
@http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
|
|
133
177
|
@http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"rectangle", "_type":"CardboardBox"}'})
|
|
134
178
|
boxes = Box.find("square", "rectangle")
|
|
135
179
|
boxes.should have(2).items
|
|
136
|
-
boxes.first.
|
|
180
|
+
boxes.first.class.should == Box
|
|
137
181
|
boxes.last.should be_kind_of(CardboardBox)
|
|
138
182
|
end
|
|
139
|
-
|
|
140
|
-
after :all do
|
|
141
|
-
Object.send(:remove_const, :CardboardBox)
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
after :all do
|
|
146
|
-
Object.send(:remove_const, :Box)
|
|
147
183
|
end
|
|
148
184
|
end
|
|
@@ -14,15 +14,7 @@
|
|
|
14
14
|
require File.expand_path("../../spec_helper", __FILE__)
|
|
15
15
|
|
|
16
16
|
describe Ripple::Document::Persistence do
|
|
17
|
-
|
|
18
|
-
Object.module_eval {
|
|
19
|
-
class Widget
|
|
20
|
-
include Ripple::Document
|
|
21
|
-
property :size, Integer
|
|
22
|
-
property :name, String, :default => "widget"
|
|
23
|
-
end
|
|
24
|
-
}
|
|
25
|
-
end
|
|
17
|
+
require 'support/models/widget'
|
|
26
18
|
|
|
27
19
|
before :each do
|
|
28
20
|
@http = mock("HTTP Backend")
|
|
@@ -38,9 +30,27 @@ describe Ripple::Document::Persistence do
|
|
|
38
30
|
@http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
|
|
39
31
|
@widget.save
|
|
40
32
|
@widget.key.should == "new_widget"
|
|
41
|
-
@widget.should_not
|
|
33
|
+
@widget.should_not be_a_new_record
|
|
42
34
|
@widget.changes.should be_blank
|
|
43
35
|
end
|
|
36
|
+
|
|
37
|
+
it "should instantiate and save a new object to riak" do
|
|
38
|
+
json = @widget.attributes.merge(:size => 10, :_type => 'Widget').to_json
|
|
39
|
+
@http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
|
|
40
|
+
@widget = Widget.create(:size => 10)
|
|
41
|
+
@widget.size.should == 10
|
|
42
|
+
@widget.should_not be_a_new_record
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should instantiate and save a new object to riak and allow its attributes to be set via a block" do
|
|
46
|
+
json = @widget.attributes.merge(:size => 10, :_type => 'Widget').to_json
|
|
47
|
+
@http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
|
|
48
|
+
@widget = Widget.create do |widget|
|
|
49
|
+
widget.size = 10
|
|
50
|
+
end
|
|
51
|
+
@widget.size.should == 10
|
|
52
|
+
@widget.should_not be_a_new_record
|
|
53
|
+
end
|
|
44
54
|
|
|
45
55
|
it "should reload a saved object" do
|
|
46
56
|
json = @widget.attributes.merge("_type" => "Widget").to_json
|
|
@@ -61,17 +71,26 @@ describe Ripple::Document::Persistence do
|
|
|
61
71
|
@widget.should be_frozen
|
|
62
72
|
end
|
|
63
73
|
|
|
74
|
+
it "should destroy all saved objects" do
|
|
75
|
+
@widget.should_receive(:destroy).and_return(true)
|
|
76
|
+
Widget.should_receive(:all).and_yield(@widget)
|
|
77
|
+
Widget.destroy_all.should be_true
|
|
78
|
+
end
|
|
79
|
+
|
|
64
80
|
it "should freeze an unsaved object when destroying" do
|
|
65
81
|
@http.should_not_receive(:delete)
|
|
66
82
|
@widget.destroy.should be_true
|
|
67
83
|
@widget.should be_frozen
|
|
68
84
|
end
|
|
85
|
+
|
|
86
|
+
it "should be a root document" do
|
|
87
|
+
@widget._root_document.should == @widget
|
|
88
|
+
end
|
|
69
89
|
|
|
70
90
|
describe "when storing a class using single-bucket inheritance" do
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
91
|
+
|
|
92
|
+
class Cog < Widget; property :name, String, :default => "cog"; end
|
|
93
|
+
|
|
75
94
|
before :each do
|
|
76
95
|
@cog = Cog.new(:size => 1000)
|
|
77
96
|
end
|
|
@@ -83,12 +102,5 @@ describe Ripple::Document::Persistence do
|
|
|
83
102
|
@cog.should_not be_new_record
|
|
84
103
|
end
|
|
85
104
|
|
|
86
|
-
after :all do
|
|
87
|
-
Object.send(:remove_const, :Cog)
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
after :all do
|
|
92
|
-
Object.send(:remove_const, :Widget)
|
|
93
105
|
end
|
|
94
106
|
end
|
|
@@ -14,9 +14,7 @@
|
|
|
14
14
|
require File.expand_path("../../spec_helper", __FILE__)
|
|
15
15
|
|
|
16
16
|
describe Ripple::Document::Properties do
|
|
17
|
-
|
|
18
|
-
Object.module_eval { class Email; include Ripple::Document; end }
|
|
19
|
-
end
|
|
17
|
+
require 'support/models/email'
|
|
20
18
|
|
|
21
19
|
it "should make the model class have a property definition method" do
|
|
22
20
|
Email.should respond_to(:property)
|
|
@@ -38,10 +36,6 @@ describe Ripple::Document::Properties do
|
|
|
38
36
|
Forward.properties[:foo].should == "bar"
|
|
39
37
|
end
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
after :all do
|
|
43
|
-
Object.send(:remove_const, :Email)
|
|
44
|
-
end
|
|
45
39
|
end
|
|
46
40
|
|
|
47
41
|
describe Ripple::Document::Property do
|
data/spec/ripple/ripple_spec.rb
CHANGED
|
@@ -41,4 +41,14 @@ describe Ripple do
|
|
|
41
41
|
Ripple.client.should_not == c
|
|
42
42
|
Ripple.client.port.should == 9000
|
|
43
43
|
end
|
|
44
|
+
|
|
45
|
+
it "should raise No Such File or Directory when given a bad configuration file" do
|
|
46
|
+
lambda { Ripple.load_config('not-here') }.should raise_error(Errno::ENOENT)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should apply the configuration under the ripple key" do
|
|
50
|
+
Ripple.load_config(File.join(File.dirname(__FILE__), '..', 'fixtures', 'config.yml'))
|
|
51
|
+
Ripple.client.port.should == 9000
|
|
52
|
+
Ripple.client.host.should == 'localhost'
|
|
53
|
+
end
|
|
44
54
|
end
|
|
@@ -1,49 +1,42 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
2
|
|
|
3
3
|
describe Ripple::Document::Timestamps do
|
|
4
|
-
|
|
5
|
-
before :all do
|
|
6
|
-
Object.module_eval { class Box; include Ripple::Document; property :shape, String; timestamps! end }
|
|
7
|
-
end
|
|
4
|
+
require 'support/models/clock'
|
|
8
5
|
|
|
9
6
|
before :each do
|
|
10
7
|
response = {:headers => {"content-type" => ["application/json"]}, :body => "{}"}
|
|
11
8
|
@client = Ripple.client
|
|
12
9
|
@http = mock("HTTP Backend", :get => response, :put => response, :post => response, :delete => response)
|
|
13
10
|
@client.stub!(:http).and_return(@http)
|
|
14
|
-
@
|
|
11
|
+
@clock = Clock.new
|
|
15
12
|
end
|
|
16
13
|
|
|
17
14
|
it "should add a created_at property" do
|
|
18
|
-
@
|
|
15
|
+
@clock.should respond_to(:created_at)
|
|
19
16
|
end
|
|
20
17
|
|
|
21
18
|
it "should add an updated_at property" do
|
|
22
|
-
@
|
|
19
|
+
@clock.should respond_to(:updated_at)
|
|
23
20
|
end
|
|
24
21
|
|
|
25
22
|
it "should set the created_at timestamp when the object is initialized" do
|
|
26
|
-
@
|
|
23
|
+
@clock.created_at.should_not be_nil
|
|
27
24
|
end
|
|
28
25
|
|
|
29
26
|
it "should not set the updated_at timestamp when the object is initialized" do
|
|
30
|
-
@
|
|
27
|
+
@clock.updated_at.should be_nil
|
|
31
28
|
end
|
|
32
29
|
|
|
33
30
|
it "should set the updated_at timestamp when the object is created" do
|
|
34
|
-
@
|
|
35
|
-
@
|
|
31
|
+
@clock.save
|
|
32
|
+
@clock.updated_at.should_not be_nil
|
|
36
33
|
end
|
|
37
34
|
|
|
38
35
|
it "should update the updated_at timestamp when the object is updated" do
|
|
39
|
-
@
|
|
40
|
-
start = @
|
|
41
|
-
@
|
|
42
|
-
@
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
after :all do
|
|
46
|
-
Object.send(:remove_const, :Box)
|
|
36
|
+
@clock.save
|
|
37
|
+
start = @clock.updated_at
|
|
38
|
+
@clock.save
|
|
39
|
+
@clock.updated_at.should > start
|
|
47
40
|
end
|
|
48
41
|
|
|
49
42
|
end
|
|
@@ -14,9 +14,7 @@
|
|
|
14
14
|
require File.expand_path("../../spec_helper", __FILE__)
|
|
15
15
|
|
|
16
16
|
describe Ripple::Document::Validations do
|
|
17
|
-
|
|
18
|
-
Object.module_eval { class Box; include Ripple::Document; property :shape, String end }
|
|
19
|
-
end
|
|
17
|
+
require 'support/models/box'
|
|
20
18
|
|
|
21
19
|
before :each do
|
|
22
20
|
@box = Box.new
|
|
@@ -41,6 +39,53 @@ describe Ripple::Document::Validations do
|
|
|
41
39
|
@box.should_receive(:valid?).and_return(false)
|
|
42
40
|
@box.save.should be_false
|
|
43
41
|
end
|
|
42
|
+
|
|
43
|
+
it "should allow skipping validations by passing save :validate => false" do
|
|
44
|
+
Ripple.client.http.stub!(:perform).and_return(mock_response)
|
|
45
|
+
@box.should_not_receive(:valid?)
|
|
46
|
+
@box.save(:validate => false).should be_true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "when using save! on an invalid record" do
|
|
50
|
+
before(:each) { @box.stub!(:valid?).and_return(false) }
|
|
51
|
+
|
|
52
|
+
it "should raise DocumentInvalid" do
|
|
53
|
+
lambda { @box.save! }.should raise_error(Ripple::DocumentInvalid)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should raise an exception that has the invalid document" do
|
|
57
|
+
begin
|
|
58
|
+
@box.save!
|
|
59
|
+
rescue Ripple::DocumentInvalid => invalid
|
|
60
|
+
invalid.document.should == @box
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should not raise an error when save! is called and the document is valid" do
|
|
66
|
+
@box.stub!(:save).and_return(true)
|
|
67
|
+
@box.stub!(:valid?).and_return(true)
|
|
68
|
+
lambda { @box.save! }.should_not raise_error(Ripple::DocumentInvalid)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "should return true from save! when no exception is raised" do
|
|
72
|
+
@box.stub!(:save).and_return(true)
|
|
73
|
+
@box.stub!(:valid?).and_return(true)
|
|
74
|
+
@box.save!.should be_true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should not raise an error when creating a box with create! succeeds" do
|
|
78
|
+
@box.stub!(:new?).and_return(false)
|
|
79
|
+
Box.stub(:create).and_return(@box)
|
|
80
|
+
lambda { @new_box = Box.create! }.should_not raise_error(Ripple::DocumentInvalid)
|
|
81
|
+
@new_box.should == @box
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should raise an error when creating a box with create! fails" do
|
|
85
|
+
@box.stub!(:new?).and_return(true)
|
|
86
|
+
Box.stub(:create).and_return(@box)
|
|
87
|
+
lambda { Box.create! }.should raise_error(Ripple::DocumentInvalid)
|
|
88
|
+
end
|
|
44
89
|
|
|
45
90
|
it "should automatically add validations from property options" do
|
|
46
91
|
Box.property :size, Integer, :inclusion => {:in => 1..30 }
|
|
@@ -60,7 +105,4 @@ describe Ripple::Document::Validations do
|
|
|
60
105
|
Box.reset_callbacks(:validate)
|
|
61
106
|
end
|
|
62
107
|
|
|
63
|
-
after :all do
|
|
64
|
-
Object.send(:remove_const, :Box)
|
|
65
|
-
end
|
|
66
108
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -13,20 +13,14 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
15
15
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
16
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'riak','lib'))
|
|
16
17
|
|
|
17
18
|
require 'rubygems' # Use the gems path only for the spec suite
|
|
18
19
|
require 'ripple'
|
|
19
|
-
require '
|
|
20
|
-
require 'spec/autorun'
|
|
21
|
-
require 'fakeweb'
|
|
20
|
+
require 'rspec/autorun'
|
|
22
21
|
|
|
23
22
|
Dir[File.join(File.dirname(__FILE__), "support", "*.rb")].each {|f| require f }
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Spec::Runner.configure do |config|
|
|
29
|
-
config.before(:each) do
|
|
30
|
-
FakeWeb.clean_registry
|
|
31
|
-
end
|
|
24
|
+
Rspec.configure do |config|
|
|
25
|
+
config.mock_with :rspec
|
|
32
26
|
end
|