wasabi 3.2.3 → 3.6.0

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 (50) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +29 -0
  3. data/README.md +4 -4
  4. data/lib/wasabi.rb +2 -0
  5. data/lib/wasabi/core_ext/string.rb +7 -8
  6. data/lib/wasabi/document.rb +6 -3
  7. data/lib/wasabi/parser.rb +42 -21
  8. data/lib/wasabi/resolver.rb +7 -4
  9. data/lib/wasabi/version.rb +3 -1
  10. data/spec/fixtures/brand.wsdl +624 -0
  11. data/spec/fixtures/multiple_parts_in_message.wsdl +66 -0
  12. data/spec/fixtures/no_message_parts.wsdl +82 -56
  13. data/spec/spec_helper.rb +2 -0
  14. data/spec/support/adapter.rb +20 -0
  15. data/spec/support/fixture.rb +2 -0
  16. data/spec/support/profiling.rb +2 -0
  17. data/spec/wasabi/core_ext/string_spec.rb +13 -11
  18. data/spec/wasabi/document/authentication_spec.rb +21 -5
  19. data/spec/wasabi/document/economic_spec.rb +2 -0
  20. data/spec/wasabi/document/encoded_endpoint_spec.rb +6 -1
  21. data/spec/wasabi/document/geotrust_spec.rb +25 -9
  22. data/spec/wasabi/document/inherited_spec.rb +12 -7
  23. data/spec/wasabi/document/multiple_namespaces_spec.rb +38 -16
  24. data/spec/wasabi/document/namespaced_actions_spec.rb +21 -5
  25. data/spec/wasabi/document/no_namespace_spec.rb +24 -8
  26. data/spec/wasabi/document/savon295_spec.rb +7 -2
  27. data/spec/wasabi/document/soap12_spec.rb +6 -1
  28. data/spec/wasabi/document/two_bindings_spec.rb +13 -3
  29. data/spec/wasabi/document_spec.rb +8 -6
  30. data/spec/wasabi/parser/get_servicename_spec.rb +3 -1
  31. data/spec/wasabi/parser/import_port_types_spec.rb +4 -2
  32. data/spec/wasabi/parser/juniper_spec.rb +5 -3
  33. data/spec/wasabi/parser/marketo_spec.rb +3 -1
  34. data/spec/wasabi/parser/multiple_namespaces_spec.rb +9 -7
  35. data/spec/wasabi/parser/multiple_parts_in_message_spec.rb +33 -0
  36. data/spec/wasabi/parser/no_message_parts_spec.rb +11 -3
  37. data/spec/wasabi/parser/no_namespace_spec.rb +6 -4
  38. data/spec/wasabi/parser/no_target_namespace_spec.rb +3 -1
  39. data/spec/wasabi/parser/softlayer_spec.rb +20 -0
  40. data/spec/wasabi/parser/symbolic_endpoint_spec.rb +8 -9
  41. data/spec/wasabi/parser/tradetracker_spec.rb +3 -1
  42. data/spec/wasabi/resolver_spec.rb +28 -11
  43. data/spec/wasabi/wasabi_spec.rb +3 -1
  44. metadata +73 -70
  45. data/.gitignore +0 -8
  46. data/.rspec +0 -1
  47. data/.travis.yml +0 -6
  48. data/Gemfile +0 -13
  49. data/Rakefile +0 -7
  50. data/wasabi.gemspec +0 -28
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Document do
@@ -5,30 +7,50 @@ describe Wasabi::Document do
5
7
 
6
8
  subject { Wasabi::Document.new fixture(:multiple_namespaces).read }
7
9
 
8
- its(:namespace) { should == "http://example.com/actions" }
10
+ describe '#namespace' do
11
+ subject { super().namespace }
12
+ it { is_expected.to eq "http://example.com/actions" }
13
+ end
9
14
 
10
- its(:endpoint) { should == URI("http://example.com:1234/soap") }
15
+ describe '#endpoint' do
16
+ subject { super().endpoint }
17
+ it { is_expected.to eq URI("http://example.com:1234/soap") }
18
+ end
11
19
 
12
- its(:element_form_default) { should == :qualified }
20
+ describe '#element_form_default' do
21
+ subject { super().element_form_default }
22
+ it { is_expected.to eq :qualified }
23
+ end
13
24
 
14
- it { should have(1).operations }
25
+ it 'has 1 operation' do
26
+ expect(subject.operations.size).to eq(1)
27
+ end
15
28
 
16
- its(:operations) do
17
- should == { :save => { :input => "Save", :output=>"SaveResponse", :action => "http://example.com/actions.Save", :namespace_identifier => "actions", :parameters => { :article => { :name => "article", :type => "Article" } } } }
29
+ describe '#operations' do
30
+ subject { super().operations }
31
+ it do
32
+ is_expected.to match({ :save => { :input => "Save", :output=>"SaveResponse", :action => "http://example.com/actions.Save", :namespace_identifier => "actions", :parameters => { :article => { :name => "article", :type => "Article" } } } })
33
+ end
18
34
  end
19
35
 
20
- its(:type_namespaces) do
21
- should =~ [
22
- [["Save"], "http://example.com/actions"],
23
- [["Save", "article"], "http://example.com/actions"],
24
- [["Article"], "http://example.com/article"],
25
- [["Article", "Author"], "http://example.com/article"],
26
- [["Article", "Title"], "http://example.com/article"]
27
- ]
36
+ describe '#type_namespaces' do
37
+ subject { super().type_namespaces }
38
+ it do
39
+ is_expected.to match([
40
+ [["Save"], "http://example.com/actions"],
41
+ [["Save", "article"], "http://example.com/actions"],
42
+ [["Article"], "http://example.com/article"],
43
+ [["Article", "Author"], "http://example.com/article"],
44
+ [["Article", "Title"], "http://example.com/article"]
45
+ ])
46
+ end
28
47
  end
29
48
 
30
- its(:type_definitions) do
31
- should =~ [ [["Save", "article"], "Article"] ]
49
+ describe '#type_definitions' do
50
+ subject { super().type_definitions }
51
+ it do
52
+ is_expected.to match([ [["Save", "article"], "Article"] ])
53
+ end
32
54
  end
33
55
 
34
56
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Document do
@@ -5,21 +7,35 @@ describe Wasabi::Document do
5
7
 
6
8
  subject { Wasabi::Document.new fixture(:namespaced_actions).read }
7
9
 
8
- its(:namespace) { should == "http://api.example.com/api/" }
10
+ describe '#namespace' do
11
+ subject { super().namespace }
12
+ it { should == "http://api.example.com/api/" }
13
+ end
9
14
 
10
- its(:endpoint) { should == URI("https://api.example.com/api/api.asmx") }
15
+ describe '#endpoint' do
16
+ subject { super().endpoint }
17
+ it { should == URI("https://api.example.com/api/api.asmx") }
18
+ end
11
19
 
12
- its(:element_form_default) { should == :qualified }
20
+ describe '#element_form_default' do
21
+ subject { super().element_form_default }
22
+ it { should == :qualified }
23
+ end
13
24
 
14
- it { should have(3).operations }
25
+ it 'has 3 operations' do
26
+ expect(subject.operations.size).to eq(3)
27
+ end
15
28
 
16
- its(:operations) do
29
+ describe '#operations' do
30
+ subject { super().operations }
31
+ it do
17
32
  should include(
18
33
  { :delete_client => { :input => "Client.Delete", :output => "Client.DeleteResponse", :action => "http://api.example.com/api/Client.Delete", :namespace_identifier => "tns" } },
19
34
  { :get_clients => { :input => "User.GetClients", :output => "User.GetClientsResponse", :action => "http://api.example.com/api/User.GetClients", :namespace_identifier => "tns" } },
20
35
  { :get_api_key => { :input => "User.GetApiKey", :output => "User.GetApiKeyResponse", :action => "http://api.example.com/api/User.GetApiKey", :namespace_identifier => "tns" } }
21
36
  )
22
37
  end
38
+ end
23
39
 
24
40
  end
25
41
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Document do
@@ -5,21 +7,35 @@ describe Wasabi::Document do
5
7
 
6
8
  subject { Wasabi::Document.new fixture(:no_namespace).read }
7
9
 
8
- its(:namespace) { should == "urn:ActionWebService" }
10
+ describe '#namespace' do
11
+ subject { super().namespace }
12
+ it { should == "urn:ActionWebService" }
13
+ end
9
14
 
10
- its(:endpoint) { should == URI("http://example.com/api/api") }
15
+ describe '#endpoint' do
16
+ subject { super().endpoint }
17
+ it { should == URI("http://example.com/api/api") }
18
+ end
11
19
 
12
- its(:element_form_default) { should == :unqualified }
20
+ describe '#element_form_default' do
21
+ subject { super().element_form_default }
22
+ it { should == :unqualified }
23
+ end
13
24
 
14
- it { should have(3).operations }
25
+ it 'has 3 operations' do
26
+ expect(subject.operations.size).to eq(3)
27
+ end
15
28
 
16
- its(:operations) do
29
+ describe '#operations' do
30
+ subject { super().operations }
31
+ it do
17
32
  should include(
18
- { :get_user_login_by_id => { :input => "GetUserLoginById", :output => "GetUserLoginById", :action => "/api/api/GetUserLoginById", :namespace_identifier => "typens" } },
19
- { :get_all_contacts => { :input => "GetAllContacts", :output =>"GetAllContacts", :action => "/api/api/GetAllContacts", :namespace_identifier => "typens" } },
20
- { :search_user => { :input => "SearchUser", :output =>"SearchUser", :action => "/api/api/SearchUser", :namespace_identifier => nil } }
33
+ { :get_user_login_by_id => { :input => { "GetUserLoginById" => { "api_key" => ["xsd", "string"], "id" => ["xsd", "int"] }}, :output=>{"GetUserLoginById"=>{"return"=>["xsd", "string"]}}, :action => "/api/api/GetUserLoginById", :namespace_identifier => "typens" } },
34
+ { :get_all_contacts => { :input => {"GetAllContacts" => { "api_key" => ["xsd", "string"], "login"=>["xsd", "string"] }}, :output=>{"GetAllContacts"=>{"return"=>["typens", "McContactArray"]}}, :action => "/api/api/GetAllContacts", :namespace_identifier => "typens" } },
35
+ { :search_user => { :input => { "SearchUser" => { "api_key" => ["xsd", "string"], "phrase"=>["xsd", "string"], "page"=>["xsd", "string"], "per_page"=>["xsd", "string"] }}, :output=>{"SearchUser"=>{"return"=>["typens", "MpUserArray"]}}, :action => "/api/api/SearchUser", :namespace_identifier => nil } }
21
36
  )
22
37
  end
38
+ end
23
39
 
24
40
  end
25
41
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Document do
@@ -5,11 +7,14 @@ describe Wasabi::Document do
5
7
 
6
8
  subject { Wasabi::Document.new fixture(:savon295).read }
7
9
 
8
- its(:operations) do
10
+ describe '#operations' do
11
+ subject { super().operations }
12
+ it do
9
13
  should include(
10
- { :sendsms => { :input => "sendsms", :output => "sendsms", :action => "sendsms", :namespace_identifier => "tns" } }
14
+ { :sendsms => { :input=>{"sendsms"=>{"sender"=>["xsd", "string"], "cellular"=>["xsd", "string"], "msg"=>["xsd", "string"], "smsnumgroup"=>["xsd", "string"], "emailaddr"=>["xsd", "string"], "udh"=>["xsd", "string"], "datetime"=>["xsd", "string"], "format"=>["xsd", "string"], "dlrurl"=>["xsd", "string"]}}, :output=>{"sendsms"=>{"body"=>["xsd", "string"]}}, :action => "sendsms", :namespace_identifier => 'tns' } }
11
15
  )
12
16
  end
17
+ end
13
18
 
14
19
  end
15
20
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Document do
@@ -5,7 +7,10 @@ describe Wasabi::Document do
5
7
 
6
8
  subject { Wasabi::Document.new fixture(:soap12).read }
7
9
 
8
- its(:endpoint) { should == URI("http://blogsite.example.com/endpoint12") }
10
+ describe '#endpoint' do
11
+ subject { super().endpoint }
12
+ it { should == URI("http://blogsite.example.com/endpoint12") }
13
+ end
9
14
 
10
15
  end
11
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Document do
@@ -5,17 +7,25 @@ describe Wasabi::Document do
5
7
 
6
8
  subject { Wasabi::Document.new fixture(:two_bindings).read }
7
9
 
8
- its(:element_form_default) { should == :unqualified }
10
+ describe '#element_form_default' do
11
+ subject { super().element_form_default }
12
+ it { should == :unqualified }
13
+ end
9
14
 
10
- it { should have(3).operations }
15
+ it 'has 3 operations' do
16
+ expect(subject.operations.size).to eq(3)
17
+ end
11
18
 
12
- its(:operations) do
19
+ describe '#operations' do
20
+ subject { super().operations }
21
+ it do
13
22
  should include(
14
23
  { :post => { :input => "Post", :action => "Post" } },
15
24
  { :post11only => { :input => "Post11only", :action => "Post11only" } },
16
25
  { :post12only => { :input => "Post12only", :action => "Post12only" } }
17
26
  )
18
27
  end
28
+ end
19
29
 
20
30
  end
21
31
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Document do
@@ -5,20 +7,20 @@ describe Wasabi::Document do
5
7
  subject { Wasabi::Document.new fixture(:authentication).read }
6
8
 
7
9
  it "accepts a URL" do
8
- HTTPI.should_receive(:get) { HTTPI::Response.new(200, {}, "wsdl") }
10
+ expect(HTTPI).to receive(:get) { HTTPI::Response.new(200, {}, "wsdl") }
9
11
 
10
12
  document = Wasabi::Document.new("http://example.com?wsdl")
11
- document.xml.should == "wsdl"
13
+ expect(document.xml).to eq("wsdl")
12
14
  end
13
15
 
14
16
  it "accepts a path" do
15
17
  document = Wasabi::Document.new fixture(:authentication).path
16
- document.xml.should == fixture(:authentication).read
18
+ expect(document.xml).to eq(fixture(:authentication).read)
17
19
  end
18
20
 
19
21
  it "accepts raw XML" do
20
22
  document = Wasabi::Document.new fixture(:authentication).read
21
- document.xml.should == fixture(:authentication).read
23
+ expect(document.xml).to eq(fixture(:authentication).read)
22
24
  end
23
25
 
24
26
  describe ".validate_element_form_default!" do
@@ -39,13 +41,13 @@ describe Wasabi::Document do
39
41
 
40
42
  describe "#element_form_default" do
41
43
  it "defaults to :unqualified" do
42
- subject.element_form_default.should == :unqualified
44
+ expect(subject.element_form_default).to eq(:unqualified)
43
45
  end
44
46
 
45
47
  [:unqualified, :qualified].each do |value|
46
48
  it "accepts :#{value}" do
47
49
  subject.element_form_default = value
48
- subject.element_form_default.should == value
50
+ expect(subject.element_form_default).to eq(value)
49
51
  end
50
52
  end
51
53
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Parser do
@@ -12,7 +14,7 @@ describe Wasabi::Parser do
12
14
  let(:xml) { fixture(:geotrust).read }
13
15
 
14
16
  it "returns the #service_name attribute" do
15
- subject.service_name.should == "queryDefinitions"
17
+ expect(subject.service_name).to eq("queryDefinitions")
16
18
  end
17
19
 
18
20
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Parser do
@@ -14,8 +16,8 @@ describe Wasabi::Parser do
14
16
  it "does blow up when portTypes are imported" do
15
17
  get_customer = subject.operations[:get_customer]
16
18
 
17
- get_customer[:input].should == "GetCustomer"
18
- get_customer[:namespace_identifier].should be_nil
19
+ expect(get_customer[:input]).to eq("GetCustomer")
20
+ expect(get_customer[:namespace_identifier]).to be_nil
19
21
  end
20
22
 
21
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Parser do
@@ -14,9 +16,9 @@ describe Wasabi::Parser do
14
16
  it 'does not blow up when an extension base element is defined in an import' do
15
17
  request = subject.operations[:get_system_info_request]
16
18
 
17
- request[:input].should == 'GetSystemInfoRequest'
18
- request[:action].should == 'urn:#GetSystemInfoRequest'
19
- request[:namespace_identifier].should == 'impl'
19
+ expect(request[:input]).to eq('GetSystemInfoRequest')
20
+ expect(request[:action]).to eq('urn:#GetSystemInfoRequest')
21
+ expect(request[:namespace_identifier]).to eq('impl')
20
22
  end
21
23
 
22
24
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Wasabi::Parser do
@@ -11,7 +13,7 @@ describe Wasabi::Parser do
11
13
  let(:xml) { fixture(:marketo).read }
12
14
 
13
15
  it 'parses the operations' do
14
- subject.operations[:get_lead][:input].should == 'paramsGetLead'
16
+ expect(subject.operations[:get_lead][:input]).to eq('paramsGetLead')
15
17
  end
16
18
  end
17
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Wasabi::Parser do
@@ -12,28 +14,28 @@ describe Wasabi::Parser do
12
14
  let(:xml) { fixture(:multiple_namespaces).read }
13
15
 
14
16
  it "lists the types" do
15
- subject.types.keys.sort.should == ["Article", "Save"]
17
+ expect(subject.types.keys.sort).to eq(["Article", "Save"])
16
18
  end
17
19
 
18
20
  it "records the namespace for each type" do
19
- subject.types["Save"][:namespace].should == "http://example.com/actions"
21
+ expect(subject.types["Save"][:namespace]).to eq("http://example.com/actions")
20
22
  end
21
23
 
22
24
  it "records the fields under a type" do
23
- subject.types["Save"].keys.should =~ ["article", :namespace, :order!]
25
+ expect(subject.types["Save"].keys).to match_array(["article", :namespace, :order!])
24
26
  end
25
27
 
26
28
  it "records multiple fields when there are more than one" do
27
- subject.types["Article"].keys.should =~ ["Title", "Author", :namespace, :order!]
29
+ expect(subject.types["Article"].keys).to match_array(["Title", "Author", :namespace, :order!])
28
30
  end
29
31
 
30
32
  it "records the type of a field" do
31
- subject.types["Save"]["article"][:type].should == "article:Article"
32
- subject.namespaces["article"].should == "http://example.com/article"
33
+ expect(subject.types["Save"]["article"][:type]).to eq("article:Article")
34
+ expect(subject.namespaces["article"]).to eq("http://example.com/article")
33
35
  end
34
36
 
35
37
  it "lists the order of the type elements" do
36
- subject.types["Article"][:order!].should == ["Author", "Title"]
38
+ expect(subject.types["Article"][:order!]).to eq(["Author", "Title"])
37
39
  end
38
40
 
39
41
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Wasabi::Parser do
6
+ context 'with: multiple_parts_in_message.wsdl' do
7
+
8
+ subject do
9
+ parser = Wasabi::Parser.new Nokogiri::XML(xml)
10
+ parser.parse
11
+ parser
12
+ end
13
+
14
+ let(:xml) { fixture(:multiple_parts_in_message).read }
15
+
16
+ context "with a parts attribute in soap:body element" do
17
+ it 'uses the part specified in parts attribute' do
18
+ request = subject.operations[:some_operation][:input]
19
+
20
+ expect(request).to eq("SomeRequestBody")
21
+ end
22
+ end
23
+
24
+ context "with no parts attribute in soap:body element" do
25
+ it 'uses the first part element in message' do
26
+ request = subject.operations[:other_operation][:input]
27
+
28
+ expect(request).to eq("SomeRequest")
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Wasabi::Parser do
@@ -13,14 +15,20 @@ describe Wasabi::Parser do
13
15
 
14
16
  it 'falls back to using the message type in the port element' do
15
17
  # Operation's input has no part element in the message, so using the message type.
16
- subject.operations[:save][:input].should == 'Save'
18
+ expect(subject.operations[:save][:input]).to eq('Save')
17
19
 
18
20
  # Operation's output has part element in the message, so using part element's type.
19
- subject.operations[:save][:output].should == 'SaveResponse'
21
+ expect(subject.operations[:save][:output]).to eq('SaveResponse')
20
22
  end
21
23
 
22
24
  it 'falls back to using the namespace ID in the port element' do
23
- subject.operations[:save][:namespace_identifier].should == 'actions'
25
+ expect(subject.operations[:save][:namespace_identifier]).to eq('actions')
26
+ end
27
+
28
+ it 'gracefully handles port messages without a colon' do
29
+ expect(subject.operations[:delete][:input]).to eq('Delete')
30
+ expect(subject.operations[:delete][:output]).to eq('DeleteResponse')
31
+ expect(subject.operations[:delete][:namespace_identifier]).to be_nil
24
32
  end
25
33
  end
26
34
  end