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