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.
- checksums.yaml +5 -13
- data/.travis.yml +1 -8
- data/README.md +3 -2
- data/carousel.gemspec +4 -2
- data/lib/carousel/client.rb +11 -2
- data/lib/carousel/order.rb +1 -1
- data/lib/carousel/response.rb +18 -6
- data/lib/carousel/version.rb +1 -1
- data/spec/fixtures/error_order_response.xml +7 -0
- data/spec/fixtures/inventory_request.xml +5 -0
- data/spec/fixtures/success_inventory_response.xml +21 -0
- data/spec/fixtures/success_order_response.xml +7 -0
- data/spec/fixtures/test_address_builder.xml +8 -0
- data/spec/fixtures/test_build_user.xml +3 -0
- data/spec/fixtures/test_line_items.xml +6 -0
- data/spec/fixtures/test_order.xml +29 -0
- data/spec/fixtures/test_request.xml +4 -0
- data/spec/fixtures/test_shipping_address_builder.xml +8 -0
- data/spec/lib/client_spec.rb +246 -50
- data/spec/lib/country_spec.rb +18 -0
- data/spec/lib/inventory_spec.rb +13 -0
- data/spec/lib/order_spec.rb +23 -18
- data/spec/lib/request_spec.rb +27 -0
- data/spec/lib/response_spec.rb +69 -0
- data/spec/lib/shipping_spec.rb +16 -0
- data/spec/lib/tracking_spec.rb +40 -0
- data/spec/logs/spec.log +0 -0
- data/spec/spec_helper.rb +180 -120
- metadata +80 -20
- data/spec/lib/soap_spec.rb +0 -39
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZDUzOTJhODViOTUzZDE3MzhhY2FkMmQzMWQ1NjA2MDQ2MmFmOGY4YQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0607f6afe1f613f3d1a4dd544943245a1369622c
|
4
|
+
data.tar.gz: 95e533b637628ccd13dcbfbca702b2bd210b5605
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MDRjOTdiYmE0ODliYzY4NDhkNjMwMWUyNzM4ZmRmNzMyNmU2YTlmNWMzYjE4
|
11
|
-
NDYzZTkwOWY2YjhhMjI1ODlmODMzZWJhZjgwYTE1ZTgwNzI3N2Q=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NjM0MzczY2Q5YjNhMTZkNzYyY2IzYjEzNjlkM2M5OTNkNWI4NTJkZmE4NmU4
|
14
|
-
MzYzNjUyNWU2NDg5NTI0NjFlM2UyMGUwZDQ0OGU4NmViMzk5OTczMjkxMDA1
|
15
|
-
ZjQ4ZGFiNThlMDdhOWUxZGZkNzE5MzgyZjg3OTg1NjZjZWU5ZDk=
|
6
|
+
metadata.gz: 6869340ee67affff0b03f571933e7a974bd4f8e175a64a376d859cd9d5678335fe7de31c8548e82472b205110df91b70594927ae4a9276f7e8b26602245659a0
|
7
|
+
data.tar.gz: 7e2e6c202c7185eaa8eb7ae8c96daa9b19d5fe060765286782962edee818bbb8bde40419b989a2a9836ec7abe16775627f65955ff557cf6c98bc7522a639860a
|
data/.travis.yml
CHANGED
@@ -6,15 +6,8 @@ matrix:
|
|
6
6
|
allow_failures:
|
7
7
|
- rvm: rbx-19mode
|
8
8
|
|
9
|
-
services:
|
10
|
-
- redis
|
11
|
-
|
12
9
|
script:
|
13
|
-
- bundle exec
|
14
|
-
|
15
|
-
# addons:
|
16
|
-
# code_climate:
|
17
|
-
# repo_token: f0884115cadbe82b33756e38a9cd32d5129304746a17126d6c7da02e7a69910a
|
10
|
+
- CODECLIMATE_REPO_TOKEN=09bd983baf4d0c64d97c20a68baecde00cefb3db009a88792f23e3ce5eadf69a bundle exec rspec
|
18
11
|
|
19
12
|
notifications:
|
20
13
|
email:
|
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# Carousel
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.org/jGRUBBS/carousel-ruby-api.svg
|
4
|
-
[![Code Climate](https://codeclimate.com/github/jGRUBBS/carousel-ruby-api.
|
3
|
+
[![Build Status](https://travis-ci.org/jGRUBBS/carousel-ruby-api.svg)](https://travis-ci.org/jGRUBBS/carousel-ruby-api)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/jGRUBBS/carousel-ruby-api/badges/gpa.svg)](https://codeclimate.com/github/jGRUBBS/carousel-ruby-api)
|
5
|
+
[![Test Coverage](https://codeclimate.com/github/jGRUBBS/carousel-ruby-api/badges/coverage.svg)](https://codeclimate.com/github/jGRUBBS/carousel-ruby-api)
|
5
6
|
|
6
7
|
Ruby library for interfacing with the Carousel Fulfillment API
|
7
8
|
|
data/carousel.gemspec
CHANGED
@@ -19,8 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.add_dependency "builder"
|
20
20
|
spec.add_dependency "xml-simple"
|
21
21
|
|
22
|
-
spec.add_development_dependency "bundler", "~> 1.
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
23
23
|
spec.add_development_dependency "rake"
|
24
24
|
spec.add_development_dependency "rspec"
|
25
|
-
spec.add_development_dependency "
|
25
|
+
spec.add_development_dependency "webmock"
|
26
|
+
spec.add_development_dependency "hashie"
|
27
|
+
spec.add_development_dependency "codeclimate-test-reporter"
|
26
28
|
end
|
data/lib/carousel/client.rb
CHANGED
@@ -11,7 +11,7 @@ module Carousel
|
|
11
11
|
PORT = 443
|
12
12
|
KEYS_MAP = { "stockid" => "upc" }
|
13
13
|
|
14
|
-
attr_accessor :username, :password, :response, :type, :request_uri, :path
|
14
|
+
attr_accessor :username, :password, :options, :response, :type, :request_uri, :path
|
15
15
|
|
16
16
|
def initialize(username, password, options = {})
|
17
17
|
raise "Username is required" unless username
|
@@ -30,7 +30,16 @@ module Carousel
|
|
30
30
|
def get_inventory
|
31
31
|
request = Inventory.new(self).build_inventory_request
|
32
32
|
@path = build_path(Inventory::PATH)
|
33
|
-
|
33
|
+
inventory_response(request)
|
34
|
+
end
|
35
|
+
|
36
|
+
# gets the raw inventory response from the provider
|
37
|
+
# then converts provider specific language to match
|
38
|
+
# a uniform API, stored on @response, and returns
|
39
|
+
def inventory_response(request)
|
40
|
+
response = post(request)
|
41
|
+
response.response = map_results(response.response['stock'])
|
42
|
+
response
|
34
43
|
end
|
35
44
|
|
36
45
|
def order_request(order)
|
data/lib/carousel/order.rb
CHANGED
@@ -13,7 +13,7 @@ module Carousel
|
|
13
13
|
xml.customerref order[:number]
|
14
14
|
xml.ordernumber order[:number]
|
15
15
|
xml.shippingmethod Shipping.map(order[:shipping_method])
|
16
|
-
xml.giftnote order[:gift_message]
|
16
|
+
xml.giftnote order[:gift_message] unless order[:gift_message].nil?
|
17
17
|
|
18
18
|
build_address xml, order[:shipping_address], :shipping
|
19
19
|
build_address xml, order[:billing_address], :billing
|
data/lib/carousel/response.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Carousel
|
2
2
|
class Response
|
3
3
|
|
4
|
-
attr_accessor :response
|
4
|
+
attr_accessor :response, :raw_response
|
5
5
|
|
6
6
|
def initialize(raw_response, type)
|
7
7
|
@raw_response = raw_response
|
@@ -14,14 +14,26 @@ module Carousel
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def success?
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
status == "OK"
|
18
|
+
end
|
19
|
+
|
20
|
+
def status
|
21
|
+
if @kind == "stock"
|
22
|
+
@response.first["status"]
|
23
|
+
else
|
24
|
+
@response[@kind][0]["status"][0]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def message
|
29
|
+
@response["order"][0]["details"][0]
|
20
30
|
end
|
21
31
|
|
22
32
|
def parse_response(xml_response)
|
23
|
-
return nil if xml_response.
|
24
|
-
XmlSimple.xml_in(xml_response)
|
33
|
+
return nil if xml_response.nil?
|
34
|
+
parsed = XmlSimple.xml_in(xml_response)
|
35
|
+
@kind = parsed.first[0]
|
36
|
+
parsed
|
25
37
|
end
|
26
38
|
|
27
39
|
end
|
data/lib/carousel/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<stocklines>
|
3
|
+
<stock>
|
4
|
+
<stockid>1000000003642</stockid>
|
5
|
+
<qty>3</qty>
|
6
|
+
<status>OK</status>
|
7
|
+
<details/>
|
8
|
+
</stock>
|
9
|
+
<stock>
|
10
|
+
<stockid>1000000003659</stockid>
|
11
|
+
<qty>2</qty>
|
12
|
+
<status>OK</status>
|
13
|
+
<details/>
|
14
|
+
</stock>
|
15
|
+
<stock>
|
16
|
+
<stockid>1000000003666</stockid>
|
17
|
+
<qty>2</qty>
|
18
|
+
<status>OK</status>
|
19
|
+
<details/>
|
20
|
+
</stock>
|
21
|
+
</stocklines>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<name>Stephen Jones</name>
|
3
|
+
<addressline1>23 Victoria Street</addressline1>
|
4
|
+
<addressline2></addressline2>
|
5
|
+
<towncity>Windsor</towncity>
|
6
|
+
<postcode>SL4 1HE</postcode>
|
7
|
+
<country>UK</country>
|
8
|
+
<contactphone>0123 336 6676</contactphone>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<orders>
|
3
|
+
<order>
|
4
|
+
<user>the_username</user>
|
5
|
+
<password>the_password</password>
|
6
|
+
<customerref>123456</customerref>
|
7
|
+
<ordernumber>123456</ordernumber>
|
8
|
+
<shippingmethod>ECONOMY</shippingmethod>
|
9
|
+
<name>Stephen Jones</name>
|
10
|
+
<addressline1>23 Victoria Street</addressline1>
|
11
|
+
<addressline2></addressline2>
|
12
|
+
<towncity>Windsor</towncity>
|
13
|
+
<postcode>SL4 1HE</postcode>
|
14
|
+
<country>UK</country>
|
15
|
+
<contactphone>0123 336 6676</contactphone>
|
16
|
+
<invname>Stephen Jones</invname>
|
17
|
+
<invaddressline1>23 Victoria Street</invaddressline1>
|
18
|
+
<invaddressline2></invaddressline2>
|
19
|
+
<invtowncity>Windsor</invtowncity>
|
20
|
+
<invpostcode>SL4 1HE</invpostcode>
|
21
|
+
<invcountry>UK</invcountry>
|
22
|
+
<invcontactphone>0123 336 6676</invcontactphone>
|
23
|
+
<orderline number="123456">
|
24
|
+
<ordernumber>123456</ordernumber>
|
25
|
+
<sku>100083</sku>
|
26
|
+
<qty>2</qty>
|
27
|
+
</orderline>
|
28
|
+
</order>
|
29
|
+
</orders>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<invname>Stephen Jones</invname>
|
3
|
+
<invaddressline1>23 Victoria Street</invaddressline1>
|
4
|
+
<invaddressline2></invaddressline2>
|
5
|
+
<invtowncity>Windsor</invtowncity>
|
6
|
+
<invpostcode>SL4 1HE</invpostcode>
|
7
|
+
<invcountry>UK</invcountry>
|
8
|
+
<invcontactphone>0123 336 6676</invcontactphone>
|
data/spec/lib/client_spec.rb
CHANGED
@@ -1,94 +1,290 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Carousel::Client do
|
4
|
-
|
5
|
-
|
4
|
+
|
5
|
+
let(:username) { "the_username" }
|
6
|
+
let(:password) { "the_password" }
|
7
|
+
let(:options) { { verbose: true, test_mode: true } }
|
8
|
+
let(:client) { Carousel::Client.new(username, password, options) }
|
9
|
+
|
10
|
+
describe '#initialize' do
|
11
|
+
it 'sets the @username, @password and @options' do
|
12
|
+
expect(client.username).to eq(username)
|
13
|
+
expect(client.password).to eq(password)
|
14
|
+
expect(client.options).to eq(options)
|
15
|
+
end
|
6
16
|
end
|
7
17
|
|
8
18
|
describe '#send_order_request' do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
19
|
+
|
20
|
+
let(:success_response) { read_xml(:success_order_response) }
|
21
|
+
let(:error_response) { read_xml(:error_order_response) }
|
22
|
+
let(:response) { client.send_order_request(order_hash) }
|
23
|
+
|
24
|
+
it 'parses a success response' do
|
25
|
+
stub_post("action=order").to_return(body: success_response)
|
26
|
+
expect(response.success?).to eq(true)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'parses an error response' do
|
30
|
+
stub_post("action=order").to_return(body: error_response)
|
31
|
+
expect(response.success?).to eq(false)
|
32
|
+
expect(response.message).to eq('Bad postcode')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'inventory methods' do
|
37
|
+
|
38
|
+
let(:success_response) { read_xml(:success_inventory_response) }
|
39
|
+
let(:response) { client.get_inventory }
|
40
|
+
let(:expected_upcs) { ['1000000003642', '1000000003659', '1000000003666'] }
|
41
|
+
let(:expected_qtys) { ['3', '2', '2'] }
|
42
|
+
let(:raw_xml) { read_xml(:inventory_request) }
|
43
|
+
|
44
|
+
before do
|
45
|
+
stub_post("action=stocklines").with(body: raw_xml, headers: xml_headers)
|
46
|
+
.to_return(body: success_response)
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#get_inventory' do
|
50
|
+
|
51
|
+
it 'parses success response and maps results to simple array of stock hashes' do
|
52
|
+
expect(response.response.collect{ |s| s["upc"] }).to eq(expected_upcs)
|
53
|
+
expect(response.response.collect{ |s| s["qty"] }).to eq(expected_qtys)
|
54
|
+
expect(response.success?).to eq(true)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#inventory_response' do
|
59
|
+
|
60
|
+
it 'gets the raw inventory response from the provider' do
|
61
|
+
expect(response.raw_response).to eq(success_response)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'converts provider specific language to match a uniform API' do
|
65
|
+
original_response = client.send(:parse_response, success_response).response["stock"]
|
66
|
+
expect(original_response.first.keys).to include('stockid')
|
67
|
+
expect(response.response.first.keys).to include('upc')
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'returns a response' do
|
71
|
+
expect(response).to be_a(Carousel::Response)
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '#order_request' do
|
79
|
+
it 'sets the path instance variable' do
|
80
|
+
client.order_request(order_hash)
|
81
|
+
expect(client.instance_variable_get(:@path)).to eq("/carouselwms/default.asp?action=order")
|
82
|
+
end
|
83
|
+
it 'returns a built request for Order' do
|
84
|
+
order_xml = read_xml(:test_order)
|
85
|
+
expect(client.order_request(order_hash)).to eq(order_xml)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#build_path' do
|
90
|
+
it 'builds and returns the uri path' do
|
91
|
+
expect(client).to receive(:env_path).and_return("carouselwms")
|
92
|
+
expect(client.build_path("?action=stocklines")).to eq("/carouselwms/default.asp?action=stocklines")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#upcs' do
|
97
|
+
it 'returns an array of the collected upcs' do
|
98
|
+
inventory = [{"upc" => "123"}, {"upc" => "123456"}]
|
99
|
+
expect(client.upcs(inventory)).to eq(["123", "123456"])
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '#mapped_inventory' do
|
104
|
+
it 'converts provider specific terms into a uniform API' do
|
105
|
+
inventory = [{"upc" => "123", "qty" => "3"}, {"upc" => "123456", "qty" => "0"}]
|
106
|
+
upcs = ["123"]
|
107
|
+
expect(client.mapped_inventory(upcs, inventory)).to eq([{quantity: 3}])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe '#request_uri' do
|
112
|
+
it 'returns the request uri based on host and path' do
|
113
|
+
client.path = "?action=stocklines"
|
114
|
+
expect(client.request_uri).to eq("https://web.carousel.eu?action=stocklines")
|
13
115
|
end
|
14
116
|
end
|
15
117
|
|
16
118
|
describe 'private#default_options' do
|
17
|
-
it '
|
18
|
-
|
119
|
+
it 'returns the default options for a Client' do
|
120
|
+
default_options = {
|
121
|
+
verbose: true,
|
122
|
+
test_mode: false
|
123
|
+
}
|
124
|
+
expect(client.send(:default_options)).to eq(default_options)
|
19
125
|
end
|
20
126
|
end
|
21
127
|
|
22
128
|
describe 'private#testing?' do
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
129
|
+
context 'not in testing mode' do
|
130
|
+
it 'returns false' do
|
131
|
+
client.options[:test_mode] = false
|
132
|
+
expect(client.send(:testing?)).to eq(false)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
context 'in testing mode' do
|
136
|
+
it 'returns true' do
|
137
|
+
expect(client.send(:testing?)).to eq(true)
|
138
|
+
end
|
27
139
|
end
|
28
140
|
end
|
29
141
|
|
30
142
|
describe 'private#verbose?' do
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
143
|
+
context 'not in verbose mode' do
|
144
|
+
it 'returns false' do
|
145
|
+
client.options[:verbose] = false
|
146
|
+
expect(client.send(:verbose?)).to eq(false)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
context 'in verbose mode' do
|
150
|
+
it 'returns true' do
|
151
|
+
expect(client.send(:verbose?)).to eq(true)
|
152
|
+
end
|
35
153
|
end
|
36
154
|
end
|
37
155
|
|
38
|
-
describe 'private#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
156
|
+
describe 'private#env_path' do
|
157
|
+
context 'not in testing mode' do
|
158
|
+
it 'returns the LIVE_PATH' do
|
159
|
+
client.options[:test_mode] = false
|
160
|
+
expect(client.send(:env_path)).to eq(Carousel::Client::LIVE_PATH)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
context 'in testing mode' do
|
164
|
+
it 'returns TEST_PATH' do
|
165
|
+
expect(client.send(:env_path)).to eq(Carousel::Client::TEST_PATH)
|
166
|
+
end
|
44
167
|
end
|
45
168
|
end
|
46
169
|
|
47
|
-
describe 'private#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
170
|
+
describe 'private#host' do
|
171
|
+
context 'not in testing mode' do
|
172
|
+
it 'returns the LIVE_PATH' do
|
173
|
+
client.options[:test_mode] = false
|
174
|
+
expect(client.send(:host)).to eq(Carousel::Client::LIVE_HOST)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
context 'in testing mode' do
|
178
|
+
it 'returns TEST_PATH' do
|
179
|
+
expect(client.send(:host)).to eq(Carousel::Client::TEST_HOST)
|
180
|
+
end
|
53
181
|
end
|
54
182
|
end
|
55
183
|
|
56
184
|
describe 'private#log' do
|
185
|
+
before do
|
186
|
+
@message = "test"
|
187
|
+
end
|
57
188
|
context 'not in verbose mode' do
|
58
|
-
it '
|
59
|
-
|
60
|
-
@client.should_not_receive(:puts)
|
61
|
-
@client.send(:log, "message")
|
189
|
+
it 'returns nil' do
|
190
|
+
expect(client.send(:log, @message)).to eq(nil)
|
62
191
|
end
|
63
192
|
end
|
64
193
|
context 'in verbose mode' do
|
65
|
-
it '
|
66
|
-
|
67
|
-
|
68
|
-
|
194
|
+
it 'logs the message to STDOUT' do
|
195
|
+
client.options[:verbose] = true
|
196
|
+
output = capture_stdout { client.send(:log, @message) }
|
197
|
+
expect(output).to eq("test\n")
|
69
198
|
end
|
70
199
|
end
|
71
200
|
end
|
72
201
|
|
202
|
+
describe 'private#http' do
|
203
|
+
it 'returns an instance of Net::HTTP' do
|
204
|
+
http = client.send(:http)
|
205
|
+
host = client.send(:host)
|
206
|
+
expect(http).to be_an_instance_of(Net::HTTP)
|
207
|
+
expect(http.address).to eq(host)
|
208
|
+
expect(http.port).to eq(Carousel::Client::PORT)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe 'private#request' do
|
213
|
+
|
214
|
+
let(:success_response) { read_xml(:success_inventory_response) }
|
215
|
+
let(:request) { read_xml(:inventory_request) }
|
216
|
+
|
217
|
+
it 'sets the ssl and verify mode, sends an http request, and returns a response object' do
|
218
|
+
client.path = "?action=stocklines"
|
219
|
+
expect(client.send(:http)).to receive(:request).and_return(success_response)
|
220
|
+
expect(client.send(:request, request)).to eq(success_response)
|
221
|
+
expect(client.send(:http).use_ssl?).to be(true)
|
222
|
+
expect(client.send(:http).verify_mode).to eq(OpenSSL::SSL::VERIFY_NONE)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
73
226
|
describe 'private#post' do
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
227
|
+
let(:request) { read_xml(:inventory_request) }
|
228
|
+
let(:response) { read_xml(:success_inventory_response) }
|
229
|
+
|
230
|
+
before do
|
231
|
+
client.path = "?action=stocklines"
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'sends a post request' do
|
235
|
+
expect(client).to receive(:request).and_return(fake_response)
|
236
|
+
client.send(:post, request)
|
237
|
+
end
|
238
|
+
it 'parses response into a Carousel::Response object' do
|
239
|
+
expect(client).to receive(:request).and_return(fake_response)
|
240
|
+
expect(client.send(:post, request)).to be_a(Carousel::Response)
|
83
241
|
end
|
84
242
|
end
|
85
243
|
|
86
244
|
describe 'private#parse_response' do
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
245
|
+
let(:response) { read_xml(:success_inventory_response) }
|
246
|
+
|
247
|
+
it 'logs the response' do
|
248
|
+
client.options[:verbose] = true
|
249
|
+
expect(client).to receive(:log).with(response)
|
250
|
+
client.send(:parse_response, response)
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'parses response into a Carousel::Response object' do
|
254
|
+
expect(client.send(:parse_response, response)).to be_a(Carousel::Response)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
describe 'private#map_results' do
|
259
|
+
it 'flattens the results and maps them' do
|
260
|
+
results = [{test: [1,2,3]}, {example: [2,3,4]}, {test: [1,2,3], stockid: [5,6,7,8]}]
|
261
|
+
expected_result = [{test: 1}, {example: 2}, {test: 1, stockid: 5}]
|
262
|
+
|
263
|
+
expect(client).to receive(:flatten_results).and_return(expected_result)
|
264
|
+
expect(client.send(:map_results, results)).to eq(expected_result)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
describe 'private#flatten_results' do
|
269
|
+
it 'sets the value for each hash key to the first item in the value array' do
|
270
|
+
results = [{test: [1,2,3]}, {example: [2,3,4]}, {test: [1,2,3], example: [5,6,7,8]}]
|
271
|
+
expected_result = [{test: 1}, {example: 2}, {test: 1, example: 5}]
|
272
|
+
expect(client.send(:flatten_results, results)).to eq(expected_result)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
describe 'private#map_keys' do
|
277
|
+
context 'with a key in the KEYS_MAP' do
|
278
|
+
it 'returns the value for the given key' do
|
279
|
+
key = "stockid"
|
280
|
+
expect(client.send(:map_keys, key)).to eq(Carousel::Client::KEYS_MAP[key])
|
281
|
+
end
|
282
|
+
end
|
283
|
+
context 'without a key in the KEYS_MAP' do
|
284
|
+
it 'returns the key' do
|
285
|
+
key = "test"
|
286
|
+
expect(client.send(:map_keys, key)).to eq(key)
|
287
|
+
end
|
92
288
|
end
|
93
289
|
end
|
94
290
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Carousel::Country do
|
4
|
+
|
5
|
+
|
6
|
+
describe '.map' do
|
7
|
+
context 'with the code in the COUNTRY_MAP' do
|
8
|
+
it 'returns the value for the given code' do
|
9
|
+
expect(Carousel::Country.map("US")).to eq("US")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
context 'without the code in the COUNTRY_MAP' do
|
13
|
+
it 'returns the given code' do
|
14
|
+
expect(Carousel::Country.map("AAA")).to eq("AAA")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Carousel::Inventory do
|
4
|
+
|
5
|
+
let(:client) { Carousel::Client.new("the_username", "the_password") }
|
6
|
+
let(:inventory_request) { Carousel::Inventory.new(client) }
|
7
|
+
|
8
|
+
describe '#build_inventory_request' do
|
9
|
+
it 'constructs xml for the user' do
|
10
|
+
expect(inventory_request.build_inventory_request).to eq(read_xml(:inventory_request))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|