Class: WebMock::Twirp::RequestStub

Inherits:
RequestStub
  • Object
show all
Defined in:
lib/webmock/twirp/request_stub.rb

Instance Method Summary collapse

Constructor Details

#initialize(*filters) ⇒ RequestStub

Returns a new instance of RequestStub.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/webmock/twirp/request_stub.rb', line 6

def initialize(*filters)
  rpc_name = filters.snag { |x| x.is_a?(Symbol) }

  client = filters.snag { |x| x.is_a?(::Twirp::Client) }

  klass = client&.class
  klass ||= filters.snag do |x|
    x.is_a?(Class) && (x < ::Twirp::Client || x < ::Twirp::Service)
  end

  unless filters.empty?
    raise ArgumentError, "unexpected arguments: #{filters}"
  end

  uri = ""

  if client
    conn = client.instance_variable_get(:@conn)
    uri += conn.url_prefix.to_s if conn
  end

  if klass
    @rpcs = klass.rpcs
    uri += "/#{klass.service_full_name}"
  else
    uri += "/[^/]+"
  end

  if rpc_name
    if klass
      # kindly convert ruby method to rpc method name
      rpc_info = klass.rpcs.values.find do |x|
        x[:rpc_method] == rpc_name || x[:ruby_method] == rpc_name
      end

      raise ArgumentError, "invalid rpc method: #{rpc_name}" unless rpc_info

      uri += "/#{rpc_info[:rpc_method]}"
    else
      uri += "/#{rpc_name}"
    end
  else
    uri += "/[^/]+"
  end

  super(:post, /#{uri}$/)

  # filter on Twirp header
  @request_pattern.with(
    headers: { "Content-Type" => ::Twirp::Encoding::PROTO },
  )
end

Instance Method Details

#to_return(*responses, &block) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/webmock/twirp/request_stub.rb', line 95

def to_return(*responses, &block)
  unless responses.empty? || block.nil?
    raise ArgumentError, "specify responses or block, but not both"
  end

  # if no args, provide default response
  responses << nil if responses.empty? && block.nil?

  response_hashes = responses.map do |response|
    ->(request) do
      # determine msg type and package response
      output_class = rpc_from_request(request)[:output_class]
      generate_http_response(output_class, response)
    end
  end

  decoder = ->(request) do
    # determine msg type and call provided block
    rpc = rpc_from_request(request)
    res = block.call(rpc[:input_class].decode(request.body))
    generate_http_response(rpc[:output_class], res)
  end if block_given?

  super(*response_hashes, &decoder)
end

#to_return_jsonObject

Raises:

  • (NotImplementedError)


121
122
123
# File 'lib/webmock/twirp/request_stub.rb', line 121

def to_return_json(*)
  raise NotImplementedError
end

#with(request = nil, **attrs, &block) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/webmock/twirp/request_stub.rb', line 59

def with(request = nil, **attrs, &block)
  unless request.nil? || attrs.empty?
    raise ArgumentError, "specify request or attrs, but not both"
  end

  request_matcher = if request
    unless request.is_a?(Google::Protobuf::MessageExts)
      raise TypeError, "Expected request to be Protobuf::MessageExts, found: #{request}"
    end

    { body: request.to_proto }
  end

  decoder = ->(request) do
    input_class = rpc_from_request(request)[:input_class]

    matched = true
    decoded_request = input_class.decode(request.body)

    if attrs.any?
      attr_matcher = Matchers::HashIncludingMatcher.new(**attrs)
      attr_hash = WebMock::Util::HashKeysStringifier.stringify_keys!(decoded_request.to_h, deep: true)

      matched &= attr_matcher === attr_hash
    end

    if block
      matched &= block.call(decoded_request)
    end

    matched
  end if attrs.any? || block_given?

  super(request_matcher || {}, &decoder)
end