Sha256: f464a82db0a19e6614f6090f3c05a1ddc2735f39427bd3f283ed2c09ed199850

Contents?: true

Size: 1.96 KB

Versions: 1

Compression:

Stored size: 1.96 KB

Contents

require 'json'

module Lurker
  class Spy
    class BlindError < StandardError; end

    attr_reader :block, :service
    attr_accessor :request, :response

    extend Forwardable
    delegate [:verb, :payload] => :request
    delegate [:status, :body] => :response

    def initialize(options={}, &block)
      @options = options
      @block = block

      @service = if defined?(Rails)
        Service.new(Rails.root.join(DEFAULT_SERVICE_PATH).to_s, Rails.application.class.parent_name)
      else
        Service.default_service
      end
    end

    def call
      @request = @response = nil # fill in while test
      @block.call.tap do |result|
        if @request && @response
          @service.verify!(
            verb, endpoint_path, payload,
            extensions, status, body
          )

          @service.persist! if success?(result)
        end
      end
    end

    def endpoint_path
      [request.endpoint_path, suffix].compact.join('-')
    end

    def extensions
      extensions = {
        path_params: request.path_params,
        path_info: request.path_info,
        method: request.verb,
        suffix: suffix.to_s,
      }
      unless request.query_params.empty?
        extensions[:query_params] = request.query_params
      end
      extensions
    end

    def suffix
      if (suffix = @options[:suffix]).is_a?(String)
        suffix.gsub(/[^[[:alnum:]]]/, '_')
      end
    end

    def success?(result)
      if defined?(::Minitest::Test) && result.is_a?(::Minitest::Test)
        result.failure.nil?
      elsif result.is_a?(Exception)
        false
      else
        result
      end
    end
    private :success?

    def self.on(options={}, &block)
      require 'lurker/spec_helper' unless defined? Lurker::SpecHelper
      (Thread.current[:lurker_spy] = new(options, &block)).tap do |spy|
        spy.call
      end
    end

    def self.enabled?
      current.present?
    end

    def self.current
      Thread.current[:lurker_spy]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lurker-0.6.1 lib/lurker/spy.rb