From 7749c9c2200ad190e3f9935c27f09ec9b95227f2 Mon Sep 17 00:00:00 2001 From: Rick Olson Date: Fri, 1 Sep 2006 01:15:10 +0000 Subject: Major updates to ActiveResource, please see changelog and unit tests [Rick Olson] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4890 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activeresource/test/base_test.rb | 109 +++++++++++++++++++++---- activeresource/test/fixtures/person.rb | 2 +- activeresource/test/fixtures/street_address.rb | 4 + activeresource/test/http_mock.rb | 34 ++++++-- 4 files changed, 128 insertions(+), 21 deletions(-) create mode 100644 activeresource/test/fixtures/street_address.rb (limited to 'activeresource/test') diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb index e4839613ee..97f2ea3d01 100644 --- a/activeresource/test/base_test.rb +++ b/activeresource/test/base_test.rb @@ -1,20 +1,32 @@ require "#{File.dirname(__FILE__)}/abstract_unit" require "fixtures/person" +require "fixtures/street_address" class BaseTest < Test::Unit::TestCase def setup - ActiveResource::HttpMock.respond_to( - ActiveResource::Request.new(:get, "/people/1.xml") => ActiveResource::Response.new("Matz1"), - ActiveResource::Request.new(:get, "/people/2.xml") => ActiveResource::Response.new("David2"), - ActiveResource::Request.new(:put, "/people/1.xml") => ActiveResource::Response.new({}, 200), - ActiveResource::Request.new(:delete, "/people/1.xml") => ActiveResource::Response.new({}, 200), - ActiveResource::Request.new(:delete, "/people/2.xml") => ActiveResource::Response.new({}, 400), - ActiveResource::Request.new(:post, "/people.xml") => ActiveResource::Response.new({}, 200), - ActiveResource::Request.new(:get, "/people/99.xml") => ActiveResource::Response.new({}, 404), - ActiveResource::Request.new(:get, "/people.xml") => ActiveResource::Response.new( - "Matz1David2" - ) - ) + @matz = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person') + @david = { :id => 2, :name => 'David' }.to_xml(:root => 'person') + @addy = { :id => 1, :street => '12345 Street' }.to_xml(:root => 'address') + ActiveResource::HttpMock.respond_to do |mock| + mock.get "/people/1.xml", @matz + mock.get "/people/2.xml", @david + mock.put "/people/1", nil, 204 + mock.delete "/people/1", nil, 200 + mock.delete "/people/2", nil, 400 + mock.post "/people", nil, 201, 'Location' => '/people/5.xml' + mock.get "/people/99.xml", nil, 404 + mock.get "/people.xml", "#{@matz}#{@david}" + mock.get "/people/1/addresses.xml", "#{@addy}" + mock.get "/people/1/addresses/1.xml", @addy + mock.put "/people/1/addresses/1", nil, 204 + mock.delete "/people/1/addresses/1", nil, 200 + mock.post "/people/1/addresses", nil, 201, 'Location' => '/people/1/addresses/5' + mock.get "/people//addresses.xml", nil, 404 + mock.get "/people//addresses/1.xml", nil, 404 + mock.put "/people//addresses/1", nil, 404 + mock.delete "/people//addresses/1", nil, 404 + mock.post "/people//addresses", nil, 404 + end end @@ -33,12 +45,47 @@ class BaseTest < Test::Unit::TestCase assert_equal "people", Person.collection_name end + def test_collection_path + assert_equal '/people.xml', Person.collection_path + end + + def test_custom_element_path + assert_equal '/people/1/addresses/1.xml', StreetAddress.element_path(1, :person_id => 1) + end + + def test_custom_collection_path + assert_equal '/people/1/addresses.xml', StreetAddress.collection_path(:person_id => 1) + end + + def test_custom_element_name + assert_equal 'address', StreetAddress.element_name + end + + def test_custom_collection_name + assert_equal 'addresses', StreetAddress.collection_name + end + + def test_prefix + assert_equal "/", Person.prefix + end + + def test_custom_prefix + assert_equal '/people//', StreetAddress.prefix + assert_equal '/people/1/', StreetAddress.prefix(:person_id => 1) + end + def test_find_by_id matz = Person.find(1) assert_kind_of Person, matz assert_equal "Matz", matz.name end + def test_find_by_id_with_custom_prefix + addy = StreetAddress.find(1, :person_id => 1) + assert_kind_of StreetAddress, addy + assert_equal '12345 Street', addy.street + end + def test_find_all all = Person.find(:all) assert_equal 2, all.size @@ -55,8 +102,21 @@ class BaseTest < Test::Unit::TestCase def test_find_by_id_not_found assert_raises(ActiveResource::ResourceNotFound) { Person.find(99) } + assert_raises(ActiveResource::ResourceNotFound) { StreetAddress.find(1) } + end + + def test_create + rick = Person.new + rick.save + assert_equal '5', rick.id + end + + def test_create_with_custom_prefix + matzs_house = StreetAddress.new({}, {:person_id => 1}) + matzs_house.save + assert_equal '5', matzs_house.id end - + def test_update matz = Person.find(:first) matz.name = "David" @@ -64,9 +124,28 @@ class BaseTest < Test::Unit::TestCase assert_equal "David", matz.name matz.save end - + + def test_update_with_custom_prefix + addy = StreetAddress.find(1, :person_id => 1) + addy.street = "54321 Street" + assert_kind_of StreetAddress, addy + assert_equal "54321 Street", addy.street + addy.save + end + def test_destroy assert Person.find(1).destroy - assert_raises(ActiveResource::ClientError) { Person.find(2).destroy } + ActiveResource::HttpMock.respond_to do |mock| + mock.get "/people/1.xml", nil, 404 + end + assert_raises(ActiveResource::ResourceNotFound) { Person.find(1).destroy } + end + + def test_destroy_with_custom_prefix + assert StreetAddress.find(1, :person_id => 1).destroy + ActiveResource::HttpMock.respond_to do |mock| + mock.get "/people/1/addresses/1.xml", nil, 404 + end + assert_raises(ActiveResource::ResourceNotFound) { StreetAddress.find(1, :person_id => 1).destroy } end end diff --git a/activeresource/test/fixtures/person.rb b/activeresource/test/fixtures/person.rb index 4914863230..8e5768586a 100644 --- a/activeresource/test/fixtures/person.rb +++ b/activeresource/test/fixtures/person.rb @@ -1,3 +1,3 @@ class Person < ActiveResource::Base - self.site = "http://37s.sunrise.i:3000/" + self.site = "http://37s.sunrise.i:3000" end \ No newline at end of file diff --git a/activeresource/test/fixtures/street_address.rb b/activeresource/test/fixtures/street_address.rb new file mode 100644 index 0000000000..84f20bbed6 --- /dev/null +++ b/activeresource/test/fixtures/street_address.rb @@ -0,0 +1,4 @@ +class StreetAddress < ActiveResource::Base + self.site = "http://37s.sunrise.i:3000/people/:person_id/" + set_element_name 'address' +end \ No newline at end of file diff --git a/activeresource/test/http_mock.rb b/activeresource/test/http_mock.rb index a4bc7e7cb2..75a54e71fe 100644 --- a/activeresource/test/http_mock.rb +++ b/activeresource/test/http_mock.rb @@ -2,6 +2,20 @@ require 'active_resource/connection' module ActiveResource class HttpMock + class Responder + def initialize(responses) + @responses = responses + end + + for method in [ :post, :put, :get, :delete ] + module_eval <<-EOE + def #{method}(path, body = nil, status = 200, headers = {}) + @responses[Request.new(:#{method}, path, nil)] = Response.new(body || {}, status, headers) + end + EOE + end + end + class << self def requests @@requests ||= [] @@ -11,11 +25,12 @@ module ActiveResource @@responses ||= {} end - def respond_to(pairs) + def respond_to(pairs = {}) reset! pairs.each do |(path, response)| responses[path] = response end + yield Responder.new(responses) if block_given? end def reset! @@ -42,7 +57,7 @@ module ActiveResource class Request attr_accessor :path, :method, :body - def initialize(method, path, body = nil) + def initialize(method, path, body = nil, headers = nil) @method, @path, @body = method, path, body end @@ -64,15 +79,24 @@ module ActiveResource end class Response - attr_accessor :body, :code + attr_accessor :body, :code, :headers - def initialize(body, code = 200) - @body, @code = body, code + def initialize(body, code = 200, headers = nil) + @body, @code, @headers = body, code, headers end def success? (200..299).include?(code) end + + def [](key) + headers[key] + end + + def []=(key, value) + headers[key] = value + end + end class Connection -- cgit v1.2.3