Merge branch 'master' into stable

This commit is contained in:
Garret Alfert 2016-08-08 15:54:07 +02:00
commit 04197a517e
2 changed files with 78 additions and 15 deletions

View File

@ -163,7 +163,7 @@ module RemoteStorage
end end
server.headers["ETag"] = %Q("#{res.headers[:etag]}") server.headers["ETag"] = %Q("#{res.headers[:etag]}")
server.halt 200 server.halt existing_metadata.empty? ? 201 : 200
else else
server.halt 500 server.halt 500
end end
@ -180,6 +180,7 @@ module RemoteStorage
def delete_data(user, directory, key) def delete_data(user, directory, key)
url = url_for_key(user, directory, key) url = url_for_key(user, directory, key)
not_found = false
existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}" existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}"
@ -187,15 +188,22 @@ module RemoteStorage
server.halt 412, "Precondition Failed" unless required_match == %Q("#{existing_metadata["e"]}") server.halt 412, "Precondition Failed" unless required_match == %Q("#{existing_metadata["e"]}")
end end
begin
do_delete_request(url) do_delete_request(url)
rescue RestClient::ResourceNotFound
not_found = true
end
log_size_difference(user, existing_metadata["s"], 0) log_size_difference(user, existing_metadata["s"], 0)
delete_metadata_objects(user, directory, key) delete_metadata_objects(user, directory, key)
delete_dir_objects(user, directory) delete_dir_objects(user, directory)
if not_found
server.halt 404, "Not Found"
else
server.headers["Etag"] = %Q("#{existing_metadata["e"]}") server.headers["Etag"] = %Q("#{existing_metadata["e"]}")
server.halt 200 server.halt 200
rescue RestClient::ResourceNotFound end
server.halt 404, "Not Found"
end end
private private

View File

@ -74,13 +74,38 @@ describe "App" do
root_items.must_equal ["food/"] root_items.must_equal ["food/"]
end end
context "response code" do
before do
@put_stub = OpenStruct.new(headers: {
etag: "bla",
last_modified: "Fri, 04 Mar 2016 12:20:18 GMT"
})
end
it "is 201 for newly created objects" do
RestClient.stub :put, @put_stub do
put "/phil/food/aguacate", "muy deliciosa"
end
last_response.status.must_equal 201
end
it "is 200 for updated objects" do
RestClient.stub :put, @put_stub do
put "/phil/food/aguacate", "deliciosa"
put "/phil/food/aguacate", "muy deliciosa"
end
last_response.status.must_equal 200
end
end
context "logging usage size" do context "logging usage size" do
before do before do
@put_stub = OpenStruct.new(headers: { @put_stub = OpenStruct.new(headers: {
etag: "bla", etag: "bla",
last_modified: "Fri, 04 Mar 2016 12:20:18 GMT" last_modified: "Fri, 04 Mar 2016 12:20:18 GMT"
}) })
end end
it "logs the complete size when creating new objects" do it "logs the complete size when creating new objects" do
@ -146,7 +171,7 @@ describe "App" do
end end
end end
last_response.status.must_equal 200 last_response.status.must_equal 201
metadata = redis.hgetall "rs:m:phil:food/aguacate" metadata = redis.hgetall "rs:m:phil:food/aguacate"
metadata["s"].must_equal "2" metadata["s"].must_equal "2"
@ -247,7 +272,7 @@ describe "App" do
put "/phil/food/aguacate", "si" put "/phil/food/aguacate", "si"
end end
last_response.status.must_equal 200 last_response.status.must_equal 201
end end
it "fails the request if the document already exsits" do it "fails the request if the document already exsits" do
@ -397,14 +422,44 @@ describe "App" do
last_response.headers["ETag"].must_equal "\"bla\"" last_response.headers["ETag"].must_equal "\"bla\""
end end
it "returns a 404 when item doesn't exist" do context "when item doesn't exist" do
before do
purge_redis
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/food/steak", "si"
end
raises_exception = ->(url, headers) { raise RestClient::ResourceNotFound.new }
RestClient.stub :delete, raises_exception do
delete "/phil/food/steak"
end
end
it "returns a 404" do
last_response.status.must_equal 404
last_response.body.must_equal "Not Found"
end
it "deletes any metadata that might still exist" do
raises_exception = ->(url, headers) { raise RestClient::ResourceNotFound.new } raises_exception = ->(url, headers) { raise RestClient::ResourceNotFound.new }
RestClient.stub :delete, raises_exception do RestClient.stub :delete, raises_exception do
delete "/phil/food/steak" delete "/phil/food/steak"
end end
last_response.status.must_equal 404 metadata = redis.hgetall "rs:m:phil:food/steak"
last_response.body.must_equal "Not Found" metadata.must_be_empty
redis.smembers("rs:m:phil:food/:items").must_be_empty
redis.hgetall("rs:m:phil:food/").must_be_empty
redis.smembers("rs:m:phil:/:items").must_be_empty
end
end end
describe "If-Match header" do describe "If-Match header" do