peddler 2.1.1 → 2.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +45 -41
  3. data/lib/mws.rb +2 -1
  4. data/lib/mws/easy_ship.rb +3 -0
  5. data/lib/mws/easy_ship/client.rb +93 -0
  6. data/lib/mws/fulfillment_outbound_shipment/client.rb +1 -1
  7. data/lib/mws/orders/client.rb +7 -9
  8. data/lib/mws/shipment_invoicing.rb +3 -0
  9. data/lib/mws/shipment_invoicing/client.rb +74 -0
  10. data/lib/mws/subscriptions/client.rb +2 -2
  11. data/lib/peddler/client.rb +17 -13
  12. data/lib/peddler/errors/builder.rb +7 -2
  13. data/lib/peddler/errors/class_generator.rb +9 -4
  14. data/lib/peddler/errors/error.rb +6 -2
  15. data/lib/peddler/errors/parser.rb +1 -1
  16. data/lib/peddler/flat_file_parser.rb +5 -3
  17. data/lib/peddler/headers.rb +6 -1
  18. data/lib/peddler/marketplace.rb +25 -19
  19. data/lib/peddler/operation.rb +17 -11
  20. data/lib/peddler/parser.rb +1 -1
  21. data/lib/peddler/structured_list.rb +1 -1
  22. data/lib/peddler/vcr_matcher.rb +7 -7
  23. data/lib/peddler/version.rb +1 -1
  24. data/lib/peddler/xml_parser.rb +1 -1
  25. data/lib/peddler/xml_response_parser.rb +3 -2
  26. metadata +15 -152
  27. data/lib/mws/off_amazon_payments/client.rb +0 -362
  28. data/lib/peddler/content.rb +0 -69
  29. data/lib/peddler/mws.rb +0 -58
  30. data/test/credentials.rb +0 -23
  31. data/test/helper.rb +0 -15
  32. data/test/integration/internals/test_errors.rb +0 -17
  33. data/test/integration/internals/test_multibyte_queries.rb +0 -17
  34. data/test/integration/internals/test_mws_headers.rb +0 -21
  35. data/test/integration/internals/test_string_encodings.rb +0 -38
  36. data/test/integration/test_feeds.rb +0 -37
  37. data/test/integration/test_fulfillment_inbound_shipment.rb +0 -35
  38. data/test/integration/test_fulfillment_inventory.rb +0 -20
  39. data/test/integration/test_fulfillment_outbound_shipment.rb +0 -13
  40. data/test/integration/test_merchant_fulfillment.rb +0 -69
  41. data/test/integration/test_off_amazon_payments.rb +0 -13
  42. data/test/integration/test_orders.rb +0 -30
  43. data/test/integration/test_products.rb +0 -97
  44. data/test/integration/test_recommendations.rb +0 -20
  45. data/test/integration/test_reports.rb +0 -51
  46. data/test/integration/test_sellers.rb +0 -13
  47. data/test/integration/test_subscriptions.rb +0 -27
  48. data/test/integration_helper.rb +0 -53
  49. data/test/mws.yml +0 -36
  50. data/test/mws.yml.example +0 -32
  51. data/test/null_client.rb +0 -25
  52. data/test/recorder.rb +0 -39
  53. data/test/unit/mws/test_feeds_client.rb +0 -103
  54. data/test/unit/mws/test_finances_client.rb +0 -74
  55. data/test/unit/mws/test_fulfillment_inbound_shipment_client.rb +0 -426
  56. data/test/unit/mws/test_fulfillment_inventory_client.rb +0 -48
  57. data/test/unit/mws/test_fulfillment_outbound_shipment_client.rb +0 -202
  58. data/test/unit/mws/test_merchant_fulfillment_client.rb +0 -109
  59. data/test/unit/mws/test_off_amazon_payments_client.rb +0 -286
  60. data/test/unit/mws/test_orders_client.rb +0 -111
  61. data/test/unit/mws/test_products_client.rb +0 -248
  62. data/test/unit/mws/test_recommendations_client.rb +0 -62
  63. data/test/unit/mws/test_reports_client.rb +0 -209
  64. data/test/unit/mws/test_sellers_client.rb +0 -47
  65. data/test/unit/mws/test_subscriptions_client.rb +0 -182
  66. data/test/unit/peddler/errors/test_builder.rb +0 -65
  67. data/test/unit/peddler/errors/test_class_generator.rb +0 -18
  68. data/test/unit/peddler/errors/test_error.rb +0 -33
  69. data/test/unit/peddler/errors/test_parser.rb +0 -44
  70. data/test/unit/peddler/test_client.rb +0 -203
  71. data/test/unit/peddler/test_flat_file_parser.rb +0 -111
  72. data/test/unit/peddler/test_headers.rb +0 -103
  73. data/test/unit/peddler/test_marketplace.rb +0 -47
  74. data/test/unit/peddler/test_operation.rb +0 -87
  75. data/test/unit/peddler/test_parser.rb +0 -36
  76. data/test/unit/peddler/test_structured_list.rb +0 -39
  77. data/test/unit/peddler/test_vcr_matcher.rb +0 -55
  78. data/test/unit/peddler/test_xml_parser.rb +0 -37
  79. data/test/unit/peddler/test_xml_response_parser.rb +0 -39
  80. data/test/unit/test_mws.rb +0 -11
  81. data/test/vcr_cassettes/CartInformation.yml +0 -433
  82. data/test/vcr_cassettes/CustomerInformation.yml +0 -433
  83. data/test/vcr_cassettes/Errors.yml +0 -444
  84. data/test/vcr_cassettes/Feeds.yml +0 -9957
  85. data/test/vcr_cassettes/FulfillmentInboundShipment.yml +0 -6166
  86. data/test/vcr_cassettes/FulfillmentInventory.yml +0 -850
  87. data/test/vcr_cassettes/FulfillmentOutboundShipment.yml +0 -433
  88. data/test/vcr_cassettes/MWSHeaders.yml +0 -2964
  89. data/test/vcr_cassettes/MerchantFulfillment.yml +0 -753
  90. data/test/vcr_cassettes/MultibyteQueries.yml +0 -437
  91. data/test/vcr_cassettes/OffAmazonPayments.yml +0 -433
  92. data/test/vcr_cassettes/Orders.yml +0 -4740
  93. data/test/vcr_cassettes/PeddlerVCRMatcher.yml +0 -41
  94. data/test/vcr_cassettes/Products.yml +0 -7139
  95. data/test/vcr_cassettes/Recommendations.yml +0 -3145
  96. data/test/vcr_cassettes/Reports.yml +0 -5549
  97. data/test/vcr_cassettes/Sellers.yml +0 -433
  98. data/test/vcr_cassettes/Subscriptions.yml +0 -1529
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'mws/sellers/client'
5
-
6
- class TestMWSSellersClient < MiniTest::Test
7
- def setup
8
- @client = MWS::Sellers::Client.new
9
- end
10
-
11
- def test_listing_marketplace_participations
12
- operation = {
13
- 'Action' => 'ListMarketplaceParticipations'
14
- }
15
-
16
- @client.stub(:run, nil) do
17
- @client.list_marketplace_participations
18
- end
19
-
20
- assert_equal operation, @client.operation
21
- end
22
-
23
- def test_listing_marketplace_participations_by_next_token
24
- operation = {
25
- 'Action' => 'ListMarketplaceParticipationsByNextToken',
26
- 'NextToken' => '1'
27
- }
28
-
29
- @client.stub(:run, nil) do
30
- @client.list_marketplace_participations_by_next_token('1')
31
- end
32
-
33
- assert_equal operation, @client.operation
34
- end
35
-
36
- def test_getting_service_status
37
- operation = {
38
- 'Action' => 'GetServiceStatus'
39
- }
40
-
41
- @client.stub(:run, nil) do
42
- @client.get_service_status
43
- end
44
-
45
- assert_equal operation, @client.operation
46
- end
47
- end
@@ -1,182 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'mws/subscriptions/client'
5
-
6
- class TestMWSSubscriptionsClient < MiniTest::Test
7
- def setup
8
- @client = MWS::Subscriptions::Client.new
9
- end
10
-
11
- def test_registering_destination
12
- operation = {
13
- 'Action' => 'RegisterDestination',
14
- 'MarketplaceId' => '321',
15
- 'Destination.DeliveryChannel' => 'SQS',
16
- 'Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
17
- 'Destination.AttributeList.member.1.Value' => 'foo'
18
- }
19
-
20
- @client.stub(:run, nil) do
21
- @client.register_destination('foo', '321')
22
- end
23
-
24
- assert_equal operation, @client.operation
25
- end
26
-
27
- def test_deregistering_destination
28
- operation = {
29
- 'Action' => 'DeregisterDestination',
30
- 'MarketplaceId' => '123',
31
- 'Destination.DeliveryChannel' => 'SQS',
32
- 'Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
33
- 'Destination.AttributeList.member.1.Value' => 'foo'
34
- }
35
-
36
- @client.stub(:run, nil) do
37
- @client.deregister_destination('foo', '123')
38
- end
39
-
40
- assert_equal operation, @client.operation
41
- end
42
-
43
- def test_deregistering_destination_with_alternate_marketplace
44
- operation = {
45
- 'Action' => 'DeregisterDestination',
46
- 'MarketplaceId' => '321',
47
- 'Destination.DeliveryChannel' => 'SQS',
48
- 'Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
49
- 'Destination.AttributeList.member.1.Value' => 'foo'
50
- }
51
-
52
- @client.stub(:run, nil) do
53
- @client.deregister_destination('foo', '321')
54
- end
55
-
56
- assert_equal operation, @client.operation
57
- end
58
-
59
- def test_listing_registered_destinations
60
- operation = {
61
- 'Action' => 'ListRegisteredDestinations',
62
- 'MarketplaceId' => '321'
63
- }
64
-
65
- @client.stub(:run, nil) do
66
- @client.list_registered_destinations('321')
67
- end
68
-
69
- assert_equal operation, @client.operation
70
- end
71
-
72
- def test_sending_test_notification_to_destination
73
- operation = {
74
- 'Action' => 'SendTestNotificationToDestination',
75
- 'MarketplaceId' => '321',
76
- 'Destination.DeliveryChannel' => 'SQS',
77
- 'Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
78
- 'Destination.AttributeList.member.1.Value' => 'foo'
79
- }
80
-
81
- @client.stub(:run, nil) do
82
- @client.send_test_notification_to_destination('foo', '321')
83
- end
84
-
85
- assert_equal operation, @client.operation
86
- end
87
-
88
- def test_creating_subscription
89
- operation = {
90
- 'Action' => 'CreateSubscription',
91
- 'MarketplaceId' => '321',
92
- 'Subscription.IsEnabled' => true,
93
- 'Subscription.NotificationType' => 'foo',
94
- 'Subscription.Destination.DeliveryChannel' => 'SQS',
95
- 'Subscription.Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
96
- 'Subscription.Destination.AttributeList.member.1.Value' => 'bar'
97
- }
98
-
99
- @client.stub(:run, nil) do
100
- @client.create_subscription('foo', 'bar', '321')
101
- end
102
-
103
- assert_equal operation, @client.operation
104
- end
105
-
106
- def test_getting_subscription
107
- operation = {
108
- 'Action' => 'GetSubscription',
109
- 'MarketplaceId' => '321',
110
- 'NotificationType' => 'foo',
111
- 'Destination.DeliveryChannel' => 'SQS',
112
- 'Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
113
- 'Destination.AttributeList.member.1.Value' => 'bar'
114
- }
115
-
116
- @client.stub(:run, nil) do
117
- @client.get_subscription('foo', 'bar', '321')
118
- end
119
-
120
- assert_equal operation, @client.operation
121
- end
122
-
123
- def test_deleting_subscription
124
- operation = {
125
- 'Action' => 'DeleteSubscription',
126
- 'MarketplaceId' => '321',
127
- 'NotificationType' => 'foo',
128
- 'Destination.DeliveryChannel' => 'SQS',
129
- 'Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
130
- 'Destination.AttributeList.member.1.Value' => 'bar'
131
- }
132
-
133
- @client.stub(:run, nil) do
134
- @client.delete_subscription('foo', 'bar', '321')
135
- end
136
-
137
- assert_equal operation, @client.operation
138
- end
139
-
140
- def test_listing_subscriptions
141
- operation = {
142
- 'Action' => 'ListSubscriptions',
143
- 'MarketplaceId' => '321'
144
- }
145
-
146
- @client.stub(:run, nil) do
147
- @client.list_subscriptions('321')
148
- end
149
-
150
- assert_equal operation, @client.operation
151
- end
152
-
153
- def test_updating_subscription
154
- operation = {
155
- 'Action' => 'UpdateSubscription',
156
- 'MarketplaceId' => '321',
157
- 'Subscription.IsEnabled' => true,
158
- 'Subscription.NotificationType' => 'foo',
159
- 'Subscription.Destination.DeliveryChannel' => 'SQS',
160
- 'Subscription.Destination.AttributeList.member.1.Key' => 'sqsQueueUrl',
161
- 'Subscription.Destination.AttributeList.member.1.Value' => 'bar'
162
- }
163
-
164
- @client.stub(:run, nil) do
165
- @client.update_subscription('foo', 'bar', true, '321')
166
- end
167
-
168
- assert_equal operation, @client.operation
169
- end
170
-
171
- def test_getting_service_status
172
- operation = {
173
- 'Action' => 'GetServiceStatus'
174
- }
175
-
176
- @client.stub(:run, nil) do
177
- @client.get_service_status
178
- end
179
-
180
- assert_equal operation, @client.operation
181
- end
182
- end
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'peddler/errors/builder'
5
-
6
- class TestPeddlerErrorsBuilder < MiniTest::Test
7
- def setup
8
- @error = Peddler::Errors::Builder.call(@cause)
9
- end
10
-
11
- class CausedByHTTPStatusError < TestPeddlerErrorsBuilder
12
- def setup
13
- @code = 'FeedProcessingResultNotReady'
14
- @message = 'Feed Submission Result is not ready for Feed 123'
15
- body = <<-XML
16
- <ErrorResponse>
17
- <Error>
18
- <Code>#{@code}</Code>
19
- <Message>#{@message}</Message>
20
- </Error>
21
- </ErrorResponse>
22
- XML
23
- @cause = Excon::Error::NotFound.new(
24
- 'Expected(200) <=> Actual(404 Not Found)',
25
- nil,
26
- OpenStruct.new(body: body)
27
- )
28
- super
29
- end
30
-
31
- def test_custom_error
32
- assert_includes @error.class.name, @code
33
- end
34
-
35
- def test_message
36
- assert_equal @message, @error.message
37
- end
38
-
39
- def test_cause
40
- assert_equal @cause, @error.cause
41
- end
42
- end
43
-
44
- class CausedByInternalServerError < TestPeddlerErrorsBuilder
45
- def setup
46
- body = <<-XML
47
- <ErrorResponse>
48
- <Error>
49
- <Code>500</Code>
50
- </Error>
51
- </ErrorResponse>
52
- XML
53
- @cause = Excon::Error::InternalServerError.new(
54
- nil,
55
- nil,
56
- OpenStruct.new(body: body)
57
- )
58
- super
59
- end
60
-
61
- def test_that_it_returns_nothing
62
- assert_nil @error
63
- end
64
- end
65
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'peddler/errors/class_generator'
5
-
6
- class TestPeddlerErrorsClassGenerator < MiniTest::Test
7
- def test_building_an_error_class
8
- Peddler::Errors::ClassGenerator.call('Foo')
9
- assert Peddler::Errors::Foo
10
- end
11
-
12
- def test_thread_safety
13
- Peddler::Errors::ClassGenerator.call('Foo')
14
- assert_output '', '' do
15
- Peddler::Errors::ClassGenerator.call('Foo')
16
- end
17
- end
18
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'peddler/errors/error'
5
-
6
- class TestPeddlerErrorsError < MiniTest::Test
7
- def setup
8
- @cause = OpenStruct.new(response: 'response')
9
- @error = Peddler::Errors::Error.new('message', @cause)
10
- end
11
-
12
- def test_message
13
- assert_equal 'message', @error.message
14
- end
15
-
16
- def test_cause
17
- assert_equal @cause, @error.cause
18
- end
19
-
20
- def test_that_it_defines_common_errors
21
- Peddler::Errors::CODES.each do |name|
22
- assert ::Peddler::Errors.const_defined?(name)
23
- end
24
- end
25
-
26
- def test_that_it_allows_nil_arguments
27
- Peddler::Errors::Error.new
28
- end
29
-
30
- def test_that_it_delegates_response_to_cause
31
- assert_equal @cause.response, @error.response
32
- end
33
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'peddler/errors/parser'
5
-
6
- class TestPeddlerErrorsParser < MiniTest::Test
7
- def setup
8
- body = <<-XML
9
- <ErrorResponse>
10
- <Error>
11
- <Type>Foo</Type>
12
- <Code>Bar</Code>
13
- <Message>Baz</Message>
14
- </Error>
15
- <RequestID>123</RequestID>
16
- </ErrorResponse>
17
- XML
18
- res = OpenStruct.new(
19
- body: body,
20
- headers: {
21
- 'Content-Type' => 'text/xml',
22
- 'Content-Length' => body.size.to_s
23
- }
24
- )
25
-
26
- @parser = Peddler::Errors::Parser.new(res)
27
- end
28
-
29
- def test_parsing_data
30
- assert @parser.parse
31
- end
32
-
33
- def test_message
34
- assert @parser.message
35
- end
36
-
37
- def test_code
38
- assert @parser.code
39
- end
40
-
41
- def test_type
42
- assert @parser.type
43
- end
44
- end
@@ -1,203 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'null_client'
5
-
6
- class TestPeddlerClient < MiniTest::Test
7
- def setup
8
- Excon.defaults[:mock] = true
9
- @klass = Class.new(Null::Client)
10
- @client = @klass.new
11
- @client.configure_with_mock_data!
12
- @client.operation('Foo')
13
- end
14
-
15
- def teardown
16
- Excon.stubs.clear
17
- Excon.defaults.delete(:mock)
18
- end
19
-
20
- class HappyPath < TestPeddlerClient
21
- def setup
22
- @response_body = 'foo'
23
- Excon.stub({}, body: @response_body, status: 200)
24
- super
25
- end
26
-
27
- def test_user_agent
28
- assert @client.connection.data[:headers].key?('User-Agent')
29
- end
30
-
31
- def test_inheritance_of_parents_params
32
- assert_equal Peddler::Client.params, @klass.params
33
- end
34
-
35
- def test_that_params_include_seller_id
36
- assert @klass.params.key?('SellerId')
37
- end
38
-
39
- def test_that_params_include_auth_token
40
- @klass.params.key?('MWSAuthToken')
41
- end
42
-
43
- def test_inheritance_of_parents_parser
44
- assert_equal @klass.parser, Class.new(@klass).parser
45
- end
46
-
47
- def test_setting_marketplace
48
- marketplace = Peddler::Marketplace.find('US')
49
- @client.marketplace = 'US'
50
- assert_equal marketplace, @client.marketplace
51
- @client.marketplace = marketplace
52
- assert_equal marketplace, @client.marketplace
53
- end
54
-
55
- def test_configuring_when_initialising
56
- client = @klass.new(aws_access_key_id: '123')
57
- assert_equal '123', client.aws_access_key_id
58
- end
59
-
60
- def test_setting_content_type_header_for_latin_flat_file
61
- @client.body = 'foo'
62
- content_type = @client.headers.fetch('Content-Type')
63
-
64
- assert_equal 'text/tab-separated-values; charset=CP1252', content_type
65
- end
66
-
67
- def test_setting_content_type_header_for_chinese_flat_file
68
- @client.marketplace = 'CN'
69
- @client.body = 'foo'
70
- content_type = @client.headers.fetch('Content-Type')
71
-
72
- assert_equal 'text/tab-separated-values; charset=UTF-16', content_type
73
- end
74
-
75
- def test_setting_content_type_header_for_japanese_flat_file
76
- @client.marketplace = 'JP'
77
- @client.body = 'foo'
78
- content_type = @client.headers.fetch('Content-Type')
79
-
80
- assert_equal 'text/tab-separated-values; charset=Windows-31J', content_type
81
- end
82
-
83
- def test_setting_content_type_header_for_xml
84
- @client.body = '<?xml version="1.0"?><Foo></Foo>'
85
- content_type = @client.headers.fetch('Content-Type')
86
-
87
- assert_equal 'text/xml', content_type
88
- end
89
-
90
- def test_encoding_body_for_latin_flat_file
91
- @client.body = 'foo'
92
- assert_equal 'Windows-1252', @client.body.encoding.to_s
93
- end
94
-
95
- def test_encoding_body_for_chinese_flat_file
96
- @client.marketplace = 'CN'
97
- @client.body = 'foo'
98
- assert_equal 'UTF-16', @client.body.encoding.to_s
99
- end
100
-
101
- def test_encoding_body_for_japanese_flat_file
102
- @client.marketplace = 'JP'
103
- @client.body = 'foo'
104
- assert_equal 'Windows-31J', @client.body.encoding.to_s
105
- end
106
-
107
- def test_running_a_request
108
- res = @client.run
109
- assert_equal @response_body, res.body
110
- end
111
-
112
- def test_clearing_body_when_run_succeeds
113
- @client.body = 'foo'
114
- @client.run
115
- assert_nil @client.body
116
- end
117
-
118
- def test_streaming_response
119
- chunks = ''
120
- streamer = ->(chunk, _, _) { chunks += chunk }
121
- @client.run(&streamer)
122
-
123
- assert_equal @response_body, chunks
124
- end
125
-
126
- class Instrumentor
127
- class << self
128
- attr_accessor :events
129
-
130
- def instrument(name, params = {})
131
- events.update(name => params)
132
- yield if block_given?
133
- end
134
- end
135
-
136
- @events = {}
137
- end
138
-
139
- def test_that_request_preserves_user_agent
140
- @client.defaults.update(instrumentor: Instrumentor)
141
- @client.run
142
- headers = Instrumentor.events['excon.request'][:headers]
143
-
144
- assert headers.key?('User-Agent')
145
- end
146
- end
147
-
148
- class MWSErrorPath < TestPeddlerClient
149
- def setup
150
- body = <<-XML
151
- <ErrorResponse>
152
- <Error>
153
- <Code>RequestThrottled</Code>
154
- </Error>
155
- </ErrorResponse>
156
- XML
157
- Excon.stub({}, body: body, status: 503)
158
- super
159
- end
160
-
161
- def test_default_error_handling
162
- assert_raises Peddler::Errors::RequestThrottled do
163
- @client.run
164
- end
165
- end
166
-
167
- def test_it_does_not_clear_body_when_run_fails
168
- @client.body = 'foo'
169
- assert_raises Peddler::Errors::RequestThrottled do
170
- @client.run
171
- end
172
- refute_nil @client.body
173
- end
174
- end
175
-
176
- class OtherHTTPStatusErrorPath < TestPeddlerClient
177
- def setup
178
- body = <<-XML
179
- <ErrorResponse>
180
- <Error>
181
- <Code>500</Code>
182
- </Error>
183
- </ErrorResponse>
184
- XML
185
- Excon.stub({}, body: body, status: 500)
186
- super
187
- end
188
-
189
- def test_error_handling
190
- assert_raises Excon::Error::InternalServerError do
191
- @client.run
192
- end
193
- end
194
-
195
- def test_it_does_not_clear_body_when_run_fails
196
- @client.body = 'foo'
197
- assert_raises Excon::Error::InternalServerError do
198
- @client.run
199
- end
200
- refute_nil @client.body
201
- end
202
- end
203
- end