class Fog::Google::Pubsub::Mock
Public Class Methods
data()
click to toggle source
# File lib/fog/google/pubsub/mock.rb, line 11 def self.data @data ||= Hash.new do |hash, key| hash[key] = { :topics => {}, :subscriptions => {} } end end
new(options)
click to toggle source
# File lib/fog/google/pubsub/mock.rb, line 7 def initialize(options) shared_initialize(options[:google_project], GOOGLE_PUBSUB_API_VERSION, GOOGLE_PUBSUB_BASE_URL) end
reset()
click to toggle source
# File lib/fog/google/pubsub/mock.rb, line 20 def self.reset @data = nil end
Public Instance Methods
acknowledge_subscription(subscription, ack_ids)
click to toggle source
# File lib/fog/google/requests/pubsub/acknowledge_subscription.rb, line 24 def acknowledge_subscription(subscription, ack_ids) unless data[:subscriptions].key?(subscription) subscription_resource = subscription.to_s.split("/")[-1] body = { "error" => { "code" => 404, "message" => "Resource not found (resource=#{subscription_resource}).", "status" => "NOT_FOUND" } } status = 404 return build_excon_response(body, status) end sub = data[:subscriptions][subscription] sub[:messages].delete_if { |msg| ack_ids.member?(msg["messageId"]) } build_excon_response(nil, 200) end
create_subscription(subscription_name, topic, push_config = {}, ack_deadline_seconds = nil)
click to toggle source
# File lib/fog/google/requests/pubsub/create_subscription.rb, line 41 def create_subscription(subscription_name, topic, push_config = {}, ack_deadline_seconds = nil) subscription = { "name" => subscription_name, "topic" => topic, "pushConfig" => push_config, "ackDeadlineSeconds" => ack_deadline_seconds } # We also track pending messages data[:subscriptions][subscription_name] = subscription.merge(:messages => []) build_excon_response(subscription, 200) end
create_topic(topic_name)
click to toggle source
# File lib/fog/google/requests/pubsub/create_topic.rb, line 22 def create_topic(topic_name) data = { "name" => topic_name } self.data[:topics][topic_name] = data body = data.clone status = 200 build_excon_response(body, status) end
data()
click to toggle source
# File lib/fog/google/pubsub/mock.rb, line 24 def data self.class.data[project] end
delete_subscription(subscription_name)
click to toggle source
# File lib/fog/google/requests/pubsub/delete_subscription.rb, line 20 def delete_subscription(subscription_name) data[:subscriptions].delete(subscription_name) build_excon_response(nil, 200) end
delete_topic(topic_name)
click to toggle source
# File lib/fog/google/requests/pubsub/delete_topic.rb, line 20 def delete_topic(topic_name) data[:topics].delete(topic_name) status = 200 build_excon_response(nil, status) end
get_subscription(subscription_name)
click to toggle source
# File lib/fog/google/requests/pubsub/get_subscription.rb, line 20 def get_subscription(subscription_name) sub = data[:subscriptions][subscription_name] if sub.nil? subscription_resource = subscription_name.split("/")[-1] body = { "error" => { "code" => 404, "message" => "Resource not found (resource=#{subscription_resource}).", "status" => "NOT_FOUND" } } return build_excon_response(body, 404) end body = sub.select do |k, _| %w(name topic pushConfig ackDeadlineSeconds).include?(k) end status = 200 build_excon_response(body, status) end
get_topic(topic_name)
click to toggle source
# File lib/fog/google/requests/pubsub/get_topic.rb, line 20 def get_topic(topic_name) if !data[:topics].key?(topic_name) topic_resource = topic_name.split("/")[-1] body = { "error" => { "code" => 404, "message" => "Resource not found (resource=#{topic_resource}).", "status" => "NOT_FOUND" } } status = 404 else body = data[:topics][topic_name].clone status = 200 end build_excon_response(body, status) end
list_subscriptions(_project = nil)
click to toggle source
# File lib/fog/google/requests/pubsub/list_subscriptions.rb, line 22 def list_subscriptions(_project = nil) subs = data[:subscriptions].values.map do |sub| # Filter out any keys that aren't part of the response object sub.select do |k, _| %w(name topic pushConfig ackDeadlineSeconds).include?(k) end end body = { "subscriptions" => subs } status = 200 build_excon_response(body, status) end
list_topics(_project = nil)
click to toggle source
# File lib/fog/google/requests/pubsub/list_topics.rb, line 22 def list_topics(_project = nil) body = { "topics" => data[:topics].values } status = 200 build_excon_response(body, status) end
publish_topic(topic, messages)
click to toggle source
# File lib/fog/google/requests/pubsub/publish_topic.rb, line 28 def publish_topic(topic, messages) if data[:topics].key?(topic) published_messages = messages.map do |msg| msg.merge("messageId" => Fog::Mock.random_letters(16), "publishTime" => Time.now.iso8601) end # Gather the subscriptions and publish data[:subscriptions].values.each do |sub| next unless sub["topic"] == topic sub[:messages] += published_messages end body = { "messageIds" => published_messages.map { |msg| msg["messageId"] } } status = 200 else topic_resource = topic_name.split("/")[-1] body = { "error" => { "code" => 404, "message" => "Resource not found (resource=#{topic_resource}).", "status" => "NOT_FOUND" } } status = 404 end build_excon_response(body, status) end
pull_subscription(subscription, options = { :return_immediately => true, :max_messages => 10 })
click to toggle source
# File lib/fog/google/requests/pubsub/pull_subscription.rb, line 36 def pull_subscription(subscription, options = { :return_immediately => true, :max_messages => 10 }) # We're going to ignore return_immediately; feel free to add support # if you need it for testing subscription_name = Fog::Google::Pubsub.subscription_name(subscription) sub = data[:subscriptions][subscription_name] if sub.nil? subscription_resource = subscription_name.split("/")[-1] body = { "error" => { "code" => 404, "message" => "Resource not found (resource=#{subscription_resource}).", "status" => "NOT_FOUND" } } return build_excon_response(body, 404) end # This implementation is a bit weak; instead of "hiding" messages for # some period of time after they are pulled, instead we always return # them until acknowledged. This might cause issues with clients that # refuse to acknowledge. # # Also, note that here we use the message id as the ack id - again, # this might cause problems with some strange-behaving clients. msgs = sub[:messages].take(options[:max_messages]).map do |msg| { "ackId" => msg["messageId"], "message" => msg } end body = { "receivedMessages" => msgs } status = 200 build_excon_response(body, status) end
reset_data()
click to toggle source
# File lib/fog/google/pubsub/mock.rb, line 28 def reset_data self.class.data.delete(project) end