Sha256: 08dc249e38f1478f12192325fa9b0afc901109cc38c7c6379bf3db268ad368d5

Contents?: true

Size: 1.98 KB

Versions: 11

Compression:

Stored size: 1.98 KB

Contents

# frozen_string_literal: true

require 'active_support/concern'

module TwirpRails
  module RSpec
    module Helper
      extend ActiveSupport::Concern

      class_methods do
        # places to subject service method returned value converted to_h
        # @param [Boolean] to_h - default true, set to false to use pure result
        # @param [Proc] block - should return array with method name and arguments
        # @example
        #   rpc { [:get, id: 1] }
        #   it { should match(id: 1)}
        def rpc(to_h: true, &block)
          let :rpc_args, &block

          subject do
            method, *args = rpc_args

            unless service.class.rpcs[method.to_s]
              camelized_method = method.to_s.camelize

              if service.class.rpcs[camelized_method]
                method = camelized_method
              else
                raise "Methods #{method}/#{camelized_method} is not found in the service #{service.class}"
              end
            end

            result = service.call_rpc(method, *args)
            to_h ? result.to_h : result
          end
        end

        def service_class_from_describe
          result = metadata[:service]

          result = result.constantize if result && !result.is_a?(Class)

          result
        end

        def infer_service_class
          service_class_name = described_class.name.gsub(/Handler$/, '') + 'Service'

          service_class_name.constantize
        rescue NameError
          msg = "Cannot infer Service class from handler #{described_class.name}."
          msg += " Inferred name #{service_class_name}" if service_class_name

          raise msg
        end

        def service_class
          @service_class ||=
            service_class_from_describe || infer_service_class
        end
      end

      def service_class
        self.class.service_class
      end

      included do
        let(:handler) { described_class.new }
        let(:service) { service_class.new(handler) }
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
twirp_rails-0.4.3 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.4.2 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.4.1 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.4.0 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.3.2 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.3.1 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.3.0 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.2.1 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.2.0 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.1.7 lib/twirp_rails/rspec/helper.rb
twirp_rails-0.1.6 lib/twirp_rails/rspec/helper.rb