Class: WebMock::Twirp::RequestStub

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*filters) ⇒ RequestStub

Returns a new instance of RequestStub.



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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/webmock/twirp/request_stub.rb', line 8

def initialize(*filters)
  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

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

  uri = filters.snag do |x|
    x.is_a?(String) && x.start_with?("http") && x =~ URI::regexp
  end

  if client && uri
    raise ArgumentError, "specify uri or client instance, but not both"
  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.chomp("/") if conn
  end

  if klass
    @twirp_client = klass
    uri += "/#{klass.service_full_name}"

    if rpc_name
      # type check and 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]}"
    end
  end

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

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

  if rpc_name
    # match rpc dynamically after client resolves
    @rpc_name = rpc_name

    @request_pattern.with do |request|
      rpc_info = request.twirp_rpc

      !!rpc_info && (
        rpc_info[:rpc_method] == rpc_name ||
        rpc_info[:ruby_method] == rpc_name
      )
    end
  end
end

Instance Attribute Details

#rpc_nameObject (readonly)

for internal, package use only



153
154
155
# File 'lib/webmock/twirp/request_stub.rb', line 153

def rpc_name
  @rpc_name
end

#twirp_clientObject (readonly)

for internal, package use only



153
154
155
# File 'lib/webmock/twirp/request_stub.rb', line 153

def twirp_client
  @twirp_client
end

#with_attrsObject (readonly)

for internal, package use only



153
154
155
# File 'lib/webmock/twirp/request_stub.rb', line 153

def with_attrs
  @with_attrs
end

Instance Method Details

#to_return(*responses, &block) ⇒ Object Also known as: and_return



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/webmock/twirp/request_stub.rb', line 123

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
      generate_http_response(request, response)
    end
  end

  decoder = ->(request) do
    generate_http_response(
      request,
      block.call(request.twirp_request),
    )
  end if block_given?

  super(*response_hashes, &decoder)
end

#to_return_jsonObject

Raises:

  • (NotImplementedError)


148
149
150
# File 'lib/webmock/twirp/request_stub.rb', line 148

def to_return_json(*)
  raise NotImplementedError
end

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



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
120
121
# File 'lib/webmock/twirp/request_stub.rb', line 75

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

  # support Ruby 2 style attributes-as-hash instead of kwargs
  if request.is_a?(Hash)
    attrs = request
    request = nil
  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

  # save for diffing
  @with_attrs = if block_given?
    block
  elsif request
    request
  elsif attrs.any?
    attrs
  end

  decoder = ->(request_signature) do
    matched = true

    request = request_signature.twirp_request
    matched &&= !!request

    # match request attributes
    if attrs.any?
      matched &&= request.include?(attrs)
    end

    # match block
    matched &&= block.call(request) if block_given?

    matched
  end

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