mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
418d487020
* 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
149 lines
4.1 KiB
Ruby
149 lines
4.1 KiB
Ruby
require File.dirname(__FILE__) + '/abstract_unit'
|
|
|
|
module InvocationTest
|
|
class API < ActionWebService::API::Base
|
|
api_method :add, :expects => [:int, :int], :returns => [:int]
|
|
api_method :transmogrify, :expects_and_returns => [:string]
|
|
api_method :fail_with_reason
|
|
api_method :fail_generic
|
|
api_method :no_before
|
|
api_method :no_after
|
|
api_method :only_one
|
|
api_method :only_two
|
|
end
|
|
|
|
class Service < ActionWebService::Base
|
|
web_service_api API
|
|
|
|
before_invocation :intercept_before, :except => [:no_before]
|
|
after_invocation :intercept_after, :except => [:no_after]
|
|
before_invocation :intercept_only, :only => [:only_one, :only_two]
|
|
|
|
attr_accessor :before_invoked
|
|
attr_accessor :after_invoked
|
|
attr_accessor :only_invoked
|
|
attr_accessor :invocation_result
|
|
|
|
def initialize
|
|
@before_invoked = nil
|
|
@after_invoked = nil
|
|
@only_invoked = nil
|
|
@invocation_result = nil
|
|
end
|
|
|
|
def add(a, b)
|
|
a + b
|
|
end
|
|
|
|
def transmogrify(str)
|
|
str.upcase
|
|
end
|
|
|
|
def fail_with_reason
|
|
end
|
|
|
|
def fail_generic
|
|
end
|
|
|
|
def no_before
|
|
5
|
|
end
|
|
|
|
def no_after
|
|
end
|
|
|
|
def only_one
|
|
end
|
|
|
|
def only_two
|
|
end
|
|
|
|
protected
|
|
def intercept_before(name, args)
|
|
@before_invoked = name
|
|
return [false, "permission denied"] if name == :fail_with_reason
|
|
return false if name == :fail_generic
|
|
end
|
|
|
|
def intercept_after(name, args, result)
|
|
@after_invoked = name
|
|
@invocation_result = result
|
|
end
|
|
|
|
def intercept_only(name, args)
|
|
raise "Interception error" unless name == :only_one || name == :only_two
|
|
@only_invoked = name
|
|
end
|
|
end
|
|
end
|
|
|
|
class TC_Invocation < Test::Unit::TestCase
|
|
include ActionWebService::Invocation
|
|
|
|
def setup
|
|
@service = InvocationTest::Service.new
|
|
end
|
|
|
|
def test_invocation
|
|
assert(perform_invocation(:add, 5, 10) == 15)
|
|
assert(perform_invocation(:transmogrify, "hello") == "HELLO")
|
|
assert_raises(NoMethodError) do
|
|
perform_invocation(:nonexistent_method_xyzzy)
|
|
end
|
|
end
|
|
|
|
def test_interceptor_registration
|
|
assert(InvocationTest::Service.before_invocation_interceptors.length == 2)
|
|
assert(InvocationTest::Service.after_invocation_interceptors.length == 1)
|
|
end
|
|
|
|
def test_interception
|
|
assert(@service.before_invoked.nil? && @service.after_invoked.nil? && @service.only_invoked.nil? && @service.invocation_result.nil?)
|
|
perform_invocation(:add, 20, 50)
|
|
assert(@service.before_invoked == :add)
|
|
assert(@service.after_invoked == :add)
|
|
assert(@service.invocation_result == 70)
|
|
end
|
|
|
|
def test_interception_canceling
|
|
reason = nil
|
|
perform_invocation(:fail_with_reason){|r| reason = r}
|
|
assert(@service.before_invoked == :fail_with_reason)
|
|
assert(@service.after_invoked.nil?)
|
|
assert(@service.invocation_result.nil?)
|
|
assert(reason == "permission denied")
|
|
reason = true
|
|
@service.before_invoked = @service.after_invoked = @service.invocation_result = nil
|
|
perform_invocation(:fail_generic){|r| reason = r}
|
|
assert(@service.before_invoked == :fail_generic)
|
|
assert(@service.after_invoked.nil?)
|
|
assert(@service.invocation_result.nil?)
|
|
assert(reason == true)
|
|
end
|
|
|
|
def test_interception_except_conditions
|
|
perform_invocation(:no_before)
|
|
assert(@service.before_invoked.nil?)
|
|
assert(@service.after_invoked == :no_before)
|
|
assert(@service.invocation_result == 5)
|
|
@service.before_invoked = @service.after_invoked = @service.invocation_result = nil
|
|
perform_invocation(:no_after)
|
|
assert(@service.before_invoked == :no_after)
|
|
assert(@service.after_invoked.nil?)
|
|
assert(@service.invocation_result.nil?)
|
|
end
|
|
|
|
def test_interception_only_conditions
|
|
assert(@service.only_invoked.nil?)
|
|
perform_invocation(:only_one)
|
|
assert(@service.only_invoked == :only_one)
|
|
@service.only_invoked = nil
|
|
perform_invocation(:only_two)
|
|
assert(@service.only_invoked == :only_two)
|
|
end
|
|
|
|
private
|
|
def perform_invocation(method_name, *args, &block)
|
|
@service.perform_invocation(method_name, args, &block)
|
|
end
|
|
end
|