From 5f3f44e76fdf465910b7c6521568bb6a1e8bd641 Mon Sep 17 00:00:00 2001 From: Leon Breedt Date: Sat, 19 Feb 2005 09:07:35 +0000 Subject: [PATCH] ensure clients can handle APIs with named parameter signatures, and test for this git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@680 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionwebservice/lib/action_web_service/client/base.rb | 4 ++++ .../lib/action_web_service/client/soap_client.rb | 5 +++-- .../lib/action_web_service/client/xmlrpc_client.rb | 5 +++-- actionwebservice/test/abstract_client.rb | 7 +++++++ actionwebservice/test/client_soap_test.rb | 6 ++++++ actionwebservice/test/client_xmlrpc_test.rb | 6 ++++++ 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/actionwebservice/lib/action_web_service/client/base.rb b/actionwebservice/lib/action_web_service/client/base.rb index d01cffcd56..431b78c748 100644 --- a/actionwebservice/lib/action_web_service/client/base.rb +++ b/actionwebservice/lib/action_web_service/client/base.rb @@ -30,6 +30,10 @@ module ActionWebService # :nodoc: nil end end + + def lookup_class(klass) + klass.is_a?(Hash) ? klass.values[0] : klass + end end end end diff --git a/actionwebservice/lib/action_web_service/client/soap_client.rb b/actionwebservice/lib/action_web_service/client/soap_client.rb index 3557f88594..dfabfd86ee 100644 --- a/actionwebservice/lib/action_web_service/client/soap_client.rb +++ b/actionwebservice/lib/action_web_service/client/soap_client.rb @@ -62,13 +62,14 @@ module ActionWebService # :nodoc: if expects expects.each do |klass| param_name = klass.is_a?(Hash) ? klass.keys[0] : "param#{i}" - mapping = @mapper.lookup(klass) + param_klass = lookup_class(klass) + mapping = @mapper.lookup(param_klass) param_def << ['in', param_name, mapping.registry_mapping] i += 1 end end if returns - mapping = @mapper.lookup(returns[0]) + mapping = @mapper.lookup(lookup_class(returns[0])) param_def << ['retval', 'return', mapping.registry_mapping] end driver.add_method(qname, action, name.to_s, param_def) diff --git a/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb b/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb index df51230b81..bb52c20453 100644 --- a/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb +++ b/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb @@ -54,7 +54,7 @@ module ActionWebService # :nodoc: signature = Protocol::XmlRpc::XmlRpcProtocol.transform_array_types(signature) (1..signature.size).each do |i| i -= 1 - params[i] = Protocol::XmlRpc::XmlRpcProtocol.ruby_to_xmlrpc(params[i], signature[i]) + params[i] = Protocol::XmlRpc::XmlRpcProtocol.ruby_to_xmlrpc(params[i], lookup_class(signature[i])) end end params @@ -63,7 +63,8 @@ module ActionWebService # :nodoc: def transform_return_value(method_name, return_value) info = @api.api_methods[method_name.to_sym] return true unless signature = info[:returns] - signature = Protocol::XmlRpc::XmlRpcProtocol.transform_array_types(signature) + param_klass = lookup_class(signature[0]) + signature = Protocol::XmlRpc::XmlRpcProtocol.transform_array_types([param_klass]) Protocol::XmlRpc::XmlRpcProtocol.xmlrpc_to_ruby(return_value, signature[0]) end diff --git a/actionwebservice/test/abstract_client.rb b/actionwebservice/test/abstract_client.rb index b443fa8ffb..88f886f05f 100644 --- a/actionwebservice/test/abstract_client.rb +++ b/actionwebservice/test/abstract_client.rb @@ -19,6 +19,7 @@ module ClientTest api_method :array_return, :returns => [[Person]] api_method :struct_pass, :expects => [[Person]], :returns => [:bool] api_method :client_container, :returns => [:int] + api_method :named_parameters, :expects => [{:key=>:string}, {:id=>:int}] end class NullLogOut @@ -32,6 +33,7 @@ module ClientTest attr :value_normal attr :value_array_return attr :value_struct_pass + attr :value_named_parameters def initialize @session = @assigns = {} @@ -39,6 +41,7 @@ module ClientTest @value_normal = nil @value_array_return = nil @value_struct_pass = nil + @value_named_parameters = nil end def void @@ -66,6 +69,10 @@ module ClientTest 50 end + def named_parameters + @value_named_parameters = @method_params + end + def protocol_request(request) probe_request_protocol(request) end diff --git a/actionwebservice/test/client_soap_test.rb b/actionwebservice/test/client_soap_test.rb index 82ccef6f1b..5d62b05c82 100644 --- a/actionwebservice/test/client_soap_test.rb +++ b/actionwebservice/test/client_soap_test.rb @@ -84,4 +84,10 @@ class TC_ClientSoap < Test::Unit::TestCase def test_client_container assert_equal(50, ClientContainer.new.get_client.client_container) end + + def test_named_parameters + assert(@container.value_named_parameters.nil?) + assert(@client.named_parameters("key", 5).nil?) + assert_equal(["key", 5], @container.value_named_parameters) + end end diff --git a/actionwebservice/test/client_xmlrpc_test.rb b/actionwebservice/test/client_xmlrpc_test.rb index f9be9bfe16..cd393fbad6 100644 --- a/actionwebservice/test/client_xmlrpc_test.rb +++ b/actionwebservice/test/client_xmlrpc_test.rb @@ -83,4 +83,10 @@ class TC_ClientXmlRpc < Test::Unit::TestCase def test_client_container assert_equal(50, ClientContainer.new.get_client.client_container) end + + def test_named_parameters + assert(@container.value_named_parameters.nil?) + assert_equal(true, @client.named_parameters("xxx", 7)) + assert_equal(["xxx", 7], @container.value_named_parameters) + end end