Merge pull request #77 from 5apps/bugfix/api_suite_regression_fixes

[WIP] API-test-suite regression fixes
This commit is contained in:
Greg Karékinian 2016-03-04 21:00:01 +01:00
commit 8bcb8bf337
2 changed files with 45 additions and 36 deletions

View File

@ -72,14 +72,14 @@ module RemoteStorage
none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").split(",").map(&:strip) none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").split(",").map(&:strip)
if etag 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) items = get_directory_listing_from_redis_via_lua(user, directory)
else else
etag = etag_for(user, directory) etag = etag_for(user, directory)
items = {} items = {}
server.halt 304 if none_match.include? etag server.halt 304 if none_match.include? %Q("#{etag}")
end end
server.headers["ETag"] = %Q("#{etag}") server.headers["ETag"] = %Q("#{etag}")
@ -130,9 +130,10 @@ module RemoteStorage
end end
def put_data(user, directory, key, data, content_type) 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) 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) url = url_for_key(user, directory, key)
if required_match = server.env["HTTP_IF_MATCH"] if required_match = server.env["HTTP_IF_MATCH"]
@ -220,35 +221,6 @@ module RemoteStorage
permission permission
end 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) def has_name_collision?(user, directory, key)
lua_script = <<-EOF lua_script = <<-EOF
local user = ARGV[1] local user = ARGV[1]
@ -337,7 +309,7 @@ module RemoteStorage
end end
def update_metadata_object(user, directory, key, metadata) 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.hmset(redis_key, *metadata)
redis.sadd "rs:m:#{user}:#{directory}/:items", key redis.sadd "rs:m:#{user}:#{directory}/:items", key
@ -356,8 +328,7 @@ module RemoteStorage
end end
def delete_metadata_objects(user, directory, key) def delete_metadata_objects(user, directory, key)
redis_key = "rs:m:#{user}:#{directory}/#{key}" redis.del redis_metadata_object_key(user, directory, key)
redis.del(redis_key)
redis.srem "rs:m:#{user}:#{directory}/:items", key redis.srem "rs:m:#{user}:#{directory}/:items", key
end end
@ -381,6 +352,10 @@ module RemoteStorage
redis.smembers("rs:m:#{user}:#{dir}/:items").empty? redis.smembers("rs:m:#{user}:#{dir}/:items").empty?
end end
def redis_metadata_object_key(user, directory, key)
"rs:m:#{user}:#{[directory, key].delete_if(&:empty?).join("/")}"
end
def container_url_for(user) def container_url_for(user)
"#{base_url}/#{container_for(user)}" "#{base_url}/#{container_for(user)}"
end end

View File

@ -74,6 +74,32 @@ describe "App" do
root_items.must_equal ["food/"] root_items.must_equal ["food/"]
end 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 describe "name collision checks" do
it "is successful when there is no name collision" do it "is successful when there is no name collision" do
put_stub = OpenStruct.new(headers: { put_stub = OpenStruct.new(headers: {
@ -129,6 +155,14 @@ describe "App" do
metadata = redis.hgetall "rs:m:phil:food/aguacate/empanado" metadata = redis.hgetall "rs:m:phil:food/aguacate/empanado"
metadata.must_be_empty metadata.must_be_empty
end 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 end
end end
@ -271,7 +305,7 @@ describe "App" do
end end
it "responds with 304 when IF_NONE_MATCH header contains the ETag" do 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/" get "/phil/food/"
last_response.status.must_equal 304 last_response.status.must_equal 304