ashikawa-core 0.4.1 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.travis.yml +2 -0
- data/CONTRIBUTING.md +5 -8
- data/Guardfile +1 -1
- data/README.md +15 -1
- data/Rakefile +45 -12
- data/ashikawa-core.gemspec +13 -6
- data/lib/ashikawa-core/collection.rb +24 -160
- data/lib/ashikawa-core/connection.rb +64 -38
- data/lib/ashikawa-core/cursor.rb +15 -9
- data/lib/ashikawa-core/database.rb +5 -12
- data/lib/ashikawa-core/document.rb +13 -10
- data/lib/ashikawa-core/exceptions/document_not_found.rb +4 -1
- data/lib/ashikawa-core/exceptions/no_collection_provided.rb +11 -0
- data/lib/ashikawa-core/index.rb +6 -6
- data/lib/ashikawa-core/query.rb +251 -0
- data/lib/ashikawa-core/version.rb +1 -1
- data/spec/{integration → acceptance}/arango_helper.rb +1 -1
- data/spec/{integration → acceptance}/basic_spec.rb +4 -4
- data/spec/{integration → acceptance}/index_spec.rb +1 -1
- data/spec/acceptance/query_spec.rb +90 -0
- data/spec/{integration → acceptance}/spec_helper.rb +0 -0
- data/spec/{integration_auth → acceptance_auth}/arango_helper.rb +1 -1
- data/spec/{integration_auth → acceptance_auth}/auth_spec.rb +1 -1
- data/spec/{integration_auth → acceptance_auth}/spec_helper.rb +0 -0
- data/spec/fixtures/query/valid.json +5 -0
- data/spec/setup/arangodb.sh +68 -0
- data/spec/unit/collection_spec.rb +43 -143
- data/spec/unit/database_spec.rb +10 -14
- data/spec/unit/exception_spec.rb +14 -0
- data/spec/unit/query_spec.rb +215 -0
- data/spec/unit/spec_helper.rb +7 -1
- metadata +107 -30
- data/spec/integration/query_spec.rb +0 -78
@@ -6,7 +6,6 @@ describe Ashikawa::Core::Collection do
|
|
6
6
|
|
7
7
|
before :each do
|
8
8
|
@database = double()
|
9
|
-
mock { Ashikawa::Core::Cursor }
|
10
9
|
end
|
11
10
|
|
12
11
|
it "should have a name" do
|
@@ -19,6 +18,16 @@ describe Ashikawa::Core::Collection do
|
|
19
18
|
my_collection.id.should == 4588
|
20
19
|
end
|
21
20
|
|
21
|
+
it "should create a query" do
|
22
|
+
collection = subject.new @database, server_response("/collections/4588")
|
23
|
+
|
24
|
+
mock Ashikawa::Core::Query
|
25
|
+
Ashikawa::Core::Query.stub(:new)
|
26
|
+
Ashikawa::Core::Query.should_receive(:new).exactly(1).times.with(collection)
|
27
|
+
|
28
|
+
collection.query
|
29
|
+
end
|
30
|
+
|
22
31
|
describe "the status code" do
|
23
32
|
it "should know if the collection is new born" do
|
24
33
|
my_collection = subject.new @database, { "status" => "1" }
|
@@ -133,79 +142,55 @@ describe Ashikawa::Core::Collection do
|
|
133
142
|
subject.name = "my_new_name"
|
134
143
|
end
|
135
144
|
|
136
|
-
describe "
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
@database.stub(:send_request).with("/document/4590/333").and_return { server_response('documents/4590-333') }
|
141
|
-
@database.should_receive(:send_request).with("/document/4590/333")
|
142
|
-
|
143
|
-
# Documents need to get initialized:
|
144
|
-
Ashikawa::Core::Document.should_receive(:new)
|
145
|
-
|
146
|
-
subject[333]
|
147
|
-
end
|
145
|
+
describe "add and get single documents" do
|
146
|
+
it "should receive a document by ID" do
|
147
|
+
@database.stub(:send_request).with("/document/4590/333").and_return { server_response('documents/4590-333') }
|
148
|
+
@database.should_receive(:send_request).with("/document/4590/333")
|
148
149
|
|
149
|
-
|
150
|
-
|
151
|
-
@database.should_receive(:send_request).with("/document/4590/333", put: {"name" => "The Dude"})
|
150
|
+
# Documents need to get initialized:
|
151
|
+
Ashikawa::Core::Document.should_receive(:new)
|
152
152
|
|
153
|
-
|
154
|
-
|
153
|
+
subject[333]
|
154
|
+
end
|
155
155
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
end
|
160
|
-
@database.stub(:send_request).with("/document/4590/333", post: { "name" => "The Dude" }).and_return { server_response('documents/4590-333') }
|
156
|
+
it "should replace a document by ID" do
|
157
|
+
@database.stub(:send_request).with("/document/4590/333", put: {"name" => "The Dude"})
|
158
|
+
@database.should_receive(:send_request).with("/document/4590/333", put: {"name" => "The Dude"})
|
161
159
|
|
162
|
-
|
163
|
-
|
160
|
+
subject[333] = {"name" => "The Dude"}
|
161
|
+
end
|
164
162
|
|
165
|
-
|
163
|
+
it "should create a new document" do
|
164
|
+
@database.stub(:send_request).with("/document?collection=4590", post: { "name" => "The Dude" }).and_return do
|
165
|
+
server_response('documents/new-4590-333')
|
166
166
|
end
|
167
|
+
@database.stub(:send_request).with("/document/4590/333", post: { "name" => "The Dude" }).and_return { server_response('documents/4590-333') }
|
167
168
|
|
168
|
-
|
169
|
-
|
170
|
-
server_response('documents/new-4590-333')
|
171
|
-
end
|
172
|
-
@database.stub(:send_request).with("/document/4590/333").and_return { server_response('documents/4590-333') }
|
169
|
+
# Documents need to get initialized:
|
170
|
+
Ashikawa::Core::Document.should_receive(:new)
|
173
171
|
|
174
|
-
|
175
|
-
Ashikawa::Core::Document.should_receive(:new)
|
176
|
-
|
177
|
-
subject << {"name" => "The Dude"}
|
178
|
-
end
|
172
|
+
subject.create({"name" => "The Dude"})
|
179
173
|
end
|
180
174
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
@database.should_receive(:send_request).with("/simple/all", put: {"collection" => "example_1"})
|
185
|
-
|
186
|
-
# Documents need to get initialized:
|
187
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
188
|
-
|
189
|
-
subject.all
|
175
|
+
it "should create a new document with `<<`" do
|
176
|
+
@database.stub(:send_request).with("/document?collection=4590", post: { "name" => "The Dude" }).and_return do
|
177
|
+
server_response('documents/new-4590-333')
|
190
178
|
end
|
179
|
+
@database.stub(:send_request).with("/document/4590/333").and_return { server_response('documents/4590-333') }
|
191
180
|
|
192
|
-
|
193
|
-
|
194
|
-
@database.should_receive(:send_request).with("/simple/all", put: {"collection" => "example_1", "limit" => 1})
|
181
|
+
# Documents need to get initialized:
|
182
|
+
Ashikawa::Core::Document.should_receive(:new)
|
195
183
|
|
196
|
-
|
184
|
+
subject << {"name" => "The Dude"}
|
185
|
+
end
|
197
186
|
|
198
|
-
|
187
|
+
it "should raise an exception if a document is not found" do
|
188
|
+
@database.stub(:send_request).with("/document/4590/333") do
|
189
|
+
raise RestClient::ResourceNotFound
|
199
190
|
end
|
191
|
+
@database.should_receive(:send_request).with("/document/4590/333")
|
200
192
|
|
201
|
-
|
202
|
-
@database.stub(:send_request).with("/simple/all", put: {"collection" => "example_1", "skip" => 1}).and_return { server_response('simple-queries/all_limit') }
|
203
|
-
@database.should_receive(:send_request).with("/simple/all", put: {"collection" => "example_1", "skip" => 1})
|
204
|
-
|
205
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
206
|
-
|
207
|
-
subject.all :skip => 1
|
208
|
-
end
|
193
|
+
expect { subject[333] }.to raise_error(Ashikawa::Core::DocumentNotFoundException)
|
209
194
|
end
|
210
195
|
|
211
196
|
describe "indices" do
|
@@ -245,91 +230,6 @@ describe Ashikawa::Core::Collection do
|
|
245
230
|
indices.length.should == 1
|
246
231
|
end
|
247
232
|
end
|
248
|
-
|
249
|
-
describe "by example" do
|
250
|
-
before(:each) do
|
251
|
-
@example = { :hello => "world" }
|
252
|
-
end
|
253
|
-
|
254
|
-
it "should find documents by example" do
|
255
|
-
@database.stub(:send_request).with("/simple/by-example", put:
|
256
|
-
{"collection" => "example_1", "example" => { :hello => "world"}}
|
257
|
-
).and_return { server_response('simple-queries/example') }
|
258
|
-
@database.should_receive(:send_request).with("/simple/by-example", put:
|
259
|
-
{"collection" => "example_1", "example" => { :hello => "world"}})
|
260
|
-
|
261
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
262
|
-
|
263
|
-
subject.by_example example: @example
|
264
|
-
end
|
265
|
-
|
266
|
-
it "should find one document by example" do
|
267
|
-
@database.stub(:send_request).with("/simple/first-example", put:
|
268
|
-
{"collection" => "example_1", "example" => { :hello => "world"}}
|
269
|
-
).and_return { server_response('simple-queries/example') }
|
270
|
-
@database.should_receive(:send_request).with("/simple/first-example", put:
|
271
|
-
{"collection" => "example_1", "example" => { :hello => "world"}})
|
272
|
-
|
273
|
-
Ashikawa::Core::Document.should_receive(:new)
|
274
|
-
|
275
|
-
subject.first_example @example
|
276
|
-
end
|
277
|
-
|
278
|
-
it "should skip documents" do
|
279
|
-
@database.stub(:send_request).with("/simple/by-example", put:
|
280
|
-
{"collection" => "example_1", "skip" => 1, "example" => { :hello => "world"}}
|
281
|
-
).and_return { server_response('simple-queries/example') }
|
282
|
-
@database.should_receive(:send_request).with("/simple/by-example", put:
|
283
|
-
{"collection" => "example_1", "skip" => 1, "example" => { :hello => "world"}})
|
284
|
-
|
285
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
286
|
-
|
287
|
-
subject.by_example example: @example, :skip => 1
|
288
|
-
end
|
289
|
-
|
290
|
-
it "should limit documents" do
|
291
|
-
@database.stub(:send_request).with("/simple/by-example", put: {"collection" => "example_1", "limit" => 2, "example" => { :hello => "world"}}).and_return { server_response('simple-queries/example') }
|
292
|
-
@database.should_receive(:send_request).with("/simple/by-example", put: {"collection" => "example_1", "limit" => 2, "example" => { :hello => "world"}})
|
293
|
-
|
294
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
295
|
-
|
296
|
-
subject.by_example example: @example, :limit => 2
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
describe "near" do
|
301
|
-
it "should look for documents based on latitude/longitude" do
|
302
|
-
@database.stub(:send_request).with("/simple/near", put: { "collection" => "example_1", "latitude" => 0, "longitude" => 0 }).and_return { server_response('simple-queries/near') }
|
303
|
-
@database.should_receive(:send_request).with("/simple/near", put: { "collection" => "example_1", "latitude" => 0, "longitude" => 0 })
|
304
|
-
|
305
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
306
|
-
|
307
|
-
subject.near :latitude => 0, :longitude => 0
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
describe "within" do
|
312
|
-
it "should look for documents within a certain radius" do
|
313
|
-
@database.stub(:send_request).with("/simple/within", put: { "collection" => "example_1", "latitude" => 0, "longitude" => 0, "radius" => 2 }).and_return { server_response('simple-queries/within') }
|
314
|
-
@database.should_receive(:send_request).with("/simple/within" , put: { "collection" => "example_1", "latitude" => 0, "longitude" => 0, "radius" => 2 })
|
315
|
-
|
316
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
317
|
-
|
318
|
-
subject.within :latitude => 0, :longitude => 0, :radius => 2
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
describe "in range" do
|
323
|
-
it "should look for documents with an attribute within a certain range" do
|
324
|
-
arguments = { "collection" => "example_1", "attribute" => "age", "left" => 50, "right" => 60, "closed" => false}
|
325
|
-
@database.stub(:send_request).with("/simple/range", put: arguments).and_return { server_response('simple-queries/range') }
|
326
|
-
@database.should_receive(:send_request).with("/simple/range" , put: arguments)
|
327
|
-
|
328
|
-
Ashikawa::Core::Cursor.should_receive(:new)
|
329
|
-
|
330
|
-
subject.in_range attribute: "age", left: 50, right: 60, closed: false
|
331
|
-
end
|
332
|
-
end
|
333
233
|
end
|
334
234
|
end
|
335
235
|
end
|
data/spec/unit/database_spec.rb
CHANGED
@@ -27,6 +27,16 @@ describe Ashikawa::Core::Database do
|
|
27
27
|
database = subject.new "http://localhost:8529"
|
28
28
|
end
|
29
29
|
|
30
|
+
it "should create a query" do
|
31
|
+
database = subject.new @connection
|
32
|
+
|
33
|
+
mock Ashikawa::Core::Query
|
34
|
+
Ashikawa::Core::Query.stub(:new)
|
35
|
+
Ashikawa::Core::Query.should_receive(:new).exactly(1).times.with(database)
|
36
|
+
|
37
|
+
database.query
|
38
|
+
end
|
39
|
+
|
30
40
|
describe "initialized database" do
|
31
41
|
subject { Ashikawa::Core::Database.new @connection }
|
32
42
|
|
@@ -76,19 +86,5 @@ describe Ashikawa::Core::Database do
|
|
76
86
|
|
77
87
|
subject.send_request "/my/path", post: { data: "mydata" }
|
78
88
|
end
|
79
|
-
|
80
|
-
describe "handling queries" do
|
81
|
-
it "should send a query to the server" do
|
82
|
-
@connection.stub(:send_request).and_return { server_response("cursor/query") }
|
83
|
-
@connection.should_receive(:send_request).with("/cursor", post: {
|
84
|
-
query: "FOR u IN users LIMIT 2 RETURN u",
|
85
|
-
count: true,
|
86
|
-
batchSize: 2
|
87
|
-
})
|
88
|
-
Ashikawa::Core::Cursor.should_receive(:new).with(subject, server_response("cursor/query"))
|
89
|
-
|
90
|
-
subject.query "FOR u IN users LIMIT 2 RETURN u", count: true, batch_size: 2
|
91
|
-
end
|
92
|
-
end
|
93
89
|
end
|
94
90
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "ashikawa-core/exceptions/document_not_found"
|
2
|
+
require "ashikawa-core/exceptions/no_collection_provided"
|
3
|
+
|
4
|
+
describe Ashikawa::Core::DocumentNotFoundException do
|
5
|
+
it "should have a good explanation" do
|
6
|
+
subject.to_s.should include "does not exist"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Ashikawa::Core::NoCollectionProvidedException do
|
11
|
+
it "should have a good explanation" do
|
12
|
+
subject.to_s.should include "without a collection"
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,215 @@
|
|
1
|
+
require 'unit/spec_helper'
|
2
|
+
require 'ashikawa-core/query'
|
3
|
+
|
4
|
+
describe Ashikawa::Core::Query do
|
5
|
+
let(:collection) { double }
|
6
|
+
let(:database) { double }
|
7
|
+
|
8
|
+
describe "initialized with collection" do
|
9
|
+
subject { Ashikawa::Core::Query.new collection }
|
10
|
+
|
11
|
+
before do
|
12
|
+
collection.stub(:name).and_return "example_1"
|
13
|
+
collection.stub(:database).and_return double
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "get all" do
|
17
|
+
it "should list all documents" do
|
18
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/all') }
|
19
|
+
collection.should_receive(:send_request).with("/simple/all", put: {"collection" => "example_1"})
|
20
|
+
|
21
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
22
|
+
|
23
|
+
subject.all
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be able to limit the number of documents" do
|
27
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/all_skip') }
|
28
|
+
collection.should_receive(:send_request).with("/simple/all", put: {"collection" => "example_1", "limit" => 1})
|
29
|
+
|
30
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
31
|
+
|
32
|
+
subject.all limit: 1
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to skip documents" do
|
36
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/all_limit') }
|
37
|
+
collection.should_receive(:send_request).with("/simple/all", put: {"collection" => "example_1", "skip" => 1})
|
38
|
+
|
39
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
40
|
+
|
41
|
+
subject.all skip: 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "first by example" do
|
46
|
+
let(:example) { {:hello => "world"} }
|
47
|
+
|
48
|
+
it "should find exactly one fitting document" do
|
49
|
+
collection.stub(:database).and_return { double }
|
50
|
+
|
51
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/example') }
|
52
|
+
collection.should_receive(:send_request).with("/simple/first-example", put:
|
53
|
+
{"collection" => "example_1", "example" => { :hello => "world"}})
|
54
|
+
|
55
|
+
Ashikawa::Core::Document.should_receive(:new)
|
56
|
+
|
57
|
+
subject.first_example example
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "all by example" do
|
62
|
+
let(:example) { {:hello => "world"} }
|
63
|
+
|
64
|
+
it "should find all fitting documents" do
|
65
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/example') }
|
66
|
+
collection.should_receive(:send_request).with("/simple/by-example", put:
|
67
|
+
{"collection" => "example_1", "example" => { :hello => "world"}})
|
68
|
+
|
69
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
70
|
+
|
71
|
+
subject.by_example example
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should be able to limit the number of documents" do
|
75
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/example') }
|
76
|
+
collection.should_receive(:send_request).with("/simple/by-example", put: {"collection" => "example_1", "limit" => 2, "example" => { :hello => "world"}})
|
77
|
+
|
78
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
79
|
+
|
80
|
+
subject.by_example example, limit: 2
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should be able to skip documents" do
|
84
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/example') }
|
85
|
+
collection.should_receive(:send_request).with("/simple/by-example", put:
|
86
|
+
{"collection" => "example_1", "skip" => 1, "example" => { :hello => "world"}})
|
87
|
+
|
88
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
89
|
+
|
90
|
+
subject.by_example example, skip: 1
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "near a geolocation" do
|
95
|
+
it "should find documents based on latitude/longitude" do
|
96
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/near') }
|
97
|
+
collection.should_receive(:send_request).with("/simple/near", put: { "collection" => "example_1", "latitude" => 0, "longitude" => 0 })
|
98
|
+
|
99
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
100
|
+
|
101
|
+
subject.near latitude: 0, longitude: 0
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "within a radious of a geolocation" do
|
106
|
+
it "should look for documents based on latidude/longitude" do
|
107
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/within') }
|
108
|
+
collection.should_receive(:send_request).with("/simple/within" , put: { "collection" => "example_1", "latitude" => 0, "longitude" => 0, "radius" => 2 })
|
109
|
+
|
110
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
111
|
+
|
112
|
+
subject.within latitude: 0, longitude: 0, radius: 2
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "in a certain range" do
|
117
|
+
it "should look for documents with an attribute in that range" do
|
118
|
+
arguments = { "collection" => "example_1", "attribute" => "age", "left" => 50, "right" => 60, "closed" => false}
|
119
|
+
collection.stub(:send_request).and_return { server_response('simple-queries/range') }
|
120
|
+
collection.should_receive(:send_request).with("/simple/range" , put: arguments)
|
121
|
+
|
122
|
+
Ashikawa::Core::Cursor.should_receive(:new)
|
123
|
+
|
124
|
+
subject.in_range attribute: "age", left: 50, right: 60, closed: false
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "with an AQL query" do
|
129
|
+
it "should be able to execute it" do
|
130
|
+
collection.stub(:database).and_return double
|
131
|
+
collection.stub(:send_request).and_return { server_response("cursor/query") }
|
132
|
+
collection.should_receive(:send_request).with("/cursor", post: {
|
133
|
+
"query" => "FOR u IN users LIMIT 2 RETURN u",
|
134
|
+
"count" => true,
|
135
|
+
"batchSize" => 2
|
136
|
+
})
|
137
|
+
Ashikawa::Core::Cursor.should_receive(:new).with(collection.database, server_response("cursor/query"))
|
138
|
+
|
139
|
+
subject.execute "FOR u IN users LIMIT 2 RETURN u", count: true, batch_size: 2
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should return true when asked if a valid query is valid" do
|
143
|
+
query = "FOR u IN users LIMIT 2 RETURN u"
|
144
|
+
|
145
|
+
collection.stub(:send_request).and_return { server_response("query/valid") }
|
146
|
+
collection.should_receive(:send_request).with("/query", post: {
|
147
|
+
"query" => query
|
148
|
+
})
|
149
|
+
|
150
|
+
subject.valid?(query).should be_true
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should return false when asked if an invalid query is valid" do
|
154
|
+
query = "FOR u IN users LIMIT 2"
|
155
|
+
|
156
|
+
collection.stub(:send_request) do
|
157
|
+
raise RestClient::BadRequest
|
158
|
+
end
|
159
|
+
collection.should_receive(:send_request).with("/query", post: {
|
160
|
+
"query" => query
|
161
|
+
})
|
162
|
+
|
163
|
+
subject.valid?(query).should be_false
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe "initialized with database" do
|
169
|
+
subject { Ashikawa::Core::Query.new database}
|
170
|
+
|
171
|
+
it "should throw an exception when a simple query is executed" do
|
172
|
+
[:all, :by_example, :first_example, :near, :within, :in_range].each do |method|
|
173
|
+
expect { subject.send method }.to raise_error Ashikawa::Core::NoCollectionProvidedException
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "with an AQL query" do
|
178
|
+
it "should be able to execute it" do
|
179
|
+
database.stub(:send_request).and_return { server_response("cursor/query") }
|
180
|
+
database.should_receive(:send_request).with("/cursor", post: {
|
181
|
+
"query" => "FOR u IN users LIMIT 2 RETURN u",
|
182
|
+
"count" => true,
|
183
|
+
"batchSize" => 2
|
184
|
+
})
|
185
|
+
Ashikawa::Core::Cursor.should_receive(:new).with(database, server_response("cursor/query"))
|
186
|
+
|
187
|
+
subject.execute "FOR u IN users LIMIT 2 RETURN u", count: true, batch_size: 2
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should return true when asked if a valid query is valid" do
|
191
|
+
query = "FOR u IN users LIMIT 2 RETURN u"
|
192
|
+
|
193
|
+
database.stub(:send_request).and_return { server_response("query/valid") }
|
194
|
+
database.should_receive(:send_request).with("/query", post: {
|
195
|
+
"query" => query
|
196
|
+
})
|
197
|
+
|
198
|
+
subject.valid?(query).should be_true
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should return false when asked if an invalid query is valid" do
|
202
|
+
query = "FOR u IN users LIMIT 2"
|
203
|
+
|
204
|
+
database.stub(:send_request) do
|
205
|
+
raise RestClient::BadRequest
|
206
|
+
end
|
207
|
+
database.should_receive(:send_request).with("/query", post: {
|
208
|
+
"query" => query
|
209
|
+
})
|
210
|
+
|
211
|
+
subject.valid?(query).should be_false
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
data/spec/unit/spec_helper.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
3
|
|
4
|
+
require 'simplecov'
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter "spec/"
|
7
|
+
end
|
8
|
+
SimpleCov.minimum_coverage 100
|
9
|
+
|
4
10
|
# For HTTP Testing
|
5
11
|
require 'webmock/rspec'
|
6
12
|
require 'json'
|
@@ -8,4 +14,4 @@ require 'json'
|
|
8
14
|
# Helper to simulate Server Responses. Parses the fixtures in the spec folder
|
9
15
|
def server_response(path)
|
10
16
|
return JSON.parse(File.readlines("spec/fixtures/#{path}.json").join)
|
11
|
-
end
|
17
|
+
end
|