2006-06-25 10:44:22 -04:00
|
|
|
require "#{File.dirname(__FILE__)}/abstract_unit"
|
2006-09-29 12:25:49 -04:00
|
|
|
require 'base64'
|
2006-06-25 10:44:22 -04:00
|
|
|
|
|
|
|
class ConnectionTest < Test::Unit::TestCase
|
2006-12-05 14:12:51 -05:00
|
|
|
ResponseCodeStub = Struct.new(:code)
|
2006-08-31 05:31:11 -04:00
|
|
|
|
2006-06-25 10:44:22 -04:00
|
|
|
def setup
|
2006-08-31 05:31:11 -04:00
|
|
|
@conn = ActiveResource::Connection.new('http://localhost')
|
2006-12-12 10:29:54 -05:00
|
|
|
@matz = { :id => 1, :name => 'Matz' }
|
|
|
|
@david = { :id => 2, :name => 'David' }
|
|
|
|
@people = [ @matz, @david ].to_xml(:root => 'people')
|
|
|
|
@people_single = [ @matz ].to_xml(:root => 'people-single-elements')
|
|
|
|
@people_empty = [ ].to_xml(:root => 'people-empty-elements')
|
|
|
|
@matz = @matz.to_xml(:root => 'person')
|
|
|
|
@david = @david.to_xml(:root => 'person')
|
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
@default_request_headers = { 'Content-Type' => 'application/xml' }
|
|
|
|
ActiveResource::HttpMock.respond_to do |mock|
|
2006-12-12 10:29:54 -05:00
|
|
|
mock.get "/people.xml", {}, @people
|
|
|
|
mock.get "/people_single_elements.xml", {}, @people_single
|
|
|
|
mock.get "/people_empty_elements.xml", {}, @people_empty
|
2006-09-29 12:25:49 -04:00
|
|
|
mock.get "/people/1.xml", {}, @matz
|
|
|
|
mock.put "/people/1.xml", {}, nil, 204
|
|
|
|
mock.delete "/people/1.xml", {}, nil, 200
|
|
|
|
mock.post "/people.xml", {}, nil, 201, 'Location' => '/people/5.xml'
|
|
|
|
end
|
2006-06-25 10:44:22 -04:00
|
|
|
end
|
2006-08-31 05:31:11 -04:00
|
|
|
|
|
|
|
def test_handle_response
|
|
|
|
# 2xx and 3xx are valid responses.
|
|
|
|
[200, 299, 300, 399].each do |code|
|
2006-12-05 14:12:51 -05:00
|
|
|
expected = ResponseCodeStub.new(code)
|
|
|
|
assert_equal expected, handle_response(expected)
|
2006-08-31 05:31:11 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# 404 is a missing resource.
|
|
|
|
assert_response_raises ActiveResource::ResourceNotFound, 404
|
|
|
|
|
2006-09-08 20:11:12 -04:00
|
|
|
# 409 is an optimistic locking error
|
|
|
|
assert_response_raises ActiveResource::ResourceConflict, 409
|
|
|
|
|
2007-01-16 19:46:32 -05:00
|
|
|
# 422 is a validation error
|
|
|
|
assert_response_raises ActiveResource::ResourceInvalid, 422
|
|
|
|
|
2006-08-31 05:31:11 -04:00
|
|
|
# 4xx are client errors.
|
2006-09-07 20:07:30 -04:00
|
|
|
[401, 499].each do |code|
|
2006-08-31 05:31:11 -04:00
|
|
|
assert_response_raises ActiveResource::ClientError, code
|
|
|
|
end
|
|
|
|
|
|
|
|
# 5xx are server errors.
|
|
|
|
[500, 599].each do |code|
|
|
|
|
assert_response_raises ActiveResource::ServerError, code
|
|
|
|
end
|
|
|
|
|
|
|
|
# Others are unknown.
|
|
|
|
[199, 600].each do |code|
|
|
|
|
assert_response_raises ActiveResource::ConnectionError, code
|
|
|
|
end
|
2006-06-25 10:44:22 -04:00
|
|
|
end
|
2006-12-05 14:12:51 -05:00
|
|
|
|
|
|
|
def test_initialize_raises_argument_error_on_missing_site
|
|
|
|
assert_raise(ArgumentError) { ActiveResource::Connection.new(nil) }
|
|
|
|
end
|
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
def test_site_accessor_accepts_uri_or_string_argument
|
|
|
|
site = URI.parse("http://localhost")
|
|
|
|
|
2006-12-05 14:12:51 -05:00
|
|
|
assert_raise(URI::InvalidURIError) { @conn.site = nil }
|
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
assert_nothing_raised { @conn.site = "http://localhost" }
|
2006-12-05 14:12:51 -05:00
|
|
|
assert_equal site, @conn.site
|
2006-08-31 05:31:11 -04:00
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
assert_nothing_raised { @conn.site = site }
|
|
|
|
assert_equal site, @conn.site
|
|
|
|
end
|
2006-12-05 14:12:51 -05:00
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
def test_get
|
|
|
|
matz = @conn.get("/people/1.xml")
|
2006-12-12 10:29:54 -05:00
|
|
|
assert_equal "Matz", matz["name"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_get_collection
|
|
|
|
people = @conn.get("/people.xml")
|
|
|
|
assert_equal "Matz", people[0]["name"]
|
|
|
|
assert_equal "David", people[1]["name"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_get_collection_single
|
|
|
|
people = @conn.get("/people_single_elements.xml")
|
|
|
|
assert_equal "Matz", people[0]["name"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_get_collection_empty
|
|
|
|
people = @conn.get("/people_empty_elements.xml")
|
|
|
|
assert_equal people, nil
|
2006-09-29 12:25:49 -04:00
|
|
|
end
|
2006-12-05 14:12:51 -05:00
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
def test_post
|
|
|
|
response = @conn.post("/people.xml")
|
|
|
|
assert_equal "/people/5.xml", response["Location"]
|
|
|
|
end
|
2006-12-05 14:12:51 -05:00
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
def test_put
|
|
|
|
response = @conn.put("/people/1.xml")
|
|
|
|
assert_equal 204, response.code
|
|
|
|
end
|
2006-12-05 14:12:51 -05:00
|
|
|
|
2006-09-29 12:25:49 -04:00
|
|
|
def test_delete
|
|
|
|
response = @conn.delete("/people/1.xml")
|
|
|
|
assert_equal 200, response.code
|
|
|
|
end
|
2006-12-05 14:12:51 -05:00
|
|
|
|
2006-08-31 05:31:11 -04:00
|
|
|
protected
|
|
|
|
def assert_response_raises(klass, code)
|
|
|
|
assert_raise(klass, "Expected response code #{code} to raise #{klass}") do
|
2006-12-05 14:12:51 -05:00
|
|
|
handle_response ResponseCodeStub.new(code)
|
2006-08-31 05:31:11 -04:00
|
|
|
end
|
|
|
|
end
|
2006-12-05 14:12:51 -05:00
|
|
|
|
|
|
|
def handle_response(response)
|
|
|
|
@conn.send(:handle_response, response)
|
|
|
|
end
|
2006-08-31 05:31:11 -04:00
|
|
|
end
|