From 625ca8e2557ee9b58469a8ccfdb1fdcc5994b479 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Mon, 20 Jan 2014 14:21:38 -0500 Subject: [PATCH] get_message and list_messages mocks. --- lib/fog/rackspace/queues.rb | 42 ++++++++++++++----- .../rackspace/requests/queues/create_queue.rb | 2 +- .../rackspace/requests/queues/get_message.rb | 18 ++++++++ .../requests/queues/list_messages.rb | 33 +++++++++++++++ 4 files changed, 83 insertions(+), 12 deletions(-) diff --git a/lib/fog/rackspace/queues.rb b/lib/fog/rackspace/queues.rb index 2ea93f310..16ad89920 100644 --- a/lib/fog/rackspace/queues.rb +++ b/lib/fog/rackspace/queues.rb @@ -92,14 +92,13 @@ module Fog # An in-memory Queue implementation. class MockQueue - attr_accessor :messages - attr_accessor :metadata + attr_accessor :name, :metadata, :messages attr_accessor :claimed, :free - def initialize - @messages = [] - @metadata = {} - @claimed, @free = 0, 0, 0 + def initialize(name) + @name = name + @messages, @metadata = [], {} + @claimed, @free = 0, 0 @id_counter = Fog::Mock.random_hex(24).to_i(16) end @@ -119,7 +118,7 @@ module Fog def add_message(client_id, data, ttl) id = @id_counter.to_s(16) @id_counter += 1 - message = MockMessage.new(id, client_id, data, ttl) + message = MockMessage.new(id, self, client_id, data, ttl) @messages << message message end @@ -127,12 +126,33 @@ module Fog # A single message posted to an in-memory MockQueue. class MockMessage - attr_accessor :id, :data, :ttl, :producer_id + attr_accessor :id, :queue, :data, :ttl, :producer_id, :claimant_id # Create a new message. Use {MockQueue#add_message} instead. - def initialize(id, client_id, data, ttl) - @id, @producer_id = id, client_id - @data, @ttl = client_id, data, ttl + def initialize(id, queue, client_id, data, ttl) + @id, @queue, @producer_id = id, queue, client_id + @data, @ttl = data, ttl + @created = Time.now.to_i + @claimant_id = nil + end + + # Determine how long ago this message was created, in seconds. + # + # @return [Integer] + def age + Time.now.to_i - @created + end + + # Convert this message to a GET payload. + # + # @return [Hash] + def to_h + { + "body" => @data, + "age" => age, + "ttl" => @ttl, + "href" => "/v1/queues/#{@queue.name}/messages/#{@id}" + } end end diff --git a/lib/fog/rackspace/requests/queues/create_queue.rb b/lib/fog/rackspace/requests/queues/create_queue.rb index 79e1bb665..ca9054cf5 100644 --- a/lib/fog/rackspace/requests/queues/create_queue.rb +++ b/lib/fog/rackspace/requests/queues/create_queue.rb @@ -30,7 +30,7 @@ module Fog existed = ! data[queue_name].nil? unless existed - data[queue_name] = MockQueue.new + data[queue_name] = MockQueue.new(queue_name) end response = Excon::Response.new diff --git a/lib/fog/rackspace/requests/queues/get_message.rb b/lib/fog/rackspace/requests/queues/get_message.rb index a5b616d76..2d73f41e1 100644 --- a/lib/fog/rackspace/requests/queues/get_message.rb +++ b/lib/fog/rackspace/requests/queues/get_message.rb @@ -1,6 +1,7 @@ module Fog module Rackspace class Queues + class Real # This operation gets the specified message from the specified queue. @@ -22,7 +23,24 @@ module Fog :headers => { 'Client-ID' => client_id } ) end + end + + class Mock + def get_message(client_id, queue_name, message_id) + queue = data[queue_name] + raise NotFound.new unless queue + + message = queue.messages.find { |msg| msg.id == message_id } + raise NotFound.new unless message + + response = Excon::Response.new + response.status = 200 + response.body = message.to_h + response + end + end + end end end diff --git a/lib/fog/rackspace/requests/queues/list_messages.rb b/lib/fog/rackspace/requests/queues/list_messages.rb index d409a2ca1..27c9c25cf 100644 --- a/lib/fog/rackspace/requests/queues/list_messages.rb +++ b/lib/fog/rackspace/requests/queues/list_messages.rb @@ -1,6 +1,7 @@ module Fog module Rackspace class Queues + class Real # This operation gets the message or messages in the specified queue. @@ -38,6 +39,38 @@ module Fog ) end end + + class Mock + def list_messages(client_id, queue_name, options = {}) + queue = data[queue_name] + raise NotFound.new unless queue + + marker = (options[:marker] || "0").to_i + limit = options[:limit] || 10 + echo = options[:echo] || false + include_claimed = options[:include_claimed] || false + + next_marker = marker + limit + 1 + messages = queue.messages[marker...next_marker] + messages.reject! { |m| m.producer_id == client_id } unless echo + messages.select! { |m| m.claimant_id.nil? } unless include_claimed + + response = Excon::Response.new + if queue.messages.empty? + response.status = 204 + else + response.body = { + "messages" => messages.map(&:to_h), + "links" => [{ + "href" => "/v1/queues/#{queue_name}/messages?marker=#{next_marker}", + "rel" => "next" + }] + } + end + response + end + end + end end end