From 418d487020d24e69b528fdbedfecb20a87f99fcb Mon Sep 17 00:00:00 2001 From: Leon Breedt Date: Sat, 19 Feb 2005 08:29:42 +0000 Subject: refactoring: * move dispatching out of the Container into Dispatcher, it makes more sense for Container to only contain the list of web services defined in it. * collapse Wsdl and ActionController "routers" into an ActionController-specific module, no advantage to having them seperate as they were quite tightly coupled. rename to Dispatcher, to avoi confusion with Routing. * add a "_thing" suffix to concept-specific filenames. this is so that we don't end up with many soap.rb files, for example. * remove "virtual invocation" support. adds complexity, and it doesn't seem to add any value. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@679 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionwebservice/test/abstract_client.rb | 2 +- .../test/dispatcher_action_controller_test.rb | 186 +++++++++++++++++++++ actionwebservice/test/invocation_test.rb | 13 +- actionwebservice/test/protocol_soap_test.rb | 60 +++++-- actionwebservice/test/protocol_xmlrpc_test.rb | 14 +- .../test/router_action_controller_test.rb | 139 --------------- actionwebservice/test/router_wsdl_test.rb | 100 ----------- 7 files changed, 234 insertions(+), 280 deletions(-) create mode 100644 actionwebservice/test/dispatcher_action_controller_test.rb delete mode 100644 actionwebservice/test/router_action_controller_test.rb delete mode 100644 actionwebservice/test/router_wsdl_test.rb (limited to 'actionwebservice/test') diff --git a/actionwebservice/test/abstract_client.rb b/actionwebservice/test/abstract_client.rb index 0197b87d63..b443fa8ffb 100644 --- a/actionwebservice/test/abstract_client.rb +++ b/actionwebservice/test/abstract_client.rb @@ -71,7 +71,7 @@ module ClientTest end def dispatch_request(protocol_request) - dispatch_web_service_request(protocol_request) + dispatch_protocol_request(protocol_request) end end diff --git a/actionwebservice/test/dispatcher_action_controller_test.rb b/actionwebservice/test/dispatcher_action_controller_test.rb new file mode 100644 index 0000000000..11ab21c6a6 --- /dev/null +++ b/actionwebservice/test/dispatcher_action_controller_test.rb @@ -0,0 +1,186 @@ +require File.dirname(__FILE__) + '/abstract_soap' +require 'wsdl/parser' + +module DispatcherActionControllerTest + class API < ActionWebService::API::Base + api_method :add, :expects => [:int, :int], :returns => [:int] + end + + class DirectAPI < ActionWebService::API::Base + api_method :add, :expects => [{:a=>:int}, {:b=>:int}], :returns => [:int] + api_method :before_filtered + api_method :after_filtered, :returns => [:int] + api_method :thrower + end + + class Service < ActionWebService::Base + web_service_api API + + attr :added + + def add(a, b) + @added = a + b + end + end + + class AbstractController < ActionController::Base + def generate_wsdl(container, uri, soap_action_base) + to_wsdl(container, uri, soap_action_base) + end + end + + class DelegatedController < AbstractController + web_service_dispatching_mode :delegated + + web_service(:test_service) { @service ||= Service.new; @service } + end + + class DirectController < AbstractController + web_service_api DirectAPI + web_service_dispatching_mode :direct + + before_filter :alwaysfail, :only => [:before_filtered] + after_filter :alwaysok, :only => [:after_filtered] + + attr :added + attr :before_filter_called + attr :before_filter_target_called + attr :after_filter_called + attr :after_filter_target_called + + def initialize + @before_filter_called = false + @before_filter_target_called = false + @after_filter_called = false + @after_filter_target_called = false + end + + def add + @added = @params['a'] + @params['b'] + end + + def before_filtered + @before_filter_target_called = true + end + + def after_filtered + @after_filter_target_called = true + 5 + end + + def thrower + raise "Hi, I'm a SOAP exception" + end + + protected + def alwaysfail + @before_filter_called = true + false + end + + def alwaysok + @after_filter_called = true + end + end +end + +class TC_DispatcherActionController < AbstractSoapTest + include DispatcherActionControllerTest + + def test_direct_dispatching + @container = DirectController.new + assert(do_soap_call('Add', 20, 50) == 70) + assert(@container.added == 70) + end + + def test_direct_entrypoint + @container = DirectController.new + assert(@container.respond_to?(:api)) + end + + def test_direct_filtering + @container = DirectController.new + assert(@container.before_filter_called == false) + assert(@container.before_filter_target_called == false) + assert(do_soap_call('BeforeFiltered').nil?) + assert(@container.before_filter_called == true) + assert(@container.before_filter_target_called == false) + assert(@container.after_filter_called == false) + assert(@container.after_filter_target_called == false) + assert(do_soap_call('AfterFiltered') == 5) + assert(@container.after_filter_called == true) + assert(@container.after_filter_target_called == true) + end + + def test_delegated_dispatching + @container = DelegatedController.new + assert(do_soap_call('Add', 50, 80) == 130) + assert(service.added == 130) + end + + def test_exception_marshaling + @container = DirectController.new + result = do_soap_call('Thrower') + exception = result.detail + assert(exception.cause.is_a?(RuntimeError)) + assert_equal("Hi, I'm a SOAP exception", exception.cause.message) + @container.web_service_exception_reporting = false + assert_raises(SoapTestError) do + do_soap_call('Thrower') + end + end + + def test_wsdl_generation + ensure_valid_wsdl_generation DelegatedController.new + ensure_valid_wsdl_generation DirectController.new + end + + def + + def test_wsdl_action + ensure_valid_wsdl_action DelegatedController.new + ensure_valid_wsdl_action DirectController.new + end + + protected + def service_name + @container.is_a?(DelegatedController) ? 'test_service' : 'api' + end + + def service + @container.web_service_object(:test_service) + end + + def do_soap_call(public_method_name, *args) + super(public_method_name, *args) do |test_request, test_response| + response = @container.process(test_request, test_response) + end + end + + def ensure_valid_wsdl_generation(controller) + wsdl = controller.generate_wsdl(controller, 'http://localhost:3000/test/', '/test') + ensure_valid_wsdl(wsdl) + end + + def ensure_valid_wsdl(wsdl) + definitions = WSDL::Parser.new.parse(wsdl) + assert(definitions.is_a?(WSDL::Definitions)) + definitions.bindings.each do |binding| + assert(binding.name.name.index(':').nil?) + end + definitions.services.each do |service| + service.ports.each do |port| + assert(port.name.name.index(':').nil?) + end + end + end + + def ensure_valid_wsdl_action(controller) + test_request = ActionController::TestRequest.new({ 'action' => 'wsdl' }) + test_request.env['REQUEST_METHOD'] = 'GET' + test_request.env['HTTP_HOST'] = 'localhost:3000' + test_response = ActionController::TestResponse.new + wsdl = controller.process(test_request, test_response).body + ensure_valid_wsdl(wsdl) + end +end diff --git a/actionwebservice/test/invocation_test.rb b/actionwebservice/test/invocation_test.rb index 8ca80ec8f2..0d519bf770 100644 --- a/actionwebservice/test/invocation_test.rb +++ b/actionwebservice/test/invocation_test.rb @@ -58,9 +58,6 @@ module InvocationTest def only_two end - def not_public - end - protected def intercept_before(name, args) @before_invoked = name @@ -90,10 +87,7 @@ class TC_Invocation < Test::Unit::TestCase def test_invocation assert(perform_invocation(:add, 5, 10) == 15) assert(perform_invocation(:transmogrify, "hello") == "HELLO") - assert_raises(InvocationError) do - perform_invocation(:not_public) - end - assert_raises(InvocationError) do + assert_raises(NoMethodError) do perform_invocation(:nonexistent_method_xyzzy) end end @@ -150,9 +144,6 @@ class TC_Invocation < Test::Unit::TestCase private def perform_invocation(method_name, *args, &block) - public_method_name = @service.class.web_service_api.public_api_method_name(method_name) - args ||= [] - request = InvocationRequest.new(ConcreteInvocation, public_method_name, method_name, args) - @service.perform_invocation(request, &block) + @service.perform_invocation(method_name, args, &block) end end diff --git a/actionwebservice/test/protocol_soap_test.rb b/actionwebservice/test/protocol_soap_test.rb index 1130dff3a7..c55b7f55af 100644 --- a/actionwebservice/test/protocol_soap_test.rb +++ b/actionwebservice/test/protocol_soap_test.rb @@ -12,6 +12,13 @@ module ProtocolSoapTest end end + class EmptyAPI < ActionWebService::API::Base + end + + class EmptyService < ActionWebService::Base + web_service_api EmptyAPI + end + class API < ActionWebService::API::Base api_method :argument_passing, :expects => [{:int=>:int}, {:string=>:string}, {:array=>[:int]}], :returns => [:bool] api_method :array_returner, :returns => [[:int]] @@ -72,26 +79,19 @@ module ProtocolSoapTest end end - class AbstractContainer - include ActionWebService::API - include ActionWebService::Container - include ActionWebService::Protocol::Registry - include ActionWebService::Protocol::Soap - + class AbstractContainer < ActionController::Base wsdl_service_name 'Test' - def protocol_request(request) - probe_request_protocol(request) - end - - def dispatch_request(protocol_request) - dispatch_web_service_request(protocol_request) + def dispatch_request(request) + protocol_request = probe_request_protocol(request) + dispatch_protocol_request(protocol_request) end end class DelegatedContainer < AbstractContainer web_service_dispatching_mode :delegated web_service :protocol_soap_service, Service.new + web_service :empty_service, EmptyService.new end class DirectContainer < AbstractContainer @@ -144,12 +144,18 @@ module ProtocolSoapTest nil end end + + class EmptyContainer < AbstractContainer + web_service_dispatching_mode :delegated + web_service :empty_service, EmptyService.new + end end class TC_ProtocolSoap < AbstractSoapTest def setup @delegated_container = ProtocolSoapTest::DelegatedContainer.new @direct_container = ProtocolSoapTest::DirectContainer.new + @empty_container = ProtocolSoapTest::EmptyContainer.new end def test_argument_passing @@ -180,6 +186,13 @@ class TC_ProtocolSoap < AbstractSoapTest end end + def test_nonexistent_method + @container = @empty_container + assert_raises(ActionWebService::Dispatcher::DispatcherError) do + do_soap_call('NonexistentMethod') + end + end + def test_exception_thrower in_all_containers do assert_raises(RuntimeError) do @@ -203,15 +216,29 @@ class TC_ProtocolSoap < AbstractSoapTest protected def service_name - @container == @direct_container ? 'api' : 'protocol_soap_service' + case + when @container == @direct_container + 'api' + when @container == @delegated_container + 'protocol_soap_service' + when @container == @empty_container + 'empty_service' + end end def service - @container == @direct_container ? @container : @container.web_service_object(:protocol_soap_service) + case + when @container == @direct_container + @container + when @container == @delegated_container + @container.web_service_object(:protocol_soap_service) + when @container == @empty_container + @container.web_service_object(:empty_service) + end end def in_all_containers(&block) - [@direct_container].each do |container| + [@direct_container, @delegated_container].each do |container| @container = container block.call end @@ -219,8 +246,7 @@ class TC_ProtocolSoap < AbstractSoapTest def do_soap_call(public_method_name, *args) super(public_method_name, *args) do |test_request, test_response| - protocol_request = @container.protocol_request(test_request) - @container.dispatch_request(protocol_request) + @container.dispatch_request(test_request) end end end diff --git a/actionwebservice/test/protocol_xmlrpc_test.rb b/actionwebservice/test/protocol_xmlrpc_test.rb index 7dc5cf0252..cda0bba6d3 100644 --- a/actionwebservice/test/protocol_xmlrpc_test.rb +++ b/actionwebservice/test/protocol_xmlrpc_test.rb @@ -79,18 +79,13 @@ module ProtocolXmlRpcTest $service = Service.new - class Container - include ActionWebService::Container - include ActionWebService::Protocol::Registry - include ActionWebService::Protocol::Soap - include ActionWebService::Protocol::XmlRpc - + class Container < ActionController::Base def protocol_request(request) probe_request_protocol(request) end def dispatch_request(protocol_request) - dispatch_web_service_request(protocol_request) + dispatch_protocol_request(protocol_request) end web_service :xmlrpc, $service @@ -136,11 +131,6 @@ class TC_ProtocolXmlRpc < Test::Unit::TestCase assert($service.default_args == ['test', [1, 2], {'name'=>'value'}]) end - def test_xmlrpc_introspection - retval = do_xmlrpc_call('system.listMethods', 'test', [1, 2], {'name'=>'value'}) - assert(retval == [true, ["Add", "ArrayReturner", "HashReturner", "SomethingHash", "StructArrayReturner"]]) - end - private def do_xmlrpc_call(public_method_name, *args) service_name = 'xmlrpc' diff --git a/actionwebservice/test/router_action_controller_test.rb b/actionwebservice/test/router_action_controller_test.rb deleted file mode 100644 index 4f6d40e738..0000000000 --- a/actionwebservice/test/router_action_controller_test.rb +++ /dev/null @@ -1,139 +0,0 @@ -require File.dirname(__FILE__) + '/abstract_soap' -require 'wsdl/parser' - -module RouterActionControllerTest - class API < ActionWebService::API::Base - api_method :add, :expects => [:int, :int], :returns => [:int] - end - - class Service < ActionWebService::Base - web_service_api API - - attr :added - - def add(a, b) - @added = a + b - end - end - - class DelegatedController < ActionController::Base - web_service_dispatching_mode :delegated - - web_service(:test_service) { @service ||= Service.new; @service } - end - - class DirectAPI < ActionWebService::API::Base - api_method :add, :expects => [{:a=>:int}, {:b=>:int}], :returns => [:int] - api_method :before_filtered - api_method :after_filtered, :returns => [:int] - api_method :thrower - end - - class DirectController < ActionController::Base - web_service_api DirectAPI - web_service_dispatching_mode :direct - - before_filter :alwaysfail, :only => [:before_filtered] - after_filter :alwaysok, :only => [:after_filtered] - - attr :added - attr :before_filter_called - attr :before_filter_target_called - attr :after_filter_called - attr :after_filter_target_called - - def initialize - @before_filter_called = false - @before_filter_target_called = false - @after_filter_called = false - @after_filter_target_called = false - end - - def add - @added = @params['a'] + @params['b'] - end - - def before_filtered - @before_filter_target_called = true - end - - def after_filtered - @after_filter_target_called = true - 5 - end - - def thrower - raise "Hi, I'm a SOAP exception" - end - - protected - def alwaysfail - @before_filter_called = true - false - end - - def alwaysok - @after_filter_called = true - end - end -end - -class TC_RouterActionController < AbstractSoapTest - def test_direct_routing - @container = RouterActionControllerTest::DirectController.new - assert(do_soap_call('Add', 20, 50) == 70) - assert(@container.added == 70) - end - - def test_direct_entrypoint - @container = RouterActionControllerTest::DirectController.new - assert(@container.respond_to?(:api)) - end - - def test_direct_filtering - @container = RouterActionControllerTest::DirectController.new - assert(@container.before_filter_called == false) - assert(@container.before_filter_target_called == false) - assert(do_soap_call('BeforeFiltered').nil?) - assert(@container.before_filter_called == true) - assert(@container.before_filter_target_called == false) - assert(@container.after_filter_called == false) - assert(@container.after_filter_target_called == false) - assert(do_soap_call('AfterFiltered') == 5) - assert(@container.after_filter_called == true) - assert(@container.after_filter_target_called == true) - end - - def test_delegated_routing - @container = RouterActionControllerTest::DelegatedController.new - assert(do_soap_call('Add', 50, 80) == 130) - assert(service.added == 130) - end - - def test_exception_marshaling - @container = RouterActionControllerTest::DirectController.new - result = do_soap_call('Thrower') - exception = result.detail - assert(exception.cause.is_a?(RuntimeError)) - assert_equal("Hi, I'm a SOAP exception", exception.cause.message) - @container.web_service_exception_reporting = false - assert_raises(SoapTestError) do - do_soap_call('Thrower') - end - end - - protected - def service_name - @container.is_a?(RouterActionControllerTest::DelegatedController) ? 'test_service' : 'api' - end - - def service - @container.web_service_object(:test_service) - end - - def do_soap_call(public_method_name, *args) - super(public_method_name, *args) do |test_request, test_response| - response = @container.process(test_request, test_response) - end - end -end diff --git a/actionwebservice/test/router_wsdl_test.rb b/actionwebservice/test/router_wsdl_test.rb deleted file mode 100644 index a441e73f37..0000000000 --- a/actionwebservice/test/router_wsdl_test.rb +++ /dev/null @@ -1,100 +0,0 @@ -require File.dirname(__FILE__) + '/abstract_unit' -require 'wsdl/parser' - -module RouterWsdlTest - class Person < ActionWebService::Struct - member :id, Integer - member :names, [String] - member :lastname, String - member :deleted, TrueClass - end - - class API < ActionWebService::API::Base - api_method :add, :expects => [{:a=>:int}, {:b=>:int}], :returns => [:int] - api_method :find_people, :returns => [[Person]] - api_method :nil_returner - end - - class Service < ActionWebService::Base - web_service_api API - - def add(a, b) - a + b - end - - def find_people - [] - end - - def nil_returner - end - end - - class AbstractController < ActionController::Base - def generate_wsdl(container, uri, soap_action_base) - to_wsdl(container, uri, soap_action_base) - end - end - - class DirectController < AbstractController - web_service_api API - - def add - end - - def find_people - end - - def nil_returner - end - end - - class DelegatedController < AbstractController - web_service_dispatching_mode :delegated - web_service(:test_service) { Service.new } - end -end - -class TC_RouterWsdl < Test::Unit::TestCase - include RouterWsdlTest - - def test_wsdl_generation - ensure_valid_generation DelegatedController.new - ensure_valid_generation DirectController.new - end - - def - - def test_wsdl_action - ensure_valid_wsdl_action DelegatedController.new - ensure_valid_wsdl_action DirectController.new - end - - protected - def ensure_valid_generation(controller) - wsdl = controller.generate_wsdl(controller, 'http://localhost:3000/test/', '/test') - ensure_valid_wsdl(wsdl) - end - - def ensure_valid_wsdl(wsdl) - definitions = WSDL::Parser.new.parse(wsdl) - assert(definitions.is_a?(WSDL::Definitions)) - definitions.bindings.each do |binding| - assert(binding.name.name.index(':').nil?) - end - definitions.services.each do |service| - service.ports.each do |port| - assert(port.name.name.index(':').nil?) - end - end - end - - def ensure_valid_wsdl_action(controller) - test_request = ActionController::TestRequest.new({ 'action' => 'wsdl' }) - test_request.env['REQUEST_METHOD'] = 'GET' - test_request.env['HTTP_HOST'] = 'localhost:3000' - test_response = ActionController::TestResponse.new - wsdl = controller.process(test_request, test_response).body - ensure_valid_wsdl(wsdl) - end -end -- cgit v1.2.3