tictoc-savon 0.7.9

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 (59) hide show
  1. data/.autotest +5 -0
  2. data/CHANGELOG +176 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +64 -0
  5. data/Rakefile +50 -0
  6. data/lib/savon.rb +35 -0
  7. data/lib/savon/client.rb +131 -0
  8. data/lib/savon/core_ext.rb +8 -0
  9. data/lib/savon/core_ext/array.rb +31 -0
  10. data/lib/savon/core_ext/datetime.rb +10 -0
  11. data/lib/savon/core_ext/hash.rb +107 -0
  12. data/lib/savon/core_ext/net_http.rb +19 -0
  13. data/lib/savon/core_ext/object.rb +16 -0
  14. data/lib/savon/core_ext/string.rb +69 -0
  15. data/lib/savon/core_ext/symbol.rb +8 -0
  16. data/lib/savon/core_ext/uri.rb +10 -0
  17. data/lib/savon/logger.rb +56 -0
  18. data/lib/savon/request.rb +138 -0
  19. data/lib/savon/response.rb +174 -0
  20. data/lib/savon/soap.rb +302 -0
  21. data/lib/savon/version.rb +5 -0
  22. data/lib/savon/wsdl.rb +137 -0
  23. data/lib/savon/wsdl_stream.rb +85 -0
  24. data/lib/savon/wsse.rb +163 -0
  25. data/spec/basic_spec_helper.rb +11 -0
  26. data/spec/endpoint_helper.rb +23 -0
  27. data/spec/fixtures/gzip/gzip_response_fixture.rb +7 -0
  28. data/spec/fixtures/gzip/message.gz +0 -0
  29. data/spec/fixtures/response/response_fixture.rb +36 -0
  30. data/spec/fixtures/response/xml/authentication.xml +14 -0
  31. data/spec/fixtures/response/xml/multi_ref.xml +39 -0
  32. data/spec/fixtures/response/xml/soap_fault.xml +8 -0
  33. data/spec/fixtures/response/xml/soap_fault12.xml +18 -0
  34. data/spec/fixtures/wsdl/wsdl_fixture.rb +37 -0
  35. data/spec/fixtures/wsdl/wsdl_fixture.yml +42 -0
  36. data/spec/fixtures/wsdl/xml/authentication.xml +63 -0
  37. data/spec/fixtures/wsdl/xml/geotrust.xml +156 -0
  38. data/spec/fixtures/wsdl/xml/namespaced_actions.xml +307 -0
  39. data/spec/fixtures/wsdl/xml/no_namespace.xml +115 -0
  40. data/spec/http_stubs.rb +26 -0
  41. data/spec/integration/http_basic_auth_spec.rb +16 -0
  42. data/spec/integration/server.rb +51 -0
  43. data/spec/savon/client_spec.rb +86 -0
  44. data/spec/savon/core_ext/array_spec.rb +49 -0
  45. data/spec/savon/core_ext/datetime_spec.rb +21 -0
  46. data/spec/savon/core_ext/hash_spec.rb +190 -0
  47. data/spec/savon/core_ext/net_http_spec.rb +38 -0
  48. data/spec/savon/core_ext/object_spec.rb +34 -0
  49. data/spec/savon/core_ext/string_spec.rb +99 -0
  50. data/spec/savon/core_ext/symbol_spec.rb +12 -0
  51. data/spec/savon/core_ext/uri_spec.rb +19 -0
  52. data/spec/savon/request_spec.rb +117 -0
  53. data/spec/savon/response_spec.rb +179 -0
  54. data/spec/savon/soap_spec.rb +202 -0
  55. data/spec/savon/wsdl_spec.rb +107 -0
  56. data/spec/savon/wsse_spec.rb +132 -0
  57. data/spec/spec.opts +4 -0
  58. data/spec/spec_helper.rb +5 -0
  59. metadata +229 -0
@@ -0,0 +1,202 @@
1
+ require "spec_helper"
2
+
3
+ describe Savon::SOAP do
4
+ before do
5
+ @operation = WSDLFixture.authentication(:operations)[:authenticate]
6
+ @action, @input = @operation[:action], @operation[:input]
7
+ @soap = Savon::SOAP.new @action, @input, EndpointHelper.soap_endpoint
8
+ end
9
+
10
+ it "should contain the SOAP namespace for each supported SOAP version" do
11
+ Savon::SOAP::Versions.each do |soap_version|
12
+ Savon::SOAP::Namespace[soap_version].should be_a(String)
13
+ Savon::SOAP::Namespace[soap_version].should_not be_empty
14
+ end
15
+ end
16
+
17
+ it "should contain the Content-Types for each supported SOAP version" do
18
+ Savon::SOAP::Versions.each do |soap_version|
19
+ Savon::SOAP::ContentType[soap_version].should be_a(String)
20
+ Savon::SOAP::ContentType[soap_version].should_not be_empty
21
+ end
22
+ end
23
+
24
+ it "should contain an Array of supported SOAP versions" do
25
+ Savon::SOAP::Versions.should be_an(Array)
26
+ Savon::SOAP::Versions.should_not be_empty
27
+ end
28
+
29
+ it "should contain the xs:dateTime format" do
30
+ Savon::SOAP::DateTimeFormat.should be_a(String)
31
+ Savon::SOAP::DateTimeFormat.should_not be_empty
32
+
33
+ DateTime.new(2012, 03, 22, 16, 22, 33).strftime(Savon::SOAP::DateTimeFormat).
34
+ should == "2012-03-22T16:22:33Z"
35
+ end
36
+
37
+ it "should contain a Regexp matching the xs:dateTime format" do
38
+ Savon::SOAP::DateTimeRegexp.should be_a(Regexp)
39
+ (Savon::SOAP::DateTimeRegexp === "2012-03-22T16:22:33").should be_true
40
+ end
41
+
42
+ it "should default to SOAP 1.1" do
43
+ Savon::SOAP.version.should == 1
44
+ end
45
+
46
+ describe "xml returned via to_xml" do
47
+ before do
48
+ @xml_declaration = '<?xml version="1.0" encoding="UTF-8"?>'
49
+ @namespace = { "xmlns:ns" => "http://example.com" }
50
+ @namespace_string = 'xmlns:ns="http://example.com"'
51
+ @namespaces = { "xmlns:ns" => "http://ns.example.com", "xmlns:ns2" => "http://ns2.example.com" }
52
+
53
+ # reset to defaults
54
+ Savon::SOAP.version = 1
55
+ Savon::SOAP.header = {}
56
+ Savon::SOAP.namespaces = {}
57
+ end
58
+
59
+ it "should contain an xml declaration" do
60
+ @soap.to_xml.should include(@xml_declaration)
61
+ end
62
+
63
+ # namespaces
64
+
65
+ it "should contain the namespace for SOAP 1.1" do
66
+ @soap.to_xml.should include('xmlns:env="' + Savon::SOAP::Namespace[1] + '"')
67
+ end
68
+
69
+ it "should contain the namespace for SOAP 1.2 when defined globally" do
70
+ Savon::SOAP.version = 2
71
+ @soap.to_xml.should include('xmlns:env="' + Savon::SOAP::Namespace[2] + '"')
72
+ end
73
+
74
+ it "should contain the namespace for SOAP 1.2 when defined per request" do
75
+ @soap.version = 2
76
+ @soap.to_xml.should include('xmlns:env="' + Savon::SOAP::Namespace[2] + '"')
77
+ end
78
+
79
+ it "should containg a xmlns:wsdl namespace defined via the :namespace shortcut method" do
80
+ @soap.namespace = "http://wsdl.example.com"
81
+ @soap.to_xml.should include('xmlns:wsdl="http://wsdl.example.com"')
82
+ end
83
+
84
+ it "should accept custom namespaces when defined globally" do
85
+ Savon::SOAP.namespaces = @namespace
86
+ @soap.to_xml.should include("<env:Envelope " + @namespace_string)
87
+ end
88
+
89
+ it "should accept custom namespaces when defined per request" do
90
+ @soap.namespaces = @namespace
91
+ @soap.to_xml.should include("<env:Envelope " + @namespace_string)
92
+ end
93
+
94
+ it "should merge global and per request namespaces" do
95
+ Savon::SOAP.namespaces = @namespaces
96
+ @soap.namespaces = @namespace
97
+ @soap.to_xml.should include(
98
+ 'xmlns:ns="http://example.com"',
99
+ 'xmlns:ns2="http://ns2.example.com"'
100
+ )
101
+ end
102
+
103
+ # header
104
+
105
+ it "should not contain a header tag unless specified" do
106
+ @soap.to_xml.should_not include("<env:Header>")
107
+ end
108
+
109
+ it "should accept a custom (String) header defined globally" do
110
+ Savon::SOAP.header = "<key>value</key>"
111
+ @soap.to_xml.should include("<env:Header><key>value</key></env:Header>")
112
+ end
113
+
114
+ it "should accept a custom (Hash) header defined globally" do
115
+ Savon::SOAP.header[:key] = "value"
116
+ @soap.to_xml.should include("<env:Header><key>value</key></env:Header>")
117
+ end
118
+
119
+ it "should accept a custom (String) header defined per request" do
120
+ @soap.header = "<key>value</key>"
121
+ @soap.to_xml.should include("<env:Header><key>value</key></env:Header>")
122
+ end
123
+
124
+ it "should accept a custom (Hash) header defined per request" do
125
+ @soap.header[:key] = "value"
126
+ @soap.to_xml.should include("<env:Header><key>value</key></env:Header>")
127
+ end
128
+
129
+ it "should merge global and per request headers defined as Strings" do
130
+ Savon::SOAP.header = "<key2>other value</key2>"
131
+ @soap.header = "<key>value</key>"
132
+ @soap.to_xml.should include(
133
+ "<env:Header><key2>other value</key2><key>value</key></env:Header>"
134
+ )
135
+ end
136
+
137
+ it "should merge global and per request headers defined as Hashes" do
138
+ Savon::SOAP.header = { :key => "value", :key2 => "global value" }
139
+ @soap.header[:key2] = "request value"
140
+ @soap.to_xml.should match(
141
+ /<env:Header>(<key>value<\/key><key2>request value<\/key2>|<key2>request value<\/key2><key>value<\/key>)<\/env:Header>/
142
+ )
143
+ end
144
+
145
+ it "should use the :header method from a given WSSE object to include a WSSE header" do
146
+ wsse = "some compliant object"
147
+ wsse.stubs(:header).returns("<wsse>authentication</wsse>")
148
+
149
+ @soap.wsse = wsse
150
+ @soap.to_xml.should include("<env:Header><wsse>authentication</wsse></env:Header>")
151
+ end
152
+
153
+ # input tag
154
+
155
+ it "should contain a :wsdl namespaced input tag matching the :input property on instantiation" do
156
+ @soap = Savon::SOAP.new "someAction", "someInput", EndpointHelper.soap_endpoint
157
+ @soap.to_xml.should include('<wsdl:someInput>')
158
+ end
159
+
160
+ it "should fall back to using the :action property whem :input is blank" do
161
+ @soap = Savon::SOAP.new "someAction", "", EndpointHelper.soap_endpoint
162
+ @soap.to_xml.should include('<wsdl:someAction>')
163
+ end
164
+
165
+ it "should containg namespaces defined via an input tag Array containing the tag name and a Hash of namespaces" do
166
+ input = ["someInput", { "otherNs" => "http://otherns.example.com" }]
167
+ @soap = Savon::SOAP.new "someAction", input, EndpointHelper.soap_endpoint
168
+ @soap.to_xml.should include('<wsdl:someInput otherNs="http://otherns.example.com">')
169
+ end
170
+
171
+ # xml body
172
+
173
+ it "should contain the SOAP body defined as a Hash" do
174
+ @soap.body = { :someTag => "some value" }
175
+ @soap.to_xml.should include("<someTag>some value</someTag>")
176
+ end
177
+
178
+ it "should contain the SOAP body defined as an Object responding to :to_s" do
179
+ @soap.body = "<someTag>some value</someTag>"
180
+ @soap.to_xml.should include(@soap.body)
181
+ end
182
+
183
+ # xml
184
+
185
+ it "should be a completely custom XML when specified" do
186
+ @soap.xml = "custom SOAP body"
187
+ @soap.to_xml.should == @soap.xml
188
+ end
189
+
190
+ # safety check
191
+
192
+ it "should be a valid SOAP request" do
193
+ @soap.to_xml.should include(
194
+ @xml_declaration +
195
+ '<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">' <<
196
+ '<env:Body><wsdl:authenticate></wsdl:authenticate></env:Body>' <<
197
+ '</env:Envelope>'
198
+ )
199
+ end
200
+ end
201
+ end
202
+
@@ -0,0 +1,107 @@
1
+ require "spec_helper"
2
+
3
+ describe Savon::WSDL do
4
+ describe "a common WSDL document" do
5
+ before { @wsdl = new_wsdl }
6
+
7
+ it "is initialized with a Savon::Request object" do
8
+ Savon::WSDL.new Savon::Request.new(EndpointHelper.wsdl_endpoint)
9
+ end
10
+
11
+ it "it accepts a custom SOAP endpoint" do
12
+ wsdl = Savon::WSDL.new Savon::Request.new(EndpointHelper.wsdl_endpoint), "http://localhost"
13
+ wsdl.soap_endpoint.should == "http://localhost"
14
+ end
15
+
16
+ it "is enabled by default" do
17
+ @wsdl.enabled?.should be_true
18
+ end
19
+
20
+ it "has a getter for the namespace URI" do
21
+ @wsdl.namespace_uri.should == WSDLFixture.authentication(:namespace_uri)
22
+ end
23
+
24
+ it "has a getter for returning an Array of available SOAP actions" do
25
+ WSDLFixture.authentication(:operations).keys.each do |soap_action|
26
+ @wsdl.soap_actions.should include(soap_action)
27
+ end
28
+ end
29
+
30
+ it "has a getter for returning a Hash of available SOAP operations" do
31
+ @wsdl.operations.should == WSDLFixture.authentication(:operations)
32
+ end
33
+
34
+ it "responds to SOAP actions while still behaving as usual otherwise" do
35
+ WSDLFixture.authentication(:operations).keys.each do |soap_action|
36
+ @wsdl.respond_to?(soap_action).should be_true
37
+ end
38
+
39
+ @wsdl.respond_to?(:object_id).should be_true
40
+ @wsdl.respond_to?(:some_undefined_method).should be_false
41
+ end
42
+
43
+ it "returns the raw WSDL document for to_s" do
44
+ @wsdl.to_s.should == WSDLFixture.authentication
45
+ end
46
+ end
47
+
48
+ describe "a WSDL document having core sections without a namespace" do
49
+ before { @wsdl = new_wsdl :no_namespace }
50
+
51
+ it "returns the namespace URI" do
52
+ @wsdl.namespace_uri.should == WSDLFixture.no_namespace(:namespace_uri)
53
+ end
54
+
55
+ it "returns an Array of available SOAP actions" do
56
+ WSDLFixture.no_namespace(:operations).keys.each do |soap_action|
57
+ @wsdl.soap_actions.should include(soap_action)
58
+ end
59
+ end
60
+
61
+ it "returns a Hash of SOAP operations" do
62
+ @wsdl.operations.should == WSDLFixture.no_namespace(:operations)
63
+ end
64
+ end
65
+
66
+ describe "a WSDL document with namespaced SOAP actions" do
67
+ before { @wsdl = new_wsdl :namespaced_actions }
68
+
69
+ it "returns the namespace URI" do
70
+ @wsdl.namespace_uri.should == WSDLFixture.namespaced_actions(:namespace_uri)
71
+ end
72
+
73
+ it "returns an Array of available SOAP actions" do
74
+ WSDLFixture.namespaced_actions(:operations).keys.each do |soap_action|
75
+ @wsdl.soap_actions.should include(soap_action)
76
+ end
77
+ end
78
+
79
+ it "returns a Hash of SOAP operations" do
80
+ @wsdl.operations.should == WSDLFixture.namespaced_actions(:operations)
81
+ end
82
+ end
83
+
84
+ describe "a WSDL document from geotrust" do
85
+ before { @wsdl = new_wsdl :geotrust }
86
+
87
+ it "returns the namespace URI" do
88
+ @wsdl.namespace_uri.should == WSDLFixture.geotrust(:namespace_uri)
89
+ end
90
+
91
+ it "returns an Array of available SOAP actions" do
92
+ WSDLFixture.geotrust(:operations).keys.each do |soap_action|
93
+ @wsdl.soap_actions.should include(soap_action)
94
+ end
95
+ end
96
+
97
+ it "returns a Hash of SOAP operations" do
98
+ @wsdl.operations.should == WSDLFixture.geotrust(:operations)
99
+ end
100
+ end
101
+
102
+ def new_wsdl(fixture = nil)
103
+ endpoint = fixture ? EndpointHelper.wsdl_endpoint(fixture) : EndpointHelper.wsdl_endpoint
104
+ Savon::WSDL.new Savon::Request.new(endpoint)
105
+ end
106
+
107
+ end
@@ -0,0 +1,132 @@
1
+ require "spec_helper"
2
+
3
+ describe Savon::WSSE do
4
+ before do
5
+ Savon::WSSE.username, Savon::WSSE.password, Savon::WSSE.digest = nil, nil, false
6
+ @wsse, @username, @password = Savon::WSSE.new, "gorilla", "secret"
7
+ end
8
+
9
+ it "contains the namespace for WS Security Secext" do
10
+ Savon::WSSE::WSENamespace.should be_a(String)
11
+ Savon::WSSE::WSENamespace.should_not be_empty
12
+ end
13
+
14
+ it "contains the namespace for WS Security Utility" do
15
+ Savon::WSSE::WSUNamespace.should be_a(String)
16
+ Savon::WSSE::WSUNamespace.should_not be_empty
17
+ end
18
+
19
+ it "defaults to nil for the WSSE username (global setting)" do
20
+ Savon::WSSE.username.should be_nil
21
+ end
22
+
23
+ it "has both getter and setter for the WSSE username (global setting)" do
24
+ Savon::WSSE.username = "gorilla"
25
+ Savon::WSSE.username.should == "gorilla"
26
+ end
27
+
28
+ it "defaults to nil for the WSSE password (global setting)" do
29
+ Savon::WSSE.password.should be_nil
30
+ end
31
+
32
+ it "has both getter and setter for the WSSE password (global setting)" do
33
+ Savon::WSSE.password = "secret"
34
+ Savon::WSSE.password.should == "secret"
35
+ end
36
+
37
+ it "defaults to nil for whether to use WSSE digest (global setting)" do
38
+ Savon::WSSE.digest?.should be_false
39
+ end
40
+
41
+ it "has both getter and setter for whether to use WSSE digest (global setting)" do
42
+ Savon::WSSE.digest = true
43
+ Savon::WSSE.digest?.should == true
44
+ end
45
+
46
+ it "defaults to nil for the WSSE username" do
47
+ @wsse.username.should be_nil
48
+ end
49
+
50
+ it "has both getter and setter for the WSSE username" do
51
+ @wsse.username = "gorilla"
52
+ @wsse.username.should == "gorilla"
53
+ end
54
+
55
+ it "defaults to nil for the WSSE password" do
56
+ @wsse.password.should be_nil
57
+ end
58
+
59
+ it "has both getter and setter for the WSSE password" do
60
+ @wsse.password = "secret"
61
+ @wsse.password.should == "secret"
62
+ end
63
+
64
+ it "defaults to nil for whether to use WSSE digest" do
65
+ @wsse.digest?.should be_false
66
+ end
67
+
68
+ it "has both getter and setter for whether to use WSSE digest" do
69
+ @wsse.digest = true
70
+ @wsse.digest?.should == true
71
+ end
72
+
73
+ describe "header" do
74
+ describe "returns the XML for a WSSE authentication header" do
75
+ it "with WSSE credentials specified" do
76
+ @wsse.username = @username
77
+ @wsse.password = @password
78
+ header = @wsse.header
79
+
80
+ header.should include_security_namespaces
81
+ header.should include(@username)
82
+ header.should include(@password)
83
+ header.should include(Savon::WSSE::PasswordTextURI)
84
+ end
85
+
86
+ it "with WSSE credentials specified via defaults" do
87
+ Savon::WSSE.username = @username
88
+ Savon::WSSE.password = @password
89
+ header = @wsse.header
90
+
91
+ header.should include_security_namespaces
92
+ header.should include(@username)
93
+ header.should include(@password)
94
+ header.should include(Savon::WSSE::PasswordTextURI)
95
+ end
96
+ end
97
+
98
+ describe "returns the XML for a WSSE digest header if specified" do
99
+ it "via accessors" do
100
+ @wsse.username = @username
101
+ @wsse.password = @password
102
+ @wsse.digest = true
103
+ header = @wsse.header
104
+
105
+ header.should include_security_namespaces
106
+ header.should include(@username)
107
+ header.should_not include(@password)
108
+ header.should include(Savon::WSSE::PasswordDigestURI)
109
+ end
110
+
111
+ it "via defaults" do
112
+ @wsse.username = @username
113
+ @wsse.password = @password
114
+ Savon::WSSE.digest = true
115
+ header = @wsse.header
116
+
117
+ header.should include_security_namespaces
118
+ header.should include(@username)
119
+ header.should_not include(@password)
120
+ header.should include(Savon::WSSE::PasswordDigestURI)
121
+ end
122
+ end
123
+
124
+ def include_security_namespaces
125
+ simple_matcher("include security namespaces") do |given|
126
+ given.should include(Savon::WSSE::WSENamespace)
127
+ given.should include(Savon::WSSE::WSUNamespace)
128
+ end
129
+ end
130
+ end
131
+
132
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse