ashikawa-core 0.6.0 → 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/.rspec +0 -1
- data/.travis.yml +2 -0
- data/CONTRIBUTING.md +14 -29
- data/Gemfile.devtools +9 -10
- data/README.md +30 -9
- data/Rakefile +1 -1
- data/ashikawa-core.gemspec +9 -8
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/roodi.yml +4 -5
- data/config/site.reek +40 -16
- data/config/yardstick.yml +1 -1
- data/lib/ashikawa-core/collection.rb +109 -22
- data/lib/ashikawa-core/connection.rb +42 -110
- data/lib/ashikawa-core/cursor.rb +13 -6
- data/lib/ashikawa-core/database.rb +67 -17
- data/lib/ashikawa-core/document.rb +41 -10
- data/lib/ashikawa-core/edge.rb +50 -0
- data/lib/ashikawa-core/exceptions/client_error/bad_syntax.rb +24 -0
- data/lib/ashikawa-core/exceptions/{collection_not_found.rb → client_error/resource_not_found/collection_not_found.rb} +3 -1
- data/lib/ashikawa-core/exceptions/{document_not_found.rb → client_error/resource_not_found/document_not_found.rb} +3 -1
- data/lib/ashikawa-core/exceptions/{index_not_found.rb → client_error/resource_not_found/index_not_found.rb} +3 -1
- data/lib/ashikawa-core/exceptions/client_error/resource_not_found.rb +25 -0
- data/lib/ashikawa-core/exceptions/client_error.rb +23 -0
- data/lib/ashikawa-core/exceptions/server_error/json_error.rb +25 -0
- data/lib/ashikawa-core/exceptions/server_error.rb +23 -0
- data/lib/ashikawa-core/figure.rb +59 -2
- data/lib/ashikawa-core/index.rb +23 -7
- data/lib/ashikawa-core/query.rb +10 -10
- data/lib/ashikawa-core/request_preprocessor.rb +49 -0
- data/lib/ashikawa-core/response_preprocessor.rb +111 -0
- data/lib/ashikawa-core/version.rb +1 -1
- data/lib/ashikawa-core.rb +0 -1
- data/spec/acceptance/basic_spec.rb +61 -22
- data/spec/acceptance/index_spec.rb +11 -4
- data/spec/acceptance/query_spec.rb +4 -1
- data/spec/acceptance/spec_helper.rb +0 -2
- data/spec/acceptance_auth/spec_helper.rb +0 -2
- data/spec/fixtures/collections/60768679-count.json +13 -0
- data/spec/fixtures/collections/60768679-figures.json +35 -0
- data/spec/fixtures/collections/60768679-properties-volatile.json +12 -0
- data/spec/fixtures/collections/60768679-properties.json +12 -0
- data/spec/fixtures/collections/{4588.json → 60768679.json} +2 -2
- data/spec/fixtures/collections/all.json +5 -5
- data/spec/fixtures/cursor/26011191-2.json +1 -1
- data/spec/fixtures/cursor/26011191.json +1 -1
- data/spec/fixtures/documents/example_1-137249191.json +6 -0
- data/spec/fixtures/documents/new-example_1-137249191.json +6 -0
- data/spec/setup/arangodb.sh +1 -1
- data/spec/unit/collection_spec.rb +117 -42
- data/spec/unit/connection_spec.rb +161 -61
- data/spec/unit/cursor_spec.rb +39 -12
- data/spec/unit/database_spec.rb +119 -19
- data/spec/unit/document_spec.rb +4 -2
- data/spec/unit/edge_spec.rb +54 -0
- data/spec/unit/exception_spec.rb +36 -8
- data/spec/unit/figure_spec.rb +37 -11
- data/spec/unit/index_spec.rb +1 -1
- data/spec/unit/query_spec.rb +18 -18
- data/spec/unit/spec_helper.rb +4 -13
- data/tasks/adjustments.rake +3 -2
- metadata +59 -32
- data/lib/ashikawa-core/exceptions/unknown_path.rb +0 -15
- data/spec/fixtures/collections/4590-properties.json +0 -9
- data/spec/fixtures/collections/4590.json +0 -8
- data/spec/fixtures/collections/73482-figures.json +0 -23
- data/spec/fixtures/documents/4590-333.json +0 -5
- data/spec/fixtures/documents/new-4590-333.json +0 -5
@@ -3,13 +3,13 @@
|
|
3
3
|
{
|
4
4
|
"name": "example_1",
|
5
5
|
"waitForSync": true,
|
6
|
-
"id":
|
6
|
+
"id": "60768679",
|
7
7
|
"status": 3
|
8
8
|
},
|
9
9
|
{
|
10
10
|
"name": "example_2",
|
11
11
|
"waitForSync": true,
|
12
|
-
"id":
|
12
|
+
"id": "60768669",
|
13
13
|
"status": 3
|
14
14
|
}
|
15
15
|
],
|
@@ -19,14 +19,14 @@
|
|
19
19
|
"example_1": {
|
20
20
|
"name": "example_1",
|
21
21
|
"waitForSync": true,
|
22
|
-
"id":
|
22
|
+
"id": "60768679",
|
23
23
|
"status": 3
|
24
24
|
},
|
25
25
|
"example_2": {
|
26
26
|
"name": "example_2",
|
27
27
|
"waitForSync": true,
|
28
|
-
"id":
|
28
|
+
"id": "60768669",
|
29
29
|
"status": 3
|
30
30
|
}
|
31
31
|
}
|
32
|
-
}
|
32
|
+
}
|
data/spec/setup/arangodb.sh
CHANGED
@@ -9,17 +9,17 @@ describe Ashikawa::Core::Collection do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should have a name" do
|
12
|
-
my_collection = subject.new @database, server_response("
|
12
|
+
my_collection = subject.new @database, server_response("collections/60768679")
|
13
13
|
my_collection.name.should == "example_1"
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should accept an ID" do
|
17
|
-
my_collection = subject.new @database, server_response("
|
18
|
-
my_collection.id.should ==
|
17
|
+
my_collection = subject.new @database, server_response("collections/60768679")
|
18
|
+
my_collection.id.should == "60768679"
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should create a query" do
|
22
|
-
collection = subject.new @database, server_response("
|
22
|
+
collection = subject.new @database, server_response("collections/60768679")
|
23
23
|
|
24
24
|
mock Ashikawa::Core::Query
|
25
25
|
Ashikawa::Core::Query.stub(:new)
|
@@ -30,83 +30,109 @@ describe Ashikawa::Core::Collection do
|
|
30
30
|
|
31
31
|
describe "attributes of a collection" do
|
32
32
|
it "should check if the collection waits for sync" do
|
33
|
-
@database.stub(:send_request).with("
|
34
|
-
@database.should_receive(:send_request).with("
|
33
|
+
@database.stub(:send_request).with("collection/60768679/properties", {}).and_return { server_response("collections/60768679-properties") }
|
34
|
+
@database.should_receive(:send_request).with("collection/60768679/properties", {})
|
35
35
|
|
36
|
-
my_collection = subject.new @database, { "id" => "
|
36
|
+
my_collection = subject.new @database, { "id" => "60768679" }
|
37
37
|
my_collection.wait_for_sync?.should be_true
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should know how many documents the collection has" do
|
41
|
-
@database.stub(:send_request).with("
|
42
|
-
@database.should_receive(:send_request).with("
|
41
|
+
@database.stub(:send_request).with("collection/60768679/count", {}).and_return { server_response("collections/60768679-count") }
|
42
|
+
@database.should_receive(:send_request).with("collection/60768679/count", {})
|
43
43
|
|
44
|
-
my_collection = subject.new @database, { "id" => "
|
44
|
+
my_collection = subject.new @database, { "id" => "60768679" }
|
45
45
|
my_collection.length.should == 54
|
46
46
|
end
|
47
47
|
|
48
|
+
it "should know if the collection is volatile" do
|
49
|
+
@database.stub(:send_request).with("collection/60768679/properties", {}).and_return { server_response("collections/60768679-properties-volatile") }
|
50
|
+
@database.should_receive(:send_request).with("collection/60768679/properties", {})
|
51
|
+
|
52
|
+
my_collection = subject.new(@database, { "id" => "60768679" })
|
53
|
+
my_collection.volatile?.should == true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should know if the collection is not volatile" do
|
57
|
+
@database.stub(:send_request).with("collection/60768679/properties", {}).and_return { server_response("collections/60768679-properties") }
|
58
|
+
@database.should_receive(:send_request).with("collection/60768679/properties", {})
|
59
|
+
|
60
|
+
my_collection = subject.new(@database, { "id" => "60768679" })
|
61
|
+
my_collection.volatile?.should == false
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should know that a collection is from type 'document'" do
|
65
|
+
my_collection = subject.new(@database, { "id" => "60768679", "type" => 2 })
|
66
|
+
my_collection.content_type.should == :document
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should know that a collection is from type 'edge'" do
|
70
|
+
my_collection = subject.new(@database, { "id" => "60768679", "type" => 3 })
|
71
|
+
my_collection.content_type.should == :edge
|
72
|
+
end
|
73
|
+
|
48
74
|
it "should check for the figures" do
|
49
|
-
@database.stub(:send_request).with("
|
50
|
-
@database.should_receive(:send_request).with("
|
75
|
+
@database.stub(:send_request).with("collection/60768679/figures", {}).and_return { server_response("collections/60768679-figures") }
|
76
|
+
@database.should_receive(:send_request).with("collection/60768679/figures", {}).at_least(1).times
|
51
77
|
|
52
78
|
mock Ashikawa::Core::Figure
|
53
79
|
Ashikawa::Core::Figure.stub(:new)
|
54
|
-
Ashikawa::Core::Figure.should_receive(:new).exactly(1).times.with(server_response("
|
80
|
+
Ashikawa::Core::Figure.should_receive(:new).exactly(1).times.with(server_response("collections/60768679-figures")["figures"])
|
55
81
|
|
56
|
-
my_collection = subject.new @database, { "id" => "
|
82
|
+
my_collection = subject.new @database, { "id" => "60768679" }
|
57
83
|
my_collection.figure
|
58
84
|
end
|
59
85
|
end
|
60
86
|
|
61
87
|
describe "an initialized collection" do
|
62
|
-
subject { Ashikawa::Core::Collection.new @database, { "id" => "
|
88
|
+
subject { Ashikawa::Core::Collection.new @database, { "id" => "60768679", "name" => "example_1" } }
|
63
89
|
|
64
90
|
it "should get deleted" do
|
65
|
-
@database.stub(:send_request).with("
|
66
|
-
@database.should_receive(:send_request).with("
|
91
|
+
@database.stub(:send_request).with("collection/60768679/", :delete => {})
|
92
|
+
@database.should_receive(:send_request).with("collection/60768679/", :delete => {})
|
67
93
|
|
68
94
|
subject.delete
|
69
95
|
end
|
70
96
|
|
71
97
|
it "should get loaded" do
|
72
|
-
@database.stub(:send_request).with("
|
73
|
-
@database.should_receive(:send_request).with("
|
98
|
+
@database.stub(:send_request).with("collection/60768679/load", :put => {})
|
99
|
+
@database.should_receive(:send_request).with("collection/60768679/load", :put => {})
|
74
100
|
|
75
101
|
subject.load
|
76
102
|
end
|
77
103
|
|
78
104
|
it "should get unloaded" do
|
79
|
-
@database.stub(:send_request).with("
|
80
|
-
@database.should_receive(:send_request).with("
|
105
|
+
@database.stub(:send_request).with("collection/60768679/unload", :put => {})
|
106
|
+
@database.should_receive(:send_request).with("collection/60768679/unload", :put => {})
|
81
107
|
|
82
108
|
subject.unload
|
83
109
|
end
|
84
110
|
|
85
111
|
it "should get truncated" do
|
86
|
-
@database.stub(:send_request).with("
|
87
|
-
@database.should_receive(:send_request).with("
|
112
|
+
@database.stub(:send_request).with("collection/60768679/truncate", :put => {})
|
113
|
+
@database.should_receive(:send_request).with("collection/60768679/truncate", :put => {})
|
88
114
|
|
89
115
|
subject.truncate!
|
90
116
|
end
|
91
117
|
|
92
118
|
it "should change if it waits for sync" do
|
93
|
-
@database.stub(:send_request).with("
|
94
|
-
@database.should_receive(:send_request).with("
|
119
|
+
@database.stub(:send_request).with("collection/60768679/properties", :put => {"waitForSync" => true})
|
120
|
+
@database.should_receive(:send_request).with("collection/60768679/properties", :put => {"waitForSync" => true})
|
95
121
|
|
96
122
|
subject.wait_for_sync = true
|
97
123
|
end
|
98
124
|
|
99
125
|
it "should change its name" do
|
100
|
-
@database.stub(:send_request).with("
|
101
|
-
@database.should_receive(:send_request).with("
|
126
|
+
@database.stub(:send_request).with("collection/60768679/rename", :put => {"name" => "my_new_name"})
|
127
|
+
@database.should_receive(:send_request).with("collection/60768679/rename", :put => {"name" => "my_new_name"})
|
102
128
|
|
103
129
|
subject.name = "my_new_name"
|
104
130
|
end
|
105
131
|
|
106
132
|
describe "add and get single documents" do
|
107
133
|
it "should receive a document by ID" do
|
108
|
-
@database.stub(:send_request).with("
|
109
|
-
@database.should_receive(:send_request).with("
|
134
|
+
@database.stub(:send_request).with("document/60768679/333", {}).and_return { server_response('documents/example_1-137249191') }
|
135
|
+
@database.should_receive(:send_request).with("document/60768679/333", {})
|
110
136
|
|
111
137
|
# Documents need to get initialized:
|
112
138
|
Ashikawa::Core::Document.should_receive(:new)
|
@@ -115,29 +141,29 @@ describe Ashikawa::Core::Collection do
|
|
115
141
|
end
|
116
142
|
|
117
143
|
it "should replace a document by ID" do
|
118
|
-
@database.stub(:send_request).with("
|
119
|
-
@database.should_receive(:send_request).with("
|
144
|
+
@database.stub(:send_request).with("document/60768679/333", :put => {"name" => "The Dude"})
|
145
|
+
@database.should_receive(:send_request).with("document/60768679/333", :put => {"name" => "The Dude"})
|
120
146
|
|
121
147
|
subject[333] = {"name" => "The Dude"}
|
122
148
|
end
|
123
149
|
|
124
150
|
it "should create a new document" do
|
125
|
-
@database.stub(:send_request).with("
|
126
|
-
server_response('documents/new-
|
151
|
+
@database.stub(:send_request).with("document?collection=60768679", :post => { "name" => "The Dude" }).and_return do
|
152
|
+
server_response('documents/new-example_1-137249191')
|
127
153
|
end
|
128
|
-
@database.stub(:send_request).with("
|
154
|
+
@database.stub(:send_request).with("document/60768679/333", :post => { "name" => "The Dude" }).and_return { server_response('documents/example_1-137249191') }
|
129
155
|
|
130
156
|
# Documents need to get initialized:
|
131
157
|
Ashikawa::Core::Document.should_receive(:new)
|
132
158
|
|
133
|
-
subject.
|
159
|
+
subject.create_document({"name" => "The Dude"})
|
134
160
|
end
|
135
161
|
|
136
162
|
it "should create a new document with `<<`" do
|
137
|
-
@database.stub(:send_request).with("
|
138
|
-
server_response('documents/
|
163
|
+
@database.stub(:send_request).with("document?collection=60768679", :post => { "name" => "The Dude" }).and_return do
|
164
|
+
server_response('documents/example_1-137249191')
|
139
165
|
end
|
140
|
-
@database.stub(:send_request).with("
|
166
|
+
@database.stub(:send_request).with("document/60768679/333").and_return { server_response('documents/example_1-137249191') }
|
141
167
|
|
142
168
|
# Documents need to get initialized:
|
143
169
|
Ashikawa::Core::Document.should_receive(:new)
|
@@ -145,12 +171,18 @@ describe Ashikawa::Core::Collection do
|
|
145
171
|
subject << {"name" => "The Dude"}
|
146
172
|
end
|
147
173
|
|
174
|
+
it "should not create a new document" do
|
175
|
+
expect {
|
176
|
+
subject.create_edge(nil, nil, {"quote" => "D'ya have to use s'many cuss words?"})
|
177
|
+
}.to raise_exception(RuntimeError, "Can't create an edge in a document collection")
|
178
|
+
end
|
179
|
+
|
148
180
|
describe "indices" do
|
149
181
|
it "should add a new index" do
|
150
|
-
@database.stub(:send_request).with("
|
182
|
+
@database.stub(:send_request).with("index?collection=60768679", :post => {
|
151
183
|
"type" => "hash", "fields" => [ "a", "b" ]
|
152
184
|
}).and_return { server_response('indices/new-hash-index') }
|
153
|
-
@database.should_receive(:send_request).with("
|
185
|
+
@database.should_receive(:send_request).with("index?collection=60768679", :post => {
|
154
186
|
"type" => "hash", "fields" => [ "a", "b" ]
|
155
187
|
})
|
156
188
|
|
@@ -162,7 +194,7 @@ describe Ashikawa::Core::Collection do
|
|
162
194
|
|
163
195
|
it "should get an index by ID" do
|
164
196
|
@database.stub(:send_request).with(
|
165
|
-
"
|
197
|
+
"index/example_1/168054969"
|
166
198
|
).and_return { server_response('indices/hash-index') }
|
167
199
|
|
168
200
|
Ashikawa::Core::Index.should_receive(:new).with(subject,
|
@@ -173,7 +205,7 @@ describe Ashikawa::Core::Collection do
|
|
173
205
|
|
174
206
|
it "should get all indices" do
|
175
207
|
@database.stub(:send_request).with(
|
176
|
-
"
|
208
|
+
"index?collection=60768679"
|
177
209
|
).and_return { server_response('indices/all') }
|
178
210
|
|
179
211
|
Ashikawa::Core::Index.should_receive(:new).exactly(1).times
|
@@ -184,4 +216,47 @@ describe Ashikawa::Core::Collection do
|
|
184
216
|
end
|
185
217
|
end
|
186
218
|
end
|
219
|
+
|
220
|
+
describe "an initialized edge collection" do
|
221
|
+
subject { Ashikawa::Core::Collection.new @database, { "id" => "60768679", "name" => "example_1", "type" => 3 } }
|
222
|
+
|
223
|
+
it "should receive an edge by ID" do
|
224
|
+
@database.stub(:send_request).with("edge/60768679/333", {}).and_return { server_response('documents/example_1-137249191') }
|
225
|
+
@database.should_receive(:send_request).with("edge/60768679/333", {})
|
226
|
+
|
227
|
+
# Documents need to get initialized:
|
228
|
+
Ashikawa::Core::Edge.should_receive(:new)
|
229
|
+
|
230
|
+
subject[333]
|
231
|
+
end
|
232
|
+
|
233
|
+
it "should replace an edge by ID" do
|
234
|
+
@database.stub(:send_request).with("edge/60768679/333", :put => {"name" => "The Dude"})
|
235
|
+
@database.should_receive(:send_request).with("edge/60768679/333", :put => {"name" => "The Dude"})
|
236
|
+
|
237
|
+
subject[333] = {"name" => "The Dude"}
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should create a new edge" do
|
241
|
+
@database.stub(:send_request).with("edge?collection=60768679&from=1&to=2", :post => { "name" => "The Dude" }).and_return do
|
242
|
+
server_response('documents/new-example_1-137249191')
|
243
|
+
end
|
244
|
+
@database.stub(:send_request).with("edge?collection=60768679&from=1&to=2", :post => { "name" => "The Dude" }).and_return { server_response('documents/example_1-137249191') }
|
245
|
+
from_double = double
|
246
|
+
from_double.stub(:id => "1")
|
247
|
+
to_double = double
|
248
|
+
to_double.stub(:id => "2")
|
249
|
+
|
250
|
+
# Documents need to get initialized:
|
251
|
+
Ashikawa::Core::Edge.should_receive(:new)
|
252
|
+
|
253
|
+
subject.create_edge(from_double, to_double, {"name" => "The Dude"})
|
254
|
+
end
|
255
|
+
|
256
|
+
it "should not create a new document" do
|
257
|
+
expect {
|
258
|
+
subject.create_document({"quote" => "D'ya have to use s'many cuss words?"})
|
259
|
+
}.to raise_exception(RuntimeError, "Can't create a document in an edge collection")
|
260
|
+
end
|
261
|
+
end
|
187
262
|
end
|
@@ -2,76 +2,78 @@ require 'unit/spec_helper'
|
|
2
2
|
require 'ashikawa-core/connection'
|
3
3
|
|
4
4
|
describe Ashikawa::Core::Connection do
|
5
|
-
|
5
|
+
let(:request_stub) { Faraday::Adapter::Test::Stubs.new }
|
6
|
+
let(:response_headers) { {"content-type" => "application/json; charset=utf-8" } }
|
7
|
+
subject { Ashikawa::Core::Connection.new(ARANGO_HOST, :adapter => [:test, request_stub]) }
|
6
8
|
|
7
9
|
it "should have a scheme, hostname and port" do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
connection.host.should == "localhost"
|
12
|
-
connection.port.should == 8529
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should default to HTTP, localhost and ArangoDB port" do
|
16
|
-
connection = subject.new
|
17
|
-
|
18
|
-
connection.scheme.should == "http"
|
19
|
-
connection.host.should == "localhost"
|
20
|
-
connection.port.should == 8529
|
10
|
+
subject.scheme.should == "http"
|
11
|
+
subject.host.should == "localhost"
|
12
|
+
subject.port.should == 8529
|
21
13
|
end
|
22
14
|
|
23
|
-
|
24
|
-
|
15
|
+
it "should send a get request" do
|
16
|
+
request_stub.get("/_api/my/path") do
|
17
|
+
[200, response_headers, MultiJson.dump({ "name" => "dude" })]
|
18
|
+
end
|
25
19
|
|
26
|
-
|
27
|
-
stub_request(:get, "http://localhost:8529/_api/my/path").to_return :body => '{ "name": "dude" }'
|
20
|
+
subject.send_request "my/path"
|
28
21
|
|
29
|
-
|
22
|
+
request_stub.verify_stubbed_calls
|
23
|
+
end
|
30
24
|
|
31
|
-
|
25
|
+
it "should send a post request" do
|
26
|
+
request_stub.post("/_api/my/path") do |request|
|
27
|
+
request[:body].should == "{\"name\":\"new_collection\"}"
|
28
|
+
[200, response_headers, MultiJson.dump({ "name" => "dude" })]
|
32
29
|
end
|
33
30
|
|
34
|
-
|
35
|
-
stub_request(:post, "http://localhost:8529/_api/my/path").with(:body => '{"name":"new_collection"}').to_return :body => '{ "name": "dude" }'
|
31
|
+
subject.send_request "my/path", :post => { :name => 'new_collection' }
|
36
32
|
|
37
|
-
|
33
|
+
request_stub.verify_stubbed_calls
|
34
|
+
end
|
38
35
|
|
39
|
-
|
36
|
+
it "should send a put request" do
|
37
|
+
request_stub.put("/_api/my/path") do |request|
|
38
|
+
request[:body].should == '{"name":"new_collection"}'
|
39
|
+
[200, response_headers, MultiJson.dump({ "name" => "dude" })]
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
stub_request(:put, "http://localhost:8529/_api/my/path").with(:body => '{"name":"new_collection"}').to_return :body => '{ "name": "dude" }'
|
42
|
+
subject.send_request "my/path", :put => { :name => 'new_collection' }
|
44
43
|
|
45
|
-
|
44
|
+
request_stub.verify_stubbed_calls
|
45
|
+
end
|
46
46
|
|
47
|
-
|
47
|
+
it "should send a delete request" do
|
48
|
+
request_stub.delete("/_api/my/path") do |request|
|
49
|
+
[200, response_headers, MultiJson.dump({ "name" => "dude" })]
|
48
50
|
end
|
49
51
|
|
50
|
-
|
51
|
-
stub_request(:delete, "http://localhost:8529/_api/my/path").to_return :body => '{ "name": "dude" }'
|
52
|
+
subject.send_request "my/path", :delete => { }
|
52
53
|
|
53
|
-
|
54
|
+
request_stub.verify_stubbed_calls
|
55
|
+
end
|
54
56
|
|
55
|
-
|
57
|
+
it "should write JSON request" do
|
58
|
+
request_stub.post("/_api/my/path") do |req|
|
59
|
+
req[:body].should == "{\"test\":1}"
|
60
|
+
[200, response_headers, MultiJson.dump({ "name" => "dude" })]
|
56
61
|
end
|
57
62
|
|
58
|
-
|
59
|
-
|
63
|
+
subject.send_request("my/path", :post => { "test" => 1})
|
64
|
+
request_stub.verify_stubbed_calls
|
65
|
+
end
|
60
66
|
|
61
|
-
|
67
|
+
it "should parse JSON response" do
|
68
|
+
request_stub.get("/_api/my/path") do
|
69
|
+
[200, response_headers, "{\"name\":\"dude\"}"]
|
62
70
|
end
|
71
|
+
|
72
|
+
subject.send_request("my/path").should == {"name" => "dude"}
|
73
|
+
request_stub.verify_stubbed_calls
|
63
74
|
end
|
64
75
|
|
65
76
|
describe "authentication" do
|
66
|
-
subject { Ashikawa::Core::Connection.new }
|
67
|
-
|
68
|
-
it "should authenticate with username and password" do
|
69
|
-
subject.authenticate_with :username => "testuser", :password => "testpassword"
|
70
|
-
|
71
|
-
subject.username.should == "testuser"
|
72
|
-
subject.password.should == "testpassword"
|
73
|
-
end
|
74
|
-
|
75
77
|
it "should have authentication turned off by default" do
|
76
78
|
subject.authentication?.should be_false
|
77
79
|
end
|
@@ -81,7 +83,7 @@ describe Ashikawa::Core::Connection do
|
|
81
83
|
subject.authentication?.should be_true
|
82
84
|
end
|
83
85
|
|
84
|
-
it "should only accept
|
86
|
+
it "should only accept username & password pairs" do
|
85
87
|
expect {
|
86
88
|
subject.authenticate_with :username => "kitty"
|
87
89
|
}.to raise_error(ArgumentError)
|
@@ -96,44 +98,142 @@ describe Ashikawa::Core::Connection do
|
|
96
98
|
end
|
97
99
|
|
98
100
|
it "should send the authentication data with every GET request" do
|
99
|
-
|
101
|
+
pending "Find out how to check for basic auth via Faraday Stubs"
|
102
|
+
|
103
|
+
request_stub.get("/_api/my/path") do |request|
|
104
|
+
[200, response_headers, MultiJson.dump({ "name" => "dude" })]
|
105
|
+
end
|
100
106
|
|
101
107
|
subject.authenticate_with :username => "user", :password => "pass"
|
102
|
-
subject.send_request "
|
108
|
+
subject.send_request "my/path"
|
103
109
|
|
104
|
-
|
110
|
+
request_stub.verify_stubbed_calls
|
105
111
|
end
|
106
112
|
end
|
107
113
|
|
108
114
|
describe "exception handling" do
|
109
|
-
|
115
|
+
it "should throw a general client error for I'm a teapot" do
|
116
|
+
request_stub.get("/_api/bad/request") do
|
117
|
+
[418, response_headers, ""]
|
118
|
+
end
|
119
|
+
|
120
|
+
expect do
|
121
|
+
subject.send_request("bad/request")
|
122
|
+
end.to raise_error(Ashikawa::Core::ClientError, /418/)
|
123
|
+
|
124
|
+
request_stub.verify_stubbed_calls
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should throw its own exception when doing a bad request" do
|
128
|
+
request_stub.get("/_api/bad/request") do
|
129
|
+
[400, response_headers, ""]
|
130
|
+
end
|
131
|
+
|
132
|
+
expect do
|
133
|
+
subject.send_request("bad/request")
|
134
|
+
end.to raise_error(Ashikawa::Core::BadSyntax)
|
135
|
+
|
136
|
+
request_stub.verify_stubbed_calls
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should throw a general server error for the generic server error" do
|
140
|
+
request_stub.get("/_api/bad/request") do
|
141
|
+
[500, response_headers, ""]
|
142
|
+
end
|
143
|
+
|
144
|
+
expect do
|
145
|
+
subject.send_request("bad/request")
|
146
|
+
end.to raise_error(Ashikawa::Core::ServerError, /500/)
|
147
|
+
|
148
|
+
request_stub.verify_stubbed_calls
|
149
|
+
end
|
110
150
|
|
111
151
|
it "should raise an exception if a document is not found" do
|
112
|
-
|
113
|
-
|
152
|
+
request_stub.get("/_api/document/4590/333") do
|
153
|
+
[404, response_headers, ""]
|
114
154
|
end
|
115
|
-
|
155
|
+
|
156
|
+
expect { subject.send_request "document/4590/333" }.to raise_error(Ashikawa::Core::DocumentNotFoundException)
|
157
|
+
|
158
|
+
request_stub.verify_stubbed_calls
|
116
159
|
end
|
117
160
|
|
118
161
|
it "should raise an exception if a collection is not found" do
|
119
|
-
|
120
|
-
|
162
|
+
request_stub.get("/_api/collection/4590") do
|
163
|
+
[404, response_headers, ""]
|
121
164
|
end
|
122
|
-
|
165
|
+
|
166
|
+
expect { subject.send_request "collection/4590" }.to raise_error(Ashikawa::Core::CollectionNotFoundException)
|
167
|
+
|
168
|
+
request_stub.verify_stubbed_calls
|
123
169
|
end
|
124
170
|
|
125
171
|
it "should raise an exception if an index is not found" do
|
126
|
-
|
127
|
-
|
172
|
+
request_stub.get("/_api/index/4590/333") do
|
173
|
+
[404, response_headers, ""]
|
128
174
|
end
|
129
|
-
|
175
|
+
|
176
|
+
expect { subject.send_request "index/4590/333" }.to raise_error(Ashikawa::Core::IndexNotFoundException)
|
177
|
+
|
178
|
+
request_stub.verify_stubbed_calls
|
130
179
|
end
|
131
180
|
|
132
181
|
it "should raise an exception for unknown pathes" do
|
133
|
-
|
134
|
-
|
182
|
+
request_stub.get("/_api/unknown_path/4590/333") do
|
183
|
+
[404, response_headers, ""]
|
184
|
+
end
|
185
|
+
|
186
|
+
expect { subject.send_request "unknown_path/4590/333" }.to raise_error(Ashikawa::Core::ResourceNotFound)
|
187
|
+
|
188
|
+
request_stub.verify_stubbed_calls
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should raise an error if a malformed JSON was returned from the server" do
|
192
|
+
request_stub.get("/_api/document/4590/333") do
|
193
|
+
[200, response_headers, "{\"a\":1"]
|
194
|
+
end
|
195
|
+
|
196
|
+
expect { subject.send_request "document/4590/333" }.to raise_error(Ashikawa::Core::JsonError)
|
197
|
+
|
198
|
+
request_stub.verify_stubbed_calls
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should raise an error if the content type of the response is not JSON" do
|
202
|
+
request_stub.get("/_api/document/4590/333") do
|
203
|
+
[200, {"content-type" => "text/html; charset=utf-8"}, ""]
|
204
|
+
end
|
205
|
+
|
206
|
+
expect { subject.send_request "document/4590/333" }.to raise_error(Ashikawa::Core::JsonError)
|
207
|
+
|
208
|
+
request_stub.verify_stubbed_calls
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "logging" do
|
213
|
+
let(:request_stub) { Faraday::Adapter::Test::Stubs.new }
|
214
|
+
let(:logger) { double }
|
215
|
+
subject {
|
216
|
+
Ashikawa::Core::Connection.new(ARANGO_HOST, :adapter => [:test, request_stub], :logger => logger)
|
217
|
+
}
|
218
|
+
|
219
|
+
it "should log a get request" do
|
220
|
+
request_stub.get("/_api/test") do
|
221
|
+
[200, response_headers, MultiJson.dump({:a => 1})]
|
222
|
+
end
|
223
|
+
logger.should_receive(:info).with("GET #{ARANGO_HOST}/_api/test ")
|
224
|
+
logger.should_receive(:info).with("200 {\"a\":1}")
|
225
|
+
subject.send_request("test")
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should log a post request" do
|
229
|
+
pending "This fails on 1.8.7 for unknown reasons. Will investigate." if RUBY_VERSION == "1.8.7"
|
230
|
+
|
231
|
+
request_stub.post("/_api/test") do
|
232
|
+
[201, response_headers, MultiJson.dump({:b => 2})]
|
135
233
|
end
|
136
|
-
|
234
|
+
logger.should_receive(:info).with("POST #{ARANGO_HOST}/_api/test {:a=>2}")
|
235
|
+
logger.should_receive(:info).with("201 {\"b\":2}")
|
236
|
+
subject.send_request("test", :post => { :a => 2})
|
137
237
|
end
|
138
238
|
end
|
139
239
|
end
|