wash_out 0.11.0.beta.2 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d5f141fb15bb0de83f6a21321b491bfe4877344f
4
- data.tar.gz: c38aa890a97bbaec1eae14629d84eb62e1303ee3
3
+ metadata.gz: 82173ea05524c819f835867ecc6c49b2e5264be4
4
+ data.tar.gz: c539a9c5a8793bb884c575f03624aec4f78dad09
5
5
  SHA512:
6
- metadata.gz: 87e9b3295e80e00d0efea3a05f316aa96367ff69569a0e4f572842e93f39af02e0b208e0c285d528227f8ec08292b150c5a49de592b346d0e237ce0bafca99cd
7
- data.tar.gz: b42db7edf34731c880378ca6e2d9194907d20893d8886d340ccc33e52b0b925a20a387dc38f0bd6e85b81e25e3065b716ff79d2890351f7d892b18f50de37be5
6
+ metadata.gz: f95800e511ef556fcd9be44eb3f15ce7c8a95ed9f90cf9bc35d2870f89c4cd7357059d914bc2f0c81eef0119adf092c6fad0cb803e4bc097c03cdcc25a01d8ab
7
+ data.tar.gz: e0aee07a1f29c56a175b4bbb764fffb086e515084783a305db61697efe287080aee785ed6cf165b58f285a615df3c93cd13dfafedc865c724fc82a14e4e3d13c
data/.travis.yml CHANGED
@@ -4,7 +4,7 @@ gemfile:
4
4
  - gemfiles/rails_4.0.0.gemfile
5
5
  - gemfiles/rails_4.1.0.gemfile
6
6
  - gemfiles/rails_4.2.0.gemfile
7
- - gemfiles/rails_5.0.0.beta2.gemfile
7
+ - gemfiles/rails_5.0.0.gemfile
8
8
  rvm:
9
9
  - 1.9.3
10
10
  - 2.0.0
@@ -18,17 +18,21 @@ matrix:
18
18
  gemfile: gemfiles/rails_3.2.13.gemfile
19
19
  - rvm: 2.3.0
20
20
  gemfile: gemfiles/rails_3.2.13.gemfile
21
+ - rvm: 1.9.3
22
+ gemfile: gemfiles/rails_4.0.0.gemfile
21
23
  - rvm: 1.9.3
22
24
  gemfile: gemfiles/rails_4.2.0.gemfile
23
25
  - rvm: jruby
24
26
  gemfile: gemfiles/rails_4.2.0.gemfile
25
27
  - rvm: 1.9.3
26
- gemfile: gemfiles/rails_5.0.0.beta2.gemfile
28
+ gemfile: gemfiles/rails_5.0.0.gemfile
27
29
  - rvm: 2.0.0
28
- gemfile: gemfiles/rails_5.0.0.beta2.gemfile
30
+ gemfile: gemfiles/rails_5.0.0.gemfile
29
31
  - rvm: 2.1.8
30
- gemfile: gemfiles/rails_5.0.0.beta2.gemfile
32
+ gemfile: gemfiles/rails_5.0.0.gemfile
33
+ - rvm: 2.2.4
34
+ gemfile: gemfiles/rails_5.0.0.gemfile
31
35
  - rvm: jruby
32
- gemfile: gemfiles/rails_5.0.0.beta2.gemfile
36
+ gemfile: gemfiles/rails_5.0.0.gemfile
33
37
  before_install:
34
- - gem update bundler
38
+ - gem update bundler
data/Appraisals CHANGED
@@ -1,9 +1,3 @@
1
- appraise "rails-3.2.13" do
2
- gem "rails", "3.2.13"
3
- gem "test-unit"
4
- gem "listen", "< 3.1.0"
5
- end
6
-
7
1
  appraise "rails-4.0.0" do
8
2
  gem "rails", "4.0.0"
9
3
  gem "listen", "< 3.1.0"
@@ -19,6 +13,7 @@ appraise "rails-4.2.0" do
19
13
  gem "listen", "< 3.1.0"
20
14
  end
21
15
 
22
- appraise "rails-5.0.0.beta2" do
23
- gem "rails", "5.0.0.beta2"
24
- end
16
+
17
+ appraise "rails-5.0.0" do
18
+ gem "rails", "5.0.0"
19
+ end
data/README.md CHANGED
@@ -10,7 +10,7 @@ But if you have a chance, please [http://stopsoap.com/](http://stopsoap.com/).
10
10
 
11
11
  ## Compatibility
12
12
 
13
- Rails 3.2.13 and higher (if you are using SOAP and still on Ruby 1.9 - that's just too much evil, sorry)
13
+ Rails 4.0 and higher is tested. Code is known to work with earlier versions but we don't bother testing outdated versions anymore - give it a try if you are THAT unlucky.
14
14
 
15
15
  ## Installation
16
16
 
@@ -118,6 +118,50 @@ class RumbasController < ApplicationController
118
118
  def dump_parameters
119
119
  Rails.logger.debug params.inspect
120
120
  end
121
+
122
+
123
+ # Rendering SOAP headers
124
+ soap_action "integer_to_header_string",
125
+ :args => :integer,
126
+ :return => :string,
127
+ :header_return => :string
128
+ def integer_to_header_string
129
+ render :soap => params[:value].to_s, :header => (params[:value]+1).to_s
130
+ end
131
+
132
+ # Reading SOAP Headers
133
+ # This is different than normal SOAP params, because we don't specify the incoming format of the header,
134
+ # but we can still access it through `soap_request.headers`. Note that the values are all strings or hashes.
135
+ soap_action "AddCircleWithHeaderRadius",
136
+ :args => { :circle => { :center => { :x => :integer,
137
+ :y => :integer } } },
138
+ :return => nil, # [] for wash_out below 0.3.0
139
+ :to => :add_circle
140
+ # e.g. for a request to the 'AddCircleWithHeaderRadius' action:
141
+ # <soapenv:Envelope>
142
+ # <soap:Header>
143
+ # <radius>12345</radius>
144
+ # </soap:Header>
145
+ # <soapenv:Body>
146
+ # <AddCircle>
147
+ # <Circle radius="5.0">
148
+ # <Center x="10" y="12" />
149
+ # </Circle>
150
+ # </AddCircle>
151
+ # </soapenv:Body>
152
+ # </soapenv:Envelope>
153
+ def add_circle_with_header_radius
154
+ circle = params[:circle]
155
+ radius = soap_request.headers[:radius]
156
+ raise SOAPError, "radius must be specified in the SOAP header" if radius.blank?
157
+ radius = radius.to_f
158
+ raise SOAPError, "radius is too small" if radius < 3.0
159
+
160
+ Circle.new(circle[:center][:x], circle[:center][:y], radius)
161
+
162
+ render :soap => nil
163
+ end
164
+
121
165
  end
122
166
  ```
123
167
 
data/Rakefile CHANGED
@@ -3,11 +3,22 @@ require 'bundler/gem_tasks'
3
3
  require 'appraisal'
4
4
  require 'rspec/core/rake_task'
5
5
 
6
- RSpec::Core::RakeTask.new(:spec)
6
+ RSpec::Core::RakeTask.new
7
7
 
8
8
  task :console do
9
9
  require "action_controller/railtie"
10
10
  require "rails/test_unit/railtie"
11
11
  Bundler.require
12
12
  binding.pry
13
- end
13
+ end
14
+
15
+
16
+ desc 'Default: run the unit tests.'
17
+ task default: [:all]
18
+
19
+ desc 'Test the plugin under all supported Rails versions.'
20
+ task :all do |_t|
21
+ # this is needed for minitest because it does not support "--pattern" option as Rspec Does
22
+ ENV['SPEC'] = '--name=spec/**{,/*/**}/*_spec.rb'
23
+ exec('bundle exec appraisal install && bundle exec rake appraisal spec')
24
+ end
@@ -2,6 +2,13 @@ xml.instruct!
2
2
  xml.tag! "soap:Envelope", "xmlns:soap" => 'http://schemas.xmlsoap.org/soap/envelope/',
3
3
  "xmlns:xsd" => 'http://www.w3.org/2001/XMLSchema',
4
4
  "xmlns:tns" => @namespace do
5
+ if !header.nil?
6
+ xml.tag! "soap:Header" do
7
+ xml.tag! "tns:#{@action_spec[:response_tag]}" do
8
+ wsdl_data xml, header
9
+ end
10
+ end
11
+ end
5
12
  xml.tag! "soap:Body" do
6
13
  xml.tag! "tns:#{@action_spec[:response_tag]}" do
7
14
  wsdl_data xml, result
@@ -3,9 +3,16 @@ xml.tag! "soap:Envelope", "xmlns:soap" => 'http://schemas.xmlsoap.org/soap/envel
3
3
  "xmlns:xsd" => 'http://www.w3.org/2001/XMLSchema',
4
4
  "xmlns:xsi" => 'http://www.w3.org/2001/XMLSchema-instance',
5
5
  "xmlns:tns" => @namespace do
6
+ if !header.nil?
7
+ xml.tag! "soap:Header" do
8
+ xml.tag! "tns:#{@action_spec[:response_tag]}" do
9
+ wsdl_data xml, header
10
+ end
11
+ end
12
+ end
6
13
  xml.tag! "soap:Body" do
7
14
  xml.tag! "tns:#{@action_spec[:response_tag]}" do
8
15
  wsdl_data xml, result
9
16
  end
10
17
  end
11
- end
18
+ end
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "wasabi"
6
+ gem "savon", ">= 2.0.0"
7
+ gem "httpi"
8
+ gem "rspec-rails"
9
+ gem "guard"
10
+ gem "guard-rspec"
11
+ gem "rb-fsevent"
12
+ gem "appraisal"
13
+ gem "tzinfo"
14
+ gem "pry"
15
+ gem "simplecov"
16
+ gem "simplecov-summary"
17
+ gem "rails", "5.0.0"
18
+
19
+ gemspec :path => "../"
@@ -31,10 +31,14 @@ module WashOut
31
31
  end
32
32
 
33
33
  def _map_soap_parameters
34
- @_params = _load_params action_spec[:in],
34
+ self.params = _load_params action_spec[:in],
35
35
  _strip_empty_nodes(action_spec[:in], xml_data)
36
36
  end
37
37
 
38
+ def _map_soap_headers
39
+ @_soap_headers = xml_header_data
40
+ end
41
+
38
42
  def _strip_empty_nodes(params, hash)
39
43
  hash.keys.each do |key|
40
44
  param = params.detect { |a| a.raw_name.to_s == key.to_s }
@@ -127,9 +131,19 @@ module WashOut
127
131
  return result_spec
128
132
  }
129
133
 
134
+ header = options[:header]
135
+ if header.present?
136
+ header = { 'value' => header } unless header.is_a? Hash
137
+ header = HashWithIndifferentAccess.new(header)
138
+ end
139
+
130
140
  render :template => "wash_out/#{soap_config.wsdl_style}/response",
131
141
  :layout => false,
132
- :locals => { :result => inject.call(result, @action_spec[:out]) },
142
+ :locals => {
143
+ :header => header.present? ? inject.call(header, @action_spec[:header_out])
144
+ : nil,
145
+ :result => inject.call(result, @action_spec[:out])
146
+ },
133
147
  :content_type => 'text/xml'
134
148
  end
135
149
 
@@ -159,18 +173,26 @@ module WashOut
159
173
  :content_type => 'text/xml'
160
174
  end
161
175
 
176
+ def soap_request
177
+ OpenStruct.new({
178
+ params: @_params,
179
+ headers: @_soap_headers
180
+ })
181
+ end
182
+
162
183
  def self.included(controller)
163
184
  entity = if defined?(Rails::VERSION::MAJOR) && (Rails::VERSION::MAJOR >= 4)
164
185
  'action'
165
186
  else
166
- 'filter'
187
+ 'filter'
167
188
  end
168
189
 
169
190
  controller.send :"around_#{entity}", :_catch_soap_errors
170
191
  controller.send :helper, :wash_out
171
192
  controller.send :"before_#{entity}", :_authenticate_wsse, :if => :soap_action?
172
193
  controller.send :"before_#{entity}", :_map_soap_parameters, :if => :soap_action?
173
- controller.send :"skip_before_#{entity}", :verify_authenticity_token
194
+ controller.send :"before_#{entity}", :_map_soap_headers, :if => :soap_action?
195
+ controller.send :"skip_before_#{entity}", :verify_authenticity_token, :raise => false
174
196
  end
175
197
 
176
198
  def self.deep_select(collection, result=[], &blk)
@@ -222,11 +244,16 @@ module WashOut
222
244
  end
223
245
 
224
246
  def xml_data
225
- xml_data = request.env['wash_out.soap_data'].values_at(:envelope, :Envelope).compact.first
226
- xml_data = xml_data.values_at(:body, :Body).compact.first || {}
247
+ envelope = request.env['wash_out.soap_data'].values_at(:envelope, :Envelope).compact.first
248
+ xml_data = envelope.values_at(:body, :Body).compact.first || {}
227
249
  return xml_data if soap_config.wsdl_style == "document"
228
250
  xml_data = xml_data.values_at(soap_action.underscore.to_sym, soap_action.to_sym, request_input_tag.to_sym).compact.first || {}
229
251
  end
230
252
 
253
+ def xml_header_data
254
+ envelope = request.env['wash_out.soap_data'].values_at(:envelope, :Envelope).compact.first
255
+ header_data = envelope.values_at(:header, :Header).compact.first || {}
256
+ end
257
+
231
258
  end
232
259
  end
@@ -4,40 +4,35 @@ module WashOut
4
4
  # This class is a Rack middleware used to route SOAP requests to a proper
5
5
  # action of a given SOAP controller.
6
6
  class Router
7
- def self.lookup_soap_routes(controller_name, routes)
8
- results = []
9
-
7
+ def self.lookup_soap_routes(controller_name, routes, path=[], &block)
10
8
  routes.each do |x|
11
9
  defaults = x.defaults
12
10
  defaults = defaults[:defaults] if defaults.include?(:defaults) # Rails 5
13
11
  if defaults[:controller] == controller_name && defaults[:action] == 'soap'
14
- results << x
12
+ yield path+[x]
15
13
  end
16
14
 
17
15
  app = x.app
18
16
  app = app.app if app.respond_to?(:app)
19
- if app.is_a?(Class) && app.ancestors.include?(Rails::Engine)
20
- results += lookup_soap_routes(controller_name, app.routes.routes)
17
+ if app.respond_to?(:routes)
18
+ lookup_soap_routes(controller_name, app.routes.routes, path+[x], &block)
21
19
  end
22
20
  end
23
-
24
- results
25
21
  end
26
22
 
27
23
  def self.url(request, controller_name)
28
- route = lookup_soap_routes(controller_name, Rails.application.routes.routes).first
29
-
30
- path = if route.respond_to?(:optimized_path) # Rails 4
31
- route.optimized_path
32
- elsif route.path.respond_to?(:build_formatter) # Rails 5
33
- route.path.build_formatter.evaluate(nil)
34
- else
35
- route.format({}) # Rails 3.2
36
- end
24
+ lookup_soap_routes(controller_name, Rails.application.routes.routes) do |routes|
37
25
 
38
- path = path.join('') if path.is_a?(Array)
26
+ path = if routes.first.respond_to?(:optimized_path) # Rails 4
27
+ routes.map(&:optimized_path)
28
+ elsif routes.first.path.respond_to?(:build_formatter) # Rails 5
29
+ routes.map{|x| x.path.build_formatter.evaluate(nil)}
30
+ else
31
+ routes.map{|x| x.format({})} # Rails 3.2
32
+ end
39
33
 
40
- request.protocol + request.host_with_port + path
34
+ return request.protocol + request.host_with_port + path.flatten.join('')
35
+ end
41
36
  end
42
37
 
43
38
  def initialize(controller_name)
@@ -123,7 +118,7 @@ module WashOut
123
118
  '_invalid_action'
124
119
  end
125
120
  end
126
-
121
+ env["action_dispatch.request.content_type"] = Mime[:soap]
127
122
  controller.action(action).call(env)
128
123
  end
129
124
  end
data/lib/wash_out/soap.rb CHANGED
@@ -13,7 +13,15 @@ module WashOut
13
13
  #
14
14
  # An optional option :to can be passed to allow for names of SOAP actions
15
15
  # which are not valid Ruby function names.
16
+ # There is also an optional :header_return option to specify the format of the
17
+ # SOAP response's header tag (<env:Header></env:Header>). If unspecified, there will
18
+ # be no header tag in the response.
16
19
  def soap_action(action, options={})
20
+ if options[:as].present?
21
+ options[:to] ||= action
22
+ action = options[:as]
23
+ end
24
+
17
25
  if action.is_a?(Symbol)
18
26
  if soap_config.camelize_wsdl.to_s == 'lower'
19
27
  options[:to] ||= action.to_s
@@ -28,10 +36,12 @@ module WashOut
28
36
  default_response_tag = soap_config.camelize_wsdl ? 'Response' : '_response'
29
37
  default_response_tag = action+default_response_tag
30
38
 
39
+
31
40
  self.soap_actions[action] = options.merge(
32
41
  :in => WashOut::Param.parse_def(soap_config, options[:args]),
33
42
  :request_tag => options[:as] || action,
34
43
  :out => WashOut::Param.parse_def(soap_config, options[:return]),
44
+ :header_out => options[:header_return].present? ? WashOut::Param.parse_def(soap_config, options[:header_return]) : nil,
35
45
  :to => options[:to] || action,
36
46
  :response_tag => options[:response_tag] || default_response_tag
37
47
  )
@@ -1,3 +1,3 @@
1
1
  module WashOut
2
- VERSION = "0.11.0.beta.2"
2
+ VERSION = "0.11.0"
3
3
  end
data/lib/wash_out.rb CHANGED
@@ -44,7 +44,7 @@ ActionController::Renderers.add :soap do |what, options|
44
44
  _render_soap(what, options)
45
45
  end
46
46
 
47
- ActionController::Base.class_eval do
47
+ ActionController::Metal.class_eval do
48
48
 
49
49
  # Define a SOAP service. The function has no required +options+:
50
50
  # but allow any of :parser, :namespace, :wsdl_style, :snakecase_input,
@@ -58,3 +58,17 @@ ActionController::Base.class_eval do
58
58
  self.soap_config = options
59
59
  end
60
60
  end
61
+
62
+ if Rails::VERSION::MAJOR >= 5
63
+ module ActionController
64
+ module ApiRendering
65
+ include ActionView::Rendering
66
+ end
67
+ end
68
+
69
+ ActiveSupport.on_load :action_controller do
70
+ if self == ActionController::API
71
+ include ActionController::Helpers
72
+ end
73
+ end
74
+ end
@@ -130,6 +130,37 @@ describe WashOut do
130
130
  XML
131
131
  end
132
132
 
133
+ it "accepts requests with no HTTP header with alias" do
134
+ mock_controller do
135
+ soap_action "answer", :as => 'whatever', :args => nil, :return => :int
136
+ def answer
137
+ render :soap => "42"
138
+ end
139
+ end
140
+
141
+ request = <<-XML
142
+ <?xml version="1.0" encoding="UTF-8"?>
143
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
144
+ <env:Body>
145
+ <tns:whatever>
146
+ <value>42</value>
147
+ </tns:whatever>
148
+ </env:Body>
149
+ </env:Envelope>
150
+ XML
151
+
152
+ expect(HTTPI.post("http://app/route/api/action", request).body).to eq <<-XML
153
+ <?xml version="1.0" encoding="UTF-8"?>
154
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false">
155
+ <soap:Body>
156
+ <tns:whateverResponse>
157
+ <Value xsi:type="xsd:int">42</Value>
158
+ </tns:whateverResponse>
159
+ </soap:Body>
160
+ </soap:Envelope>
161
+ XML
162
+ end
163
+
133
164
  it "accept no parameters" do
134
165
  mock_controller do
135
166
  soap_action "answer", :args => nil, :return => :int
@@ -313,10 +344,10 @@ describe WashOut do
313
344
 
314
345
  expect(savon(:gogogo)[:gogogo_response]).
315
346
  to eq({
316
- :zoo=>"zoo",
347
+ :zoo=>"zoo",
317
348
  :boo=>{
318
- :moo=>"moo",
319
- :doo=>"doo",
349
+ :moo=>"moo",
350
+ :doo=>"doo",
320
351
  :"@xsi:type"=>"tns:Boo"
321
352
  }
322
353
  })
@@ -459,6 +490,175 @@ describe WashOut do
459
490
  end
460
491
  end
461
492
 
493
+ context "SOAP header" do
494
+ it "accepts requests with a simple header" do
495
+ mock_controller do
496
+ soap_action "answer", :args => nil, :return => :int, :header_args => :string
497
+ def answer
498
+ render :soap => "42"
499
+ end
500
+ end
501
+
502
+ request = <<-XML
503
+ <?xml version="1.0" encoding="UTF-8"?>
504
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
505
+ <env:Header>
506
+ <tns:Auth>
507
+ <value>12345</value>
508
+ </tns:Auth>
509
+ </env:Header>
510
+ <env:Body>
511
+ <tns:answer>
512
+ <value>42</value>
513
+ </tns:answer>
514
+ </env:Body>
515
+ </env:Envelope>
516
+ XML
517
+
518
+ expect(HTTPI.post("http://app/route/api/action", request).body).to eq <<-XML
519
+ <?xml version="1.0" encoding="UTF-8"?>
520
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false">
521
+ <soap:Body>
522
+ <tns:answerResponse>
523
+ <Value xsi:type="xsd:int">42</Value>
524
+ </tns:answerResponse>
525
+ </soap:Body>
526
+ </soap:Envelope>
527
+ XML
528
+ end
529
+
530
+ it "makes simple header values accessible" do
531
+ mock_controller do
532
+ soap_action "answer", :args => nil, :return => :int
533
+ def answer
534
+ expect(soap_request.headers).to eq({value: "12345"})
535
+ render :soap => "42"
536
+ end
537
+ end
538
+
539
+ request = <<-XML
540
+ <?xml version="1.0" encoding="UTF-8"?>
541
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
542
+ <env:Header>
543
+ <value>12345</value>
544
+ </env:Header>
545
+ <env:Body>
546
+ <tns:answer>
547
+ <value>42</value>
548
+ </tns:answer>
549
+ </env:Body>
550
+ </env:Envelope>
551
+ XML
552
+
553
+ HTTPI.post("http://app/route/api/action", request)
554
+
555
+ end
556
+
557
+ it "makes complex header values accessible" do
558
+ mock_controller do
559
+ soap_action "answer", :args => nil, :return => :int
560
+ def answer
561
+ expect(soap_request.headers[:auth][:answer_response]).to eq "12345"
562
+ render :soap => "42"
563
+ end
564
+ end
565
+
566
+ request = <<-XML
567
+ <?xml version="1.0" encoding="UTF-8"?>
568
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
569
+ <env:Header>
570
+ <Auth>
571
+ <AnswerResponse>12345</AnswerResponse>
572
+ </Auth>
573
+ </env:Header>
574
+ <env:Body>
575
+ <tns:answer>
576
+ <value>42</value>
577
+ </tns:answer>
578
+ </env:Body>
579
+ </env:Envelope>
580
+ XML
581
+
582
+ HTTPI.post("http://app/route/api/action", request)
583
+
584
+ end
585
+
586
+ it "renders a simple header if specified" do
587
+ mock_controller do
588
+ soap_action "answer", :args => nil, :return => :int, header_return: :string
589
+ def answer
590
+ render :soap => "42", :header => "12345"
591
+ end
592
+ end
593
+
594
+
595
+ request = <<-XML
596
+ <?xml version="1.0" encoding="UTF-8"?>
597
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
598
+ <env:Body>
599
+ <tns:answer>
600
+ <value>42</value>
601
+ </tns:answer>
602
+ </env:Body>
603
+ </env:Envelope>
604
+ XML
605
+
606
+ expect(HTTPI.post("http://app/route/api/action", request).body).to eq <<-XML
607
+ <?xml version="1.0" encoding="UTF-8"?>
608
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false">
609
+ <soap:Header>
610
+ <tns:answerResponse>
611
+ <Value xsi:type="xsd:string">12345</Value>
612
+ </tns:answerResponse>
613
+ </soap:Header>
614
+ <soap:Body>
615
+ <tns:answerResponse>
616
+ <Value xsi:type="xsd:int">42</Value>
617
+ </tns:answerResponse>
618
+ </soap:Body>
619
+ </soap:Envelope>
620
+ XML
621
+ end
622
+ end
623
+
624
+ it "renders a complex header if specified" do
625
+ mock_controller do
626
+ soap_action "answer", :args => nil, :return => :int, header_return: {:"Auth" => :string}
627
+ def answer
628
+ render :soap => "42", :header => {Auth: "12345"}
629
+ end
630
+ end
631
+
632
+
633
+ request = <<-XML
634
+ <?xml version="1.0" encoding="UTF-8"?>
635
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
636
+ <env:Body>
637
+ <tns:answer>
638
+ <value>42</value>
639
+ </tns:answer>
640
+ </env:Body>
641
+ </env:Envelope>
642
+ XML
643
+
644
+ expect(HTTPI.post("http://app/route/api/action", request).body).to eq <<-XML
645
+ <?xml version="1.0" encoding="UTF-8"?>
646
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="false">
647
+ <soap:Header>
648
+ <tns:answerResponse>
649
+ <Auth xsi:type="xsd:string">12345</Auth>
650
+ </tns:answerResponse>
651
+ </soap:Header>
652
+ <soap:Body>
653
+ <tns:answerResponse>
654
+ <Value xsi:type="xsd:int">42</Value>
655
+ </tns:answerResponse>
656
+ </soap:Body>
657
+ </soap:Envelope>
658
+ XML
659
+ end
660
+
661
+
462
662
  context "types" do
463
663
  it "recognize boolean" do
464
664
  mock_controller do
@@ -680,7 +880,7 @@ describe WashOut do
680
880
  response_hash = Nori.new.parse(HTTPI.post("http://app/route/api/action", invalid_request).body)
681
881
  expect(response_hash["soap:Envelope"]["soap:Body"]["soap:Fault"]['faultstring']).to eq "Invalid SOAP request"
682
882
  end
683
-
883
+
684
884
  it "raises when SOAP message without SOAP Body arrives" do
685
885
  mock_controller do; end
686
886
  invalid_request = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"></s:Envelope>'
@@ -762,7 +962,7 @@ describe WashOut do
762
962
  it "handles auth callback" do
763
963
  mock_controller(
764
964
  wsse_auth_callback: lambda {|user, password|
765
- return user == "gorilla" && password == "secret"
965
+ return user == "gorilla" && password == "secret"
766
966
  }
767
967
  ) do
768
968
  soap_action "checkAuth", :args => :integer, :return => :boolean, :to => 'check_auth'
data/spec/spec_helper.rb CHANGED
@@ -24,6 +24,8 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
24
24
  RSpec.configure do |config|
25
25
  require 'rspec/expectations'
26
26
  config.include RSpec::Matchers
27
+ config.filter_run focus: true
28
+ config.run_all_when_everything_filtered = true
27
29
 
28
30
  config.mock_with :rspec
29
31
  config.before(:all) do
@@ -63,7 +65,7 @@ def mock_controller(options = {}, &block)
63
65
  Route::Space.send :remove_const, :ApiController if defined?(Route::Space::ApiController)
64
66
  Route::Space.send :const_set, :ApiController, Class.new(ApplicationController) {
65
67
  include RSpec::Matchers
66
-
68
+
67
69
  soap_service options.reverse_merge({
68
70
  snakecase_input: true,
69
71
  camelize_wsdl: true,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wash_out
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0.beta.2
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boris Staal
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-06-21 00:00:00.000000000 Z
12
+ date: 2016-12-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nori
@@ -53,6 +53,7 @@ files:
53
53
  - gemfiles/rails_4.1.0.gemfile
54
54
  - gemfiles/rails_4.2.0.gemfile
55
55
  - gemfiles/rails_5.0.0.beta2.gemfile
56
+ - gemfiles/rails_5.0.0.gemfile
56
57
  - init.rb
57
58
  - lib/wash_out.rb
58
59
  - lib/wash_out/configurable.rb
@@ -117,9 +118,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
118
  version: '0'
118
119
  required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  requirements:
120
- - - ">"
121
+ - - ">="
121
122
  - !ruby/object:Gem::Version
122
- version: 1.3.1
123
+ version: '0'
123
124
  requirements: []
124
125
  rubyforge_project:
125
126
  rubygems_version: 2.5.1