Sha256: 5f2bdfe488ed9582b5e98e120f52834ca92681005bb0d867ce63ff3875439321

Contents?: true

Size: 1.8 KB

Versions: 9

Compression:

Stored size: 1.8 KB

Contents

module FakeWeb
  class Registry #:nodoc:
    include Singleton

    attr_accessor :uri_map

    def initialize
      clean_registry
    end

    def clean_registry
      self.uri_map = Hash.new do |hash, key|
        hash[key] = Hash.new(&hash.default_proc)
      end
    end

    def register_uri(method, uri, options)
      uri_map[normalize_uri(uri)][method] = [*[options]].flatten.collect do |option|
        FakeWeb::Responder.new(method, uri, option, option[:times])
      end
    end

    def registered_uri?(method, uri)
      normalized_uri = normalize_uri(uri)
      uri_map[normalized_uri].has_key?(method) || uri_map[normalized_uri].has_key?(:any)
    end

    def registered_uri(method, uri)
      uri = normalize_uri(uri)
      registered = registered_uri?(method, uri)
      if registered && uri_map[uri].has_key?(method)
        uri_map[uri][method]
      elsif registered
        uri_map[uri][:any]
      else
        nil
      end
    end

    def response_for(method, uri, &block)
      responses = registered_uri(method, uri)
      return nil if responses.nil?

      next_response = responses.last
      responses.each do |response|
        if response.times and response.times > 0
          response.times -= 1
          next_response = response
          break
        end
      end

      next_response.response(&block)
    end

    private

    def normalize_uri(uri)
      normalized_uri =
        case uri
        when URI then uri
        else
          uri = 'http://' + uri unless uri.match('^https?://')
          URI.parse(uri)
        end
      normalized_uri.query = sort_query_params(normalized_uri.query)
      normalized_uri.normalize
    end

    def sort_query_params(query)
      if query.nil? || query.empty?
        nil
      else
        query.split('&').sort.join('&')
      end
    end

  end
end

Version data entries

9 entries across 9 versions & 3 rubygems

Version Path
chrisk-fakeweb-1.2.1 lib/fake_web/registry.rb
eric-fakeweb-1.2.2.1 lib/fake_web/registry.rb
eric-fakeweb-1.2.2.2 lib/fake_web/registry.rb
eric-fakeweb-1.2.2.3 lib/fake_web/registry.rb
eric-fakeweb-1.2.2.4 lib/fake_web/registry.rb
eric-fakeweb-1.2.2 lib/fake_web/registry.rb
fakeweb-1.2.2 lib/fake_web/registry.rb
fakeweb-1.2.3 lib/fake_web/registry.rb
fakeweb-1.2.1 lib/fake_web/registry.rb