Class: WebMock::RequestStub

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(method, uri) ⇒ RequestStub

Returns a new instance of RequestStub.



8
9
10
11
12
# File 'lib/webmock/request_stub.rb', line 8

def initialize(method, uri)
  @request_pattern = RequestPattern.new(method, uri)
  @responses_sequences = []
  self
end

Instance Attribute Details

#request_patternObject

Returns the value of attribute request_pattern.



6
7
8
# File 'lib/webmock/request_stub.rb', line 6

def request_pattern
  @request_pattern
end

Class Method Details

.from_request_signature(signature) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/webmock/request_stub.rb', line 116

def self.from_request_signature(signature)
  stub = self.new(signature.method.to_sym, signature.uri.to_s)

  if signature.body.to_s != ''
    body = if signature.url_encoded?
      WebMock::Util::QueryMapper.query_to_values(signature.body, notation: Config.instance.query_values_notation)
    else
      signature.body
    end
    stub.with(body: body)
  end

  if (signature.headers && !signature.headers.empty?)
    stub.with(headers: signature.headers)
  end
  stub
end

Instance Method Details

#has_responses?Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/webmock/request_stub.rb', line 90

def has_responses?
  !@responses_sequences.empty?
end

#matches?(request_signature) ⇒ Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/webmock/request_stub.rb', line 108

def matches?(request_signature)
  self.request_pattern.matches?(request_signature)
end

#responseObject



79
80
81
82
83
84
85
86
87
88
# File 'lib/webmock/request_stub.rb', line 79

def response
  if @responses_sequences.empty?
    WebMock::Response.new
  elsif @responses_sequences.length > 1
    @responses_sequences.shift if @responses_sequences.first.end?
    @responses_sequences.first.next_response
  else
    @responses_sequences[0].next_response
  end
end

#thenObject



94
95
96
# File 'lib/webmock/request_stub.rb', line 94

def then
  self
end

#times(number) ⇒ Object



98
99
100
101
102
103
104
105
106
# File 'lib/webmock/request_stub.rb', line 98

def times(number)
  raise "times(N) accepts integers >= 1 only" if !number.is_a?(Integer) || number < 1
  if @responses_sequences.empty?
    raise "Invalid WebMock stub declaration." +
      " times(N) can be declared only after response declaration."
  end
  @responses_sequences.last.times_to_repeat += number-1
  self
end

#to_rack(app, options = {}) ⇒ Object



61
62
63
# File 'lib/webmock/request_stub.rb', line 61

def to_rack(app, options={})
  @responses_sequences << ResponsesSequence.new([RackResponse.new(app)])
end

#to_raise(*exceptions) ⇒ Object Also known as: and_raise



65
66
67
68
69
70
# File 'lib/webmock/request_stub.rb', line 65

def to_raise(*exceptions)
  @responses_sequences << ResponsesSequence.new([*exceptions].flatten.map {|e|
    ResponseFactory.response_for(exception: e)
  })
  self
end

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



19
20
21
22
23
24
25
26
# File 'lib/webmock/request_stub.rb', line 19

def to_return(*response_hashes, &block)
  if block
    @responses_sequences << ResponsesSequence.new([ResponseFactory.response_for(block)])
  else
    @responses_sequences << ResponsesSequence.new([*response_hashes].flatten.map {|r| ResponseFactory.response_for(r)})
  end
  self
end

#to_return_json(*response_hashes) ⇒ Object Also known as: and_return_json

Raises:

  • (ArgumentError)


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

def to_return_json(*response_hashes)
  raise ArgumentError, '#to_return_json does not support passing a block' if block_given?

  json_response_hashes = [*response_hashes].flatten.map do |resp_h|
    headers, body = resp_h.values_at(:headers, :body)

    json_body = if body.respond_to?(:call)
      ->(request_signature) {
        b = if body.respond_to?(:arity) && body.arity == 1
          body.call(request_signature)
        else
          body.call
        end
        b = b.to_json unless b.is_a?(String)
        b
      }
    elsif !body.is_a?(String)
      body.to_json
    else
      body
    end

    resp_h.merge(
      headers: {content_type: 'application/json'}.merge(headers.to_h),
      body: json_body
    )
  end

  to_return(json_response_hashes)
end

#to_sObject



112
113
114
# File 'lib/webmock/request_stub.rb', line 112

def to_s
  self.request_pattern.to_s
end

#to_timeoutObject Also known as: and_timeout



73
74
75
76
# File 'lib/webmock/request_stub.rb', line 73

def to_timeout
  @responses_sequences << ResponsesSequence.new([ResponseFactory.response_for(should_timeout: true)])
  self
end

#with(params = {}, &block) ⇒ Object



14
15
16
17
# File 'lib/webmock/request_stub.rb', line 14

def with(params = {}, &block)
  @request_pattern.with(params, &block)
  self
end