carousel-ruby-api 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,34 +1,39 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Carousel::Order do
4
-
5
- before do
6
- @client = Carousel::Client.new("the_username", "the_password")
7
- @order_client = Carousel::Order.new(@client)
8
- @xml = Builder::XmlMarkup.new
9
- end
4
+ let(:client) { Carousel::Client.new("the_username", "the_password") }
5
+ let(:order_request) { Carousel::Order.new(client) }
10
6
 
11
7
  describe '#build_order_request' do
12
- it 'should' do
13
- response = @order_client.build_order_request(order_hash)
14
- @client.type.should == "new_order_entry"
15
- request_body = xml_order_request_string(order_hash)
16
- response.should == xml_string("new_order_entry", request_body)
8
+ it 'builds an xml file based on the order' do
9
+ expect(order_request.build_order_request(order_hash)).to eq(read_xml(:test_order))
17
10
  end
18
11
  end
19
12
 
20
13
  describe 'private#build_address' do
21
- it 'should build the proper address xml' do
22
- type = "CUSTOMER"
23
- request = @order_client.send(:build_address, @xml, type, order_hash[:shipping_address])
24
- request.should == xml_address_string(type, order_hash[:shipping_address])
14
+ before do
15
+ @xml = ::Builder::XmlMarkup.new :indent => 2
16
+ @xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
17
+ end
18
+
19
+ context 'given a billing address' do
20
+ it 'adds the address tags with the "inv" prefix' do
21
+ expect(order_request.send(:build_address, @xml, address_hash, :billing)).to eq(read_xml(:test_shipping_address_builder))
22
+ end
23
+ end
24
+ context 'given any other address' do
25
+ it 'adds the address tags to the xml file' do
26
+ expect(order_request.send(:build_address, @xml, address_hash, "shipping")).to eq(read_xml(:test_address_builder))
27
+ end
25
28
  end
26
29
  end
27
30
 
28
31
  describe 'private#build_line_items' do
29
- it 'should build the proper line items xml' do
30
- request = @order_client.send(:build_line_items, @xml, order_hash)
31
- request.should == xml_line_items_string(order_hash)
32
+ it 'adds the line_items tags to the xml file under orderline' do
33
+ xml = ::Builder::XmlMarkup.new :indent => 2
34
+ xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
35
+ order_request.send(:build_line_items, xml, order_hash)
36
+ expect(xml.target!).to eq(read_xml(:test_line_items))
32
37
  end
33
38
  end
34
39
 
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Carousel::Request do
4
+
5
+ let(:client) { Carousel::Client.new("the_username", "the_password") }
6
+ let(:request) { Carousel::Request.new(client) }
7
+
8
+ describe '#initialize' do
9
+ it 'sets the client' do
10
+ expect(request.instance_variable_get(:@client)).to eq(client)
11
+ end
12
+ end
13
+
14
+ describe '#construct_xml' do
15
+ it 'creates xml with a given block' do
16
+ expect(request.construct_xml("order"){|xml| xml.test "test"}).to eq(read_xml(:test_request))
17
+ end
18
+ end
19
+
20
+ describe '#build_user' do
21
+ it 'adds user and password to xml file' do
22
+ xml = ::Builder::XmlMarkup.new :indent => 2
23
+ xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
24
+ expect(request.build_user(xml)).to eq(read_xml(:test_build_user))
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Carousel::Response do
4
+
5
+ let(:raw_xml) { read_xml(:success_order_response) }
6
+ let(:raw_fail_xml) { read_xml(:error_order_response) }
7
+ let(:failed_response) { Carousel::Response.new(raw_fail_xml, "order") }
8
+ let(:successful_response) { Carousel::Response.new(raw_xml, "order") }
9
+ let(:message) { {"order"=>[{"number"=>"12345", "status"=>["OK"], "details"=>[{}]}]} }
10
+
11
+ describe '#initialize' do
12
+ it 'sets the raw_response. response, and type' do
13
+ expect(successful_response.instance_variable_get(:@raw_response)).to eq(raw_xml)
14
+ expect(successful_response.instance_variable_get(:@type)).to eq("order")
15
+ expect(successful_response.response).to eq(message)
16
+ end
17
+ end
18
+
19
+ describe '#failure?' do
20
+ context 'the status is "OK"' do
21
+ it 'returns false' do
22
+ expect(successful_response.failure?).to eq(false)
23
+ end
24
+ end
25
+ context 'the status is not "OK"' do
26
+ it 'returns true' do
27
+ expect(failed_response.failure?).to eq(true)
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '#success?' do
33
+ context 'the status is "OK"' do
34
+ it 'returns true' do
35
+ expect(successful_response.success?).to eq(true)
36
+ end
37
+ end
38
+ context 'the status is not "OK"' do
39
+ it 'returns false' do
40
+ expect(failed_response.success?).to eq(false)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe '#status' do
46
+ context 'with a successful response' do
47
+ it 'returns succesful status code' do
48
+ expect(successful_response.status).to eq("OK")
49
+ end
50
+ end
51
+ context 'with an failed response' do
52
+ it 'returns a failed status code' do
53
+ expect(failed_response.status).to eq("ERROR")
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '#message' do
59
+ it 'returns the details from the response' do
60
+ expect(successful_response.message).to eq({})
61
+ end
62
+ end
63
+
64
+ describe '#parse_response' do
65
+ it 'returns the parsed xml' do
66
+ expect(successful_response.parse_response(raw_xml)).to eq(message)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Carousel::Shipping do
4
+ describe '.map' do
5
+ context 'with the code within the shipping map' do
6
+ it 'returns the value for the given key' do
7
+ expect(Carousel::Shipping.map("standard")).to eq("ECONOMY")
8
+ end
9
+ end
10
+ context 'with the code not in the shipping map' do
11
+ it 'returns the given code' do
12
+ expect(Carousel::Shipping.map("first-class")).to eq("first-class")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Carousel::Tracking do
4
+
5
+ let(:tracking) { Carousel::Tracking.new('carousel', '123456')}
6
+
7
+ describe '#initialize' do
8
+ it 'sets the carrier and tracking number' do
9
+ expect(tracking.instance_variable_get(:@carrier)).to eq("carousel")
10
+ expect(tracking.instance_variable_get(:@tracking_number)).to eq("123456")
11
+ end
12
+ end
13
+
14
+ describe '#carrier_destination' do
15
+ context 'when carrier is FedEx' do
16
+ it 'returns the FedEx tracking url' do
17
+ tracking.carrier = "fedex"
18
+ expect(tracking.url).to eq("http://www.fedexuk.net/accounts/QuickTrack.aspx?consignment=123456")
19
+ end
20
+ end
21
+ context 'when carrier is Carousel' do
22
+ it 'returns the Carousel tracking url' do
23
+ expect(tracking.url).to eq("https://web.carousel.eu/easyweb/default.asp?action=clienttrack&type=Carousel&acct1=BEC01&reference=123456")
24
+ end
25
+ end
26
+ end
27
+ describe '#url' do
28
+ context 'when carrier is FedEx' do
29
+ it 'returns the FedEx tracking url including the tracking number' do
30
+ tracking.carrier = "fedex"
31
+ expect(tracking.url).to eq("http://www.fedexuk.net/accounts/QuickTrack.aspx?consignment=123456")
32
+ end
33
+ end
34
+ context 'when carrier is Carousel' do
35
+ it 'returns the Carousel tracking url including the tracking number' do
36
+ expect(tracking.url).to eq("https://web.carousel.eu/easyweb/default.asp?action=clienttrack&type=Carousel&acct1=BEC01&reference=123456")
37
+ end
38
+ end
39
+ end
40
+ end
File without changes
data/spec/spec_helper.rb CHANGED
@@ -1,129 +1,189 @@
1
- # This file was generated by the `rspec --init` command. Conventionally, all
2
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
- # Require this file using `require "spec_helper"` to ensure that it is only
4
- # loaded once.
5
-
6
- require 'rubygems'
1
+ require 'codeclimate-test-reporter'
2
+ CodeClimate::TestReporter.start
7
3
  require 'bundler/setup'
8
- Bundler.require(:default, :development)
9
- require 'hashie'
10
4
  require 'carousel'
5
+ require 'rspec'
6
+ require 'webmock/rspec'
7
+ require 'hashie'
8
+
9
+ Bundler.setup
10
+
11
+ WebMock.disable_net_connect!(:allow => "codeclimate.com")
11
12
 
12
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
13
13
  RSpec.configure do |config|
14
- config.treat_symbols_as_metadata_keys_with_true_values = true
15
- config.run_all_when_everything_filtered = true
16
- config.filter_run :focus
17
- config.order = 'random'
18
- end
19
-
20
- def xml_string(type, body)
21
- xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
22
- xml += "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\">"
23
- xml += xml_header_string(type)
24
- xml += "<s:Body><#{type} xmlns=\"SII\">"
25
- xml += xml_user_string
26
- xml += body
27
- xml += "</#{type}></s:Body></s:Envelope>"
28
- end
29
-
30
- def xml_header_string(type)
31
- xml = "<s:Header><a:Action s:mustUnderstand=\"1\">SII/ISIIService/#{type}</a:Action>"
32
- xml += "<a:MessageID>urn:uuid:56b55a70-8bbc-471d-94bb-9ca060bcf99f</a:MessageID>"
33
- xml += "<a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo>"
34
- xml += "<a:To s:mustUnderstand=\"1\">https://www.carousel.us/webservices/SIIService.svc</a:To></s:Header>"
35
- end
36
-
37
- def xml_user_string
38
- xml = "<user xmlns:b=\"http://schemas.datacontract.org/2004/07/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"
39
- xml += "<b:user_name>&lt;![CDATA[the_username]]&gt;</b:user_name><b:user_password>&lt;![CDATA[the_password]]&gt;</b:user_password></user>"
40
- end
41
-
42
- def xml_address_string(type, address)
43
- full_name = "#{address[:first_name]} #{address[:last_name]}"
44
- xml = "<b:#{type}_NAME>&lt;![CDATA[#{full_name}]]&gt;</b:#{type}_NAME>"
45
- xml += "<b:#{type}_ADDRESS_1>&lt;![CDATA[#{address[:address1]}]]&gt;</b:#{type}_ADDRESS_1>"
46
- xml += "<b:#{type}_ADDRESS_2>&lt;![CDATA[#{address[:address2]}]]&gt;</b:#{type}_ADDRESS_2>"
47
- xml += "<b:#{type}_ADDRESS_3>&lt;![CDATA[#{address[:address3]}]]&gt;</b:#{type}_ADDRESS_3>"
48
- xml += "<b:#{type}_ADDRESS_CITY>#{address[:city]}</b:#{type}_ADDRESS_CITY>"
49
- xml += "<b:#{type}_ADDRESS_COUNTRY>#{address[:country]}</b:#{type}_ADDRESS_COUNTRY>"
50
- xml += "<b:#{type}_ADDRESS_STATE>#{address[:state]}</b:#{type}_ADDRESS_STATE>"
51
- xml += "<b:#{type}_ADDRESS_ZIP>#{address[:zipcode]}</b:#{type}_ADDRESS_ZIP>"
52
- xml += "<b:#{type}_TELEPHONE>#{address[:phone]}</b:#{type}_TELEPHONE>"
53
- end
54
-
55
- def xml_line_items_string(order)
56
- xml = "<b:Order_Details>"
57
- order[:line_items].each do |line_item|
58
- xml += "<b:Order_Detail_New>"
59
- xml += "<b:PRICE>#{line_item[:price]}</b:PRICE>"
60
- xml += "<b:QUANTITY>#{line_item[:quantity]}</b:QUANTITY>"
61
- xml += "<b:SIZE>#{line_item[:size]}</b:SIZE>"
62
- xml += "<b:sku>#{line_item[:sku]}</b:sku>"
63
- xml += "</b:Order_Detail_New>"
64
- end
65
- xml += "</b:Order_Details>"
66
- end
67
-
68
- def xml_order_request_string(order)
69
- xml = "<ohn xmlns:b=\"http://schemas.datacontract.org/2004/07/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"
70
- xml += "<b:SERVICE>90</b:SERVICE>"
71
- xml += "<b:USER1>&lt;![CDATA[http://example.com/R123123123/invoice]]&gt;</b:USER1>"
72
- xml += "<b:CARRIER>FEDEX</b:CARRIER>"
73
- xml += "<b:CUSTOMER_CODE/><b:DELIVERY_GIFT_WRAP/>"
74
- xml += "<b:DELIVERY_MESSAGE>&lt;![CDATA[Happy Birthday!]]&gt;</b:DELIVERY_MESSAGE>"
75
- xml += "<b:EMAIL>someone@somehwere.com</b:EMAIL>"
76
- xml += "<b:ORDER_ID>R123123123</b:ORDER_ID>"
77
- xml += "<b:ORDER_TYPE>OO</b:ORDER_TYPE>"
78
- xml += "<b:DELIVERY_FROM i:nil=\"true\"/><b:DELIVERY_TO i:nil=\"true\"/>"
79
- xml += "<b:DELIVERY_ID i:nil=\"true\"/><b:FREIGHT_ACCOUNT i:nil=\"true\"/>"
80
- xml += xml_address_string("CUSTOMER", order[:billing_address])
81
- xml += xml_address_string("DELIVERY", order[:shipping_address])
82
- xml += xml_line_items_string(order)
83
- xml += "</ohn>"
14
+ config.include WebMock::API
15
+ config.before(:all, &:silence_output)
16
+ config.after(:all, &:enable_output)
84
17
  end
85
18
 
86
- def order_hash
87
- {
88
- carrier: "FEDEX",
89
- billing_address: {
90
- first_name: "John",
91
- last_name: "Smith",
92
- address1: "123 Here Now",
93
- address2: "2nd Floor",
94
- address3: "",
95
- city: "New York",
96
- state: "New York",
97
- country: "US",
98
- zipcode: "10012",
99
- phone: "123-123-1234"
100
- },
101
- shipping_address: {
102
- first_name: "John",
103
- last_name: "Smith",
104
- address1: "123 Here Now",
105
- address2: "2nd Floor",
106
- address3: "",
107
- city: "New York",
108
- state: "New York",
109
- country: "US",
110
- zipcode: "10012",
111
- phone: "123-123-1234"
112
- },
113
- gift_wrap: "true",
114
- gift_message: "Happy Birthday!",
115
- email: "someone@somehwere.com",
116
- number: "R123123123",
117
- type: "OO",
118
- line_items: [
19
+ def read_xml(type)
20
+ File.read( File.expand_path("spec/fixtures/#{type}.xml") )
21
+ end
22
+
23
+ def fixture(type)
24
+ XmlSimple.xml_in( read_xml(type) )
25
+ end
26
+
27
+ def base_url
28
+ 'https://web.carousel.eu/carouselwms/default.asp?'
29
+ end
30
+
31
+ def stub_get(path)
32
+ stub_request(:get, "#{base_url}#{path}")
33
+ end
34
+
35
+ def stub_post(path)
36
+ stub_request(:post, "#{base_url}#{path}")
37
+ end
38
+
39
+ def xml_headers
40
+ {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/xml', 'User-Agent'=>'Ruby'}
41
+ end
42
+
43
+ def json_post_headers
44
+ {
45
+ 'Accept' => '*/*',
46
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
47
+ 'Content-Type' => 'application/json',
48
+ 'User-Agent' => 'Ruby'
49
+ }
50
+ end
51
+
52
+ def success_response
53
+ {
54
+ 'Response' => {
55
+ 'CallStatus' => {
56
+ 'Code' => 0,
57
+ 'Message' => {},
58
+ 'Success' => true
59
+ }
60
+ }
61
+ }
62
+ end
63
+
64
+ def error_product_response
65
+ {
66
+ 'CallStatus' => {
67
+ 'Success' => false,
68
+ 'Code' => 100,
69
+ 'Message' => 'Error Submitting Product Master: LJ-W-BERN-S-GW - Error. Product Code already exists.'
70
+ }
71
+ }
72
+ end
73
+
74
+ def configuration
75
+ {
76
+ supplier_code: 'Supplier1',
77
+ supplier_description: 'My Supplier',
78
+ supplier_uom: 1,
79
+ warehouses: {},
80
+ token: 'token123'
81
+ }
82
+ end
83
+
84
+ def address_hash
85
+ {
86
+ city: 'Windsor',
87
+ country: 'GB',
88
+ first_name: 'Stephen',
89
+ last_name: 'Jones',
90
+ address1: '23 Victoria Street',
91
+ address2: '',
92
+ phone: '0123 336 6676',
93
+ zipcode: 'SL4 1HE'
94
+ }
95
+ end
96
+
97
+ def line_items_array
98
+ [
119
99
  {
120
- price: "127.23",
121
- quantity: "1",
122
- sku: "123332211",
123
- size: "XS"
100
+ sku: 100083,
101
+ quantity: 2
124
102
  }
125
- ],
126
- shipping_code: "90",
127
- invoice_url: "http://example.com/R123123123/invoice"
128
- }
103
+ ]
104
+ end
105
+
106
+ def company_hash
107
+ {
108
+ code: 'IND001',
109
+ description: 'Indigina'
110
+ }
111
+ end
112
+
113
+ def order_hash
114
+ {
115
+ number: 123456,
116
+ email: 'stephen.jones@gmail.com',
117
+ shipping_address: address_hash,
118
+ billing_address: address_hash,
119
+ line_items: line_items_array,
120
+ warehouse: 'DC123',
121
+ date: '2013-12-12',
122
+ shipping_method: 'standard'
123
+ }
124
+ end
125
+
126
+ def company_order_hash
127
+ order_hash.merge(company: company_hash)
128
+ end
129
+
130
+ def company_address_hash
131
+ {
132
+ city: 'High Wycombe',
133
+ country: 'GB',
134
+ country_name: 'Buckinghamshire',
135
+ address1: 'The Farthings',
136
+ address2: 'Sandpits Lane',
137
+ address3: 'Beaconsfield',
138
+ zipcode: 'HP8 TTT'
139
+ }
140
+ end
141
+
142
+ def company_submit_hash
143
+ {
144
+ code: 123456,
145
+ description: 'My Test company',
146
+ address: company_address_hash
147
+ }
148
+ end
149
+
150
+ def fake_response
151
+ Hashie::Mash.new( {body: read_xml(:success_order_response)} )
152
+ end
153
+
154
+
155
+ public
156
+ # Redirects stderr and stout to /log/spec.log
157
+ def silence_output
158
+ # Store the original stderr and stdout in order to restore them later
159
+ @original_stderr = $stderr
160
+ @original_stdout = $stdout
161
+
162
+ # Redirect stderr and stdout
163
+ $stderr = File.new(log_file, 'w')
164
+ $stdout = File.new(log_file, 'w')
165
+ end
166
+
167
+ def log_file
168
+ File.join(File.dirname(__FILE__), 'logs', 'spec.log')
169
+ end
170
+
171
+ # Replace stderr and stdout so anything else is output correctly
172
+ def enable_output
173
+ $stderr = @original_stderr
174
+ $stdout = @original_stdout
175
+ @original_stderr = nil
176
+ @original_stdout = nil
177
+ `rm #{log_file} && touch #{log_file}`
178
+ end
179
+
180
+ def capture_stdout(&block)
181
+ original_stdout = $stdout
182
+ $stdout = fake = StringIO.new
183
+ begin
184
+ yield
185
+ ensure
186
+ $stdout = original_stdout
187
+ end
188
+ fake.string
129
189
  end