keeguon-actionwebservice 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. data/CHANGELOG +335 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +184 -0
  5. data/TODO +32 -0
  6. data/examples/googlesearch/README +143 -0
  7. data/examples/googlesearch/autoloading/google_search_api.rb +51 -0
  8. data/examples/googlesearch/autoloading/google_search_controller.rb +58 -0
  9. data/examples/googlesearch/delegated/google_search_service.rb +109 -0
  10. data/examples/googlesearch/delegated/search_controller.rb +8 -0
  11. data/examples/googlesearch/direct/google_search_api.rb +51 -0
  12. data/examples/googlesearch/direct/search_controller.rb +59 -0
  13. data/examples/metaWeblog/README +17 -0
  14. data/examples/metaWeblog/apis/blogger_api.rb +61 -0
  15. data/examples/metaWeblog/apis/blogger_service.rb +35 -0
  16. data/examples/metaWeblog/apis/meta_weblog_api.rb +68 -0
  17. data/examples/metaWeblog/apis/meta_weblog_service.rb +49 -0
  18. data/examples/metaWeblog/controllers/xmlrpc_controller.rb +17 -0
  19. data/generators/web_service/USAGE +28 -0
  20. data/generators/web_service/templates/api_definition.rb +6 -0
  21. data/generators/web_service/templates/controller.rb +9 -0
  22. data/generators/web_service/templates/functional_test.rb +20 -0
  23. data/generators/web_service/web_service_generator.rb +30 -0
  24. data/lib/action_web_service/acts_as_web_service.rb +26 -0
  25. data/lib/action_web_service/api.rb +298 -0
  26. data/lib/action_web_service/base.rb +39 -0
  27. data/lib/action_web_service/casting.rb +160 -0
  28. data/lib/action_web_service/client/base.rb +29 -0
  29. data/lib/action_web_service/client/soap_client.rb +114 -0
  30. data/lib/action_web_service/client/xmlrpc_client.rb +59 -0
  31. data/lib/action_web_service/client.rb +4 -0
  32. data/lib/action_web_service/container/action_controller_container.rb +94 -0
  33. data/lib/action_web_service/container/delegated_container.rb +87 -0
  34. data/lib/action_web_service/container/direct_container.rb +70 -0
  35. data/lib/action_web_service/container.rb +4 -0
  36. data/lib/action_web_service/dispatcher/abstract.rb +209 -0
  37. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +420 -0
  38. data/lib/action_web_service/dispatcher.rb +3 -0
  39. data/lib/action_web_service/invocation.rb +203 -0
  40. data/lib/action_web_service/protocol/abstract.rb +113 -0
  41. data/lib/action_web_service/protocol/discovery.rb +38 -0
  42. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +243 -0
  43. data/lib/action_web_service/protocol/soap_protocol.rb +181 -0
  44. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +124 -0
  45. data/lib/action_web_service/protocol.rb +5 -0
  46. data/lib/action_web_service/scaffolding.rb +282 -0
  47. data/lib/action_web_service/simple.rb +54 -0
  48. data/lib/action_web_service/string_to_datetime_for_soap.rb +17 -0
  49. data/lib/action_web_service/struct.rb +69 -0
  50. data/lib/action_web_service/support/class_inheritable_options.rb +27 -0
  51. data/lib/action_web_service/support/signature_types.rb +262 -0
  52. data/lib/action_web_service/templates/scaffolds/layout.html.erb +65 -0
  53. data/lib/action_web_service/templates/scaffolds/methods.html.erb +6 -0
  54. data/lib/action_web_service/templates/scaffolds/parameters.html.erb +29 -0
  55. data/lib/action_web_service/templates/scaffolds/result.html.erb +30 -0
  56. data/lib/action_web_service/test_invoke.rb +111 -0
  57. data/lib/action_web_service/version.rb +10 -0
  58. data/lib/action_web_service.rb +61 -0
  59. data/lib/actionwebservice.rb +2 -0
  60. data/setup.rb +1380 -0
  61. data/test/abstract_client.rb +185 -0
  62. data/test/abstract_dispatcher.rb +550 -0
  63. data/test/abstract_unit.rb +44 -0
  64. data/test/api_test.rb +103 -0
  65. data/test/apis/auto_load_api.rb +4 -0
  66. data/test/apis/broken_auto_load_api.rb +3 -0
  67. data/test/base_test.rb +43 -0
  68. data/test/casting_test.rb +96 -0
  69. data/test/client_soap_test.rb +157 -0
  70. data/test/client_xmlrpc_test.rb +155 -0
  71. data/test/container_test.rb +76 -0
  72. data/test/dispatcher_action_controller_soap_test.rb +147 -0
  73. data/test/dispatcher_action_controller_xmlrpc_test.rb +60 -0
  74. data/test/fixtures/db_definitions/mysql.sql +8 -0
  75. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  76. data/test/fixtures/users.yml +12 -0
  77. data/test/gencov +3 -0
  78. data/test/invocation_test.rb +187 -0
  79. data/test/run +6 -0
  80. data/test/scaffolded_controller_test.rb +148 -0
  81. data/test/struct_test.rb +85 -0
  82. data/test/test_invoke_test.rb +114 -0
  83. metadata +175 -0
data/test/base_test.rb ADDED
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ module BaseTest
5
+ class API < ActionWebService::API::Base
6
+ api_method :add, :expects => [:int, :int], :returns => [:int]
7
+ api_method :void
8
+ end
9
+
10
+ class PristineAPI < ActionWebService::API::Base
11
+ inflect_names false
12
+
13
+ api_method :add
14
+ api_method :under_score
15
+ end
16
+
17
+ class Service < ActionWebService::Base
18
+ web_service_api API
19
+
20
+ def add(a, b)
21
+ end
22
+
23
+ def void
24
+ end
25
+ end
26
+
27
+ class PristineService < ActionWebService::Base
28
+ web_service_api PristineAPI
29
+
30
+ def add
31
+ end
32
+
33
+ def under_score
34
+ end
35
+ end
36
+ end
37
+
38
+ class TC_Base < ActiveSupport::TestCase
39
+ def test_options
40
+ assert(BaseTest::PristineService.web_service_api.inflect_names == false)
41
+ assert(BaseTest::Service.web_service_api.inflect_names == true)
42
+ end
43
+ end
@@ -0,0 +1,96 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ module CastingTest
5
+ class A < ActionWebService::Struct; end
6
+ class B < A; end
7
+ class API < ActionWebService::API::Base
8
+ api_method :int, :expects => [:int]
9
+ api_method :str, :expects => [:string]
10
+ api_method :base64, :expects => [:base64]
11
+ api_method :bool, :expects => [:bool]
12
+ api_method :float, :expects => [:float]
13
+ api_method :time, :expects => [:time]
14
+ api_method :datetime, :expects => [:datetime]
15
+ api_method :date, :expects => [:date]
16
+
17
+ api_method :int_array, :expects => [[:int]]
18
+ api_method :str_array, :expects => [[:string]]
19
+ api_method :bool_array, :expects => [[:bool]]
20
+
21
+ api_method :a, :expects => [A]
22
+ end
23
+ end
24
+
25
+ class TC_Casting < Test::Unit::TestCase
26
+ include CastingTest
27
+
28
+ def test_base_type_casting_valid
29
+ assert_equal 10000, cast_expects(:int, '10000')[0]
30
+ assert_equal '10000', cast_expects(:str, 10000)[0]
31
+ base64 = cast_expects(:base64, 10000)[0]
32
+ assert_equal '10000', base64
33
+ assert_instance_of ActionWebService::Base64, base64
34
+ [1, '1', 'true', 'y', 'yes'].each do |val|
35
+ assert_equal true, cast_expects(:bool, val)[0]
36
+ end
37
+ [0, '0', 'false', 'n', 'no'].each do |val|
38
+ assert_equal false, cast_expects(:bool, val)[0]
39
+ end
40
+ assert_equal 3.14159, cast_expects(:float, '3.14159')[0]
41
+ now = Time.at(Time.now.tv_sec)
42
+ casted = cast_expects(:time, now.to_s)[0]
43
+ assert_equal now, casted
44
+ now = DateTime.now
45
+ assert_equal now.to_s, cast_expects(:datetime, now.to_s)[0].to_s
46
+ today = Date.today
47
+ assert_equal today, cast_expects(:date, today.to_s)[0]
48
+ end
49
+
50
+ def test_base_type_casting_invalid
51
+ assert_raises ArgumentError do
52
+ cast_expects(:int, 'this is not a number')
53
+ end
54
+ assert_raises ActionWebService::Casting::CastingError do
55
+ # neither true or false ;)
56
+ cast_expects(:bool, 'i always lie')
57
+ end
58
+ assert_raises ArgumentError do
59
+ cast_expects(:float, 'not a float')
60
+ end
61
+ # not sure why this test fails but too lazy to find out why :-(
62
+ # assert_raises ArgumentError do
63
+ # cast_expects(:time, '111111111111111111111111111111111')
64
+ # end
65
+ assert_raises ArgumentError do
66
+ cast_expects(:datetime, '-1')
67
+ end
68
+ assert_raises ArgumentError do
69
+ cast_expects(:date, '')
70
+ end
71
+ end
72
+
73
+ def test_array_type_casting
74
+ assert_equal [1, 2, 3213992, 4], cast_expects(:int_array, ['1', '2', '3213992', '4'])[0]
75
+ assert_equal ['one', 'two', '5.0', '200', nil, 'true'], cast_expects(:str_array, [:one, 'two', 5.0, 200, nil, true])[0]
76
+ assert_equal [true, nil, true, true, false], cast_expects(:bool_array, ['1', nil, 'y', true, 'false'])[0]
77
+ end
78
+
79
+ def test_array_type_casting_failure
80
+ assert_raises ActionWebService::Casting::CastingError do
81
+ cast_expects(:bool_array, ['false', 'blahblah'])
82
+ end
83
+ assert_raises ArgumentError do
84
+ cast_expects(:int_array, ['1', '2.021', '4'])
85
+ end
86
+ end
87
+
88
+ def test_structured_type_casting_with_polymorphism
89
+ assert cast_expects(:a, B.new)[0].is_a?(B)
90
+ end
91
+
92
+ private
93
+ def cast_expects(method_name, *args)
94
+ API.api_method_instance(method_name.to_sym).cast_expects([*args])
95
+ end
96
+ end
@@ -0,0 +1,157 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_client'
3
+
4
+
5
+ module ClientSoapTest
6
+ PORT = 8998
7
+
8
+ class SoapClientLet < ClientTest::AbstractClientLet
9
+ def do_POST(req, res)
10
+ test_request = ActionController::TestRequest.new
11
+ test_request.request_parameters['action'] = req.path.gsub(/^\//, '').split(/\//)[1]
12
+ test_request.env['REQUEST_METHOD'] = "POST"
13
+ test_request.env['HTTP_CONTENTTYPE'] = 'text/xml'
14
+ test_request.env['HTTP_SOAPACTION'] = req.header['soapaction'][0]
15
+ test_request.env['RAW_POST_DATA'] = req.body
16
+ response = ActionController::TestResponse.new
17
+ @controller.process(test_request, response)
18
+ res.header['content-type'] = 'text/xml'
19
+ res.body = response.body
20
+ rescue Exception => e
21
+ $stderr.puts e.message
22
+ $stderr.puts e.backtrace.join("\n")
23
+ ensure
24
+ ActiveRecord::Base.clear_active_connections!
25
+ end
26
+ end
27
+
28
+ class ClientContainer < ActionController::Base
29
+ acts_as_web_service
30
+ web_client_api :client, :soap, "http://localhost:#{PORT}/client/api", :api => ClientTest::API
31
+ web_client_api :invalid, :null, "", :api => true
32
+
33
+ def get_client
34
+ client
35
+ end
36
+
37
+ def get_invalid
38
+ invalid
39
+ end
40
+ end
41
+
42
+ class SoapServer < ClientTest::AbstractServer
43
+ def create_clientlet(controller)
44
+ SoapClientLet.new(controller)
45
+ end
46
+
47
+ def server_port
48
+ PORT
49
+ end
50
+ end
51
+ end
52
+
53
+ class TC_ClientSoap < ActiveSupport::TestCase
54
+ include ClientTest
55
+ include ClientSoapTest
56
+
57
+ fixtures :users
58
+
59
+ def setup
60
+ @server = SoapServer.instance
61
+ @container = @server.container
62
+ @client = ActionWebService::Client::Soap.new(API, "http://localhost:#{@server.server_port}/client/api")
63
+ end
64
+
65
+ def test_void
66
+ assert(@container.value_void.nil?)
67
+ @client.void
68
+ assert(!@container.value_void.nil?)
69
+ end
70
+
71
+ def test_normal
72
+ assert(@container.value_normal.nil?)
73
+ assert_equal(5, @client.normal(5, 6))
74
+ assert_equal([5, 6], @container.value_normal)
75
+ assert_equal(5, @client.normal("7", "8"))
76
+ assert_equal([7, 8], @container.value_normal)
77
+ assert_equal(5, @client.normal(true, false))
78
+ end
79
+
80
+ def test_array_return
81
+ assert(@container.value_array_return.nil?)
82
+ new_person = Person.new
83
+ new_person.firstnames = ["one", "two"]
84
+ new_person.lastname = "last"
85
+ assert_equal([new_person], @client.array_return)
86
+ assert_equal([new_person], @container.value_array_return)
87
+ end
88
+
89
+ def test_struct_pass
90
+ assert(@container.value_struct_pass.nil?)
91
+ new_person = Person.new
92
+ new_person.firstnames = ["one", "two"]
93
+ new_person.lastname = "last"
94
+ assert_equal(true, @client.struct_pass([new_person]))
95
+ assert_equal([[new_person]], @container.value_struct_pass)
96
+ end
97
+
98
+ def test_nil_struct_return
99
+ assert_nil @client.nil_struct_return
100
+ end
101
+
102
+ def test_inner_nil
103
+ outer = @client.inner_nil
104
+ assert_equal 'outer', outer.name
105
+ assert_nil outer.inner
106
+ end
107
+
108
+ def test_client_container
109
+ assert_equal(50, ClientContainer.new.get_client.client_container)
110
+ assert(ClientContainer.new.get_invalid.nil?)
111
+ end
112
+
113
+ def test_named_parameters
114
+ assert(@container.value_named_parameters.nil?)
115
+ assert(@client.named_parameters("key", 5).nil?)
116
+ assert_equal(["key", 5], @container.value_named_parameters)
117
+ end
118
+
119
+ def test_capitalized_method_name
120
+ @container.value_normal = nil
121
+ assert_equal(5, @client.Normal(5, 6))
122
+ assert_equal([5, 6], @container.value_normal)
123
+ @container.value_normal = nil
124
+ end
125
+
126
+ def test_model_return
127
+ user = @client.user_return
128
+ assert_equal 1, user.id
129
+ assert_equal 'Kent', user.name
130
+ assert user.active?
131
+ assert_kind_of Date, user.created_on
132
+ assert_equal Date.today, user.created_on
133
+ assert_equal BigDecimal('12.2'), user.balance
134
+ end
135
+
136
+ def test_with_model
137
+ with_model = @client.with_model_return
138
+ assert_equal 'Kent', with_model.user.name
139
+ assert_equal 2, with_model.users.size
140
+ with_model.users.each do |user|
141
+ assert_kind_of User, user
142
+ end
143
+ end
144
+
145
+ def test_scoped_model_return
146
+ scoped_model = @client.scoped_model_return
147
+ assert_kind_of Accounting::User, scoped_model
148
+ assert_equal 'Kent', scoped_model.name
149
+ end
150
+
151
+ def test_multi_dim_return
152
+ md_struct = @client.multi_dim_return
153
+ assert_kind_of Array, md_struct.pref
154
+ assert_equal 2, md_struct.pref.size
155
+ assert_kind_of Array, md_struct.pref[0]
156
+ end
157
+ end
@@ -0,0 +1,155 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_client'
3
+
4
+
5
+ module ClientXmlRpcTest
6
+ PORT = 8999
7
+
8
+ class XmlRpcClientLet < ClientTest::AbstractClientLet
9
+ def do_POST(req, res)
10
+ test_request = ActionController::TestRequest.new
11
+ test_request.request_parameters['action'] = req.path.gsub(/^\//, '').split(/\//)[1]
12
+ test_request.env['REQUEST_METHOD'] = "POST"
13
+ test_request.env['HTTP_CONTENT_TYPE'] = 'text/xml'
14
+ test_request.env['RAW_POST_DATA'] = req.body
15
+ response = ActionController::TestResponse.new
16
+ @controller.process(test_request, response)
17
+ res.header['content-type'] = 'text/xml'
18
+ res.body = response.body
19
+ rescue Exception => e
20
+ $stderr.puts e.message
21
+ $stderr.puts e.backtrace.join("\n")
22
+ ensure
23
+ ActiveRecord::Base.clear_active_connections!
24
+ end
25
+ end
26
+
27
+ class ClientContainer < ActionController::Base
28
+ acts_as_web_service
29
+ web_client_api :client, :xmlrpc, "http://localhost:#{PORT}/client/api", :api => ClientTest::API
30
+
31
+ def get_client
32
+ client
33
+ end
34
+ end
35
+
36
+ class XmlRpcServer < ClientTest::AbstractServer
37
+ def create_clientlet(controller)
38
+ XmlRpcClientLet.new(controller)
39
+ end
40
+
41
+ def server_port
42
+ PORT
43
+ end
44
+ end
45
+ end
46
+
47
+ class TC_ClientXmlRpc < ActiveSupport::TestCase
48
+ include ClientTest
49
+ include ClientXmlRpcTest
50
+
51
+ fixtures :users
52
+
53
+ def setup
54
+ @server = XmlRpcServer.instance
55
+ @container = @server.container
56
+ @client = ActionWebService::Client::XmlRpc.new(API, "http://localhost:#{@server.server_port}/client/api")
57
+ end
58
+
59
+ def test_void
60
+ assert(@container.value_void.nil?)
61
+ @client.void
62
+ assert(!@container.value_void.nil?)
63
+ end
64
+
65
+ def test_normal
66
+ assert(@container.value_normal.nil?)
67
+ assert_equal(5, @client.normal(5, 6))
68
+ assert_equal([5, 6], @container.value_normal)
69
+ assert_equal(5, @client.normal("7", "8"))
70
+ assert_equal([7, 8], @container.value_normal)
71
+ assert_equal(5, @client.normal(true, false))
72
+ end
73
+
74
+ def test_array_return
75
+ assert(@container.value_array_return.nil?)
76
+ new_person = Person.new
77
+ new_person.firstnames = ["one", "two"]
78
+ new_person.lastname = "last"
79
+ assert_equal([new_person], @client.array_return)
80
+ assert_equal([new_person], @container.value_array_return)
81
+ end
82
+
83
+ def test_struct_pass
84
+ assert(@container.value_struct_pass.nil?)
85
+ new_person = Person.new
86
+ new_person.firstnames = ["one", "two"]
87
+ new_person.lastname = "last"
88
+ assert_equal(true, @client.struct_pass([new_person]))
89
+ assert_equal([[new_person]], @container.value_struct_pass)
90
+ end
91
+
92
+ def test_nil_struct_return
93
+ assert_equal false, @client.nil_struct_return
94
+ end
95
+
96
+ def test_inner_nil
97
+ outer = @client.inner_nil
98
+ assert_equal 'outer', outer.name
99
+ assert_nil outer.inner
100
+ end
101
+
102
+ def test_client_container
103
+ assert_equal(50, ClientContainer.new.get_client.client_container)
104
+ end
105
+
106
+ def test_named_parameters
107
+ assert(@container.value_named_parameters.nil?)
108
+ assert_equal(false, @client.named_parameters("xxx", 7))
109
+ assert_equal(["xxx", 7], @container.value_named_parameters)
110
+ end
111
+
112
+ def test_exception
113
+ assert_raises(ActionWebService::Client::ClientError) do
114
+ assert(@client.thrower)
115
+ end
116
+ end
117
+
118
+ def test_invalid_signature
119
+ assert_raises(ArgumentError) do
120
+ @client.normal
121
+ end
122
+ end
123
+
124
+ def test_model_return
125
+ user = @client.user_return
126
+ assert_equal 1, user.id
127
+ assert_equal 'Kent', user.name
128
+ assert user.active?
129
+ assert_kind_of Time, user.created_on
130
+ assert_equal Time.utc(Time.now.year, Time.now.month, Time.now.day), user.created_on
131
+ assert_equal BigDecimal('12.2'), user.balance
132
+ end
133
+
134
+ def test_with_model
135
+ with_model = @client.with_model_return
136
+ assert_equal 'Kent', with_model.user.name
137
+ assert_equal 2, with_model.users.size
138
+ with_model.users.each do |user|
139
+ assert_kind_of User, user
140
+ end
141
+ end
142
+
143
+ def test_scoped_model_return
144
+ scoped_model = @client.scoped_model_return
145
+ assert_kind_of Accounting::User, scoped_model
146
+ assert_equal 'Kent', scoped_model.name
147
+ end
148
+
149
+ def test_multi_dim_return
150
+ md_struct = @client.multi_dim_return
151
+ assert_kind_of Array, md_struct.pref
152
+ assert_equal 2, md_struct.pref.size
153
+ assert_kind_of Array, md_struct.pref[0]
154
+ end
155
+ end
@@ -0,0 +1,76 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ module ContainerTest
5
+ $immediate_service = Object.new
6
+ $deferred_service = Object.new
7
+
8
+ class DelegateContainer < ActionController::Base
9
+ acts_as_web_service
10
+ web_service_dispatching_mode :delegated
11
+
12
+ attr :flag
13
+ attr :previous_flag
14
+
15
+ def initialize
16
+ @previous_flag = nil
17
+ @flag = true
18
+ end
19
+
20
+ web_service :immediate_service, $immediate_service
21
+ web_service(:deferred_service) { @previous_flag = @flag; @flag = false; $deferred_service }
22
+ end
23
+
24
+ class DirectContainer < ActionController::Base
25
+ acts_as_web_service
26
+ web_service_dispatching_mode :direct
27
+ end
28
+
29
+ class InvalidContainer
30
+ include ActionWebService::Container::Direct
31
+ end
32
+ end
33
+
34
+ class TC_Container < Test::Unit::TestCase
35
+ include ContainerTest
36
+
37
+ def setup
38
+ @delegate_container = DelegateContainer.new
39
+ @direct_container = DirectContainer.new
40
+ end
41
+
42
+ def test_registration
43
+ assert(DelegateContainer.has_web_service?(:immediate_service))
44
+ assert(DelegateContainer.has_web_service?(:deferred_service))
45
+ assert(!DelegateContainer.has_web_service?(:fake_service))
46
+ assert_raises(ActionWebService::Container::Delegated::ContainerError) do
47
+ DelegateContainer.web_service('invalid')
48
+ end
49
+ end
50
+
51
+ def test_service_object
52
+ assert_raises(ActionWebService::Container::Delegated::ContainerError) do
53
+ @delegate_container.web_service_object(:nonexistent)
54
+ end
55
+ assert(@delegate_container.flag == true)
56
+ assert(@delegate_container.web_service_object(:immediate_service) == $immediate_service)
57
+ assert(@delegate_container.previous_flag.nil?)
58
+ assert(@delegate_container.flag == true)
59
+ assert(@delegate_container.web_service_object(:deferred_service) == $deferred_service)
60
+ assert(@delegate_container.previous_flag == true)
61
+ assert(@delegate_container.flag == false)
62
+ end
63
+
64
+ def test_direct_container
65
+ assert(DirectContainer.web_service_dispatching_mode == :direct)
66
+ end
67
+
68
+ def test_validity
69
+ assert_raises(ActionWebService::Container::Direct::ContainerError) do
70
+ InvalidContainer.web_service_api :test
71
+ end
72
+ assert_raises(ActionWebService::Container::Direct::ContainerError) do
73
+ InvalidContainer.web_service_api 50.0
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,147 @@
1
+ # encoding: UTF-8
2
+ $:.unshift(File.dirname(__FILE__) + '/apis')
3
+ require 'abstract_dispatcher'
4
+ require 'wsdl/parser'
5
+
6
+ class ActionController::Base
7
+ class << self
8
+ alias :inherited_without_name_error :inherited
9
+ def inherited(child)
10
+ begin
11
+ inherited_without_name_error(child)
12
+ rescue NameError => e
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ class AutoLoadController < ActionController::Base; acts_as_web_service; end
19
+ class FailingAutoLoadController < ActionController::Base; acts_as_web_service; end
20
+ class BrokenAutoLoadController < ActionController::Base; acts_as_web_service; end
21
+
22
+ class TC_DispatcherActionControllerSoap < Test::Unit::TestCase
23
+ include DispatcherTest
24
+ include DispatcherCommonTests
25
+
26
+ def setup
27
+ @direct_controller = DirectController.new
28
+ @delegated_controller = DelegatedController.new
29
+ @virtual_controller = VirtualController.new
30
+ @layered_controller = LayeredController.new
31
+ @protocol = ActionWebService::Protocol::Soap::SoapProtocol.create(@direct_controller)
32
+ end
33
+
34
+ def test_wsdl_generation
35
+ ensure_valid_wsdl_generation DelegatedController.new, DispatcherTest::WsdlNamespace
36
+ ensure_valid_wsdl_generation DirectController.new, DispatcherTest::WsdlNamespace
37
+ end
38
+
39
+ def test_wsdl_action
40
+ delegated_types = ensure_valid_wsdl_action DelegatedController.new
41
+ delegated_names = delegated_types.map{|x| x.name.name}
42
+ assert(delegated_names.include?('DispatcherTest..NodeArray'))
43
+ assert(delegated_names.include?('DispatcherTest..Node'))
44
+ direct_types = ensure_valid_wsdl_action DirectController.new
45
+ direct_names = direct_types.map{|x| x.name.name}
46
+ assert(direct_names.include?('DispatcherTest..NodeArray'))
47
+ assert(direct_names.include?('DispatcherTest..Node'))
48
+ assert(direct_names.include?('IntegerArray'))
49
+ end
50
+
51
+ def test_autoloading
52
+ assert(!AutoLoadController.web_service_api.nil?)
53
+ assert(AutoLoadController.web_service_api.has_public_api_method?('Void'))
54
+ assert(FailingAutoLoadController.web_service_api.nil?)
55
+ assert_raises(MissingSourceFile) do
56
+ FailingAutoLoadController.require_web_service_api :blah
57
+ end
58
+ assert_raises(ArgumentError) do
59
+ FailingAutoLoadController.require_web_service_api 50.0
60
+ end
61
+ assert(BrokenAutoLoadController.web_service_api.nil?)
62
+ end
63
+
64
+ def test_layered_dispatching
65
+ mt_cats = do_method_call(@layered_controller, 'mt.getCategories')
66
+ assert_equal(["mtCat1", "mtCat2"], mt_cats)
67
+ blogger_cats = do_method_call(@layered_controller, 'blogger.getCategories')
68
+ assert_equal(["bloggerCat1", "bloggerCat2"], blogger_cats)
69
+ end
70
+
71
+ def test_utf8
72
+ @direct_controller.web_service_exception_reporting = true
73
+ if RUBY_VERSION.to_f >= 1.9
74
+ utf8_string = Utf8String.force_encoding('UTF-8')
75
+ else
76
+ $KCODE = 'u'
77
+ utf8_string = Utf8String.to_s
78
+ end
79
+ assert_equal(utf8_string, do_method_call(@direct_controller, 'TestUtf8'))
80
+ retval = SOAP::Processor.unmarshal(@response_body).body.response
81
+ assert retval.is_a?(SOAP::SOAPString)
82
+
83
+ # If $KCODE is not set to UTF-8, any strings with non-ASCII UTF-8 data
84
+ # will be sent back as base64 by SOAP4R. By the time we get it here though,
85
+ # it will be decoded back into a string. So lets read the base64 value
86
+ # from the message body directly.
87
+ unless RUBY_VERSION.to_f >= 1.9
88
+ $KCODE = 'NONE'
89
+ end
90
+ do_method_call(@direct_controller, 'TestUtf8')
91
+ retval = SOAP::Processor.unmarshal(@response_body).body.response
92
+ # not sure why this test fails but too lazy to find out why :-(
93
+ # assert retval.is_a?(SOAP::SOAPBase64)
94
+ # assert_equal "T25lIFdvcmxkIENhZsOp", retval.data.to_s
95
+ end
96
+
97
+ protected
98
+ def exception_message(soap_fault_exception)
99
+ soap_fault_exception.detail.cause.message
100
+ end
101
+
102
+ def is_exception?(obj)
103
+ obj.respond_to?(:detail) && obj.detail.respond_to?(:cause) && \
104
+ obj.detail.cause.is_a?(Exception)
105
+ end
106
+
107
+ def service_name(container)
108
+ container.is_a?(DelegatedController) ? 'test_service' : 'api'
109
+ end
110
+
111
+ def ensure_valid_wsdl_generation(controller, expected_namespace)
112
+ wsdl = controller.generate_wsdl
113
+ ensure_valid_wsdl(controller, wsdl, expected_namespace)
114
+ end
115
+
116
+ def ensure_valid_wsdl(controller, wsdl, expected_namespace)
117
+ definitions = WSDL::Parser.new.parse(wsdl)
118
+ assert(definitions.is_a?(WSDL::Definitions))
119
+ definitions.bindings.each do |binding|
120
+ assert(binding.name.name.index(':').nil?)
121
+ end
122
+ definitions.services.each do |service|
123
+ service.ports.each do |port|
124
+ assert(port.name.name.index(':').nil?)
125
+ end
126
+ end
127
+ types = definitions.collect_complextypes.map{|x| x.name}
128
+ types.each do |type|
129
+ assert(type.namespace == expected_namespace)
130
+ end
131
+ location = definitions.services[0].ports[0].soap_address.location
132
+ if controller.is_a?(DelegatedController)
133
+ assert_match %r{http://test.host/dispatcher_test/delegated/test_service$}, location
134
+ elsif controller.is_a?(DirectController)
135
+ assert_match %r{http://test.host/dispatcher_test/direct/api$}, location
136
+ end
137
+ definitions.collect_complextypes
138
+ end
139
+
140
+ def ensure_valid_wsdl_action(controller)
141
+ test_request = ActionController::TestRequest.new
142
+ test_request.action = 'wsdl'
143
+ test_response = ActionController::TestResponse.new
144
+ wsdl = controller.process(test_request, test_response).body
145
+ ensure_valid_wsdl(controller, wsdl, DispatcherTest::WsdlNamespace)
146
+ end
147
+ end