peddler 0.12.5 → 0.12.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -5
- data/lib/mws/fulfillment_inbound_shipment/client.rb +1 -0
- data/lib/mws/subscriptions/client.rb +1 -1
- data/lib/peddler/client.rb +2 -2
- data/lib/peddler/flat_file_response.rb +53 -0
- data/lib/peddler/operation.rb +4 -4
- data/lib/peddler/response.rb +24 -0
- data/lib/peddler/version.rb +1 -1
- data/lib/peddler/xml_response.rb +30 -0
- data/test/helper.rb +74 -0
- data/test/integration/test_cart_information.rb +1 -1
- data/test/integration/test_customer_information.rb +1 -1
- data/test/integration/test_feeds.rb +1 -1
- data/test/integration/test_fulfillment_inbound_shipment.rb +1 -1
- data/test/integration/test_fulfillment_inventory.rb +1 -1
- data/test/integration/test_fulfillment_outbound_shipment.rb +1 -1
- data/test/integration/test_off_amazon_payments.rb +1 -1
- data/test/integration/test_orders.rb +1 -1
- data/test/integration/test_products.rb +1 -1
- data/test/integration/test_recommendations.rb +1 -1
- data/test/integration/test_reports.rb +1 -1
- data/test/integration/test_sellers.rb +1 -1
- data/test/integration/test_subscriptions.rb +1 -1
- data/test/integration/test_webstore.rb +1 -1
- data/test/unit/mws/test_cart_information_client.rb +2 -2
- data/test/unit/mws/test_customer_information_client.rb +2 -2
- data/test/unit/mws/test_feeds_client.rb +2 -2
- data/test/unit/mws/test_fulfillment_inbound_shipment_client.rb +12 -4
- data/test/unit/mws/test_fulfillment_inventory_client.rb +2 -2
- data/test/unit/mws/test_fulfillment_outbound_shipment_client.rb +2 -2
- data/test/unit/mws/test_off_amazon_payments_client.rb +1 -1
- data/test/unit/mws/test_orders_client.rb +2 -2
- data/test/unit/mws/test_products_client.rb +156 -7
- data/test/unit/mws/test_recommendations_client.rb +2 -2
- data/test/unit/mws/test_reports_client.rb +187 -4
- data/test/unit/mws/test_sellers_client.rb +2 -2
- data/test/unit/mws/test_subscriptions_client.rb +291 -4
- data/test/unit/mws/test_webstore_client.rb +83 -4
- data/test/unit/peddler/test_client.rb +1 -1
- data/test/unit/peddler/test_flat_file_parser.rb +1 -1
- data/test/unit/peddler/test_marketplace.rb +1 -1
- data/test/unit/peddler/test_operation.rb +8 -1
- data/test/unit/peddler/test_parser.rb +1 -1
- data/test/unit/peddler/test_structured_list.rb +1 -1
- data/test/unit/peddler/test_xml_parser.rb +1 -1
- data/test/unit/test_mws.rb +2 -2
- metadata +7 -6
- data/test/integration_test_helper.rb +0 -48
- data/test/test_helper.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30436cbe660437bbf9bd37c50f71e97cd5ea3dba
|
4
|
+
data.tar.gz: daf21940a611131fb3fe34a12d4bad5d25fabca1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fcd83c8e7ce9ff05bacdf5344acaae8537a64fcd3f34aa43ab9e115cca5518691ce9daa07b6520ed5229f7f6b5703be7f8c4c8668865ac85ce3f33f574668be6
|
7
|
+
data.tar.gz: 69af1faee5272ec880e01bc835e6c88e771b44cdc6f43c6f2b549d9798dcb59d69a0a40d6427ba981bc984b22b106dfad2b9867ec64fe20f2b1dcdf06b2c33e8
|
data/README.md
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
# Peddler
|
3
3
|
|
4
4
|
[![Build Status](https://travis-ci.org/hakanensari/peddler.svg)](https://travis-ci.org/hakanensari/peddler)
|
5
|
-
[![Code Climate](
|
6
|
-
[![Coverage Status](
|
5
|
+
[![Code Climate](https://codeclimate.com/github/hakanensari/peddler/badges/gpa.svg)](https://codeclimate.com/github/hakanensari/peddler)
|
6
|
+
[![Coverage Status](https://coveralls.io/repos/hakanensari/peddler/badge.svg?branch=master)](https://coveralls.io/r/hakanensari/peddler?branch=master)
|
7
7
|
|
8
8
|
**Peddler** is a Ruby interface to the [Amazon MWS API](https://developer.amazonservices.com/), a collection of web services that help Amazon sellers programmatically exchange data on their listings, orders, payments, reports, and more.
|
9
9
|
|
@@ -49,9 +49,11 @@ If instantiating a client for another seller, you have to provide the `MWSAuthTo
|
|
49
49
|
|
50
50
|
```ruby
|
51
51
|
client = MWS.orders(
|
52
|
-
marketplace_id:
|
53
|
-
merchant_id:
|
54
|
-
|
52
|
+
marketplace_id: "...",
|
53
|
+
merchant_id: "...",
|
54
|
+
aws_access_key_id: "...",
|
55
|
+
aws_secret_access_key: "...",
|
56
|
+
auth_token: "..."
|
55
57
|
)
|
56
58
|
```
|
57
59
|
|
@@ -137,7 +137,7 @@ module MWS
|
|
137
137
|
# @param marketplace_id [String]
|
138
138
|
# @return [Peddler::XMLParser]
|
139
139
|
def update_subscription(notification_type, sqs_queue_url, enabled, marketplace_id = marketplace_id())
|
140
|
-
operation('
|
140
|
+
operation('UpdateSubscription')
|
141
141
|
.add('MarketplaceId' => marketplace_id)
|
142
142
|
.add(build_subscription(notification_type, sqs_queue_url, enabled))
|
143
143
|
|
data/lib/peddler/client.rb
CHANGED
@@ -84,10 +84,10 @@ module Peddler
|
|
84
84
|
action ? @operation = Operation.new(action) : @operation
|
85
85
|
end
|
86
86
|
|
87
|
-
def run
|
87
|
+
def run
|
88
88
|
opts = defaults.merge(query: operation, headers: headers)
|
89
89
|
opts.store(:body, body) if body
|
90
|
-
opts.store(:response_block,
|
90
|
+
opts.store(:response_block, Proc.new) if block_given?
|
91
91
|
res = post(opts)
|
92
92
|
|
93
93
|
parser.parse(res, encoding)
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require 'csv'
|
3
|
+
require 'digest/md5'
|
4
|
+
|
5
|
+
module Peddler
|
6
|
+
# @api private
|
7
|
+
class FlatFileResponse < SimpleDelegator
|
8
|
+
# http://stackoverflow.com/questions/8073920/importing-csv-quoting-error-is-driving-me-nuts
|
9
|
+
OPTIONS = { col_sep: "\t", quote_char: "\x00", headers: true }
|
10
|
+
|
11
|
+
attr_reader :content, :summary, :encoding
|
12
|
+
|
13
|
+
def initialize(res, encoding)
|
14
|
+
super(res)
|
15
|
+
@encoding = encoding
|
16
|
+
extract_content
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
CSV.parse(scrub_content, OPTIONS) if content
|
21
|
+
end
|
22
|
+
|
23
|
+
def records_count
|
24
|
+
summarize if summary?
|
25
|
+
end
|
26
|
+
|
27
|
+
def valid?
|
28
|
+
headers['Content-MD5'] == Digest::MD5.base64digest(body)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def extract_content
|
34
|
+
if summary?
|
35
|
+
@summary, @content = body.split("\n\n")
|
36
|
+
else
|
37
|
+
@content = body.dup
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def scrub_content
|
42
|
+
content.force_encoding(encoding).encode('UTF-8')
|
43
|
+
end
|
44
|
+
|
45
|
+
def summary?
|
46
|
+
body.start_with?('Feed Processing Summary')
|
47
|
+
end
|
48
|
+
|
49
|
+
def summarize
|
50
|
+
Hash[summary.split("\n\t")[1, 2].map { |line| line.split("\t\t") }]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/peddler/operation.rb
CHANGED
@@ -10,11 +10,11 @@ module Peddler
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def structure!(*list_keys)
|
13
|
-
list_key = list_keys.
|
13
|
+
list_key = list_keys.shift
|
14
14
|
|
15
|
-
if key?(list_key)
|
16
|
-
builder = StructuredList.new(*list_keys)
|
17
|
-
vals = delete(
|
15
|
+
if found_key = keys.find { |key| key.end_with?(list_key) }
|
16
|
+
builder = StructuredList.new(found_key, *list_keys)
|
17
|
+
vals = delete(found_key)
|
18
18
|
update(builder.build(vals))
|
19
19
|
end
|
20
20
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'peddler/flat_file_response'
|
2
|
+
require 'peddler/xml_response'
|
3
|
+
|
4
|
+
module Peddler
|
5
|
+
# @api private
|
6
|
+
module Response
|
7
|
+
# The inevitable messiness of massaging data produced by a motley army of
|
8
|
+
# Amazon developers
|
9
|
+
def self.new(response, encoding = 'ISO-8859-1')
|
10
|
+
# Don't parse if there's no body
|
11
|
+
return response unless response.body
|
12
|
+
|
13
|
+
content_type = response.headers['Content-Type']
|
14
|
+
if content_type.start_with?('text/xml')
|
15
|
+
XMLResponse.new(response)
|
16
|
+
else
|
17
|
+
# Amazon returns a variety of content types for flat files, so we
|
18
|
+
# simply assume that anything not XML is a flat file rather than code
|
19
|
+
# defensively and check content type again.
|
20
|
+
FlatFileResponse.new(response, encoding)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/peddler/version.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require 'multi_xml'
|
3
|
+
|
4
|
+
module Peddler
|
5
|
+
# @api private
|
6
|
+
class XMLResponse < SimpleDelegator
|
7
|
+
def next_token
|
8
|
+
parse.fetch('NextToken', false)
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse
|
12
|
+
@result ||= find_result
|
13
|
+
end
|
14
|
+
|
15
|
+
def document
|
16
|
+
MultiXml.parse(body)
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid?
|
20
|
+
headers['Content-Length'].to_i == body.size if headers['Content-Length']
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def find_result
|
26
|
+
results = document.values[0].find { |k, _| k.include?('Result') }
|
27
|
+
results ? results.last : nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'coveralls'
|
2
|
+
Coveralls.wear!
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'yaml'
|
5
|
+
require 'vcr'
|
6
|
+
begin
|
7
|
+
require 'pry'
|
8
|
+
rescue LoadError
|
9
|
+
end
|
10
|
+
|
11
|
+
# Wraps MWS credentials to run integration tests against
|
12
|
+
#
|
13
|
+
# Replace entries in the fixture file with real credentials if adding new tests
|
14
|
+
# or otherwise testing against live data.
|
15
|
+
module Accounts
|
16
|
+
extend Enumerable
|
17
|
+
|
18
|
+
def self.each(&blk)
|
19
|
+
@data.each(&blk)
|
20
|
+
end
|
21
|
+
|
22
|
+
@data = YAML.load_file(File.expand_path('../mws.yml', __FILE__))
|
23
|
+
end
|
24
|
+
|
25
|
+
# Sets up clients and bootstraps VCR for integration tests
|
26
|
+
class IntegrationTest < MiniTest::Test
|
27
|
+
def setup
|
28
|
+
ENV['LIVE'] ? VCR.turn_off! : VCR.insert_cassette(api)
|
29
|
+
end
|
30
|
+
|
31
|
+
def teardown
|
32
|
+
VCR.eject_cassette if VCR.turned_on?
|
33
|
+
end
|
34
|
+
|
35
|
+
def clients
|
36
|
+
Accounts.map do |account|
|
37
|
+
klass = MWS.const_get("#{api}::Client")
|
38
|
+
klass.new(account)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def api
|
45
|
+
self.class.name.sub('Test', '')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
VCR.configure do |c|
|
50
|
+
c.hook_into :excon
|
51
|
+
c.cassette_library_dir = 'test/vcr_cassettes'
|
52
|
+
|
53
|
+
# HTTP errors are not Peddler's concern, so ignore them to ease development.
|
54
|
+
c.before_record do |interaction|
|
55
|
+
interaction.ignore! if interaction.response.status.code >= 400
|
56
|
+
end
|
57
|
+
|
58
|
+
# Ignore transient params when building VCR fixtures.
|
59
|
+
matcher = VCR.request_matchers.uri_without_param(
|
60
|
+
'AWSAccessKeyId', 'SellerId', 'Signature', 'Timestamp', 'StartDate',
|
61
|
+
'CreatedAfter', 'QueryStartDateTime'
|
62
|
+
)
|
63
|
+
|
64
|
+
c.default_cassette_options = {
|
65
|
+
match_requests_on: [:host, :path, matcher],
|
66
|
+
record: :none
|
67
|
+
}
|
68
|
+
|
69
|
+
# So that fixtures do not depend on merchant credentials
|
70
|
+
Accounts.each do |account|
|
71
|
+
c.filter_sensitive_data('MERCHANT_ID') { account['merchant_id'] }
|
72
|
+
c.filter_sensitive_data('AWS_ACCESS_KEY_ID') { account['aws_access_key_id'] }
|
73
|
+
end
|
74
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
require 'mws/customer_information/client'
|
3
3
|
|
4
|
-
class
|
4
|
+
class TestMWSCustomerInformationClient < MiniTest::Test
|
5
5
|
def setup
|
6
6
|
@client = MWS::CustomerInformation::Client.new
|
7
7
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
require 'mws/fulfillment_inbound_shipment/client'
|
3
3
|
|
4
|
-
class
|
4
|
+
class TestMWSFulfillmentInboundShipmentClient < MiniTest::Test
|
5
5
|
def setup
|
6
6
|
@client = MWS::FulfillmentInboundShipment::Client.new
|
7
7
|
end
|
@@ -51,16 +51,24 @@ class TestFulfillmentInboundShipmentClient < MiniTest::Test
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_puts_transport_content
|
54
|
+
transport_details = {
|
55
|
+
'ParcelData' => {
|
56
|
+
'PackageList' => {
|
57
|
+
'TrackingId' => '123'
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
54
62
|
operation = {
|
55
63
|
'Action' => 'PutTransportContent',
|
56
64
|
'ShipmentId' => '1',
|
57
65
|
'IsPartnered' => true,
|
58
66
|
'ShipmentType' => 'Foo',
|
59
|
-
'TransportDetails.
|
67
|
+
'TransportDetails.ParcelData.PackageList.TrackingId' => '123'
|
60
68
|
}
|
61
69
|
|
62
70
|
@client.stub(:run, nil) do
|
63
|
-
@client.put_transport_content('1', true, 'Foo',
|
71
|
+
@client.put_transport_content('1', true, 'Foo', transport_details)
|
64
72
|
end
|
65
73
|
|
66
74
|
assert_equal operation, @client.operation
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
require 'mws/fulfillment_inventory/client'
|
3
3
|
|
4
|
-
class
|
4
|
+
class TestMWSFulfillmentInventoryClient < MiniTest::Test
|
5
5
|
def setup
|
6
6
|
@client = MWS::FulfillmentInventory::Client.new
|
7
7
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
require 'mws/fulfillment_outbound_shipment/client'
|
3
3
|
|
4
|
-
class
|
4
|
+
class TestMWSFulfillmentOutboundShipmentClient < MiniTest::Test
|
5
5
|
def setup
|
6
6
|
@client = MWS::FulfillmentOutboundShipment::Client.new
|
7
7
|
end
|
@@ -1,14 +1,165 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
require 'mws/products/client'
|
3
3
|
|
4
|
-
class
|
4
|
+
class TestMWSProductsClient < MiniTest::Test
|
5
5
|
def setup
|
6
6
|
@client = MWS::Products::Client.new
|
7
|
+
@client.marketplace_id = '123'
|
7
8
|
end
|
8
9
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
10
|
+
def test_lists_matching_products
|
11
|
+
operation = {
|
12
|
+
'Action' => 'ListMatchingProducts',
|
13
|
+
'MarketplaceId' => '123',
|
14
|
+
'Query' => 'foo'
|
15
|
+
}
|
16
|
+
|
17
|
+
@client.stub(:run, nil) do
|
18
|
+
@client.list_matching_products('foo')
|
19
|
+
end
|
20
|
+
|
21
|
+
assert_equal operation, @client.operation
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_gets_matching_product_for_id
|
25
|
+
operation = {
|
26
|
+
'Action' => 'GetMatchingProductForId',
|
27
|
+
'MarketplaceId' => '123',
|
28
|
+
'IdType' => 'foo',
|
29
|
+
'IdList.Id.1' => '1'
|
30
|
+
}
|
31
|
+
|
32
|
+
@client.stub(:run, nil) do
|
33
|
+
@client.get_matching_product_for_id('foo', '1')
|
34
|
+
end
|
35
|
+
|
36
|
+
assert_equal operation, @client.operation
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_gets_matching_product
|
40
|
+
operation = {
|
41
|
+
'Action' => 'GetMatchingProduct',
|
42
|
+
'MarketplaceId' => '123',
|
43
|
+
'ASINList.ASIN.1' => '1'
|
44
|
+
}
|
45
|
+
|
46
|
+
@client.stub(:run, nil) do
|
47
|
+
@client.get_matching_product('1')
|
48
|
+
end
|
49
|
+
|
50
|
+
assert_equal operation, @client.operation
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_gets_competitive_pricing_for_sku
|
54
|
+
operation = {
|
55
|
+
'Action' => 'GetCompetitivePricingForSKU',
|
56
|
+
'MarketplaceId' => '123',
|
57
|
+
'SellerSKUList.SellerSKU.1' => '1'
|
58
|
+
}
|
59
|
+
|
60
|
+
@client.stub(:run, nil) do
|
61
|
+
@client.get_competitive_pricing_for_sku('1')
|
62
|
+
end
|
63
|
+
|
64
|
+
assert_equal operation, @client.operation
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_gets_competitive_pricing_for_asin
|
68
|
+
operation = {
|
69
|
+
'Action' => 'GetCompetitivePricingForASIN',
|
70
|
+
'MarketplaceId' => '123',
|
71
|
+
'ASINList.ASIN.1' => '1'
|
72
|
+
}
|
73
|
+
|
74
|
+
@client.stub(:run, nil) do
|
75
|
+
@client.get_competitive_pricing_for_asin('1')
|
76
|
+
end
|
77
|
+
|
78
|
+
assert_equal operation, @client.operation
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_gets_lowest_offer_listings_for_sku
|
82
|
+
operation = {
|
83
|
+
'Action' => 'GetLowestOfferListingsForSKU',
|
84
|
+
'MarketplaceId' => '123',
|
85
|
+
'SellerSKUList.SellerSKU.1' => '1'
|
86
|
+
}
|
87
|
+
|
88
|
+
@client.stub(:run, nil) do
|
89
|
+
@client.get_lowest_offer_listings_for_sku('1')
|
90
|
+
end
|
91
|
+
|
92
|
+
assert_equal operation, @client.operation
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_gets_lowest_offer_listings_for_asin
|
96
|
+
operation = {
|
97
|
+
'Action' => 'GetLowestOfferListingsForASIN',
|
98
|
+
'MarketplaceId' => '123',
|
99
|
+
'ASINList.ASIN.1' => '1'
|
100
|
+
}
|
101
|
+
|
102
|
+
@client.stub(:run, nil) do
|
103
|
+
@client.get_lowest_offer_listings_for_asin('1')
|
104
|
+
end
|
105
|
+
|
106
|
+
assert_equal operation, @client.operation
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_gets_my_price_for_sku
|
110
|
+
operation = {
|
111
|
+
'Action' => 'GetMyPriceForSKU',
|
112
|
+
'MarketplaceId' => '123',
|
113
|
+
'SellerSKUList.SellerSKU.1' => '1'
|
114
|
+
}
|
115
|
+
|
116
|
+
@client.stub(:run, nil) do
|
117
|
+
@client.get_my_price_for_sku('1')
|
118
|
+
end
|
119
|
+
|
120
|
+
assert_equal operation, @client.operation
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_gets_my_price_for_asin
|
124
|
+
operation = {
|
125
|
+
'Action' => 'GetMyPriceForASIN',
|
126
|
+
'MarketplaceId' => '123',
|
127
|
+
'ASINList.ASIN.1' => '1'
|
128
|
+
}
|
129
|
+
|
130
|
+
@client.stub(:run, nil) do
|
131
|
+
@client.get_my_price_for_asin('1')
|
132
|
+
end
|
133
|
+
|
134
|
+
assert_equal operation, @client.operation
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_gets_product_categories_for_sku
|
138
|
+
operation = {
|
139
|
+
'Action' => 'GetProductCategoriesForSKU',
|
140
|
+
'MarketplaceId' => '123',
|
141
|
+
'SellerSKU' => '1'
|
142
|
+
}
|
143
|
+
|
144
|
+
@client.stub(:run, nil) do
|
145
|
+
@client.get_product_categories_for_sku('1')
|
146
|
+
end
|
147
|
+
|
148
|
+
assert_equal operation, @client.operation
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_gets_product_categories_for_asin
|
152
|
+
operation = {
|
153
|
+
'Action' => 'GetProductCategoriesForASIN',
|
154
|
+
'MarketplaceId' => '123',
|
155
|
+
'ASIN' => '1'
|
156
|
+
}
|
157
|
+
|
158
|
+
@client.stub(:run, nil) do
|
159
|
+
@client.get_product_categories_for_asin('1')
|
160
|
+
end
|
161
|
+
|
162
|
+
assert_equal operation, @client.operation
|
12
163
|
end
|
13
164
|
|
14
165
|
def test_gets_service_status
|
@@ -22,6 +173,4 @@ class TestProductsClient < MiniTest::Test
|
|
22
173
|
|
23
174
|
assert_equal operation, @client.operation
|
24
175
|
end
|
25
|
-
|
26
|
-
# FIXME Fill in tests for operations
|
27
176
|
end
|