Class: WebMock::Twirp::RequestStub
- Inherits:
-
RequestStub
- Object
- RequestStub
- WebMock::Twirp::RequestStub
- Defined in:
- lib/webmock/twirp/request_stub.rb
Instance Attribute Summary collapse
-
#rpc_name ⇒ Object
readonly
for internal, package use only.
-
#twirp_client ⇒ Object
readonly
for internal, package use only.
-
#with_attrs ⇒ Object
readonly
for internal, package use only.
Instance Method Summary collapse
-
#initialize(*filters) ⇒ RequestStub
constructor
A new instance of RequestStub.
- #to_return(*responses, &block) ⇒ Object (also: #and_return)
- #to_return_json ⇒ Object
- #with(request = nil, **attrs, &block) ⇒ Object
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_name ⇒ Object (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_client ⇒ Object (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_attrs ⇒ Object (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_json ⇒ Object
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 |