Sha256: cf19ea7e8339d106dbe0e3ba4ea3cff9e8dfb85947f015116a01a96d5addebe3

Contents?: true

Size: 1.67 KB

Versions: 6

Compression:

Stored size: 1.67 KB

Contents

require 'webmock'
require 'singleton'
require 'set'

module WebValve
  # @api private
  class Manager
    include Singleton

    def register(fake_service, **args)
      raise "#{fake_service.inspect} already registered" if fake_service_configs.any? { |c| c.service == fake_service }
      fake_service_configs << FakeServiceConfig.new(service: fake_service, **args)
    end

    def whitelist_url(url)
      raise "#{url} already registered" if whitelisted_urls.include?(url)
      whitelisted_urls << url
    end

    def setup
      fake_service_configs.each do |config|
        if config.should_intercept?
          webmock_service config
        else
          whitelist_service config
        end
      end

      WebMock.enable!
      WebMock.disable_net_connect! webmock_disable_options
    end

    # @api private
    def reset
      whitelisted_urls.clear
      fake_service_configs.clear
    end

    # @api private
    def fake_service_configs
      @fake_service_configs ||= []
    end

    # @api private
    def whitelisted_urls
      @whitelisted_urls ||= Set.new
    end

    private

    def webmock_disable_options
      { allow_localhost: true }.tap do |opts|
        opts[:allow] = whitelisted_url_regexps unless WebValve.env.test?
      end
    end

    def whitelisted_url_regexps
      whitelisted_urls.map { |url| url_to_regexp url }
    end

    def webmock_service(config)
      WebMock.stub_request(
        :any,
        url_to_regexp(config.service_url)
      ).to_rack(FakeServiceWrapper.new(config.service))
    end

    def whitelist_service(config)
      whitelisted_urls << config.service_url
    end

    def url_to_regexp(url)
      %r(\A#{Regexp.escape url})
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
webvalve-0.9.9 lib/webvalve/manager.rb
webvalve-0.9.8 lib/webvalve/manager.rb
webvalve-0.9.7 lib/webvalve/manager.rb
webvalve-0.9.6 lib/webvalve/manager.rb
webvalve-0.9.5 lib/webvalve/manager.rb
webvalve-0.9.4 lib/webvalve/manager.rb