aboutsummaryrefslogtreecommitdiffstats
path: root/activeresource
diff options
context:
space:
mode:
authorLuis Hurtado <luisfelipehurtado@gmail.com>2008-06-09 21:39:39 -0500
committerJeremy Kemper <jeremy@bitsweat.net>2008-06-09 23:06:07 -0700
commit225065709c43dacd57e0904aef2075024ccf2744 (patch)
tree97bb64adfd245513c9c5fcd8aa9f929cc19013fc /activeresource
parent16a9787bf034a4de36a35b647c456ef142f814e1 (diff)
downloadrails-225065709c43dacd57e0904aef2075024ccf2744.tar.gz
rails-225065709c43dacd57e0904aef2075024ccf2744.tar.bz2
rails-225065709c43dacd57e0904aef2075024ccf2744.zip
Fixes parsing deep nested resources from XML. [#380 state:resolved]
Diffstat (limited to 'activeresource')
-rw-r--r--activeresource/lib/active_resource/base.rb6
-rw-r--r--activeresource/test/base_test.rb48
-rw-r--r--activeresource/test/fixtures/customer.rb3
3 files changed, 56 insertions, 1 deletions
diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb
index 55dacfdf06..347dbb82aa 100644
--- a/activeresource/lib/active_resource/base.rb
+++ b/activeresource/lib/active_resource/base.rb
@@ -988,7 +988,11 @@ module ActiveResource
self.class.const_get(resource_name)
end
rescue NameError
- resource = self.class.const_set(resource_name, Class.new(ActiveResource::Base))
+ if self.class.const_defined?(resource_name)
+ resource = self.class.const_get(resource_name)
+ else
+ resource = self.class.const_set(resource_name, Class.new(ActiveResource::Base))
+ end
resource.prefix = self.class.prefix
resource.site = self.class.site
resource
diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb
index 9e2f6c1831..4addd52636 100644
--- a/activeresource/test/base_test.rb
+++ b/activeresource/test/base_test.rb
@@ -1,5 +1,6 @@
require 'abstract_unit'
require "fixtures/person"
+require "fixtures/customer"
require "fixtures/street_address"
require "fixtures/beast"
@@ -15,6 +16,37 @@ class BaseTest < Test::Unit::TestCase
@people_david = [{ :id => 2, :name => 'David' }].to_xml(:root => 'people')
@addresses = [{ :id => 1, :street => '12345 Street' }].to_xml(:root => 'addresses')
+ # - deep nested resource -
+ # - Luis (Customer)
+ # - JK (Customer::Friend)
+ # - Mateo (Customer::Friend::Brother)
+ # - Edith (Customer::Friend::Brother::Child)
+ # - Martha (Customer::Friend::Brother::Child)
+ # - Felipe (Customer::Friend::Brother)
+ # - Bryan (Customer::Friend::Brother::Child)
+ # - Luke (Customer::Friend::Brother::Child)
+ # - Eduardo (Customer::Friend)
+ # - Sebas (Customer::Friend::Brother)
+ # - Andres (Customer::Friend::Brother::Child)
+ # - Jorge (Customer::Friend::Brother::Child)
+ # - Elsa (Customer::Friend::Brother)
+ # - Natacha (Customer::Friend::Brother::Child)
+ # - Milena (Customer::Friend::Brother)
+ #
+ @luis = {:id => 1, :name => 'Luis',
+ :friends => [{:name => 'JK',
+ :brothers => [{:name => 'Mateo',
+ :children => [{:name => 'Edith'},{:name => 'Martha'}]},
+ {:name => 'Felipe',
+ :children => [{:name => 'Bryan'},{:name => 'Luke'}]}]},
+ {:name => 'Eduardo',
+ :brothers => [{:name => 'Sebas',
+ :children => [{:name => 'Andres'},{:name => 'Jorge'}]},
+ {:name => 'Elsa',
+ :children => [{:name => 'Natacha'}]},
+ {:name => 'Milena',
+ :children => []}]}]}.to_xml(:root => 'customer')
+
ActiveResource::HttpMock.respond_to do |mock|
mock.get "/people/1.xml", {}, @matz
mock.get "/people/2.xml", {}, @david
@@ -46,6 +78,8 @@ class BaseTest < Test::Unit::TestCase
mock.head "/people/1/addresses/2.xml", {}, nil, 404
mock.head "/people/2/addresses/1.xml", {}, nil, 404
mock.head "/people/Greg/addresses/1.xml", {}, nil, 200
+ # customer
+ mock.get "/customers/1.xml", {}, @luis
end
Person.user = nil
@@ -788,4 +822,18 @@ class BaseTest < Test::Unit::TestCase
matz = Person.find(1)
assert_equal '1', matz.to_param
end
+
+ def test_parse_deep_nested_resources
+ luis = Customer.find(1)
+ assert_kind_of Customer, luis
+ luis.friends.each do |friend|
+ assert_kind_of Customer::Friend, friend
+ friend.brothers.each do |brother|
+ assert_kind_of Customer::Friend::Brother, brother
+ brother.children.each do |child|
+ assert_kind_of Customer::Friend::Brother::Child, child
+ end
+ end
+ end
+ end
end
diff --git a/activeresource/test/fixtures/customer.rb b/activeresource/test/fixtures/customer.rb
new file mode 100644
index 0000000000..845d5d11cb
--- /dev/null
+++ b/activeresource/test/fixtures/customer.rb
@@ -0,0 +1,3 @@
+class Customer < ActiveResource::Base
+ self.site = "http://37s.sunrise.i:3000"
+end