@@ -51,6 +51,29 @@ class InvalidRequestError < StandardError; end # :nodoc:
5151 # assert_equal "Matz", person.name
5252 # end
5353 #
54+ # Each method can also accept a block. The mock will yield an
55+ # ActiveResource::Request instance to the block it handles a matching request.
56+ #
57+ # def setup
58+ # @matz = { person: { id: 1, name: "Matz" } }
59+ #
60+ # ActiveResource::HttpMock.respond_to do |mock|
61+ # mock.get "/people.json", omit_query_params: true do |request|
62+ # if request.path.split("?").includes?("name=Matz")
63+ # { people: [ @matz ] }.to_json
64+ # else
65+ # { people: [] }.to_json
66+ # end
67+ # end
68+ # end
69+ # end
70+ #
71+ # def test_get_matz
72+ # people = Person.where(name: "Matz")
73+ # assert_equal [ "Matz" ], people.map(&:name)
74+ # end
75+ #
76+ # When a block is passed to the mock, it ignores the +body+, +status+, and +response_headers+ arguments.
5477 class HttpMock
5578 class Responder # :nodoc:
5679 def initialize ( responses )
@@ -62,9 +85,10 @@ def initialize(responses)
6285 # @responses[Request.new(:post, path, nil, request_headers, options)] = Response.new(body || "", status, response_headers)
6386 # end
6487 module_eval <<-EOE , __FILE__ , __LINE__ + 1
65- def #{ method } (path, request_headers = {}, body = nil, status = 200, response_headers = {}, options = {})
88+ def #{ method } (path, request_headers = {}, body = nil, status = 200, response_headers = {}, options = {}, &response)
89+ options = body if response
6690 request = Request.new(:#{ method } , path, nil, request_headers, options)
67- response = Response.new(body || "", status, response_headers)
91+ response = Response.new(body || "", status, response_headers) unless response
6892
6993 delete_duplicate_responses(request)
7094
@@ -154,12 +178,12 @@ def responses
154178 # === Example
155179 #
156180 # ActiveResource::HttpMock.respond_to do |mock|
157- # mock.send(: get, "/people/1", {}, "JSON1")
181+ # mock.get( "/people/1", {}, "JSON1")
158182 # end
159183 # ActiveResource::HttpMock.responses.length #=> 1
160184 #
161185 # ActiveResource::HttpMock.respond_to(false) do |mock|
162- # mock.send(: get, "/people/2", {}, "JSON2")
186+ # mock.get( "/people/2", {}, "JSON2")
163187 # end
164188 # ActiveResource::HttpMock.responses.length #=> 2
165189 #
@@ -169,7 +193,7 @@ def responses
169193 # === Example
170194 #
171195 # ActiveResource::HttpMock.respond_to do |mock|
172- # mock.send(: get, "/people/1", {}, "JSON1")
196+ # mock.get( "/people/1", {}, "JSON1")
173197 # end
174198 # ActiveResource::HttpMock.responses.length #=> 1
175199 #
@@ -248,7 +272,10 @@ def net_connection_disabled?
248272 # request = ActiveResource::Request.new(:post, path, body, headers, options)
249273 # self.class.requests << request
250274 # if response = self.class.responses.assoc(request)
251- # response[1]
275+ # response = response[1]
276+ # response = response.call(request) if response.respond_to?(:call)
277+ #
278+ # Response.wrap(response)
252279 # else
253280 # raise InvalidRequestError.new("Could not find a response recorded for #{request.to_s} - Responses recorded are: - #{inspect_responses}")
254281 # end
@@ -258,7 +285,10 @@ def #{method}(path, #{'body, ' if has_body}headers, options = {})
258285 request = ActiveResource::Request.new(:#{ method } , path, #{ has_body ? 'body, ' : 'nil, ' } headers, options)
259286 self.class.requests << request
260287 if response = self.class.responses.assoc(request)
261- response[1]
288+ response = response[1]
289+ response = response.call(request) if response.respond_to?(:call)
290+
291+ Response.wrap(response)
262292 else
263293 raise InvalidRequestError.new("Could not find a response recorded for \# {request.to_s} - Responses recorded are: \# {inspect_responses}")
264294 end
@@ -321,6 +351,14 @@ def headers_match?(req)
321351 class Response
322352 attr_accessor :body , :message , :code , :headers
323353
354+ def self . wrap ( response ) # :nodoc:
355+ case response
356+ when self then response
357+ when String then new ( response )
358+ else new ( nil )
359+ end
360+ end
361+
324362 def initialize ( body , message = 200 , headers = { } )
325363 @body , @message , @headers = body , message . to_s , headers
326364 @code = @message [ 0 , 3 ] . to_i
0 commit comments