Updating documentation on ActiveResource HTTP Mock and also adding test coverage

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

View File

@ -29,7 +29,8 @@ module ActiveResource
# #
# In order for a mock to deliver its content, the incoming request must match by the <tt>http_method</tt>, # In order for a mock to deliver its content, the incoming request must match by the <tt>http_method</tt>,
# +path+ and <tt>request_headers</tt>. If no match is found an InvalidRequestError exception # +path+ and <tt>request_headers</tt>. If no match is found an InvalidRequestError exception
# will be raised letting you know you need to create a new mock for that request. # will be raised showing you what request it could not find a response for and also what requests and response
# pairs have been recorded so you can create a new mock for that request.
# #
# ==== Example # ==== Example
# def setup # def setup
@ -97,8 +98,41 @@ module ActiveResource
@@responses ||= [] @@responses ||= []
end end
# Accepts a block which declares a set of requests and responses for the HttpMock to respond to. See the main # Accepts a block which declares a set of requests and responses for the HttpMock to respond to in
# ActiveResource::HttpMock description for a more detailed explanation. # the following format:
#
# mock.http_method(path, request_headers = {}, body = nil, status = 200, response_headers = {})
#
# === Example
#
# @matz = { :id => 1, :name => "Matz" }.to_xml(:root => "person")
# ActiveResource::HttpMock.respond_to do |mock|
# mock.post "/people.xml", {}, @matz, 201, "Location" => "/people/1.xml"
# mock.get "/people/1.xml", {}, @matz
# mock.put "/people/1.xml", {}, nil, 204
# mock.delete "/people/1.xml", {}, nil, 200
# end
#
# Alternatively, accepts a hash of <tt>{Request => Response}</tt> pairs allowing you to generate
# these the following format:
#
# ActiveResource::Request.new(method, path, body, request_headers)
# ActiveResource::Response.new(body, status, response_headers)
#
# === Example
#
# Request.new(:#{method}, path, nil, request_headers)
#
# @matz = { :id => 1, :name => "Matz" }.to_xml(:root => "person")
#
# create_matz = ActiveResource::Request.new(:post, '/people.xml', @matz, {})
# created_response = ActiveResource::Response.new("", 201, {"Location" => "/people/1.xml"})
# get_matz = ActiveResource::Request.new(:get, '/people/1.xml', nil)
# ok_response = ActiveResource::Response.new("", 200, {})
#
# pairs = {create_matz => created_response, get_matz => ok_response}
#
# ActiveResource::HttpMock.respond_to(pairs)
def respond_to(pairs = {}) #:yields: mock def respond_to(pairs = {}) #:yields: mock
reset! reset!
responses.concat pairs.to_a responses.concat pairs.to_a

View File

@ -72,6 +72,34 @@ class HttpMockTest < ActiveSupport::TestCase
end end
test "allows you to send in pairs directly to the respond_to method" do
matz = { :id => 1, :name => "Matz" }.to_xml(:root => "person")
create_matz = ActiveResource::Request.new(:post, '/people.xml', matz, {})
created_response = ActiveResource::Response.new("", 201, {"Location" => "/people/1.xml"})
get_matz = ActiveResource::Request.new(:get, '/people/1.xml', nil)
ok_response = ActiveResource::Response.new(matz, 200, {})
pairs = {create_matz => created_response, get_matz => ok_response}
ActiveResource::HttpMock.respond_to(pairs)
assert_equal 2, ActiveResource::HttpMock.responses.length
assert_equal "", ActiveResource::HttpMock.responses.assoc(create_matz)[1].body
assert_equal matz, ActiveResource::HttpMock.responses.assoc(get_matz)[1].body
end
test "resets all mocked responses on each call to respond_to by default" 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 do |mock|
mock.send(:get, "/people/2", {}, "XML2")
end
assert_equal 1, 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)