active_fulfillment 0.10.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.
Files changed (33) hide show
  1. data/CHANGELOG +26 -0
  2. data/Rakefile +60 -0
  3. data/VERSION +1 -0
  4. data/active_fulfillment.gemspec +74 -0
  5. data/init.rb +1 -0
  6. data/lib/active_fulfillment/fulfillment/base.rb +12 -0
  7. data/lib/active_fulfillment/fulfillment/response.rb +32 -0
  8. data/lib/active_fulfillment/fulfillment/service.rb +31 -0
  9. data/lib/active_fulfillment/fulfillment/services/amazon.rb +230 -0
  10. data/lib/active_fulfillment/fulfillment/services/shipwire.rb +236 -0
  11. data/lib/active_fulfillment/fulfillment/services/webgistix.rb +207 -0
  12. data/lib/active_fulfillment/fulfillment/services.rb +3 -0
  13. data/lib/active_fulfillment.rb +50 -0
  14. data/lib/active_merchant/common/connection.rb +172 -0
  15. data/lib/active_merchant/common/country.rb +319 -0
  16. data/lib/active_merchant/common/error.rb +26 -0
  17. data/lib/active_merchant/common/post_data.rb +24 -0
  18. data/lib/active_merchant/common/posts_data.rb +47 -0
  19. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  20. data/lib/active_merchant/common/utils.rb +18 -0
  21. data/lib/active_merchant/common/validateable.rb +76 -0
  22. data/lib/active_merchant/common.rb +14 -0
  23. data/lib/certs/cacert.pem +7815 -0
  24. data/test/fixtures.yml +11 -0
  25. data/test/remote/amazon_test.rb +93 -0
  26. data/test/remote/shipwire_test.rb +145 -0
  27. data/test/remote/webgistix_test.rb +80 -0
  28. data/test/test_helper.rb +60 -0
  29. data/test/unit/base_test.rb +17 -0
  30. data/test/unit/services/amazon_test.rb +187 -0
  31. data/test/unit/services/shipwire_test.rb +164 -0
  32. data/test/unit/services/webgistix_test.rb +145 -0
  33. metadata +106 -0
data/test/fixtures.yml ADDED
@@ -0,0 +1,11 @@
1
+ shipwire:
2
+ login:
3
+ password:
4
+
5
+ webgistix:
6
+ login:
7
+ password:
8
+
9
+ amazon:
10
+ login:
11
+ password:
@@ -0,0 +1,93 @@
1
+ require 'test_helper'
2
+
3
+ class RemoteAmazonTest < Test::Unit::TestCase
4
+ # In order for these tests to work you must have a live account with Amazon.
5
+ # You can sign up at http://amazonservices.com/fulfillment/
6
+ # The SKUs must also exist in your inventory. You do not want the SKUs you
7
+ # use for testing to actually have inventory in the Amazon warehouse, or else
8
+ # the shipments will actually be fulfillable
9
+ def setup
10
+ @service = AmazonService.new( fixtures(:amazon) )
11
+
12
+ @options = {
13
+ :shipping_method => 'Standard',
14
+ :order_date => Time.now.utc.yesterday,
15
+ :comment => "Delayed due to tornados"
16
+ }
17
+
18
+ @address = { :name => 'Johnny Chase',
19
+ :address1 => '100 Information Super Highway',
20
+ :address2 => 'Suite 66',
21
+ :city => 'Beverly Hills',
22
+ :state => 'CA',
23
+ :country => 'US',
24
+ :zip => '90210'
25
+ }
26
+
27
+ @line_items = [
28
+ { :sku => 'SETTLERS8',
29
+ :quantity => 1 #,
30
+ #:comment => 'Awesome'
31
+ }
32
+ ]
33
+ end
34
+
35
+ def test_successful_order_submission
36
+ response = @service.fulfill(generate_order_id, @address, @line_items, @options)
37
+ assert response.success?
38
+ assert !response.test?
39
+ end
40
+
41
+ def test_order_multiple_line_items
42
+ @line_items.push(
43
+ { :sku => 'CARCASSONNE',
44
+ :quantity => 2
45
+ }
46
+ )
47
+
48
+ response = @service.fulfill(generate_order_id, @address, @line_items, @options)
49
+ assert response.success?
50
+ end
51
+
52
+ def test_invalid_credentials_during_fulfillment
53
+ service = AmazonService.new(
54
+ :login => 'y',
55
+ :password => 'p')
56
+
57
+ response = service.fulfill(generate_order_id, @address, @line_items, @options)
58
+ assert !response.success?
59
+ assert_equal "aws:Client.InvalidClientTokenId The AWS Access Key Id you provided does not exist in our records.", response.message
60
+ end
61
+
62
+ def test_list_orders
63
+ response = @service.fetch_current_orders
64
+ assert response.success?
65
+ end
66
+
67
+ def test_valid_credentials
68
+ assert @service.valid_credentials?
69
+ end
70
+
71
+ def test_invalid_credentials
72
+ service = AmazonService.new(
73
+ :login => 'your@email.com',
74
+ :password => 'password')
75
+ assert !service.valid_credentials?
76
+ end
77
+
78
+ def test_get_status_fails
79
+ service = AmazonService.new(
80
+ :login => 'your@email.com',
81
+ :password => 'password')
82
+ response = service.status
83
+ assert !response.success?
84
+ assert_equal "aws:Client.InvalidClientTokenId The AWS Access Key Id you provided does not exist in our records.", response.message
85
+ end
86
+
87
+ def test_get_status
88
+ service = AmazonService.new(fixtures(:amazon))
89
+ response = service.status
90
+ assert response.success?
91
+ end
92
+
93
+ end
@@ -0,0 +1,145 @@
1
+ require 'test_helper'
2
+
3
+ class RemoteShipwireTest < Test::Unit::TestCase
4
+ def setup
5
+ Base.mode = :test
6
+
7
+ @shipwire = ShipwireService.new( fixtures(:shipwire) )
8
+
9
+ @options = {
10
+ :warehouse => 'LAX',
11
+ :shipping_method => 'UPS Ground',
12
+ :email => 'cody@example.com'
13
+ }
14
+
15
+ @us_address = {
16
+ :name => 'Steve Jobs',
17
+ :company => 'Apple Computer Inc.',
18
+ :address1 => '1 Infinite Loop',
19
+ :city => 'Cupertino',
20
+ :state => 'CA',
21
+ :country => 'US',
22
+ :zip => '95014',
23
+ :email => 'steve@apple.com'
24
+ }
25
+
26
+ @uk_address = {
27
+ :name => 'Bob Diamond',
28
+ :company => 'Barclays Bank PLC',
29
+ :address1 => '1 Churchill Place',
30
+ :city => 'London',
31
+ :country => 'GB',
32
+ :zip => 'E14 5HP',
33
+ :email => 'bob@barclays.co.uk'
34
+ }
35
+
36
+ @line_items = [ { :sku => 'AF0001', :quantity => 25 } ]
37
+ end
38
+
39
+ def test_invalid_credentials_during_fulfillment
40
+ shipwire = ShipwireService.new(
41
+ :login => 'your@email.com',
42
+ :password => 'password')
43
+
44
+ response = shipwire.fulfill('123456', @us_address, @line_items, @options)
45
+ assert !response.success?
46
+ assert response.test?
47
+ assert_equal 'Error', response.params['status']
48
+ assert_equal "Could not verify e-mail/password combination", response.message
49
+ end
50
+
51
+ def test_successful_order_submission_to_us
52
+ response = @shipwire.fulfill('123456', @us_address, @line_items, @options)
53
+ assert response.success?
54
+ assert response.test?
55
+ assert response.params['transaction_id']
56
+ assert_equal '1', response.params['total_orders']
57
+ assert_equal '1', response.params['total_items']
58
+ assert_equal '0', response.params['status']
59
+ assert_equal 'Successfully submitted the order', response.message
60
+ end
61
+
62
+ def test_successful_order_submission_to_uk
63
+ response = @shipwire.fulfill('123456', @uk_address, @line_items, @options)
64
+ assert response.success?
65
+ assert response.test?
66
+ assert response.params['transaction_id']
67
+ assert_equal '1', response.params['total_orders']
68
+ assert_equal '1', response.params['total_items']
69
+ assert_equal '0', response.params['status']
70
+ assert_equal 'Successfully submitted the order', response.message
71
+ end
72
+
73
+ def test_order_multiple_line_items
74
+ @line_items.push({ :sku => 'AF0002', :quantity => 25 })
75
+
76
+ response = @shipwire.fulfill('123456', @us_address, @line_items, @options)
77
+ assert response.success?
78
+ assert response.test?
79
+ assert response.params['transaction_id']
80
+ assert_equal '1', response.params['total_orders']
81
+ assert_equal '2', response.params['total_items']
82
+ assert_equal '0', response.params['status']
83
+ assert_equal 'Successfully submitted the order', response.message
84
+ end
85
+
86
+ def test_no_sku_is_sent_with_fulfillment
87
+ options = {
88
+ :shipping_method => 'UPS Ground'
89
+ }
90
+
91
+ line_items = [ { :quantity => 1, :description => 'Libtech Snowboard' } ]
92
+
93
+ response = @shipwire.fulfill('123456', @us_address, line_items, options)
94
+
95
+ assert response.success?
96
+ assert response.test?
97
+ assert_not_nil response.params['transaction_id']
98
+ assert_equal "1", response.params['total_orders']
99
+ assert_equal "0", response.params['total_items']
100
+ assert_equal "0", response.params['status']
101
+ assert_equal 'Successfully submitted the order', response.message
102
+ end
103
+
104
+ def test_invalid_credentials_during_inventory
105
+ shipwire = ShipwireService.new(
106
+ :login => 'your@email.com',
107
+ :password => 'password'
108
+ )
109
+
110
+ response = shipwire.fetch_stock_levels
111
+
112
+ assert !response.success?
113
+ assert response.test?
114
+ assert_equal 'Error', response.params['status']
115
+ assert_equal "Error with EmailAddress, valid email is required. There is an error in XML document.", response.message
116
+ end
117
+
118
+ def test_get_inventory
119
+ response = @shipwire.fetch_stock_levels
120
+ assert response.success?
121
+ assert response.test?
122
+ assert_equal 14, response.stock_levels["GD802-024"]
123
+ assert_equal 32, response.stock_levels["GD201-500"]
124
+ assert_equal "2", response.params["total_products"]
125
+ end
126
+
127
+ def test_fetch_tracking_numbers
128
+ response = @shipwire.fetch_tracking_numbers
129
+ assert response.success?
130
+ assert response.test?
131
+ assert_equal Hash.new, response.tracking_numbers
132
+ end
133
+
134
+ def test_valid_credentials
135
+ assert @shipwire.valid_credentials?
136
+ end
137
+
138
+ def test_invalid_credentials
139
+ service = ShipwireService.new(
140
+ :login => 'your@email.com',
141
+ :password => 'password'
142
+ )
143
+ assert !service.valid_credentials?
144
+ end
145
+ end
@@ -0,0 +1,80 @@
1
+ require 'test_helper'
2
+
3
+ class RemoteWebgistixTest < Test::Unit::TestCase
4
+ def setup
5
+ Base.mode = :test
6
+
7
+ @service = WebgistixService.new( fixtures(:webgistix) )
8
+
9
+ @options = {
10
+ :shipping_method => 'Ground',
11
+ :email => 'buyer@jadedpallet.com'
12
+ }
13
+
14
+ @address = { :name => 'Fred Brooks',
15
+ :address1 => '1234 Penny Lane',
16
+ :city => 'Jonsetown',
17
+ :state => 'NC',
18
+ :country => 'US',
19
+ :zip => '23456'
20
+ }
21
+
22
+ @line_items = [
23
+ { :sku => 'WX-01-4001',
24
+ :quantity => 2
25
+ }
26
+ ]
27
+
28
+ end
29
+
30
+ def test_successful_order_submission
31
+ response = @service.fulfill('123456', @address, @line_items, @options)
32
+ assert response.success?
33
+ assert response.test?
34
+ assert_equal WebgistixService::SUCCESS_MESSAGE, response.message
35
+ end
36
+
37
+ def test_order_multiple_line_items
38
+ @line_items.push(
39
+ { :sku => 'WX-01-1020',
40
+ :quantity => 3
41
+ }
42
+ )
43
+
44
+ response = @service.fulfill('123456', @address, @line_items, @options)
45
+ assert response.success?
46
+ assert response.test?
47
+ assert_equal WebgistixService::SUCCESS_MESSAGE, response.message
48
+ end
49
+
50
+ def test_invalid_sku_during_fulfillment
51
+ line_items = [ { :sku => 'invalid', :quantity => 1 } ]
52
+ response = @service.fulfill('123456', @address, line_items, @options)
53
+ assert !response.success?
54
+ assert response.test?
55
+ assert_equal WebgistixService::FAILURE_MESSAGE, response.message
56
+ end
57
+
58
+ def test_invalid_credentials_during_fulfillment
59
+ service = WebgistixService.new(
60
+ :login => 'your@email.com',
61
+ :password => 'password')
62
+
63
+ response = service.fulfill('123456', @address, @line_items, @options)
64
+ assert !response.success?
65
+ assert response.test?
66
+ assert_equal "Access Denied", response.message
67
+ end
68
+
69
+ def test_valid_credentials
70
+ assert @service.valid_credentials?
71
+ end
72
+
73
+ def test_invalid_credentials
74
+ service = WebgistixService.new(
75
+ :login => 'your@email.com',
76
+ :password => 'password')
77
+
78
+ assert !service.valid_credentials?
79
+ end
80
+ end
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
3
+
4
+ require 'test/unit'
5
+ require 'digest/md5'
6
+ require 'active_fulfillment'
7
+
8
+ begin
9
+ require 'mocha'
10
+ rescue LoadError
11
+ require 'rubygems'
12
+ require 'mocha'
13
+ end
14
+
15
+ module Test
16
+ module Unit
17
+ class TestCase
18
+ include ActiveMerchant::Fulfillment
19
+
20
+ LOCAL_CREDENTIALS = ENV['HOME'] + '/.active_merchant/fixtures.yml' unless defined?(LOCAL_CREDENTIALS)
21
+ DEFAULT_CREDENTIALS = File.dirname(__FILE__) + '/fixtures.yml' unless defined?(DEFAULT_CREDENTIALS)
22
+
23
+ def generate_order_id
24
+ md5 = Digest::MD5.new
25
+ now = Time.now
26
+ md5 << now.to_s
27
+ md5 << String(now.usec)
28
+ md5 << String(rand(0))
29
+ md5 << String($$)
30
+ md5 << self.class.name
31
+ md5.hexdigest
32
+ end
33
+
34
+ def all_fixtures
35
+ @@fixtures ||= load_fixtures
36
+ end
37
+
38
+ def fixtures(key)
39
+ data = all_fixtures[key] || raise(StandardError, "No fixture data was found for '#{key}'")
40
+
41
+ data.dup
42
+ end
43
+
44
+ def load_fixtures
45
+ file = File.exists?(LOCAL_CREDENTIALS) ? LOCAL_CREDENTIALS : DEFAULT_CREDENTIALS
46
+ yaml_data = YAML.load(File.read(file))
47
+ symbolize_keys(yaml_data)
48
+
49
+ yaml_data
50
+ end
51
+
52
+ def symbolize_keys(hash)
53
+ return unless hash.is_a?(Hash)
54
+
55
+ hash.symbolize_keys!
56
+ hash.each{|k,v| symbolize_keys(v)}
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ class BaseTest < Test::Unit::TestCase
4
+ include ActiveMerchant::Fulfillment
5
+
6
+ def test_get_shipwire_by_string
7
+ assert_equal ShipwireService, Base.service('shipwire')
8
+ end
9
+
10
+ def test_get_shipwire_by_name
11
+ assert_equal ShipwireService, Base.service(:shipwire)
12
+ end
13
+
14
+ def test_get_unknown_service
15
+ assert_raise(NameError){ Base.service(:polar_north) }
16
+ end
17
+ end
@@ -0,0 +1,187 @@
1
+ require 'test_helper'
2
+
3
+ class AmazonTest < Test::Unit::TestCase
4
+ def setup
5
+ @service = AmazonService.new(
6
+ :login => 'l',
7
+ :password => 'p'
8
+ )
9
+
10
+ @options = {
11
+ :shipping_method => 'Standard',
12
+ :order_date => Time.now.utc.yesterday,
13
+ :comment => "Delayed due to tornados"
14
+ }
15
+
16
+ @address = { :name => 'Johnny Chase',
17
+ :address1 => '100 Information Super Highway',
18
+ :address2 => 'Suite 66',
19
+ :city => 'Beverly Hills',
20
+ :state => 'CA',
21
+ :country => 'US',
22
+ :zip => '90210'
23
+ }
24
+
25
+ @line_items = [
26
+ { :sku => 'SETTLERS1',
27
+ :quantity => 1,
28
+ :comment => 'Awesome'
29
+ }
30
+ ]
31
+ end
32
+
33
+ def test_successful_fulfillment
34
+ @service.expects(:ssl_post).returns(successful_fulfillment_response)
35
+ response = @service.fulfill('12345678', @address, @line_items, @options)
36
+ assert response.success?
37
+ end
38
+
39
+ def test_invalid_arguments
40
+ http_response = build_mock_response(invalid_create_response, "", "500")
41
+ @service.expects(:ssl_post).raises(ActiveMerchant::ResponseError.new(http_response))
42
+ response = @service.fulfill('12345678', @address, @line_items, @options)
43
+ assert !response.success?
44
+ assert_equal "aws:Client.MissingParameter The request must contain the parameter Item.", response.params['response_comment']
45
+ end
46
+
47
+ def test_missing_order_comment
48
+ @options.delete(:comment)
49
+ assert_raise(ArgumentError) { @service.fulfill('12345678', @address, @line_items, @options) }
50
+ end
51
+
52
+ def test_missing_order_date
53
+ @options.delete(:order_date)
54
+ assert_raise(ArgumentError) { @service.fulfill('12345678', @address, @line_items, @options) }
55
+ end
56
+
57
+ def test_missing_shipping_method
58
+ @options.delete(:shipping_method)
59
+ assert_raise(ArgumentError) { @service.fulfill('12345678', @address, @line_items, @options) }
60
+ end
61
+
62
+ def test_404_error
63
+ http_response = build_mock_response(response_from_404, "Not Found", "404")
64
+ @service.expects(:ssl_post).raises(ActiveMerchant::ResponseError.new(http_response))
65
+
66
+ response = @service.fulfill('12345678', @address, @line_items, @options)
67
+ assert !response.success?
68
+ assert_equal "404: Not Found", response.message
69
+ assert_equal "404", response.params["http_code"]
70
+ assert_equal "Not Found", response.params["http_message"]
71
+ assert_equal response_from_404, response.params["http_body"]
72
+ end
73
+
74
+ def test_soap_fault
75
+ http_response = build_mock_response(invalid_create_response, "500", "")
76
+ @service.expects(:ssl_post).raises(ActiveMerchant::ResponseError.new(http_response))
77
+
78
+ response = @service.fulfill('12345678', @address, @line_items, @options)
79
+ assert !response.success?
80
+ assert_equal 'aws:Client.MissingParameter', response.params['faultcode']
81
+ assert_equal 'The request must contain the parameter Item.', response.params['faultstring']
82
+ assert_equal 'aws:Client.MissingParameter The request must contain the parameter Item.', response.message
83
+ end
84
+
85
+ def test_valid_credentials
86
+ @service.expects(:ssl_post).returns(successful_status_response)
87
+ assert @service.valid_credentials?
88
+ end
89
+
90
+ def test_invalid_credentials
91
+ http_response = build_mock_response(invalid_login_response, "500", "")
92
+ @service.expects(:ssl_post).raises(ActiveMerchant::ResponseError.new(http_response))
93
+ assert !@service.valid_credentials?
94
+ end
95
+
96
+ def test_successful_service_status
97
+ @service.expects(:ssl_request).returns(successful_status_response)
98
+
99
+ response = @service.status
100
+ assert response.success?
101
+ end
102
+
103
+ private
104
+
105
+ def build_mock_response(response, message, code = "200")
106
+ http_response = mock(:code => code, :message => message)
107
+ http_response.stubs(:body).returns(response)
108
+ http_response
109
+ end
110
+
111
+ def response_for_empty_request
112
+ '<ns:GetErrorResponse xmlns:ns="http://xino.amazonaws.com/doc/"><ns:Error><ns:Code>MissingDateHeader</ns:Code><ns:Message>Authorized request must have a "date" or "x-amz-date" header.</ns:Message></ns:Error><ns:RequestID>79ceaffe-e5a3-46a5-b36a-9ce958d68939</ns:RequestID></ns:GetErrorResponse>'
113
+ end
114
+
115
+
116
+ def invalid_login_response
117
+ <<-XML
118
+ <?xml version="1.0"?>
119
+ <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aws="http://webservices.amazon.com/AWSFault/2005-15-09">
120
+ <env:Body>
121
+ <env:Fault>
122
+ <faultcode>aws:Client.InvalidClientTokenId</faultcode>
123
+ <faultstring>The AWS Access Key Id you provided does not exist in our records.</faultstring>
124
+ <detail>
125
+ <aws:RequestId xmlns:aws="http://webservices.amazon.com/AWSFault/2005-15-09">51de28ce-c380-46c4-bf95-62bbf8cc4682</aws:RequestId>
126
+ </detail>
127
+ </env:Fault>
128
+ </env:Body>
129
+ </env:Envelope>
130
+ XML
131
+ end
132
+
133
+ def invalid_create_response
134
+ <<-XML
135
+ <?xml version="1.0"?>
136
+ <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aws="http://webservices.amazon.com/AWSFault/2005-15-09">
137
+ <env:Body>
138
+ <env:Fault>
139
+ <faultcode>aws:Client.MissingParameter</faultcode>
140
+ <faultstring>The request must contain the parameter Item.</faultstring>
141
+ <detail>
142
+ <aws:RequestId xmlns:aws="http://webservices.amazon.com/AWSFault/2005-15-09">edc852d3-937f-40f5-9d72-97b7da897b38</aws:RequestId>
143
+ </detail>
144
+ </env:Fault>
145
+ </env:Body>
146
+ </env:Envelope>
147
+ XML
148
+ end
149
+
150
+ def response_from_404
151
+ '<html><head><title>Apache Tomcat/5.5.9 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 404 - Servlet XinoServlet is not available</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Servlet XinoServlet is not available</u></p><p><b>description</b> <u>The requested resource (Servlet XinoServlet is not available) is not available.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/5.5.9</h3></body></html>'
152
+ end
153
+
154
+ def successful_fulfillment_response
155
+ <<-XML
156
+ <?xml version="1.0"?>
157
+ <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
158
+ <env:Body>
159
+ <ns1:CreateFulfillmentOrderResponse xmlns:ns1="http://fba-outbound.amazonaws.com/doc/2007-08-02/">
160
+ <ns1:ResponseMetadata>
161
+ <ns1:RequestId>ccd0116d-a476-48ac-810e-778eebe5e5e2</ns1:RequestId>
162
+ </ns1:ResponseMetadata>
163
+ </ns1:CreateFulfillmentOrderResponse>
164
+ </env:Body>
165
+ </env:Envelope>
166
+ XML
167
+ end
168
+
169
+
170
+ def successful_status_response
171
+ <<-XML
172
+ <?xml version="1.0"?>
173
+ <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
174
+ <env:Body>
175
+ <ns1:GetServiceStatusResponse xmlns:ns1="http://fba-outbound.amazonaws.com/doc/2007-08-02/">
176
+ <ns1:GetServiceStatusResult>
177
+ <ns1:Status>2009-06-05T18:36:19Z service available [Version: 2007-08-02]</ns1:Status>
178
+ </ns1:GetServiceStatusResult>
179
+ <ns1:ResponseMetadata>
180
+ <ns1:RequestId>1e04fabc-fbaa-4ae5-836a-f0c60f1d301a</ns1:RequestId>
181
+ </ns1:ResponseMetadata>
182
+ </ns1:GetServiceStatusResponse>
183
+ </env:Body>
184
+ </env:Envelope>
185
+ XML
186
+ end
187
+ end