Module: SorenWebMockHook

Defined in:
lib/soren/webmock.rb

Instance Method Summary collapse

Instance Method Details

#send(request) ⇒ Object



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
# File 'lib/soren/webmock.rb', line 9

def send(request)
  return super unless request.is_a?(Soren::Request)

  uri = "#{instance_variable_get(:@scheme)}://#{instance_variable_get(:@host)}:" \
        "#{instance_variable_get(:@port)}#{request.target}"

  sig = WebMock::RequestSignature.new(
    request.method.to_s.downcase.to_sym,
    uri,
    body:    request.body.to_s,
    headers: request.headers.to_h,
  )

  WebMock::RequestRegistry.instance.requested_signatures.put(sig)

  if (webmock_response = WebMock::StubRegistry.instance.response_for_request(sig))
    webmock_response.raise_error_if_any
    raise Soren::Error::TimeoutError, 'connection timeout' if webmock_response.should_timeout

    if WebMock::CallbackRegistry.any_callbacks?
      WebMock::CallbackRegistry.invoke_callbacks({ lib: :soren }, sig, webmock_response)
    end

    build_soren_response(webmock_response)
  elsif WebMock.net_connect_allowed?(sig.uri)
    response = super

    if WebMock::CallbackRegistry.any_callbacks?
      wm = WebMock::Response.new
      wm.status = [response.code, response.message]
      wm.headers = response.headers
      wm.body = response.body
      WebMock::CallbackRegistry.invoke_callbacks({ lib: :soren, real_request: true }, sig, wm)
    end

    response
  else
    raise WebMock::NetConnectNotAllowedError, sig
  end
end