asin 1.1.2 → 2.0.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.irbrc +12 -0
- data/.rspec +1 -0
- data/.travis.yml +2 -3
- data/CHANGELOG.md +8 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +72 -17
- data/README.md +33 -38
- data/asin.gemspec +1 -1
- data/lib/asin.rb +4 -7
- data/lib/asin/adapter.rb +222 -0
- data/lib/asin/client.rb +21 -135
- data/lib/asin/configuration.rb +1 -7
- data/lib/asin/version.rb +1 -1
- data/spec/cassettes/asin/lookup_and_search_should_have_metadata.yml +1 -1
- data/spec/lib/browse_node_spec.rb +3 -3
- data/spec/lib/cart_spec.rb +13 -106
- data/spec/lib/config_spec.rb +11 -11
- data/spec/lib/search_spec.rb +53 -42
- data/spec/lib/similarity_spec.rb +4 -4
- data/spec/spec_helper.rb +5 -1
- metadata +20 -21
- data/lib/asin/simple_cart.rb +0 -54
- data/lib/asin/simple_item.rb +0 -44
- data/lib/asin/simple_node.rb +0 -44
data/lib/asin/client.rb
CHANGED
@@ -1,105 +1,10 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
require 'httpi'
|
3
|
-
require 'rexml/document'
|
2
|
+
require 'rexml/document' # https://github.com/phoet/asin/pull/23
|
4
3
|
require 'crack/xml'
|
5
4
|
require 'cgi'
|
6
5
|
require 'base64'
|
6
|
+
require 'rash'
|
7
7
|
|
8
|
-
# ASIN (Amazon Simple INterface) is a gem for easy access of the Amazon E-Commerce-API.
|
9
|
-
# It is simple to configure and use. Since it's very small and flexible, it is easy to extend it to your needs.
|
10
|
-
#
|
11
|
-
# Author:: Peter Schröder (mailto:phoetmail@googlemail.com)
|
12
|
-
#
|
13
|
-
# == Usage
|
14
|
-
#
|
15
|
-
# The ASIN module is designed as a mixin.
|
16
|
-
#
|
17
|
-
# require 'asin'
|
18
|
-
# include ASIN::Client
|
19
|
-
#
|
20
|
-
# In order to use the Amazon API properly, you need to be a registered user (http://aws.amazon.com).
|
21
|
-
#
|
22
|
-
# The registration process will give you a +secret-key+ and an +access-key+ (AWSAccessKeyId).
|
23
|
-
# Since the latest updates to the service you will need an +associate-tag+.
|
24
|
-
#
|
25
|
-
# Both are needed to use ASIN (see Configuration for more details):
|
26
|
-
#
|
27
|
-
# configure :secret => 'your-secret', :key => 'your-key', :associate_tag => 'your-associate_tag'
|
28
|
-
#
|
29
|
-
# == Search
|
30
|
-
#
|
31
|
-
# After configuring your environment you can call the +lookup+ method to retrieve an +SimpleItem+ via the
|
32
|
-
# Amazon Standard Identification Number (ASIN):
|
33
|
-
#
|
34
|
-
# item = lookup '1430218150'
|
35
|
-
# item.first.title
|
36
|
-
# => "Learn Objective-C on the Mac (Learn Series)"
|
37
|
-
#
|
38
|
-
# OR search with fulltext/ASIN/ISBN
|
39
|
-
#
|
40
|
-
# items = search 'Learn Objective-C'
|
41
|
-
# items.first.title
|
42
|
-
# => "Learn Objective-C on the Mac (Learn Series)"
|
43
|
-
#
|
44
|
-
# The +SimpleItem+ uses a Hashie::Mash as its internal data representation and you can get fetched data from it:
|
45
|
-
#
|
46
|
-
# item.raw.ItemAttributes.ListPrice.FormattedPrice
|
47
|
-
# => "$39.99"
|
48
|
-
#
|
49
|
-
# == Further Configuration
|
50
|
-
#
|
51
|
-
# If you need more controll over the request that is sent to the
|
52
|
-
# Amazon API (http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html),
|
53
|
-
# you can override some defaults or add additional query-parameters to the REST calls:
|
54
|
-
#
|
55
|
-
# configure :host => 'webservices.amazon.de'
|
56
|
-
# lookup(asin, :ResponseGroup => :Medium)
|
57
|
-
#
|
58
|
-
# == Cart
|
59
|
-
#
|
60
|
-
# ASIN helps with AWS cart-operations.
|
61
|
-
# It currently supports the CartCreate, CartGet, CartAdd, CartModify and CartClear operations:
|
62
|
-
#
|
63
|
-
# cart = create_cart({:asin => '1430218150', :quantity => 1})
|
64
|
-
# cart.valid?
|
65
|
-
# cart.items
|
66
|
-
# => true
|
67
|
-
# => [<#Hashie::Mash ASIN="1430218150" CartItemId="U3G241HVLLB8N6" ... >]
|
68
|
-
#
|
69
|
-
# cart = get_cart('176-9182855-2326919', 'KgeVCA0YJTbuN/7Ibakrk/KnHWA=')
|
70
|
-
# cart.empty?
|
71
|
-
# => false
|
72
|
-
#
|
73
|
-
# cart = clear_cart(cart)
|
74
|
-
# cart.empty?
|
75
|
-
# => true
|
76
|
-
#
|
77
|
-
# cart = add_items(cart, {:asin => '1430216263', :quantity => 2})
|
78
|
-
# cart.empty?
|
79
|
-
# => false
|
80
|
-
#
|
81
|
-
# cart = update_items(cart, {:cart_item_id => cart.items.first.CartItemId, :action => :SaveForLater}, {:cart_item_id => cart.items.first.CartItemId, :quantity => 7})
|
82
|
-
# cart.valid?
|
83
|
-
# cart.saved_items
|
84
|
-
# => true
|
85
|
-
# => [<#Hashie::Mash ASIN="1430218150" CartItemId="U3G241HVLLB8N6" ... >]
|
86
|
-
#
|
87
|
-
# == Nodes
|
88
|
-
#
|
89
|
-
# In order to browse Amazon nodes, you can use +browse_node+ method:
|
90
|
-
#
|
91
|
-
# node = browse_node('163357')
|
92
|
-
# node.node_id
|
93
|
-
# => '163357'
|
94
|
-
# node.name
|
95
|
-
# => 'Comedy'
|
96
|
-
# node.children
|
97
|
-
# node.ancestors
|
98
|
-
#
|
99
|
-
# you can configure the +:ResponseGroup+ option to your needs:
|
100
|
-
#
|
101
|
-
# node = browse_node('163357', :ResponseGroup => :TopSellers)
|
102
|
-
#
|
103
8
|
module ASIN
|
104
9
|
module Client
|
105
10
|
|
@@ -130,16 +35,10 @@ module ASIN
|
|
130
35
|
|
131
36
|
# Performs an +ItemLookup+ REST call against the Amazon API.
|
132
37
|
#
|
133
|
-
# Expects an arbitrary number of ASIN (Amazon Standard Identification Number) and returns an array of
|
38
|
+
# Expects an arbitrary number of ASIN (Amazon Standard Identification Number) and returns an array of item:
|
134
39
|
#
|
135
40
|
# item = lookup '1430218150'
|
136
|
-
# item.title
|
137
|
-
# => "Learn Objective-C on the Mac (Learn Series)"
|
138
41
|
# items = lookup ['1430218150', '0439023521']
|
139
|
-
# items[0].title
|
140
|
-
# => "Learn Objective-C on the Mac (Learn Series)"
|
141
|
-
# items[1].title
|
142
|
-
# => "The Hunger Games"
|
143
42
|
#
|
144
43
|
# ==== Options:
|
145
44
|
#
|
@@ -154,16 +53,14 @@ module ASIN
|
|
154
53
|
def lookup(*asins)
|
155
54
|
params = asins.last.is_a?(Hash) ? asins.pop : {:ResponseGroup => :Medium}
|
156
55
|
response = call(params.merge(:Operation => :ItemLookup, :ItemId => asins.join(',')))
|
157
|
-
arrayfy(response['ItemLookupResponse']['Items']['Item']).map {|item|
|
56
|
+
arrayfy(response['ItemLookupResponse']['Items']['Item']).map {|item| handle_type(item, :item)}
|
158
57
|
end
|
159
58
|
|
160
59
|
# Performs an +ItemSearch+ REST call against the Amazon API.
|
161
60
|
#
|
162
|
-
# Expects a search-string which can be an arbitrary array of strings (ASINs f.e.) and returns a list of
|
61
|
+
# Expects a search-string which can be an arbitrary array of strings (ASINs f.e.) and returns a list of items:
|
163
62
|
#
|
164
63
|
# items = search_keywords 'Learn', 'Objective-C'
|
165
|
-
# items.first.title
|
166
|
-
# => "Learn Objective-C on the Mac (Learn Series)"
|
167
64
|
#
|
168
65
|
# ==== Options:
|
169
66
|
#
|
@@ -176,12 +73,12 @@ module ASIN
|
|
176
73
|
def search_keywords(*keywords)
|
177
74
|
params = keywords.last.is_a?(Hash) ? keywords.pop : {:SearchIndex => :Books, :ResponseGroup => :Medium}
|
178
75
|
response = call(params.merge(:Operation => :ItemSearch, :Keywords => keywords.join(' ')))
|
179
|
-
arrayfy(response['ItemSearchResponse']['Items']['Item']).map {|item|
|
76
|
+
arrayfy(response['ItemSearchResponse']['Items']['Item']).map {|item| handle_type(item, :item)}
|
180
77
|
end
|
181
78
|
|
182
79
|
# Performs an +ItemSearch+ REST call against the Amazon API.
|
183
80
|
#
|
184
|
-
# Expects a Hash of search params and returns a list of
|
81
|
+
# Expects a Hash of search params and returns a list of items:
|
185
82
|
#
|
186
83
|
# items = search :SearchIndex => :Music
|
187
84
|
#
|
@@ -195,31 +92,31 @@ module ASIN
|
|
195
92
|
#
|
196
93
|
def search(params={:SearchIndex => :Books, :ResponseGroup => :Medium})
|
197
94
|
response = call(params.merge(:Operation => :ItemSearch))
|
198
|
-
arrayfy(response['ItemSearchResponse']['Items']['Item']).map {|item|
|
95
|
+
arrayfy(response['ItemSearchResponse']['Items']['Item']).map {|item| handle_type(item, :item)}
|
199
96
|
end
|
200
97
|
|
201
98
|
# Performs an +BrowseNodeLookup+ REST call against the Amazon API.
|
202
99
|
#
|
203
|
-
# Expects a node-id and returns a
|
100
|
+
# Expects a node-id and returns a node:
|
204
101
|
#
|
205
|
-
# node = browse_node '
|
102
|
+
# node = browse_node '17'
|
206
103
|
#
|
207
104
|
# ==== Options:
|
208
105
|
#
|
209
106
|
# Additional parameters for the API call like this:
|
210
107
|
#
|
211
|
-
# browse_node('
|
108
|
+
# browse_node('17', :ResponseGroup => :TopSellers)
|
212
109
|
#
|
213
110
|
# Have a look at the different browse node values on the Amazon-Documentation[http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html]
|
214
111
|
#
|
215
112
|
def browse_node(node_id, params={:ResponseGroup => :BrowseNodeInfo})
|
216
113
|
response = call(params.merge(:Operation => :BrowseNodeLookup, :BrowseNodeId => node_id))
|
217
|
-
arrayfy(response['BrowseNodeLookupResponse']['BrowseNodes']['BrowseNode']).map {|item| handle_type(item,
|
114
|
+
arrayfy(response['BrowseNodeLookupResponse']['BrowseNodes']['BrowseNode']).map {|item| handle_type(item, :node)}
|
218
115
|
end
|
219
116
|
|
220
117
|
# Performs an +SimilarityLookup+ REST call against the Amazon API.
|
221
118
|
#
|
222
|
-
# Expects one ore more asins and returns a list of
|
119
|
+
# Expects one ore more asins and returns a list of nodes:
|
223
120
|
#
|
224
121
|
# items = similar '1430218150'
|
225
122
|
#
|
@@ -234,12 +131,12 @@ module ASIN
|
|
234
131
|
def similar(*asins)
|
235
132
|
params = asins.last.is_a?(Hash) ? asins.pop : {:SimilarityType => :Random, :ResponseGroup => :Medium}
|
236
133
|
response = call(params.merge(:Operation => :SimilarityLookup, :ItemId => asins.join(',')))
|
237
|
-
arrayfy(response['SimilarityLookupResponse']['Items']['Item']).map {|item|
|
134
|
+
arrayfy(response['SimilarityLookupResponse']['Items']['Item']).map {|item| handle_type(item, :item)}
|
238
135
|
end
|
239
136
|
|
240
137
|
# Performs an +CartCreate+ REST call against the Amazon API.
|
241
138
|
#
|
242
|
-
# Expects one ore more item-hashes and returns a
|
139
|
+
# Expects one ore more item-hashes and returns a cart:
|
243
140
|
#
|
244
141
|
# cart = create_cart({:asin => '1430218150', :quantity => 1})
|
245
142
|
#
|
@@ -257,7 +154,7 @@ module ASIN
|
|
257
154
|
|
258
155
|
# Performs an +CartGet+ REST call against the Amazon API.
|
259
156
|
#
|
260
|
-
# Expects the CartId and the HMAC to identify the returning
|
157
|
+
# Expects the CartId and the HMAC to identify the returning cart:
|
261
158
|
#
|
262
159
|
# cart = get_cart('176-9182855-2326919', 'KgeVCA0YJTbuN/7Ibakrk/KnHWA=')
|
263
160
|
#
|
@@ -267,7 +164,7 @@ module ASIN
|
|
267
164
|
|
268
165
|
# Performs an +CartAdd+ REST call against the Amazon API.
|
269
166
|
#
|
270
|
-
# Expects a
|
167
|
+
# Expects a cart created with +create_cart+ and one ore more Item-Hashes and returns an updated cart:
|
271
168
|
#
|
272
169
|
# cart = add_items(cart, {:asin => '1430216263', :quantity => 2})
|
273
170
|
#
|
@@ -285,7 +182,7 @@ module ASIN
|
|
285
182
|
|
286
183
|
# Performs an +CartModify+ REST call against the Amazon API.
|
287
184
|
#
|
288
|
-
# Expects a
|
185
|
+
# Expects a cart created with +create_cart+ and one ore more Item-Hashes to modify and returns an updated cart:
|
289
186
|
#
|
290
187
|
# cart = update_items(cart, {:cart_item_id => cart.items.first.CartItemId, :quantity => 7})
|
291
188
|
#
|
@@ -303,7 +200,7 @@ module ASIN
|
|
303
200
|
|
304
201
|
# Performs an +CartClear+ REST call against the Amazon API.
|
305
202
|
#
|
306
|
-
# Expects a
|
203
|
+
# Expects a cart created with +create_cart+ and returns an empty cart:
|
307
204
|
#
|
308
205
|
# cart = clear_cart(cart)
|
309
206
|
#
|
@@ -318,19 +215,8 @@ module ASIN
|
|
318
215
|
item.is_a?(Array) ? item : [item]
|
319
216
|
end
|
320
217
|
|
321
|
-
def handle_item(item)
|
322
|
-
handle_type(item, Configuration.item_type)
|
323
|
-
end
|
324
|
-
|
325
218
|
def handle_type(data, type)
|
326
|
-
|
327
|
-
type.new(data)
|
328
|
-
elsif type == :mash
|
329
|
-
require 'hashie'
|
330
|
-
Hashie::Mash.new(data)
|
331
|
-
else
|
332
|
-
data
|
333
|
-
end
|
219
|
+
Hashie::Rash.new(data)
|
334
220
|
end
|
335
221
|
|
336
222
|
def create_item_params(items)
|
@@ -354,7 +240,7 @@ module ASIN
|
|
354
240
|
def cart(operation, params={})
|
355
241
|
response = call(params.merge(:Operation => operation))
|
356
242
|
cart = response["#{operation}Response"]['Cart']
|
357
|
-
handle_type(cart,
|
243
|
+
handle_type(cart, :cart)
|
358
244
|
end
|
359
245
|
|
360
246
|
def call(params)
|
data/lib/asin/configuration.rb
CHANGED
@@ -23,13 +23,10 @@ module ASIN
|
|
23
23
|
# [host] the host, which defaults to 'webservices.amazon.com'
|
24
24
|
# [logger] a different logger than logging to STDERR (nil for no logging)
|
25
25
|
# [version] a custom version of the API calls. Default is 2010-11-01
|
26
|
-
# [item_type] a different class for SimpleItem, use :mash for Hashie::Mash or :raw for a plain hash
|
27
|
-
# [cart_type] a different class for SimpleCart, use :mash for Hashie::Mash or :raw for a plain hash
|
28
|
-
# [node_type] a different class for SimpleNode, use :mash for Hashie::Mash or :raw for a plain hash
|
29
26
|
#
|
30
27
|
class Configuration
|
31
28
|
include Confiture::Configuration
|
32
|
-
confiture_allowed_keys(:secret, :key, :associate_tag, :host, :version, :logger
|
29
|
+
confiture_allowed_keys(:secret, :key, :associate_tag, :host, :version, :logger)
|
33
30
|
confiture_mandatory_keys(:secret, :key, :associate_tag)
|
34
31
|
confiture_defaults({
|
35
32
|
:secret => '',
|
@@ -38,9 +35,6 @@ module ASIN
|
|
38
35
|
:host => 'webservices.amazon.com',
|
39
36
|
:version => '2011-08-01',
|
40
37
|
:logger => Logger.new(STDERR),
|
41
|
-
:item_type => SimpleItem,
|
42
|
-
:cart_type => SimpleCart,
|
43
|
-
:node_type => SimpleNode,
|
44
38
|
})
|
45
39
|
end
|
46
40
|
end
|
data/lib/asin/version.rb
CHANGED
@@ -94,4 +94,4 @@ http_interactions:
|
|
94
94
|
new to programming. </p></Content><IsLinkSuppressed>0</IsLinkSuppressed></EditorialReview></EditorialReviews></Item></Items></ItemLookupResponse>
|
95
95
|
http_version:
|
96
96
|
recorded_at: Tue, 25 Sep 2012 20:04:40 GMT
|
97
|
-
recorded_with: VCR 2.2.5
|
97
|
+
recorded_with: VCR 2.2.5
|
@@ -9,9 +9,9 @@ module ASIN
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should lookup a browse_node", :vcr do
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
item = @helper.browse_node(ANY_BROWSE_NODE_ID).first
|
13
|
+
expect(item.browse_node_id).to eql(ANY_BROWSE_NODE_ID)
|
14
|
+
expect(item.name).to eql('Comedy')
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/spec/lib/cart_spec.rb
CHANGED
@@ -11,13 +11,13 @@ module ASIN
|
|
11
11
|
|
12
12
|
it "should create a cart", :vcr do
|
13
13
|
cart = @helper.create_cart({:asin => ANY_ASIN, :quantity => 1}, {:asin => ANY_OTHER_ASIN, :quantity => 2})
|
14
|
-
cart.valid
|
15
|
-
cart.empty
|
14
|
+
expect(cart.valid?).to be_true
|
15
|
+
expect(cart.empty?).to be_false
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should handle item paramters" do
|
19
19
|
params = @helper.send(:create_item_params, [{:asin => 'any_asin', :quantity => 1}, {:cart_item_id => 'any_cart_item_id', :quantity => 2}, {:offer_listing_id => 'any_offer_listing_id', :quantity => 3},{:cart_item_id => 'any_cart_item_id', :action => :SaveForLater}])
|
20
|
-
params.
|
20
|
+
expect(params).to eql({"Item.0.ASIN"=>"any_asin", "Item.0.Quantity"=>"1", "Item.1.CartItemId"=>"any_cart_item_id", "Item.1.Quantity"=>"2", "Item.2.OfferListingId"=>"any_offer_listing_id", "Item.2.Quantity"=>"3", "Item.3.CartItemId"=>"any_cart_item_id", "Item.3.Action"=>"SaveForLater"})
|
21
21
|
end
|
22
22
|
|
23
23
|
context "with an existing cart" do
|
@@ -25,124 +25,31 @@ module ASIN
|
|
25
25
|
it "should clear a cart", :vcr do
|
26
26
|
@cart = @helper.create_cart({:asin => ANY_ASIN, :quantity => 1})
|
27
27
|
cart = @helper.clear_cart(@cart)
|
28
|
-
cart.valid
|
29
|
-
cart.empty
|
28
|
+
expect(cart.valid?).to be_true
|
29
|
+
expect(cart.empty?).to be_true
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should get a cart", :vcr do
|
33
33
|
@cart = @helper.create_cart({:asin => ANY_ASIN, :quantity => 1})
|
34
34
|
cart = @helper.get_cart(@cart.cart_id, @cart.hmac)
|
35
|
-
cart.valid
|
36
|
-
cart.empty
|
35
|
+
expect(cart.valid?).to be_true
|
36
|
+
expect(cart.empty?).to be_false
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should add items to a cart", :vcr do
|
40
40
|
@cart = @helper.create_cart({:asin => ANY_ASIN, :quantity => 1})
|
41
41
|
cart = @helper.add_items(@cart, {:asin => ANY_OTHER_ASIN, :quantity => 2})
|
42
|
-
cart.valid
|
43
|
-
cart.empty
|
44
|
-
cart.
|
42
|
+
expect(cart.valid?).to be_true
|
43
|
+
expect(cart.empty?).to be_false
|
44
|
+
expect(cart).to have(2).items
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should update a cart", :vcr do
|
48
48
|
@cart = @helper.create_cart({:asin => ANY_ASIN, :quantity => 1})
|
49
|
-
item_id = @cart.items.first.
|
49
|
+
item_id = @cart.items.first.cart_item_id
|
50
50
|
cart = @helper.update_items(@cart, {:cart_item_id => item_id, :action => 'SaveForLater'}, {:cart_item_id => item_id, :quantity => 7})
|
51
|
-
cart.
|
52
|
-
cart.valid
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
context SimpleCart do
|
58
|
-
|
59
|
-
before do
|
60
|
-
@helper.configure :secret => @secret, :key => @key
|
61
|
-
@two_items = {"Request"=>
|
62
|
-
{"IsValid"=>"True",
|
63
|
-
"CartAddRequest"=>
|
64
|
-
{"CartId"=>"186-8702292-9782208",
|
65
|
-
"HMAC"=>"Ck5MXUE+OQiC/Jh8u6NhBf5FbV8=",
|
66
|
-
"Items"=>{"Item"=>{"ASIN"=>"1430216263", "Quantity"=>"2"}}}},
|
67
|
-
"CartId"=>"186-8702292-9782208",
|
68
|
-
"HMAC"=>"Ck5MXUE+OQiC/Jh8u6NhBf5FbV8=",
|
69
|
-
"URLEncodedHMAC"=>"Ck5MXUE%2BOQiC%2FJh8u6NhBf5FbV8%3D",
|
70
|
-
"PurchaseURL"=>
|
71
|
-
"https://www.amazon.com/gp/cart/aws-merge.html?cart-id=186-8702292-9782208%26associate-id=ws%26hmac=Ck5MXUE%2BOQiC/Jh8u6NhBf5FbV8=%26SubscriptionId=AKIAJFA5X7RTOKFNPVZQ%26MergeCart=False",
|
72
|
-
"SubTotal"=>
|
73
|
-
{"Amount"=>"6595", "CurrencyCode"=>"USD", "FormattedPrice"=>"$65.95"},
|
74
|
-
"CartItems"=>
|
75
|
-
{"SubTotal"=>
|
76
|
-
{"Amount"=>"6595", "CurrencyCode"=>"USD", "FormattedPrice"=>"$65.95"},
|
77
|
-
"CartItem"=>
|
78
|
-
[{"CartItemId"=>"U3CFEHHIPJNW3L",
|
79
|
-
"ASIN"=>"1430216263",
|
80
|
-
"MerchantId"=>"ATVPDKIKX0DER",
|
81
|
-
"SellerId"=>"A2R2RITDJNW1Q6",
|
82
|
-
"SellerNickname"=>"Amazon.com",
|
83
|
-
"Quantity"=>"2",
|
84
|
-
"Title"=>"Beginning iPhone Development: Exploring the iPhone SDK",
|
85
|
-
"ProductGroup"=>"Book",
|
86
|
-
"Price"=>
|
87
|
-
{"Amount"=>"1978", "CurrencyCode"=>"USD", "FormattedPrice"=>"$19.78"},
|
88
|
-
"ItemTotal"=>
|
89
|
-
{"Amount"=>"3956", "CurrencyCode"=>"USD", "FormattedPrice"=>"$39.56"}},
|
90
|
-
{"CartItemId"=>"U3G241HVLLB8N6",
|
91
|
-
"ASIN"=>"1430218150",
|
92
|
-
"MerchantId"=>"ATVPDKIKX0DER",
|
93
|
-
"SellerId"=>"A2R2RITDJNW1Q6",
|
94
|
-
"SellerNickname"=>"Amazon.com",
|
95
|
-
"Quantity"=>"1",
|
96
|
-
"Title"=>"Learn Objective-C on the Mac (Learn Series)",
|
97
|
-
"ProductGroup"=>"Book",
|
98
|
-
"Price"=>
|
99
|
-
{"Amount"=>"2639", "CurrencyCode"=>"USD", "FormattedPrice"=>"$26.39"},
|
100
|
-
"ItemTotal"=>
|
101
|
-
{"Amount"=>"2639",
|
102
|
-
"CurrencyCode"=>"USD",
|
103
|
-
"FormattedPrice"=>"$26.39"}}]}}
|
104
|
-
@one_item = {"Request"=>
|
105
|
-
{"IsValid"=>"True",
|
106
|
-
"CartCreateRequest"=>
|
107
|
-
{"Items"=>{"Item"=>{"ASIN"=>"1430218150", "Quantity"=>"1"}}}},
|
108
|
-
"CartId"=>"176-9182855-2326919",
|
109
|
-
"HMAC"=>"KgeVCA0YJTbuN/7Ibakrk/KnHWA=",
|
110
|
-
"URLEncodedHMAC"=>"KgeVCA0YJTbuN%2F7Ibakrk%2FKnHWA%3D",
|
111
|
-
"PurchaseURL"=>
|
112
|
-
"https://www.amazon.com/gp/cart/aws-merge.html?cart-id=176-9182855-2326919%26associate-id=ws%26hmac=KgeVCA0YJTbuN/7Ibakrk/KnHWA=%26SubscriptionId=AKIAJFA5X7RTOKFNPVZQ%26MergeCart=False",
|
113
|
-
"SubTotal"=>
|
114
|
-
{"Amount"=>"2639", "CurrencyCode"=>"USD", "FormattedPrice"=>"$26.39"},
|
115
|
-
"CartItems"=>
|
116
|
-
{"SubTotal"=>
|
117
|
-
{"Amount"=>"2639", "CurrencyCode"=>"USD", "FormattedPrice"=>"$26.39"},
|
118
|
-
"CartItem"=>
|
119
|
-
{"CartItemId"=>"U3G241HVLLB8N6",
|
120
|
-
"ASIN"=>"1430218150",
|
121
|
-
"MerchantId"=>"ATVPDKIKX0DER",
|
122
|
-
"SellerId"=>"A2R2RITDJNW1Q6",
|
123
|
-
"SellerNickname"=>"Amazon.com",
|
124
|
-
"Quantity"=>"1",
|
125
|
-
"Title"=>"Learn Objective-C on the Mac (Learn Series)",
|
126
|
-
"ProductGroup"=>"Book",
|
127
|
-
"Price"=>
|
128
|
-
{"Amount"=>"2639", "CurrencyCode"=>"USD", "FormattedPrice"=>"$26.39"},
|
129
|
-
"ItemTotal"=>
|
130
|
-
{"Amount"=>"2639", "CurrencyCode"=>"USD", "FormattedPrice"=>"$26.39"}}}}
|
131
|
-
end
|
132
|
-
|
133
|
-
it "should handle response data" do
|
134
|
-
cart = SimpleCart.new(@two_items)
|
135
|
-
cart.valid?.should be(true)
|
136
|
-
cart.cart_id.should eql('186-8702292-9782208')
|
137
|
-
cart.hmac.should eql('Ck5MXUE+OQiC/Jh8u6NhBf5FbV8=')
|
138
|
-
cart.url.should eql('https://www.amazon.com/gp/cart/aws-merge.html?cart-id=186-8702292-9782208%26associate-id=ws%26hmac=Ck5MXUE%2BOQiC/Jh8u6NhBf5FbV8=%26SubscriptionId=AKIAJFA5X7RTOKFNPVZQ%26MergeCart=False')
|
139
|
-
cart.price.should eql('$65.95')
|
140
|
-
cart.items.first.CartItemId eql('U3G241HVLLB8N6')
|
141
|
-
end
|
142
|
-
|
143
|
-
it "should handle one item" do
|
144
|
-
cart = SimpleCart.new(@two_items)
|
145
|
-
cart.items.first.CartItemId eql('U3G241HVLLB8N6')
|
51
|
+
expect(cart).to have(1).saved_items
|
52
|
+
expect(cart.valid?).to be_true
|
146
53
|
end
|
147
54
|
|
148
55
|
end
|