1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Adding option to ActiveResource to allow you to not reset the previously stored requests and responses by passing false to respond_to

This commit is contained in:
Mikel Lindsaar 2010-08-30 15:35:36 +10:00 committed by Jeremy Kemper
parent a299642293
commit 58d0e2c23c
2 changed files with 79 additions and 3 deletions

View file

@ -133,8 +133,44 @@ module ActiveResource
# pairs = {create_matz => created_response, get_matz => ok_response} # pairs = {create_matz => created_response, get_matz => ok_response}
# #
# ActiveResource::HttpMock.respond_to(pairs) # ActiveResource::HttpMock.respond_to(pairs)
def respond_to(pairs = {}) #:yields: mock #
reset! # Note, by default, every time you call +respond_to+, any previous request and response pairs stored
# in HttpMock will be deleted giving you a clean slate to work on.
#
# If you want to override this behaviour, pass in +false+ as the last argument to +respond_to+
#
# === Example
#
# ActiveResource::HttpMock.respond_to do |mock|
# mock.send(:get, "/people/1", {}, "XML1")
# end
# ActiveResource::HttpMock.responses.length #=> 1
#
# ActiveResource::HttpMock.respond_to(false) do |mock|
# mock.send(:get, "/people/2", {}, "XML2")
# end
# ActiveResource::HttpMock.responses.length #=> 2
#
# This also works with passing in generated pairs of requests and responses, again, just pass in false
# as the last argument:
#
# === Example
#
# ActiveResource::HttpMock.respond_to do |mock|
# mock.send(:get, "/people/1", {}, "XML1")
# end
# ActiveResource::HttpMock.responses.length #=> 1
#
# get_matz = ActiveResource::Request.new(:get, '/people/1.xml', nil)
# ok_response = ActiveResource::Response.new("", 200, {})
#
# pairs = {get_matz => ok_response}
#
# ActiveResource::HttpMock.respond_to(pairs, false)
# ActiveResource::HttpMock.responses.length #=> 2
def respond_to(*args) #:yields: mock
pairs = args.first || {}
reset! if args.last.class != FalseClass
responses.concat pairs.to_a responses.concat pairs.to_a
if block_given? if block_given?
yield Responder.new(responses) yield Responder.new(responses)

View file

@ -88,7 +88,7 @@ class HttpMockTest < ActiveSupport::TestCase
assert_equal matz, ActiveResource::HttpMock.responses.assoc(get_matz)[1].body assert_equal matz, ActiveResource::HttpMock.responses.assoc(get_matz)[1].body
end end
test "resets all mocked responses on each call to respond_to by default" do test "resets all mocked responses on each call to respond_to with a block by default" do
ActiveResource::HttpMock.respond_to do |mock| ActiveResource::HttpMock.respond_to do |mock|
mock.send(:get, "/people/1", {}, "XML1") mock.send(:get, "/people/1", {}, "XML1")
end end
@ -100,6 +100,46 @@ class HttpMockTest < ActiveSupport::TestCase
assert_equal 1, ActiveResource::HttpMock.responses.length assert_equal 1, ActiveResource::HttpMock.responses.length
end end
test "resets all mocked responses on each call to respond_to by passing pairs by default" do
ActiveResource::HttpMock.respond_to do |mock|
mock.send(:get, "/people/1", {}, "XML1")
end
assert_equal 1, ActiveResource::HttpMock.responses.length
matz = { :id => 1, :name => "Matz" }.to_xml(:root => "person")
get_matz = ActiveResource::Request.new(:get, '/people/1.xml', nil)
ok_response = ActiveResource::Response.new(matz, 200, {})
ActiveResource::HttpMock.respond_to({get_matz => ok_response})
assert_equal 1, ActiveResource::HttpMock.responses.length
end
test "allows you to add new responses to the existing responses by calling a block" do
ActiveResource::HttpMock.respond_to do |mock|
mock.send(:get, "/people/1", {}, "XML1")
end
assert_equal 1, ActiveResource::HttpMock.responses.length
ActiveResource::HttpMock.respond_to(false) do |mock|
mock.send(:get, "/people/2", {}, "XML2")
end
assert_equal 2, ActiveResource::HttpMock.responses.length
end
test "allows you to add new responses to the existing responses by passing pairs" do
ActiveResource::HttpMock.respond_to do |mock|
mock.send(:get, "/people/1", {}, "XML1")
end
assert_equal 1, ActiveResource::HttpMock.responses.length
matz = { :id => 1, :name => "Matz" }.to_xml(:root => "person")
get_matz = ActiveResource::Request.new(:get, '/people/1.xml', nil)
ok_response = ActiveResource::Response.new(matz, 200, {})
ActiveResource::HttpMock.respond_to({get_matz => ok_response}, false)
assert_equal 2, ActiveResource::HttpMock.responses.length
end
def request(method, path, headers = {}, body = nil) def request(method, path, headers = {}, body = nil)
if [:put, :post].include? method if [:put, :post].include? method
@http.send(method, path, body, headers) @http.send(method, path, body, headers)