ripple 0.6.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|