rubyjedi-actionwebservice 2.3.5.20100615120735

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/CHANGELOG +335 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +180 -0
  5. data/TODO +32 -0
  6. data/examples/googlesearch/README +143 -0
  7. data/examples/googlesearch/autoloading/google_search_api.rb +50 -0
  8. data/examples/googlesearch/autoloading/google_search_controller.rb +57 -0
  9. data/examples/googlesearch/delegated/google_search_service.rb +108 -0
  10. data/examples/googlesearch/delegated/search_controller.rb +7 -0
  11. data/examples/googlesearch/direct/google_search_api.rb +50 -0
  12. data/examples/googlesearch/direct/search_controller.rb +58 -0
  13. data/examples/metaWeblog/README +17 -0
  14. data/examples/metaWeblog/apis/blogger_api.rb +60 -0
  15. data/examples/metaWeblog/apis/blogger_service.rb +34 -0
  16. data/examples/metaWeblog/apis/meta_weblog_api.rb +67 -0
  17. data/examples/metaWeblog/apis/meta_weblog_service.rb +48 -0
  18. data/examples/metaWeblog/controllers/xmlrpc_controller.rb +16 -0
  19. data/generators/web_service/USAGE +28 -0
  20. data/generators/web_service/templates/api_definition.rb +5 -0
  21. data/generators/web_service/templates/controller.rb +8 -0
  22. data/generators/web_service/templates/functional_test.rb +19 -0
  23. data/generators/web_service/web_service_generator.rb +29 -0
  24. data/lib/action_web_service/acts_as_web_service.rb +24 -0
  25. data/lib/action_web_service/api.rb +297 -0
  26. data/lib/action_web_service/base.rb +38 -0
  27. data/lib/action_web_service/casting.rb +151 -0
  28. data/lib/action_web_service/client/base.rb +28 -0
  29. data/lib/action_web_service/client/soap_client.rb +113 -0
  30. data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  31. data/lib/action_web_service/client.rb +3 -0
  32. data/lib/action_web_service/container/action_controller_container.rb +93 -0
  33. data/lib/action_web_service/container/delegated_container.rb +86 -0
  34. data/lib/action_web_service/container/direct_container.rb +69 -0
  35. data/lib/action_web_service/container.rb +3 -0
  36. data/lib/action_web_service/dispatcher/abstract.rb +208 -0
  37. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +396 -0
  38. data/lib/action_web_service/dispatcher.rb +2 -0
  39. data/lib/action_web_service/invocation.rb +202 -0
  40. data/lib/action_web_service/protocol/abstract.rb +112 -0
  41. data/lib/action_web_service/protocol/discovery.rb +37 -0
  42. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
  43. data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  44. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +123 -0
  45. data/lib/action_web_service/protocol.rb +4 -0
  46. data/lib/action_web_service/scaffolding.rb +281 -0
  47. data/lib/action_web_service/simple.rb +53 -0
  48. data/lib/action_web_service/string_to_datetime_for_soap.rb +16 -0
  49. data/lib/action_web_service/struct.rb +68 -0
  50. data/lib/action_web_service/support/class_inheritable_options.rb +26 -0
  51. data/lib/action_web_service/support/signature_types.rb +261 -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 +110 -0
  57. data/lib/action_web_service/version.rb +9 -0
  58. data/lib/action_web_service.rb +60 -0
  59. data/lib/actionwebservice.rb +1 -0
  60. data/setup.rb +1379 -0
  61. data/test/abstract_client.rb +184 -0
  62. data/test/abstract_dispatcher.rb +549 -0
  63. data/test/abstract_unit.rb +43 -0
  64. data/test/actionwebservice_unittest.db +0 -0
  65. data/test/api_test.rb +102 -0
  66. data/test/apis/auto_load_api.rb +3 -0
  67. data/test/apis/broken_auto_load_api.rb +2 -0
  68. data/test/base_test.rb +42 -0
  69. data/test/casting_test.rb +95 -0
  70. data/test/client_soap_test.rb +156 -0
  71. data/test/client_xmlrpc_test.rb +154 -0
  72. data/test/container_test.rb +75 -0
  73. data/test/debug.log +12305 -0
  74. data/test/dispatcher_action_controller_soap_test.rb +139 -0
  75. data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
  76. data/test/fixtures/db_definitions/mysql.sql +8 -0
  77. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  78. data/test/fixtures/users.yml +12 -0
  79. data/test/gencov +3 -0
  80. data/test/invocation_test.rb +186 -0
  81. data/test/run +6 -0
  82. data/test/scaffolded_controller_test.rb +147 -0
  83. data/test/struct_test.rb +84 -0
  84. data/test/test_invoke_test.rb +113 -0
  85. metadata +182 -0
data/test/base_test.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'abstract_unit'
2
+
3
+ module BaseTest
4
+ class API < ActionWebService::API::Base
5
+ api_method :add, :expects => [:int, :int], :returns => [:int]
6
+ api_method :void
7
+ end
8
+
9
+ class PristineAPI < ActionWebService::API::Base
10
+ inflect_names false
11
+
12
+ api_method :add
13
+ api_method :under_score
14
+ end
15
+
16
+ class Service < ActionWebService::Base
17
+ web_service_api API
18
+
19
+ def add(a, b)
20
+ end
21
+
22
+ def void
23
+ end
24
+ end
25
+
26
+ class PristineService < ActionWebService::Base
27
+ web_service_api PristineAPI
28
+
29
+ def add
30
+ end
31
+
32
+ def under_score
33
+ end
34
+ end
35
+ end
36
+
37
+ class TC_Base < ActiveSupport::TestCase
38
+ def test_options
39
+ assert(BaseTest::PristineService.web_service_api.inflect_names == false)
40
+ assert(BaseTest::Service.web_service_api.inflect_names == true)
41
+ end
42
+ end
@@ -0,0 +1,95 @@
1
+ require 'abstract_unit'
2
+
3
+ module CastingTest
4
+ class A < ActionWebService::Struct; end
5
+ class B < A; end
6
+ class API < ActionWebService::API::Base
7
+ api_method :int, :expects => [:int]
8
+ api_method :str, :expects => [:string]
9
+ api_method :base64, :expects => [:base64]
10
+ api_method :bool, :expects => [:bool]
11
+ api_method :float, :expects => [:float]
12
+ api_method :time, :expects => [:time]
13
+ api_method :datetime, :expects => [:datetime]
14
+ api_method :date, :expects => [:date]
15
+
16
+ api_method :int_array, :expects => [[:int]]
17
+ api_method :str_array, :expects => [[:string]]
18
+ api_method :bool_array, :expects => [[:bool]]
19
+
20
+ api_method :a, :expects => [A]
21
+ end
22
+ end
23
+
24
+ class TC_Casting < Test::Unit::TestCase
25
+ include CastingTest
26
+
27
+ def test_base_type_casting_valid
28
+ assert_equal 10000, cast_expects(:int, '10000')[0]
29
+ assert_equal '10000', cast_expects(:str, 10000)[0]
30
+ base64 = cast_expects(:base64, 10000)[0]
31
+ assert_equal '10000', base64
32
+ assert_instance_of ActionWebService::Base64, base64
33
+ [1, '1', 'true', 'y', 'yes'].each do |val|
34
+ assert_equal true, cast_expects(:bool, val)[0]
35
+ end
36
+ [0, '0', 'false', 'n', 'no'].each do |val|
37
+ assert_equal false, cast_expects(:bool, val)[0]
38
+ end
39
+ assert_equal 3.14159, cast_expects(:float, '3.14159')[0]
40
+ now = Time.at(Time.now.tv_sec)
41
+ casted = cast_expects(:time, now.to_s)[0]
42
+ assert_equal now, casted
43
+ now = DateTime.now
44
+ assert_equal now.to_s, cast_expects(:datetime, now.to_s)[0].to_s
45
+ today = Date.today
46
+ assert_equal today, cast_expects(:date, today.to_s)[0]
47
+ end
48
+
49
+ def test_base_type_casting_invalid
50
+ assert_raises ArgumentError do
51
+ cast_expects(:int, 'this is not a number')
52
+ end
53
+ assert_raises ActionWebService::Casting::CastingError do
54
+ # neither true or false ;)
55
+ cast_expects(:bool, 'i always lie')
56
+ end
57
+ assert_raises ArgumentError do
58
+ cast_expects(:float, 'not a float')
59
+ end
60
+ # not sure why this test fails but too lazy to find out why :-(
61
+ # assert_raises ArgumentError do
62
+ # cast_expects(:time, '111111111111111111111111111111111')
63
+ # end
64
+ assert_raises ArgumentError do
65
+ cast_expects(:datetime, '-1')
66
+ end
67
+ assert_raises ArgumentError do
68
+ cast_expects(:date, '')
69
+ end
70
+ end
71
+
72
+ def test_array_type_casting
73
+ assert_equal [1, 2, 3213992, 4], cast_expects(:int_array, ['1', '2', '3213992', '4'])[0]
74
+ assert_equal ['one', 'two', '5.0', '200', nil, 'true'], cast_expects(:str_array, [:one, 'two', 5.0, 200, nil, true])[0]
75
+ assert_equal [true, nil, true, true, false], cast_expects(:bool_array, ['1', nil, 'y', true, 'false'])[0]
76
+ end
77
+
78
+ def test_array_type_casting_failure
79
+ assert_raises ActionWebService::Casting::CastingError do
80
+ cast_expects(:bool_array, ['false', 'blahblah'])
81
+ end
82
+ assert_raises ArgumentError do
83
+ cast_expects(:int_array, ['1', '2.021', '4'])
84
+ end
85
+ end
86
+
87
+ def test_structured_type_casting_with_polymorphism
88
+ assert cast_expects(:a, B.new)[0].is_a?(B)
89
+ end
90
+
91
+ private
92
+ def cast_expects(method_name, *args)
93
+ API.api_method_instance(method_name.to_sym).cast_expects([*args])
94
+ end
95
+ end
@@ -0,0 +1,156 @@
1
+ require 'abstract_client'
2
+
3
+
4
+ module ClientSoapTest
5
+ PORT = 8998
6
+
7
+ class SoapClientLet < ClientTest::AbstractClientLet
8
+ def do_POST(req, res)
9
+ test_request = ActionController::TestRequest.new
10
+ test_request.request_parameters['action'] = req.path.gsub(/^\//, '').split(/\//)[1]
11
+ test_request.env['REQUEST_METHOD'] = "POST"
12
+ test_request.env['HTTP_CONTENTTYPE'] = 'text/xml'
13
+ test_request.env['HTTP_SOAPACTION'] = req.header['soapaction'][0]
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, :soap, "http://localhost:#{PORT}/client/api", :api => ClientTest::API
30
+ web_client_api :invalid, :null, "", :api => true
31
+
32
+ def get_client
33
+ client
34
+ end
35
+
36
+ def get_invalid
37
+ invalid
38
+ end
39
+ end
40
+
41
+ class SoapServer < ClientTest::AbstractServer
42
+ def create_clientlet(controller)
43
+ SoapClientLet.new(controller)
44
+ end
45
+
46
+ def server_port
47
+ PORT
48
+ end
49
+ end
50
+ end
51
+
52
+ class TC_ClientSoap < ActiveSupport::TestCase
53
+ include ClientTest
54
+ include ClientSoapTest
55
+
56
+ fixtures :users
57
+
58
+ def setup
59
+ @server = SoapServer.instance
60
+ @container = @server.container
61
+ @client = ActionWebService::Client::Soap.new(API, "http://localhost:#{@server.server_port}/client/api")
62
+ end
63
+
64
+ def test_void
65
+ assert(@container.value_void.nil?)
66
+ @client.void
67
+ assert(!@container.value_void.nil?)
68
+ end
69
+
70
+ def test_normal
71
+ assert(@container.value_normal.nil?)
72
+ assert_equal(5, @client.normal(5, 6))
73
+ assert_equal([5, 6], @container.value_normal)
74
+ assert_equal(5, @client.normal("7", "8"))
75
+ assert_equal([7, 8], @container.value_normal)
76
+ assert_equal(5, @client.normal(true, false))
77
+ end
78
+
79
+ def test_array_return
80
+ assert(@container.value_array_return.nil?)
81
+ new_person = Person.new
82
+ new_person.firstnames = ["one", "two"]
83
+ new_person.lastname = "last"
84
+ assert_equal([new_person], @client.array_return)
85
+ assert_equal([new_person], @container.value_array_return)
86
+ end
87
+
88
+ def test_struct_pass
89
+ assert(@container.value_struct_pass.nil?)
90
+ new_person = Person.new
91
+ new_person.firstnames = ["one", "two"]
92
+ new_person.lastname = "last"
93
+ assert_equal(true, @client.struct_pass([new_person]))
94
+ assert_equal([[new_person]], @container.value_struct_pass)
95
+ end
96
+
97
+ def test_nil_struct_return
98
+ assert_nil @client.nil_struct_return
99
+ end
100
+
101
+ def test_inner_nil
102
+ outer = @client.inner_nil
103
+ assert_equal 'outer', outer.name
104
+ assert_nil outer.inner
105
+ end
106
+
107
+ def test_client_container
108
+ assert_equal(50, ClientContainer.new.get_client.client_container)
109
+ assert(ClientContainer.new.get_invalid.nil?)
110
+ end
111
+
112
+ def test_named_parameters
113
+ assert(@container.value_named_parameters.nil?)
114
+ assert(@client.named_parameters("key", 5).nil?)
115
+ assert_equal(["key", 5], @container.value_named_parameters)
116
+ end
117
+
118
+ def test_capitalized_method_name
119
+ @container.value_normal = nil
120
+ assert_equal(5, @client.Normal(5, 6))
121
+ assert_equal([5, 6], @container.value_normal)
122
+ @container.value_normal = nil
123
+ end
124
+
125
+ def test_model_return
126
+ user = @client.user_return
127
+ assert_equal 1, user.id
128
+ assert_equal 'Kent', user.name
129
+ assert user.active?
130
+ assert_kind_of Date, user.created_on
131
+ assert_equal Date.today, user.created_on
132
+ assert_equal BigDecimal('12.2'), user.balance
133
+ end
134
+
135
+ def test_with_model
136
+ with_model = @client.with_model_return
137
+ assert_equal 'Kent', with_model.user.name
138
+ assert_equal 2, with_model.users.size
139
+ with_model.users.each do |user|
140
+ assert_kind_of User, user
141
+ end
142
+ end
143
+
144
+ def test_scoped_model_return
145
+ scoped_model = @client.scoped_model_return
146
+ assert_kind_of Accounting::User, scoped_model
147
+ assert_equal 'Kent', scoped_model.name
148
+ end
149
+
150
+ def test_multi_dim_return
151
+ md_struct = @client.multi_dim_return
152
+ assert_kind_of Array, md_struct.pref
153
+ assert_equal 2, md_struct.pref.size
154
+ assert_kind_of Array, md_struct.pref[0]
155
+ end
156
+ end
@@ -0,0 +1,154 @@
1
+ require 'abstract_client'
2
+
3
+
4
+ module ClientXmlRpcTest
5
+ PORT = 8999
6
+
7
+ class XmlRpcClientLet < ClientTest::AbstractClientLet
8
+ def do_POST(req, res)
9
+ test_request = ActionController::TestRequest.new
10
+ test_request.request_parameters['action'] = req.path.gsub(/^\//, '').split(/\//)[1]
11
+ test_request.env['REQUEST_METHOD'] = "POST"
12
+ test_request.env['HTTP_CONTENT_TYPE'] = 'text/xml'
13
+ test_request.env['RAW_POST_DATA'] = req.body
14
+ response = ActionController::TestResponse.new
15
+ @controller.process(test_request, response)
16
+ res.header['content-type'] = 'text/xml'
17
+ res.body = response.body
18
+ rescue Exception => e
19
+ $stderr.puts e.message
20
+ $stderr.puts e.backtrace.join("\n")
21
+ ensure
22
+ ActiveRecord::Base.clear_active_connections!
23
+ end
24
+ end
25
+
26
+ class ClientContainer < ActionController::Base
27
+ acts_as_web_service
28
+ web_client_api :client, :xmlrpc, "http://localhost:#{PORT}/client/api", :api => ClientTest::API
29
+
30
+ def get_client
31
+ client
32
+ end
33
+ end
34
+
35
+ class XmlRpcServer < ClientTest::AbstractServer
36
+ def create_clientlet(controller)
37
+ XmlRpcClientLet.new(controller)
38
+ end
39
+
40
+ def server_port
41
+ PORT
42
+ end
43
+ end
44
+ end
45
+
46
+ class TC_ClientXmlRpc < ActiveSupport::TestCase
47
+ include ClientTest
48
+ include ClientXmlRpcTest
49
+
50
+ fixtures :users
51
+
52
+ def setup
53
+ @server = XmlRpcServer.instance
54
+ @container = @server.container
55
+ @client = ActionWebService::Client::XmlRpc.new(API, "http://localhost:#{@server.server_port}/client/api")
56
+ end
57
+
58
+ def test_void
59
+ assert(@container.value_void.nil?)
60
+ @client.void
61
+ assert(!@container.value_void.nil?)
62
+ end
63
+
64
+ def test_normal
65
+ assert(@container.value_normal.nil?)
66
+ assert_equal(5, @client.normal(5, 6))
67
+ assert_equal([5, 6], @container.value_normal)
68
+ assert_equal(5, @client.normal("7", "8"))
69
+ assert_equal([7, 8], @container.value_normal)
70
+ assert_equal(5, @client.normal(true, false))
71
+ end
72
+
73
+ def test_array_return
74
+ assert(@container.value_array_return.nil?)
75
+ new_person = Person.new
76
+ new_person.firstnames = ["one", "two"]
77
+ new_person.lastname = "last"
78
+ assert_equal([new_person], @client.array_return)
79
+ assert_equal([new_person], @container.value_array_return)
80
+ end
81
+
82
+ def test_struct_pass
83
+ assert(@container.value_struct_pass.nil?)
84
+ new_person = Person.new
85
+ new_person.firstnames = ["one", "two"]
86
+ new_person.lastname = "last"
87
+ assert_equal(true, @client.struct_pass([new_person]))
88
+ assert_equal([[new_person]], @container.value_struct_pass)
89
+ end
90
+
91
+ def test_nil_struct_return
92
+ assert_equal false, @client.nil_struct_return
93
+ end
94
+
95
+ def test_inner_nil
96
+ outer = @client.inner_nil
97
+ assert_equal 'outer', outer.name
98
+ assert_nil outer.inner
99
+ end
100
+
101
+ def test_client_container
102
+ assert_equal(50, ClientContainer.new.get_client.client_container)
103
+ end
104
+
105
+ def test_named_parameters
106
+ assert(@container.value_named_parameters.nil?)
107
+ assert_equal(false, @client.named_parameters("xxx", 7))
108
+ assert_equal(["xxx", 7], @container.value_named_parameters)
109
+ end
110
+
111
+ def test_exception
112
+ assert_raises(ActionWebService::Client::ClientError) do
113
+ assert(@client.thrower)
114
+ end
115
+ end
116
+
117
+ def test_invalid_signature
118
+ assert_raises(ArgumentError) do
119
+ @client.normal
120
+ end
121
+ end
122
+
123
+ def test_model_return
124
+ user = @client.user_return
125
+ assert_equal 1, user.id
126
+ assert_equal 'Kent', user.name
127
+ assert user.active?
128
+ assert_kind_of Time, user.created_on
129
+ assert_equal Time.utc(Time.now.year, Time.now.month, Time.now.day), user.created_on
130
+ assert_equal BigDecimal('12.2'), user.balance
131
+ end
132
+
133
+ def test_with_model
134
+ with_model = @client.with_model_return
135
+ assert_equal 'Kent', with_model.user.name
136
+ assert_equal 2, with_model.users.size
137
+ with_model.users.each do |user|
138
+ assert_kind_of User, user
139
+ end
140
+ end
141
+
142
+ def test_scoped_model_return
143
+ scoped_model = @client.scoped_model_return
144
+ assert_kind_of Accounting::User, scoped_model
145
+ assert_equal 'Kent', scoped_model.name
146
+ end
147
+
148
+ def test_multi_dim_return
149
+ md_struct = @client.multi_dim_return
150
+ assert_kind_of Array, md_struct.pref
151
+ assert_equal 2, md_struct.pref.size
152
+ assert_kind_of Array, md_struct.pref[0]
153
+ end
154
+ end
@@ -0,0 +1,75 @@
1
+ require 'abstract_unit'
2
+
3
+ module ContainerTest
4
+ $immediate_service = Object.new
5
+ $deferred_service = Object.new
6
+
7
+ class DelegateContainer < ActionController::Base
8
+ acts_as_web_service
9
+ web_service_dispatching_mode :delegated
10
+
11
+ attr :flag
12
+ attr :previous_flag
13
+
14
+ def initialize
15
+ @previous_flag = nil
16
+ @flag = true
17
+ end
18
+
19
+ web_service :immediate_service, $immediate_service
20
+ web_service(:deferred_service) { @previous_flag = @flag; @flag = false; $deferred_service }
21
+ end
22
+
23
+ class DirectContainer < ActionController::Base
24
+ acts_as_web_service
25
+ web_service_dispatching_mode :direct
26
+ end
27
+
28
+ class InvalidContainer
29
+ include ActionWebService::Container::Direct
30
+ end
31
+ end
32
+
33
+ class TC_Container < Test::Unit::TestCase
34
+ include ContainerTest
35
+
36
+ def setup
37
+ @delegate_container = DelegateContainer.new
38
+ @direct_container = DirectContainer.new
39
+ end
40
+
41
+ def test_registration
42
+ assert(DelegateContainer.has_web_service?(:immediate_service))
43
+ assert(DelegateContainer.has_web_service?(:deferred_service))
44
+ assert(!DelegateContainer.has_web_service?(:fake_service))
45
+ assert_raises(ActionWebService::Container::Delegated::ContainerError) do
46
+ DelegateContainer.web_service('invalid')
47
+ end
48
+ end
49
+
50
+ def test_service_object
51
+ assert_raises(ActionWebService::Container::Delegated::ContainerError) do
52
+ @delegate_container.web_service_object(:nonexistent)
53
+ end
54
+ assert(@delegate_container.flag == true)
55
+ assert(@delegate_container.web_service_object(:immediate_service) == $immediate_service)
56
+ assert(@delegate_container.previous_flag.nil?)
57
+ assert(@delegate_container.flag == true)
58
+ assert(@delegate_container.web_service_object(:deferred_service) == $deferred_service)
59
+ assert(@delegate_container.previous_flag == true)
60
+ assert(@delegate_container.flag == false)
61
+ end
62
+
63
+ def test_direct_container
64
+ assert(DirectContainer.web_service_dispatching_mode == :direct)
65
+ end
66
+
67
+ def test_validity
68
+ assert_raises(ActionWebService::Container::Direct::ContainerError) do
69
+ InvalidContainer.web_service_api :test
70
+ end
71
+ assert_raises(ActionWebService::Container::Direct::ContainerError) do
72
+ InvalidContainer.web_service_api 50.0
73
+ end
74
+ end
75
+ end