Class: WebMock::Twirp::RequestStub
- Inherits:
-
RequestStub
- Object
- RequestStub
- WebMock::Twirp::RequestStub
- Defined in:
- lib/webmock/twirp/request_stub.rb
Instance Method Summary collapse
-
#initialize(*filters) ⇒ RequestStub
constructor
A new instance of RequestStub.
- #to_return(*responses, &block) ⇒ Object
- #to_return_json ⇒ Object
- #with(request = nil, **attrs, &block) ⇒ Object
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_json ⇒ Object
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 |