Merge pull request #77 from 5apps/bugfix/api_suite_regression_fixes
[WIP] API-test-suite regression fixes
This commit is contained in:
commit
8bcb8bf337
@ -72,14 +72,14 @@ module RemoteStorage
|
||||
none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").split(",").map(&:strip)
|
||||
|
||||
if etag
|
||||
server.halt 304 if none_match.include? etag
|
||||
server.halt 304 if none_match.include? %Q("#{etag}")
|
||||
|
||||
items = get_directory_listing_from_redis_via_lua(user, directory)
|
||||
else
|
||||
etag = etag_for(user, directory)
|
||||
items = {}
|
||||
|
||||
server.halt 304 if none_match.include? etag
|
||||
server.halt 304 if none_match.include? %Q("#{etag}")
|
||||
end
|
||||
|
||||
server.headers["ETag"] = %Q("#{etag}")
|
||||
@ -130,9 +130,10 @@ module RemoteStorage
|
||||
end
|
||||
|
||||
def put_data(user, directory, key, data, content_type)
|
||||
server.halt 400 if server.env["HTTP_CONTENT_RANGE"]
|
||||
server.halt 409 if has_name_collision?(user, directory, key)
|
||||
|
||||
existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}"
|
||||
existing_metadata = redis.hgetall redis_metadata_object_key(user, directory, key)
|
||||
url = url_for_key(user, directory, key)
|
||||
|
||||
if required_match = server.env["HTTP_IF_MATCH"]
|
||||
@ -220,35 +221,6 @@ module RemoteStorage
|
||||
permission
|
||||
end
|
||||
|
||||
def directory_listing(res_body)
|
||||
listing = {
|
||||
"@context" => "http://remotestorage.io/spec/folder-description",
|
||||
"items" => {}
|
||||
}
|
||||
|
||||
res_body.each do |entry|
|
||||
name = entry["name"]
|
||||
name.sub!("#{File.dirname(entry["name"])}/", '')
|
||||
if name[-1] == "/" # It's a directory
|
||||
listing["items"].merge!({
|
||||
name => {
|
||||
"ETag" => entry["hash"],
|
||||
}
|
||||
})
|
||||
else # It's a file
|
||||
listing["items"].merge!({
|
||||
name => {
|
||||
"ETag" => entry["hash"],
|
||||
"Content-Type" => entry["content_type"],
|
||||
"Content-Length" => entry["bytes"]
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
listing
|
||||
end
|
||||
|
||||
def has_name_collision?(user, directory, key)
|
||||
lua_script = <<-EOF
|
||||
local user = ARGV[1]
|
||||
@ -337,7 +309,7 @@ module RemoteStorage
|
||||
end
|
||||
|
||||
def update_metadata_object(user, directory, key, metadata)
|
||||
redis_key = "rs:m:#{user}:#{directory}/#{key}"
|
||||
redis_key = redis_metadata_object_key(user, directory, key)
|
||||
redis.hmset(redis_key, *metadata)
|
||||
redis.sadd "rs:m:#{user}:#{directory}/:items", key
|
||||
|
||||
@ -356,8 +328,7 @@ module RemoteStorage
|
||||
end
|
||||
|
||||
def delete_metadata_objects(user, directory, key)
|
||||
redis_key = "rs:m:#{user}:#{directory}/#{key}"
|
||||
redis.del(redis_key)
|
||||
redis.del redis_metadata_object_key(user, directory, key)
|
||||
redis.srem "rs:m:#{user}:#{directory}/:items", key
|
||||
end
|
||||
|
||||
@ -381,6 +352,10 @@ module RemoteStorage
|
||||
redis.smembers("rs:m:#{user}:#{dir}/:items").empty?
|
||||
end
|
||||
|
||||
def redis_metadata_object_key(user, directory, key)
|
||||
"rs:m:#{user}:#{[directory, key].delete_if(&:empty?).join("/")}"
|
||||
end
|
||||
|
||||
def container_url_for(user)
|
||||
"#{base_url}/#{container_for(user)}"
|
||||
end
|
||||
|
||||
@ -74,6 +74,32 @@ describe "App" do
|
||||
root_items.must_equal ["food/"]
|
||||
end
|
||||
|
||||
describe "objects in root dir" do
|
||||
before do
|
||||
put_stub = OpenStruct.new(headers: {
|
||||
etag: "bla",
|
||||
last_modified: "Fri, 04 Mar 2016 12:20:18 GMT"
|
||||
})
|
||||
|
||||
RestClient.stub :put, put_stub do
|
||||
put "/phil/bamboo.txt", "shir kan"
|
||||
end
|
||||
end
|
||||
|
||||
it "are listed in the directory listing with all metadata" do
|
||||
get "phil/"
|
||||
|
||||
last_response.status.must_equal 200
|
||||
last_response.content_type.must_equal "application/json"
|
||||
|
||||
content = JSON.parse(last_response.body)
|
||||
content["items"]["bamboo.txt"].wont_be_nil
|
||||
content["items"]["bamboo.txt"]["ETag"].must_equal "bla"
|
||||
content["items"]["bamboo.txt"]["Content-Type"].must_equal "text/plain; charset=utf-8"
|
||||
content["items"]["bamboo.txt"]["Content-Length"].must_equal 8
|
||||
end
|
||||
end
|
||||
|
||||
describe "name collision checks" do
|
||||
it "is successful when there is no name collision" do
|
||||
put_stub = OpenStruct.new(headers: {
|
||||
@ -129,6 +155,14 @@ describe "App" do
|
||||
metadata = redis.hgetall "rs:m:phil:food/aguacate/empanado"
|
||||
metadata.must_be_empty
|
||||
end
|
||||
|
||||
it "returns 400 when a Content-Range header is sent" do
|
||||
header "Content-Range", "bytes 0-3/3"
|
||||
|
||||
put "/phil/food/aguacate", "si"
|
||||
|
||||
last_response.status.must_equal 400
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -271,7 +305,7 @@ describe "App" do
|
||||
end
|
||||
|
||||
it "responds with 304 when IF_NONE_MATCH header contains the ETag" do
|
||||
header "If-None-Match", "a693babe4b4027de2340b4f1c362d2c8"
|
||||
header "If-None-Match", "\"a693babe4b4027de2340b4f1c362d2c8\""
|
||||
get "/phil/food/"
|
||||
|
||||
last_response.status.must_equal 304
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user