mirror of https://gitee.com/bigwinds/arangodb
902 lines
38 KiB
Ruby
902 lines
38 KiB
Ruby
# coding: utf-8
|
|
|
|
require 'rspec'
|
|
require 'arangodb.rb'
|
|
|
|
describe ArangoDB do
|
|
api = "/_api/export"
|
|
prefix = "api-export"
|
|
|
|
context "dealing with exports:" do
|
|
before do
|
|
@reId = Regexp.new('^\d+$')
|
|
end
|
|
|
|
################################################################################
|
|
## error handling
|
|
################################################################################
|
|
|
|
context "error handling:" do
|
|
it "returns an error if collection is unknown" do
|
|
cmd = api + "?collection=unknowncollection";
|
|
body = "{ \"count\" : true, \"batchSize\" : 2 }"
|
|
doc = ArangoDB.log_post("#{prefix}-unknown-collection", cmd, :body => body)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(404)
|
|
doc.parsed_response['errorNum'].should eq(1203)
|
|
end
|
|
|
|
it "returns an error if cursor identifier is missing" do
|
|
cmd = api
|
|
doc = ArangoDB.log_put("#{prefix}-missing-cursor-identifier", cmd)
|
|
|
|
doc.code.should eq(400)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(400)
|
|
doc.parsed_response['errorNum'].should eq(400)
|
|
end
|
|
|
|
it "returns an error if cursor identifier is invalid" do
|
|
cmd = api + "/123456"
|
|
doc = ArangoDB.log_put("#{prefix}-invalid-cursor-identifier", cmd)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(404)
|
|
doc.parsed_response['errorNum'].should eq(1600)
|
|
end
|
|
|
|
it "returns an error if restrict has an invalid type" do
|
|
cmd = api + "?collection=whatever"
|
|
doc = ArangoDB.log_post("#{prefix}-missing-restrict-type", cmd, :body => "{ \"restrict\" : \"foo\" }")
|
|
|
|
doc.code.should eq(400)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(400)
|
|
doc.parsed_response['errorNum'].should eq(17)
|
|
end
|
|
|
|
it "returns an error if restrict type is missing" do
|
|
cmd = api + "?collection=whatever"
|
|
doc = ArangoDB.log_post("#{prefix}-missing-restrict-type", cmd, :body => "{ \"restrict\" : { \"fields\" : [ ] } }")
|
|
|
|
doc.code.should eq(400)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(400)
|
|
doc.parsed_response['errorNum'].should eq(10)
|
|
end
|
|
|
|
it "returns an error if restrict type is invalid" do
|
|
cmd = api + "?collection=whatever"
|
|
doc = ArangoDB.log_post("#{prefix}-invalid-restrict-type", cmd, :body => "{ \"restrict\" : { \"type\" : \"foo\", \"fields\" : [ ] } }")
|
|
|
|
doc.code.should eq(400)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(400)
|
|
doc.parsed_response['errorNum'].should eq(10)
|
|
end
|
|
|
|
it "returns an error if restrict fields are missing" do
|
|
cmd = api + "?collection=whatever"
|
|
doc = ArangoDB.log_post("#{prefix}-missing-restrict-fields", cmd, :body => "{ \"restrict\" : { \"type\" : \"include\" } }")
|
|
|
|
doc.code.should eq(400)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(400)
|
|
doc.parsed_response['errorNum'].should eq(10)
|
|
end
|
|
|
|
it "returns an error if restrict fields are invalid" do
|
|
cmd = api + "?collection=whatever"
|
|
doc = ArangoDB.log_post("#{prefix}-invalid-restrict-fields", cmd, :body => "{ \"restrict\" : { \"type\" : \"include\", \"fields\" : \"foo\" } }")
|
|
|
|
doc.code.should eq(400)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(400)
|
|
doc.parsed_response['errorNum'].should eq(10)
|
|
end
|
|
|
|
end
|
|
|
|
################################################################################
|
|
## create and using exports
|
|
################################################################################
|
|
|
|
context "handling exports:" do
|
|
before do
|
|
@cn = "users"
|
|
ArangoDB.drop_collection(@cn)
|
|
@cid = ArangoDB.create_collection(@cn, false)
|
|
|
|
(0...10).each{|i|
|
|
ArangoDB.post("/_api/document?collection=#{@cid}", :body => "{ \"n\" : #{i} }")
|
|
}
|
|
end
|
|
|
|
after do
|
|
ArangoDB.drop_collection(@cn)
|
|
end
|
|
|
|
it "creates a cursor, single run" do
|
|
cmd = api + "?collection=#{@cid}"
|
|
body = "{ \"count\" : true, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-return-single", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(10)
|
|
end
|
|
|
|
it "creates a cursor, single run, no body" do
|
|
doc = ArangoDB.log_put("#{prefix}-return-single", "/_admin/wal/flush", :body => "{\"waitForSync\":true,\"waitForCollector\":true}")
|
|
|
|
cmd = api + "?collection=#{@cid}"
|
|
body = "{ \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-return-single", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should be_nil
|
|
doc.parsed_response['result'].length.should eq(10)
|
|
end
|
|
|
|
it "creates a cursor single run, without count" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : false, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-return-single", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(nil)
|
|
doc.parsed_response['result'].length.should eq(10)
|
|
end
|
|
|
|
it "creates a cursor single run, larger batch size" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 50, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-return-single-larger", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(10)
|
|
end
|
|
|
|
it "creates a cursor" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 4, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-limit-return", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(4)
|
|
|
|
id = doc.parsed_response['id']
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(4)
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont2", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(2)
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont3", cmd)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['errorNum'].should eq(1600)
|
|
doc.parsed_response['code'].should eq(404)
|
|
end
|
|
|
|
it "creates a cursor and deletes it in the middle" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 4, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-return", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(4)
|
|
|
|
id = doc.parsed_response['id']
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(4)
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_delete("#{prefix}-delete", cmd)
|
|
|
|
doc.code.should eq(202)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(202)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
end
|
|
|
|
it "deleting a cursor" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 2, \"flush\" : true }"
|
|
doc = ArangoDB.post(cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(2)
|
|
|
|
id = doc.parsed_response['id']
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_delete("#{prefix}-delete", cmd)
|
|
|
|
doc.code.should eq(202)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(202)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
end
|
|
|
|
it "deleting a deleted cursor" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 2, \"flush\" : true }"
|
|
doc = ArangoDB.post(cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(2)
|
|
|
|
id = doc.parsed_response['id']
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_delete("#{prefix}-delete", cmd)
|
|
|
|
doc.code.should eq(202)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(202)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
|
|
doc = ArangoDB.log_delete("#{prefix}-delete", cmd)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['errorNum'].should eq(1600);
|
|
doc.parsed_response['code'].should eq(404)
|
|
doc.parsed_response['id'].should be_nil
|
|
end
|
|
|
|
it "deleting an invalid cursor" do
|
|
cmd = api + "/999999" # we assume this cursor id is invalid
|
|
doc = ArangoDB.log_delete("#{prefix}-delete", cmd)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true);
|
|
doc.parsed_response['errorNum'].should eq(1600);
|
|
doc.parsed_response['code'].should eq(404)
|
|
doc.parsed_response['id'].should be_nil
|
|
end
|
|
|
|
it "creates a cursor that will expire" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 1, \"ttl\" : 4, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-create-ttl", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(1)
|
|
|
|
sleep 1
|
|
id = doc.parsed_response['id']
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-create-ttl", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(1)
|
|
|
|
sleep 1
|
|
|
|
doc = ArangoDB.log_put("#{prefix}-create-ttl", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(1)
|
|
|
|
# after this, the cursor might expire eventually
|
|
# the problem is that we cannot exactly determine the point in time
|
|
# when it really vanishes, as this depends on thread scheduling, state
|
|
# of the cleanup thread etc.
|
|
|
|
# sleep 10 # this should delete the cursor on the server
|
|
# doc = ArangoDB.log_put("#{prefix}-create-ttl", cmd)
|
|
# doc.code.should eq(404)
|
|
# doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
# doc.parsed_response['error'].should eq(true)
|
|
# doc.parsed_response['errorNum'].should eq(1600)
|
|
# doc.parsed_response['code'].should eq(404)
|
|
end
|
|
|
|
it "creates a cursor that will not expire" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 1, \"ttl\" : 60, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-create-ttl", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(1)
|
|
|
|
sleep 1
|
|
id = doc.parsed_response['id']
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-create-ttl", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(1)
|
|
|
|
sleep 1
|
|
|
|
doc = ArangoDB.log_put("#{prefix}-create-ttl", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(1)
|
|
|
|
sleep 5 # this should not delete the cursor on the server
|
|
|
|
doc = ArangoDB.log_put("#{prefix}-create-ttl", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(10)
|
|
doc.parsed_response['result'].length.should eq(1)
|
|
|
|
# must clean up. otherwise we'll have to wait 60 seconds!
|
|
doc = ArangoDB.log_delete("#{prefix}-create-ttl", cmd)
|
|
end
|
|
end
|
|
|
|
################################################################################
|
|
## create and using exports
|
|
################################################################################
|
|
|
|
context "handling bigger exports:" do
|
|
before do
|
|
@cn = "users"
|
|
ArangoDB.drop_collection(@cn)
|
|
@cid = ArangoDB.create_collection(@cn, false)
|
|
|
|
ArangoDB.post("/_admin/execute", :body => "var db = require('internal').db, c = db.#{@cn}; for (var i = 0; i < 2000; ++i) { c.save({ n: i }); }")
|
|
end
|
|
|
|
after do
|
|
ArangoDB.drop_collection(@cn)
|
|
end
|
|
|
|
it "creates a cursor, single run" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 2000, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-return-single", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
end
|
|
|
|
it "creates a cursor, multiple runs" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 700, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-limit-return", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(700)
|
|
|
|
id = doc.parsed_response['id']
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(700)
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont2", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(600)
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont3", cmd)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['errorNum'].should eq(1600)
|
|
doc.parsed_response['code'].should eq(404)
|
|
end
|
|
|
|
it "consumes a cursor, while compaction is running" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 700, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-limit-return", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(700)
|
|
|
|
id = doc.parsed_response['id']
|
|
|
|
# truncating the collection should not affect the results in the cursor
|
|
cmd = "/_api/collection/#{@cn}/truncate"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
# flush wal
|
|
cmd = "/_admin/wal/flush?waitForSync=true&waitForCollector=true"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
# rotate the journal
|
|
cmd = "/_api/collection/#{@cn}/rotate"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
sleep 4
|
|
|
|
# now continue with the cursor
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['id'].should eq(id)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(700)
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont2", cmd)
|
|
|
|
doc.code.should eq(200)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(200)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(600)
|
|
|
|
cmd = api + "/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont3", cmd)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['errorNum'].should eq(1600)
|
|
doc.parsed_response['code'].should eq(404)
|
|
end
|
|
|
|
it "using limit" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 2000, \"flush\" : true, \"limit\" : 5 }"
|
|
doc = ArangoDB.log_post("#{prefix}-limit", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(5)
|
|
doc.parsed_response['result'].length.should eq(5)
|
|
end
|
|
|
|
it "using limit == collection size" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 2000, \"flush\" : true, \"limit\" : 2000 }"
|
|
doc = ArangoDB.log_post("#{prefix}-limit-eq", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
end
|
|
|
|
it "using limit > collection size" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 2000, \"flush\" : true, \"limit\" : 200000 }"
|
|
doc = ArangoDB.log_post("#{prefix}-limit", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
end
|
|
|
|
it "calls wrong cursor API" do
|
|
|
|
cmd = "/_api/engine"
|
|
doc = ArangoDB.log_get("#{prefix}-limit-return", cmd)
|
|
doc.code.should eq(200)
|
|
if doc.parsed_response['name'] != 'rocksdb'
|
|
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 100, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-limit-return", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_kind_of(String)
|
|
doc.parsed_response['id'].should match(@reId)
|
|
doc.parsed_response['hasMore'].should eq(true)
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['result'].length.should eq(100)
|
|
|
|
id = doc.parsed_response['id']
|
|
|
|
# intentionally wrong
|
|
cmd = "/_api/cursor/#{id}"
|
|
doc = ArangoDB.log_put("#{prefix}-return-cont", cmd)
|
|
|
|
doc.code.should eq(404)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(true)
|
|
doc.parsed_response['code'].should eq(404)
|
|
doc.parsed_response['errorNum'].should eq(1600)
|
|
end
|
|
end
|
|
end
|
|
|
|
################################################################################
|
|
## using restrictions
|
|
################################################################################
|
|
|
|
context "handling restrictions:" do
|
|
before do
|
|
@cn = "users"
|
|
ArangoDB.drop_collection(@cn)
|
|
@cid = ArangoDB.create_collection(@cn, false)
|
|
|
|
ArangoDB.post("/_admin/execute", :body => "var db = require('internal').db, c = db.#{@cn}; for (var i = 0; i < 2000; ++i) { c.save({ a: i, b: i, c: i }); }")
|
|
end
|
|
|
|
after do
|
|
ArangoDB.drop_collection(@cn)
|
|
end
|
|
|
|
it "includes a single attribute" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"count\" : true, \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"include\", \"fields\" : [ \"b\" ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-include-single", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['count'].should eq(2000)
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(1)
|
|
oneDoc.should have_key('b')
|
|
}
|
|
end
|
|
|
|
it "includes a few attributes" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"include\", \"fields\" : [ \"b\", \"_id\", \"_rev\", \"a\" ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-include-few", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(4)
|
|
oneDoc.should have_key('a')
|
|
oneDoc.should have_key('b')
|
|
oneDoc.should_not have_key('c')
|
|
oneDoc.should_not have_key('_key')
|
|
oneDoc.should have_key('_id')
|
|
oneDoc.should have_key('_rev')
|
|
}
|
|
end
|
|
|
|
it "includes non-existing attributes" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"include\", \"fields\" : [ \"c\", \"xxxx\", \"A\" ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-include-non-existing", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(1)
|
|
oneDoc.should have_key('c')
|
|
}
|
|
end
|
|
|
|
it "includes no attributes" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"include\", \"fields\" : [ ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-include-none", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(0)
|
|
}
|
|
end
|
|
|
|
it "excludes a single attribute" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"exclude\", \"fields\" : [ \"b\" ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-exclude-single", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(5)
|
|
oneDoc.should_not have_key('b')
|
|
oneDoc.should have_key('a')
|
|
oneDoc.should have_key('c')
|
|
oneDoc.should have_key('_id')
|
|
oneDoc.should have_key('_key')
|
|
oneDoc.should have_key('_rev')
|
|
}
|
|
end
|
|
|
|
it "excludes a few attributes" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"exclude\", \"fields\" : [ \"b\", \"_id\", \"_rev\", \"a\" ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-exclude-few", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(2)
|
|
oneDoc.should have_key('c')
|
|
oneDoc.should have_key('_key')
|
|
}
|
|
end
|
|
|
|
it "excludes non-existing attributes" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"exclude\", \"fields\" : [ \"c\", \"xxxx\", \"A\" ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-exclude-non-existing", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(5)
|
|
oneDoc.should_not have_key('c')
|
|
}
|
|
end
|
|
|
|
it "excludes no attributes" do
|
|
cmd = api + "?collection=#{@cn}"
|
|
body = "{ \"batchSize\" : 2000, \"restrict\" : { \"type\" : \"exclude\", \"fields\" : [ ] }, \"flush\" : true }"
|
|
doc = ArangoDB.log_post("#{prefix}-exclude-none", cmd, :body => body)
|
|
|
|
doc.code.should eq(201)
|
|
doc.headers['content-type'].should eq("application/json; charset=utf-8")
|
|
doc.parsed_response['error'].should eq(false)
|
|
doc.parsed_response['code'].should eq(201)
|
|
doc.parsed_response['id'].should be_nil
|
|
doc.parsed_response['hasMore'].should eq(false)
|
|
doc.parsed_response['result'].length.should eq(2000)
|
|
|
|
doc.parsed_response['result'].each{|oneDoc|
|
|
oneDoc.size.should eq(6)
|
|
}
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|