diff --git a/lib/rabbitmq/http/client.rb b/lib/rabbitmq/http/client.rb index e6875d0..0c7f854 100644 --- a/lib/rabbitmq/http/client.rb +++ b/lib/rabbitmq/http/client.rb @@ -177,8 +177,12 @@ def declare_queue(vhost, name, attributes) decode_resource(response) end - def delete_queue(vhost, name) - decode_resource(@connection.delete("queues/#{encode_uri_path_segment(vhost)}/#{encode_uri_path_segment(name)}")) + def delete_queue(vhost, name, if_unused = false, if_empty = false) + response = @connection.delete("queues/#{encode_uri_path_segment(vhost)}/#{encode_uri_path_segment(name)}") do |req| + req.params["if-unused"] = true if if_unused + req.params["if-empty"] = true if if_empty + end + decode_resource(response) end def list_queue_bindings(vhost, queue, query = {}) diff --git a/lib/rabbitmq/http/client/response_helper.rb b/lib/rabbitmq/http/client/response_helper.rb index 6172630..452035c 100644 --- a/lib/rabbitmq/http/client/response_helper.rb +++ b/lib/rabbitmq/http/client/response_helper.rb @@ -31,7 +31,13 @@ def decode_response_body(body) def decode_resource_collection(response) collection = response.body.is_a?(Array) ? response.body : response.body.fetch('items') - collection.map { |i| Hashie::Mash.new(i) } + collection.map do |i| + if i == [] + Hashie::Mash.new() + else + Hashie::Mash.new(i) + end + end end end end diff --git a/spec/integration/api_endpoints_spec.rb b/spec/integration/api_endpoints_spec.rb index f36fa40..4ddd895 100644 --- a/spec/integration/api_endpoints_spec.rb +++ b/spec/integration/api_endpoints_spec.rb @@ -505,6 +505,35 @@ def await_event_propagation it "deletes a queue" do q = @channel.queue(queue_name, durable: false) subject.delete_queue("/", queue_name) + expect { subject.queue_info("/", queue_name) }.to raise_error(Faraday::ResourceNotFound) + end + + it "doesn't delete non-empty queue if if-empty is set" do + q = @channel.queue(queue_name, durable: false) + q.publish("hello") + expect do + subject.delete_queue("/", queue_name, false, true) + end.to raise_error(Faraday::ClientError) + + subject.purge_queue("/", q.name) + subject.delete_queue("/", queue_name, false, true) + expect { subject.queue_info("/", queue_name) }.to raise_error(Faraday::ResourceNotFound) + end + + it "doesn't delete used queue if if-unused is set" do + q = @channel.queue(queue_name, durable: false) + # Simulate the queue being used by creating a consumer + consumer = q.subscribe do |_delivery_info, _properties, _body| + # consumer block + end + + expect do + subject.delete_queue("/", queue_name, true, false) + end.to raise_error(Faraday::ClientError) + + consumer.cancel + subject.delete_queue("/", queue_name, true, false) + expect { subject.queue_info("/", queue_name) }.to raise_error(Faraday::ResourceNotFound) end end