mirror of https://gitee.com/bigwinds/arangodb
some more meaningful tests
This commit is contained in:
parent
856a1bf9f6
commit
3904a5ae8d
|
@ -52,24 +52,135 @@ describe ArangoDB do
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
## checking invalid posts
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
context "checking wrong/missing content-type/boundary:" do
|
||||||
|
it "checks missing content-type" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-ct-none", cmd, :body => "xx" )
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks invalid content-type (xxx)" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-ct-wrong-1", cmd, :body => "xx", :headers => { "Content-Type" => "xxx/xxx" } )
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks invalid content-type (json)" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-ct-wrong-2", cmd, :body => "xx", :headers => { "Content-Type" => "application/json" } )
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks valid content-type with missing boundary" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-boundary-wrong-1", cmd, :body => "xx", :headers => { "Content-Type" => "multipart/form-data" } )
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks valid content-type with unexpected boundary" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-boundary-wrong-2", cmd, :body => "xx", :headers => { "Content-Type" => "multipart/form-data; peng" } )
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks valid content-type with broken boundary" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-boundary-wrong-3", cmd, :body => "xx", :headers => { "Content-Type" => "multipart/form-data; boundary=" } )
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks valid content-type with too short boundary" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-boundary-wrong-4", cmd, :body => "xx", :headers => { "Content-Type" => "multipart/form-data; boundary=a" } )
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
## checking simple batches
|
## checking simple batches
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
context "checking simple requests:" do
|
context "checking simple requests:" do
|
||||||
|
|
||||||
it "checks whether POST is allowed on /_api/batch" do
|
it "checks an empty operation multipart message" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
multipart = ArangoMultipartBody.new()
|
||||||
|
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-version-empty", cmd, :body => multipart.to_s, :format => :json, :headers => { "Content-Type" => "multipart/form-data; boundary=" + multipart.getBoundary })
|
||||||
|
|
||||||
|
doc.code.should eq(400)
|
||||||
|
doc.parsed_response['error'].should eq(true)
|
||||||
|
doc.parsed_response['code'].should eq(400)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks a multipart message with a single operation" do
|
||||||
cmd = "/_api/batch"
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
multipart = ArangoMultipartBody.new()
|
multipart = ArangoMultipartBody.new()
|
||||||
|
|
||||||
multipart.addPart("GET", "/_api/version", { }, "")
|
multipart.addPart("GET", "/_api/version", { }, "")
|
||||||
# multipart.addPart("GET", "/_api/version", { }, "")
|
doc = ArangoDB.log_post("#{prefix}-post-version-one", cmd, :body => multipart.to_s, :format => :plain, :headers => { "Content-Type" => "multipart/form-data; boundary=" + multipart.getBoundary })
|
||||||
doc = ArangoDB.log_post("#{prefix}-post-version1", cmd, :body => multipart.to_s, :format => :plain, :headers => { "Content-Type" => "multipart/form-data; boundary=" + multipart.getBoundary })
|
|
||||||
|
|
||||||
doc.code.should eq(200)
|
doc.code.should eq(200)
|
||||||
# doc.parsed_response['error'].should eq(false)
|
|
||||||
# doc.parsed_response['code'].should eq(200)
|
parts = multipart.getParts(multipart.getBoundary, doc.response.body)
|
||||||
|
|
||||||
|
parts.each do|part|
|
||||||
|
part[:status].should eq(200)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "checks a multipart message with a multiple operations" do
|
||||||
|
cmd = "/_api/batch"
|
||||||
|
|
||||||
|
multipart = ArangoMultipartBody.new()
|
||||||
|
|
||||||
|
multipart.addPart("GET", "/_api/version", { }, "")
|
||||||
|
multipart.addPart("GET", "/_api/version", { }, "")
|
||||||
|
multipart.addPart("GET", "/_api/version", { }, "")
|
||||||
|
multipart.addPart("GET", "/_api/version", { }, "")
|
||||||
|
doc = ArangoDB.log_post("#{prefix}-post-version-mult", cmd, :body => multipart.to_s, :format => :plain, :headers => { "Content-Type" => "multipart/form-data; boundary=" + multipart.getBoundary })
|
||||||
|
|
||||||
|
doc.code.should eq(200)
|
||||||
|
|
||||||
|
parts = multipart.getParts(multipart.getBoundary, doc.response.body)
|
||||||
|
|
||||||
|
parts.each do|part|
|
||||||
|
part[:status].should eq(200)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,6 +36,86 @@ class ArangoMultipartBody
|
||||||
@parts.push(part)
|
@parts.push(part)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
## split the response body into its individual parts
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
def getParts (boundary, body)
|
||||||
|
parts = [ ]
|
||||||
|
valid = false
|
||||||
|
|
||||||
|
while 1
|
||||||
|
position = body.index("--" + boundary)
|
||||||
|
|
||||||
|
break if position != 0 or position == nil
|
||||||
|
|
||||||
|
follow = body.slice(position + boundary.length + 2, 2)
|
||||||
|
|
||||||
|
break if follow != "\r\n" and follow != "--"
|
||||||
|
|
||||||
|
if follow == "--"
|
||||||
|
valid = true
|
||||||
|
break
|
||||||
|
end if
|
||||||
|
|
||||||
|
# strip boundary start from body
|
||||||
|
body = body.slice(position + boundary.length + 4, body.length)
|
||||||
|
|
||||||
|
# look for boundary end
|
||||||
|
final = body.index("--" + boundary)
|
||||||
|
|
||||||
|
break if final == nil
|
||||||
|
|
||||||
|
# extract the part
|
||||||
|
partTotal = body.slice(0, final)
|
||||||
|
|
||||||
|
# look for envelope bounds
|
||||||
|
position = partTotal.index("\r\n\r\n");
|
||||||
|
break if position == nil
|
||||||
|
|
||||||
|
# strip envelope
|
||||||
|
partTotal = partTotal.slice(position + 4, partTotal.length)
|
||||||
|
|
||||||
|
# look for actual header & body
|
||||||
|
partHeader, partBody = "", ""
|
||||||
|
position = partTotal.index("\r\n\r\n");
|
||||||
|
|
||||||
|
break if position == nil
|
||||||
|
|
||||||
|
partHeader = partTotal.slice(0, position)
|
||||||
|
partBody = partTotal.slice(position + 4, partTotal.length)
|
||||||
|
|
||||||
|
partHeaders = { }
|
||||||
|
status = 500
|
||||||
|
lineNumber = 0
|
||||||
|
|
||||||
|
# parse headers and status code
|
||||||
|
|
||||||
|
partHeader.each_line("\r\n") do |line|
|
||||||
|
if lineNumber == 0
|
||||||
|
position = line.index("HTTP/1.1 ")
|
||||||
|
break if position == nil
|
||||||
|
status = line.slice(9, 3).to_i
|
||||||
|
else
|
||||||
|
key, void, value = line.partition(":")
|
||||||
|
partHeaders[key.strip] = value.strip
|
||||||
|
end
|
||||||
|
lineNumber = lineNumber + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
part = { :headers => partHeaders, :body => partBody, :status => status }
|
||||||
|
parts.push(part)
|
||||||
|
|
||||||
|
body = body.slice(final, body.length)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not valid
|
||||||
|
raise "invalid multipart response received"
|
||||||
|
end
|
||||||
|
|
||||||
|
parts
|
||||||
|
end
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
## get the string representation of a multipart message body
|
## get the string representation of a multipart message body
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
Loading…
Reference in New Issue