peddler 0.12.5 → 0.12.7
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/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
|
[](https://travis-ci.org/hakanensari/peddler)
|
5
|
-
[](https://codeclimate.com/github/hakanensari/peddler)
|
6
|
+
[](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
|