class WebValve::Manager

@api private

Public Instance Methods

allow_url(url) click to toggle source
# File lib/webvalve/manager.rb, line 20
def allow_url(url)
  raise "#{url} already registered" if allowlisted_urls.include?(url)
  allowlisted_urls << url
end
allowing?() click to toggle source

@api private

# File lib/webvalve/manager.rb, line 65
def allowing?
  !in_always_intercepting_env? && explicitly_enabled? && services_enabled_by_default?
end
allowlisted_urls() click to toggle source

@api private

# File lib/webvalve/manager.rb, line 89
def allowlisted_urls
  @allowlisted_urls ||= Set.new
end
clear!() click to toggle source

@api private

# File lib/webvalve/manager.rb, line 76
def clear!
  allowlisted_urls.clear
  fake_service_configs.clear
  stubbed_urls.clear
  WebMock.reset!
end
enabled?() click to toggle source

@api private

# File lib/webvalve/manager.rb, line 55
def enabled?
  in_always_intercepting_env? || explicitly_enabled?
end
fake_service_configs() click to toggle source

@api private

# File lib/webvalve/manager.rb, line 84
def fake_service_configs
  @fake_service_configs ||= []
end
intercepting?() click to toggle source

@api private

# File lib/webvalve/manager.rb, line 60
def intercepting?
  in_always_intercepting_env? || (explicitly_enabled? && !services_enabled_by_default?)
end
register(fake_service_class_name, **args) click to toggle source
# File lib/webvalve/manager.rb, line 14
def register(fake_service_class_name, **args)
  raise "register must be called with a string to comply with Rails autoloading" unless fake_service_class_name.is_a?(String)
  raise "#{fake_service_class_name.inspect} already registered" if fake_service_configs.any? { |c| c.service_class_name == fake_service_class_name }
  fake_service_configs << FakeServiceConfig.new(service_class_name: fake_service_class_name, **args)
end
reset!() click to toggle source

@api private

# File lib/webvalve/manager.rb, line 70
def reset!
  clear!
  setup
end
setup() click to toggle source
# File lib/webvalve/manager.rb, line 25
def setup
  return unless enabled?
  load_configs!

  if intercepting?
    fake_service_configs.each do |config|
      if !WebValve.env.test? && config.explicitly_enabled?
        allowlist_service config
      else
        webmock_service config
      end
    end
    WebMock.disable_net_connect! webmock_disable_options
    WebMock.enable!
  end

  if allowing?
    fake_service_configs.each do |config|
      if config.explicitly_disabled?
        webmock_service config
      end
    end
    if fake_service_configs.any?(&:explicitly_disabled?)
      WebMock.allow_net_connect!
      WebMock.enable!
    end
  end
end

Private Instance Methods

allowlist_service(config) click to toggle source
# File lib/webvalve/manager.rb, line 146
def allowlist_service(config)
  allowlisted_urls << config.service_url
end
allowlisted_url_regexps() click to toggle source
# File lib/webvalve/manager.rb, line 133
def allowlisted_url_regexps
  allowlisted_urls.map { |url| url_to_regexp url }
end
ensure_non_duplicate_stub(config) click to toggle source
# File lib/webvalve/manager.rb, line 154
def ensure_non_duplicate_stub(config)
  raise "Invalid config for #{config.service_class_name}. Already stubbed url #{config.full_url}" if stubbed_urls.include?(config.full_url)
  stubbed_urls << config.full_url
end
explicitly_enabled?() click to toggle source
# File lib/webvalve/manager.rb, line 95
def explicitly_enabled?
  ENABLED_VALUES.include?(ENV['WEBVALVE_ENABLED'])
end
in_always_intercepting_env?() click to toggle source
# File lib/webvalve/manager.rb, line 113
    def in_always_intercepting_env?
      if WebValve.env.in?(ALWAYS_ENABLED_ENVS)
        if ENV.key? 'WEBVALVE_ENABLED'
          WebValve.logger.warn(<<~MESSAGE)
            WARNING: Ignoring WEBVALVE_ENABLED environment variable setting (#{ENV['WEBVALVE_ENABLED']})
            WebValve is always enabled in development and test environments.
          MESSAGE
        end
        true
      else
        false
      end
    end
load_configs!() click to toggle source
# File lib/webvalve/manager.rb, line 159
def load_configs!
  WebValve.config_paths.each do |root|
    path = root.join('config', 'webvalve.rb').to_s
    load path if File.exist?(path)
  end
end
services_enabled_by_default?() click to toggle source
# File lib/webvalve/manager.rb, line 99
    def services_enabled_by_default?
      if WebValve.env.in?(ALWAYS_ENABLED_ENVS)
        if ENV.key? 'WEBVALVE_SERVICE_ENABLED_DEFAULT'
          WebValve.logger.warn(<<~MESSAGE)
            WARNING: Ignoring WEBVALVE_SERVICE_ENABLED_DEFAULT environment variable setting (#{ENV['WEBVALVE_SERVICE_ENABLED_DEFAULT']})
            WebValve is always enabled in intercepting mode in development and test environments.
          MESSAGE
        end
        false
      else
        ENABLED_VALUES.include?(ENV.fetch('WEBVALVE_SERVICE_ENABLED_DEFAULT', '1'))
      end
    end
stubbed_urls() click to toggle source
# File lib/webvalve/manager.rb, line 166
def stubbed_urls
  @stubbed_urls ||= Set.new
end
url_to_regexp(url) click to toggle source
# File lib/webvalve/manager.rb, line 150
def url_to_regexp(url)
  %r(\A#{Regexp.escape url})
end
webmock_disable_options() click to toggle source
# File lib/webvalve/manager.rb, line 127
def webmock_disable_options
  { allow_localhost: true }.tap do |opts|
    opts[:allow] = allowlisted_url_regexps unless WebValve.env.test?
  end
end
webmock_service(config) click to toggle source
# File lib/webvalve/manager.rb, line 137
def webmock_service(config)
  ensure_non_duplicate_stub(config)

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