shipcloud 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-style.yml +31 -4
- data/.travis.yml +0 -1
- data/CHANGELOG.md +25 -0
- data/README.md +22 -5
- data/lib/shipcloud.rb +6 -10
- data/lib/shipcloud/operations/all.rb +6 -2
- data/lib/shipcloud/operations/create.rb +4 -2
- data/lib/shipcloud/operations/delete.rb +4 -2
- data/lib/shipcloud/operations/find.rb +4 -2
- data/lib/shipcloud/operations/update.rb +8 -4
- data/lib/shipcloud/request/base.rb +11 -10
- data/lib/shipcloud/request/connection.rb +1 -1
- data/lib/shipcloud/request/info.rb +3 -2
- data/lib/shipcloud/shipcloud_error.rb +66 -0
- data/lib/shipcloud/version.rb +1 -1
- data/spec/shipcloud/address_spec.rb +45 -41
- data/spec/shipcloud/carrier_spec.rb +4 -4
- data/spec/shipcloud/request/base_spec.rb +49 -13
- data/spec/shipcloud/shipcloud_error_spec.rb +125 -0
- data/spec/shipcloud/shipment_quote_spec.rb +1 -1
- data/spec/shipcloud/shipment_spec.rb +12 -8
- data/spec/shipcloud/webhooks_spec.rb +7 -5
- data/spec/shipcloud_spec.rb +14 -0
- metadata +4 -4
- data/lib/shipcloud/request/validator.rb +0 -33
- data/spec/shipcloud/request/validator_spec.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1af501886ebceb1740604bdc3216bac732bfd3a
|
4
|
+
data.tar.gz: b0eb7b46245cab6d030a7dc4ec268ad2198cc117
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f84e3710264fe699fde827fa9393bb54fa1d054385f8c966da2238898ec9ccfe9b424399e35630c98c89d9e7375fef97d1745d7178087a3030c3267d6e1051f7
|
7
|
+
data.tar.gz: 5efa177ecb0085b8dee951c02032b4b874f26c3a85df5ba07920d399c0bf048b2ab2434b75ec3429802a65469195ad03c7f533d4bf39d9c8b1445d45b64367f4
|
data/.ruby-style.yml
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
AllCops:
|
2
|
-
RunRailsCops: true
|
3
2
|
Exclude:
|
4
3
|
- "vendor/**/*"
|
5
4
|
- "db/schema.rb"
|
6
5
|
UseCache: false
|
6
|
+
Rails:
|
7
|
+
Enabled: true
|
7
8
|
Rails/FindBy:
|
8
9
|
Enabled: false
|
9
10
|
Metrics/LineLength:
|
@@ -30,6 +31,21 @@ Style/FileName:
|
|
30
31
|
StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files
|
31
32
|
Enabled: false
|
32
33
|
Exclude: []
|
34
|
+
Style/FirstArrayElementLineBreak:
|
35
|
+
Description: >-
|
36
|
+
Checks for a line break before the first element in a
|
37
|
+
multi-line array.
|
38
|
+
Enabled: true
|
39
|
+
Style/FirstHashElementLineBreak:
|
40
|
+
Description: >-
|
41
|
+
Checks for a line break before the first element in a
|
42
|
+
multi-line hash.
|
43
|
+
Enabled: true
|
44
|
+
Style/FirstMethodArgumentLineBreak:
|
45
|
+
Description: >-
|
46
|
+
Checks for a line break before the first argument in a
|
47
|
+
multi-line method call.
|
48
|
+
Enabled: true
|
33
49
|
Style/GuardClause:
|
34
50
|
Description: Check for conditionals that can be replaced with guard clauses
|
35
51
|
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals
|
@@ -118,13 +134,24 @@ Style/StringLiteralsInInterpolation:
|
|
118
134
|
SupportedStyles:
|
119
135
|
- single_quotes
|
120
136
|
- double_quotes
|
121
|
-
Style/
|
122
|
-
Description: Checks for trailing comma in
|
123
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas
|
137
|
+
Style/TrailingCommaInArguments:
|
138
|
+
Description: 'Checks for trailing comma in argument lists.'
|
139
|
+
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
|
140
|
+
Enabled: false
|
141
|
+
EnforcedStyleForMultiline: no_comma
|
142
|
+
SupportedStyles:
|
143
|
+
- comma
|
144
|
+
- consistent_comma
|
145
|
+
- no_comma
|
146
|
+
Style/TrailingCommaInLiteral:
|
147
|
+
Description: 'Checks for trailing comma in array and hash literals.'
|
148
|
+
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
|
124
149
|
Enabled: false
|
125
150
|
EnforcedStyleForMultiline: no_comma
|
126
151
|
SupportedStyles:
|
127
152
|
- comma
|
153
|
+
- consistent_comma
|
154
|
+
- no_comma
|
128
155
|
Metrics/AbcSize:
|
129
156
|
Description: A calculated magnitude based on number of assignments, branches, and
|
130
157
|
conditions.
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
## [Unreleased]
|
2
|
+
### Added
|
3
|
+
|
4
|
+
### Removed
|
5
|
+
|
6
|
+
### Changed
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
|
10
|
+
## [0.7.0] - 2016-01-21
|
11
|
+
### Added
|
12
|
+
- Add the possibility to specify the api key on every request. (#8)
|
13
|
+
- Add some more specific error classes ```Shipcloud::ClientError```,```Shipcloud::ServerError```,
|
14
|
+
```Shipcloud::InvalidRequestError```, ```Shipcloud::TooManyRequests``` and ```Shipcloud::NotFoundError``` (#11).
|
15
|
+
- Access to the entire response and error descriptions from the error object (#11).
|
16
|
+
|
17
|
+
### Removed
|
18
|
+
- Removed the following ruby versions from travis-ci test runs:
|
19
|
+
- jruby-9.0.0.0
|
20
|
+
- Removed ```Shipcloud::APIError``` in preference to more granular error classes (#11).
|
21
|
+
|
22
|
+
### Changed
|
23
|
+
|
24
|
+
### Fixed
|
25
|
+
|
1
26
|
## [0.6.0] - 2016-01-21
|
2
27
|
### Added
|
3
28
|
- This CHANGELOG file (Following "[Keep a CHANGELOG](http://keepachangelog.com/)")
|
data/README.md
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
|
5
5
|
A Ruby wrapper for the shipcloud API
|
6
6
|
|
7
|
+
We have dropped the support of jruby-9, because there is an issue with mixing hash and keyword arguments (https://github.com/jruby/jruby/issues/3138). When this issue is fixed, we will support jruby-9 again.
|
8
|
+
|
7
9
|
## Installation
|
8
10
|
|
9
11
|
Add this line to your application's Gemfile:
|
@@ -20,27 +22,42 @@ Or install it yourself as:
|
|
20
22
|
|
21
23
|
## Usage
|
22
24
|
|
23
|
-
Before using the shipcloud API, you
|
25
|
+
Before using the shipcloud API, you may want to set the API access key.
|
24
26
|
|
25
|
-
```
|
27
|
+
```ruby
|
26
28
|
Shipcloud.api_key = 'your-api-key-goes-here'
|
27
29
|
```
|
28
30
|
|
29
31
|
Since Version 0.4.0, you can also do this via a configuration block, e.g. in an initializer:
|
30
32
|
|
31
|
-
```
|
33
|
+
```ruby
|
32
34
|
Shipcloud.configure do |config|
|
33
35
|
config.api_key = 'your-api-key-goes-here'
|
34
36
|
end
|
35
37
|
```
|
36
38
|
|
39
|
+
You can also pass the API key with each request:
|
40
|
+
```ruby
|
41
|
+
Shipcloud::Shipment.create(
|
42
|
+
{
|
43
|
+
carrier: 'ups',
|
44
|
+
from: from-address-params,
|
45
|
+
to: to-address-params,
|
46
|
+
package: package-params,
|
47
|
+
create_shipping_label: true
|
48
|
+
},
|
49
|
+
api_key: "your-api-key"
|
50
|
+
)
|
51
|
+
```
|
52
|
+
If you pass in the ```api_key``` option, the value will be used as API key for the current request, even if you have set the ```Shipcloud.api_key``` before.
|
53
|
+
|
37
54
|
You can sign up for a developer account at *[shipcloud.io](http://www.shipcloud.io)*
|
38
55
|
|
39
56
|
### Create a new shipment
|
40
57
|
|
41
58
|
To create a new Shipment on the shipclod platform, you need to provide the name of the carrier, to- and from-address, and the package dimensions.
|
42
59
|
For details, see *[shipcloud API documentation on Shipments](http://developers.shipcloud.io/reference/#shipments)*
|
43
|
-
```
|
60
|
+
```ruby
|
44
61
|
Shipcloud::Shipment.create(
|
45
62
|
carrier: 'ups',
|
46
63
|
from: from-address-params,
|
@@ -52,7 +69,7 @@ Shipcloud::Shipment.create(
|
|
52
69
|
|
53
70
|
`Shipment#create` will return shipping label and tracking information, encapsulated in a `Shipcloud::Shipment` object:
|
54
71
|
|
55
|
-
```
|
72
|
+
```ruby
|
56
73
|
shipment = Shipcloud::Shipment.create(...) # parameters ommitted
|
57
74
|
shipment.tracking_url # -> http://track.shipcloud.io/uzdgu22z3ed12
|
58
75
|
```
|
data/lib/shipcloud.rb
CHANGED
@@ -2,6 +2,7 @@ require "net/http"
|
|
2
2
|
require "net/https"
|
3
3
|
require "json"
|
4
4
|
require "shipcloud/version"
|
5
|
+
require "shipcloud/shipcloud_error"
|
5
6
|
|
6
7
|
module Shipcloud
|
7
8
|
API_VERSION = "v1"
|
@@ -12,8 +13,6 @@ module Shipcloud
|
|
12
13
|
"User-Agent" => "shipcloud-ruby v#{Shipcloud::VERSION}, API #{Shipcloud::API_VERSION}, #{RUBY_VERSION}, #{RUBY_PLATFORM}, #{RUBY_PATCHLEVEL}"
|
13
14
|
}
|
14
15
|
|
15
|
-
@@api_key = nil
|
16
|
-
|
17
16
|
autoload :Base, "shipcloud/base"
|
18
17
|
autoload :Shipment, "shipcloud/shipment"
|
19
18
|
autoload :Carrier, "shipcloud/carrier"
|
@@ -33,13 +32,8 @@ module Shipcloud
|
|
33
32
|
autoload :Base, "shipcloud/request/base"
|
34
33
|
autoload :Connection, "shipcloud/request/connection"
|
35
34
|
autoload :Info, "shipcloud/request/info"
|
36
|
-
autoload :Validator, "shipcloud/request/validator"
|
37
35
|
end
|
38
36
|
|
39
|
-
class ShipcloudError < StandardError; end
|
40
|
-
class AuthenticationError < ShipcloudError; end
|
41
|
-
class APIError < ShipcloudError; end
|
42
|
-
|
43
37
|
class << self
|
44
38
|
attr_accessor :configuration
|
45
39
|
end
|
@@ -75,7 +69,6 @@ module Shipcloud
|
|
75
69
|
#
|
76
70
|
# @param [String] api_key The api key
|
77
71
|
def self.api_key=(api_key)
|
78
|
-
@@api_key = api_key
|
79
72
|
configuration.api_key = api_key
|
80
73
|
end
|
81
74
|
|
@@ -84,9 +77,12 @@ module Shipcloud
|
|
84
77
|
# @param [Symbol] http_method The http method to use, must be one of :get, :post, :put and :delete
|
85
78
|
# @param [String] api_url The API url to use
|
86
79
|
# @param [Hash] data The data to send, e.g. used when creating new objects.
|
80
|
+
# @param [String] optional api_key The api key. If no api key is given, Shipcloud.api_key will
|
81
|
+
# be used for the request
|
87
82
|
# @return [Array] The parsed JSON response.
|
88
|
-
def self.request(http_method, api_url, data)
|
89
|
-
|
83
|
+
def self.request(http_method, api_url, data, api_key: nil)
|
84
|
+
api_key ||= Shipcloud.api_key
|
85
|
+
info = Request::Info.new(http_method, api_url, api_key, data)
|
90
86
|
Request::Base.new(info).perform
|
91
87
|
end
|
92
88
|
end
|
@@ -3,8 +3,12 @@ module Shipcloud
|
|
3
3
|
module All
|
4
4
|
module ClassMethods
|
5
5
|
# Loads all Objects of the resource
|
6
|
-
|
7
|
-
|
6
|
+
# @param [Hash] optional filter Filter the shipments list using one or more filter
|
7
|
+
# creteria
|
8
|
+
# @param [String] optional api_key The api key. If no api key is given, Shipcloud.api_key
|
9
|
+
# will be used for the request
|
10
|
+
def all(filter = {}, api_key: nil)
|
11
|
+
response = Shipcloud.request(:get, base_url, filter, api_key: api_key)
|
8
12
|
if index_response_root
|
9
13
|
response = response.fetch(index_response_root, [])
|
10
14
|
end
|
@@ -5,8 +5,10 @@ module Shipcloud
|
|
5
5
|
# Creates a new object
|
6
6
|
#
|
7
7
|
# @param [Hash] attributes The attributes of the created object
|
8
|
-
|
9
|
-
|
8
|
+
# @param \[String\] optional api_key The api key. If no api key is given, Shipcloud.api_key
|
9
|
+
# will be used for the request
|
10
|
+
def create(attributes, api_key: nil)
|
11
|
+
response = Shipcloud.request(:post, base_url, attributes, api_key: api_key)
|
10
12
|
if create_response_root
|
11
13
|
response = response.fetch(create_response_root, {})
|
12
14
|
end
|
@@ -5,8 +5,10 @@ module Shipcloud
|
|
5
5
|
# Deletes the given object
|
6
6
|
#
|
7
7
|
# @param [String] id The id of the object that gets deleted
|
8
|
-
|
9
|
-
|
8
|
+
# @param \[String\] optional api_key The api key. If no api key is given, Shipcloud.api_key
|
9
|
+
# will be used for the request
|
10
|
+
def delete(id, api_key: nil)
|
11
|
+
Shipcloud.request(:delete, "#{base_url}/#{id}", {}, api_key: api_key)
|
10
12
|
true
|
11
13
|
end
|
12
14
|
end
|
@@ -5,9 +5,11 @@ module Shipcloud
|
|
5
5
|
# Finds a given object
|
6
6
|
#
|
7
7
|
# @param [String] id The id of the object that should be found
|
8
|
+
# @param \[String\] optional api_key The api key. If no api key is given, Shipcloud.api_key
|
9
|
+
# will be used for the request
|
8
10
|
# @return [Shipcloud::Base] The found object
|
9
|
-
def find(id)
|
10
|
-
response = Shipcloud.request(:get, "#{base_url}/#{id}", {})
|
11
|
+
def find(id, api_key: nil)
|
12
|
+
response = Shipcloud.request(:get, "#{base_url}/#{id}", {}, api_key: api_key)
|
11
13
|
self.new(response)
|
12
14
|
end
|
13
15
|
end
|
@@ -6,8 +6,10 @@ module Shipcloud
|
|
6
6
|
# Updates a object
|
7
7
|
# @param [String] id The id of the object that should be updated
|
8
8
|
# @param [Hash] attributes The attributes that should be updated
|
9
|
-
|
10
|
-
|
9
|
+
# @param \[String\] optional api_key The api key. If no api key is given, Shipcloud.api_key
|
10
|
+
# will be used for the request
|
11
|
+
def update(id, attributes, api_key: nil)
|
12
|
+
response = Shipcloud.request(:put, "#{base_url}/#{id}", attributes, api_key: api_key)
|
11
13
|
self.new(response)
|
12
14
|
end
|
13
15
|
end
|
@@ -19,8 +21,10 @@ module Shipcloud
|
|
19
21
|
# Updates a object
|
20
22
|
#
|
21
23
|
# @param [Hash] attributes The attributes that should be updated
|
22
|
-
|
23
|
-
|
24
|
+
# @param \[String\] optional api_key The api key. If no api key is given, Shipcloud.api_key
|
25
|
+
# will be used for the request
|
26
|
+
def update(attributes, api_key: nil)
|
27
|
+
response = Shipcloud.request(:put, "#{base_url}/#{id}", attributes, api_key: api_key)
|
24
28
|
set_attributes(response)
|
25
29
|
end
|
26
30
|
end
|
@@ -2,32 +2,33 @@ module Shipcloud
|
|
2
2
|
module Request
|
3
3
|
class Base
|
4
4
|
attr_reader :info
|
5
|
-
attr_accessor :response
|
6
5
|
|
7
6
|
def initialize(info)
|
8
7
|
@info = info
|
9
8
|
end
|
10
9
|
|
11
10
|
def perform
|
12
|
-
raise AuthenticationError
|
11
|
+
raise AuthenticationError unless @info.api_key
|
13
12
|
connection.setup_https
|
14
|
-
|
15
|
-
|
13
|
+
response = connection.request
|
14
|
+
validate_response(response)
|
15
|
+
JSON.parse(response.body)
|
16
|
+
rescue JSON::ParserError
|
17
|
+
raise ShipcloudError.new(response)
|
16
18
|
end
|
17
19
|
|
18
20
|
protected
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
+
def validate_response(response)
|
23
|
+
error = ShipcloudError.from_response(response)
|
24
|
+
if error
|
25
|
+
raise error
|
26
|
+
end
|
22
27
|
end
|
23
28
|
|
24
29
|
def connection
|
25
30
|
@connection ||= Connection.new(info)
|
26
31
|
end
|
27
|
-
|
28
|
-
def validator
|
29
|
-
@validator ||= Validator.new(info)
|
30
|
-
end
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
@@ -38,7 +38,7 @@ module Shipcloud
|
|
38
38
|
else
|
39
39
|
Net::HTTP::Get.new(@info.path_with_params(@info.url, @info.data), API_HEADERS)
|
40
40
|
end
|
41
|
-
https_request.basic_auth(
|
41
|
+
https_request.basic_auth(@info.api_key, "")
|
42
42
|
https_request.body = @info.data.to_json if [:post, :put].include?(@info.http_method)
|
43
43
|
https_request
|
44
44
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module Shipcloud
|
2
2
|
module Request
|
3
3
|
class Info
|
4
|
-
attr_accessor :http_method, :api_url, :data
|
4
|
+
attr_accessor :http_method, :api_url, :api_key, :data
|
5
5
|
|
6
|
-
def initialize(http_method, api_url, data)
|
6
|
+
def initialize(http_method, api_url, api_key, data)
|
7
|
+
@api_key = api_key
|
7
8
|
@http_method = http_method
|
8
9
|
@api_url = api_url
|
9
10
|
@data = data
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Shipcloud
|
2
|
+
class ShipcloudError < StandardError
|
3
|
+
attr_reader :errors, :response
|
4
|
+
|
5
|
+
def initialize(response = nil)
|
6
|
+
@response = response
|
7
|
+
@errors = parse_errors
|
8
|
+
error_message = errors.empty? ? response_body : errors
|
9
|
+
super(error_message)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns the appropriate Shipcloud::ShipcloudError subclass based
|
13
|
+
# on status code
|
14
|
+
#
|
15
|
+
# @param [HTTPResponse] response HTTP response
|
16
|
+
# @return [Shipcloud::ShipcloudError]
|
17
|
+
def self.from_response(response)
|
18
|
+
response_code = response.code.to_i
|
19
|
+
if error_class = error_class_for(response_code)
|
20
|
+
error_class.new(response)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.error_class_for(response_code)
|
25
|
+
case response_code
|
26
|
+
when 400, 422 then InvalidRequestError
|
27
|
+
when 401 then AuthenticationError
|
28
|
+
when 402 then TooManyRequests
|
29
|
+
when 404 then NotFoundError
|
30
|
+
when 400..499 then ClientError
|
31
|
+
when 500..599 then ServerError
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private_class_method :error_class_for
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def parse_errors
|
40
|
+
return [] unless response_body
|
41
|
+
data = JSON.parse(response_body)
|
42
|
+
if data.is_a?(Hash) && data["errors"]
|
43
|
+
data["errors"]
|
44
|
+
else
|
45
|
+
[]
|
46
|
+
end
|
47
|
+
rescue JSON::ParserError
|
48
|
+
[]
|
49
|
+
end
|
50
|
+
|
51
|
+
def response_body
|
52
|
+
return unless @response
|
53
|
+
@response.body
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Raised on errors in the 400-499 range
|
58
|
+
class ClientError < ShipcloudError; end
|
59
|
+
class AuthenticationError < ClientError; end
|
60
|
+
class InvalidRequestError < ClientError; end
|
61
|
+
class TooManyRequests < ClientError; end
|
62
|
+
class NotFoundError < ClientError; end
|
63
|
+
|
64
|
+
# Raised on errors in the 500-599 range
|
65
|
+
class ServerError < ShipcloudError; end
|
66
|
+
end
|
data/lib/shipcloud/version.rb
CHANGED
@@ -35,31 +35,35 @@ describe Shipcloud::Address do
|
|
35
35
|
|
36
36
|
describe '.create' do
|
37
37
|
it 'makes a new POST request using the correct API endpoint' do
|
38
|
-
Shipcloud.
|
38
|
+
expect(Shipcloud).to receive(:request).
|
39
|
+
with(:post, "addresses", valid_attributes, api_key: nil).and_return("data" => {})
|
40
|
+
|
39
41
|
Shipcloud::Address.create(valid_attributes)
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
43
45
|
describe '.find' do
|
44
46
|
it 'makes a new GET request using the correct API endpoint to receive a specific address' do
|
45
|
-
Shipcloud.
|
46
|
-
:get,
|
47
|
-
|
47
|
+
expect(Shipcloud).to receive(:request).with(
|
48
|
+
:get, "addresses/123", {}, api_key: nil).and_return("id" => "123")
|
49
|
+
|
50
|
+
Shipcloud::Address.find("123")
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
51
54
|
describe '.update' do
|
52
55
|
it 'makes a new PUT request using the correct API endpoint' do
|
53
|
-
Shipcloud.
|
54
|
-
:put,
|
55
|
-
|
56
|
+
expect(Shipcloud).to receive(:request).with(
|
57
|
+
:put, "addresses/123", { street: "Mittelweg" }, api_key: nil).and_return("data" => {})
|
58
|
+
|
59
|
+
Shipcloud::Address.update("123", street: "Mittelweg")
|
56
60
|
end
|
57
61
|
end
|
58
62
|
|
59
63
|
describe '.all' do
|
60
64
|
it 'makes a new Get request using the correct API endpoint' do
|
61
65
|
expect(Shipcloud).to receive(:request).
|
62
|
-
with(:get,
|
66
|
+
with(:get, "addresses", {}, api_key: nil).and_return([])
|
63
67
|
|
64
68
|
Shipcloud::Address.all
|
65
69
|
end
|
@@ -77,38 +81,38 @@ describe Shipcloud::Address do
|
|
77
81
|
|
78
82
|
def stub_addresses_request
|
79
83
|
allow(Shipcloud).to receive(:request).
|
80
|
-
with(:get,
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
84
|
+
with(:get, "addresses", {}, api_key: nil).
|
85
|
+
and_return(
|
86
|
+
[
|
87
|
+
{
|
88
|
+
"id" => "1c81efb7-9b95-4dd8-92e3-cac1bca3df6f",
|
89
|
+
"company" => "",
|
90
|
+
"first_name" => "Max",
|
91
|
+
"last_name" => "Mustermann",
|
92
|
+
"care_of" => "",
|
93
|
+
"street" => "Musterstraße",
|
94
|
+
"street_no" => "42",
|
95
|
+
"zip_code" => "12345",
|
96
|
+
"city" => "Musterstadt",
|
97
|
+
"state" => "",
|
98
|
+
"country" => "DE",
|
99
|
+
"phone" => ""
|
100
|
+
},
|
101
|
+
{
|
102
|
+
"id" => "7ea2a290-b456-4ecf-9010-e82b3da298f0",
|
103
|
+
"company" => "Muster-Company",
|
104
|
+
"first_name" => "Max",
|
105
|
+
"last_name" => "Mustermann",
|
106
|
+
"care_of" => "",
|
107
|
+
"street" => "Musterstraße",
|
108
|
+
"street_no" => "42",
|
109
|
+
"zip_code" => "54321",
|
110
|
+
"city" => "Musterstadt",
|
111
|
+
"state" => "",
|
112
|
+
"country" => "DE",
|
113
|
+
"phone" => ""
|
114
|
+
}
|
115
|
+
]
|
116
|
+
)
|
113
117
|
end
|
114
118
|
end
|
@@ -24,7 +24,7 @@ describe Shipcloud::Carrier do
|
|
24
24
|
describe '.all' do
|
25
25
|
it 'makes a new Get request using the correct API endpoint' do
|
26
26
|
expect(Shipcloud).to receive(:request).
|
27
|
-
with(:get,
|
27
|
+
with(:get, "carriers", {}, api_key: nil).and_return([])
|
28
28
|
|
29
29
|
Shipcloud::Carrier.all
|
30
30
|
end
|
@@ -69,9 +69,9 @@ describe Shipcloud::Carrier do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def stub_carriers_request
|
72
|
-
allow(Shipcloud).to receive(:request)
|
73
|
-
|
74
|
-
|
72
|
+
allow(Shipcloud).to receive(:request).
|
73
|
+
with(:get, "carriers", {}, api_key: nil).
|
74
|
+
and_return(
|
75
75
|
[
|
76
76
|
{
|
77
77
|
'name' => 'carrier_1',
|
@@ -3,25 +3,61 @@ require "spec_helper"
|
|
3
3
|
describe Shipcloud::Request::Base do
|
4
4
|
context "#perform" do
|
5
5
|
it "checks for an api key" do
|
6
|
-
Shipcloud.
|
6
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", nil, {})
|
7
7
|
|
8
8
|
expect{
|
9
|
-
Shipcloud::Request::Base.new(
|
9
|
+
Shipcloud::Request::Base.new(info).perform
|
10
10
|
}.to raise_error Shipcloud::AuthenticationError
|
11
11
|
end
|
12
12
|
|
13
|
-
it "performs an https request" do
|
14
|
-
|
15
|
-
connection
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
it "performs an https request and returns a response hash" do
|
14
|
+
connection = double
|
15
|
+
expect(Shipcloud::Request::Connection).to receive(:new).and_return(connection)
|
16
|
+
expect(connection).to receive(:setup_https)
|
17
|
+
response = double(code: "200", body: { id: 1 }.to_json)
|
18
|
+
expect(connection).to receive(:request).and_return(response)
|
19
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", "api_key", {})
|
19
20
|
|
20
|
-
|
21
|
-
connection.should_receive(:request)
|
22
|
-
validator.should_receive(:validated_data_for)
|
21
|
+
data = Shipcloud::Request::Base.new(info).perform
|
23
22
|
|
24
|
-
|
23
|
+
expect(data).to eq("id" => 1)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "performs an https request and raises an Shipcloud::ClientError if the response "\
|
27
|
+
"has a 400 status code" do
|
28
|
+
connection = double
|
29
|
+
expect(Shipcloud::Request::Connection).to receive(:new).and_return(connection)
|
30
|
+
expect(connection).to receive(:setup_https)
|
31
|
+
response = double(code: "400", body: { id: 1 }.to_json)
|
32
|
+
expect(connection).to receive(:request).and_return(response)
|
33
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", "api_key", {})
|
34
|
+
|
35
|
+
expect { Shipcloud::Request::Base.new(info).perform }.to raise_error(Shipcloud::ClientError)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "performs an https request and raises an Shipcloud::ServerError if the response "\
|
39
|
+
"has a 500 status code" do
|
40
|
+
connection = double
|
41
|
+
expect(Shipcloud::Request::Connection).to receive(:new).and_return(connection)
|
42
|
+
expect(connection).to receive(:setup_https)
|
43
|
+
response = double(code: "500", body: { id: 1 }.to_json)
|
44
|
+
expect(connection).to receive(:request).and_return(response)
|
45
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", "api_key", {})
|
46
|
+
|
47
|
+
expect { Shipcloud::Request::Base.new(info).perform }.to raise_error(Shipcloud::ServerError)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "performs an https request and raises an Shipcloud::ShipcloudError if the body of the "\
|
51
|
+
"response is not in JSON" do
|
52
|
+
connection = double
|
53
|
+
expect(Shipcloud::Request::Connection).to receive(:new).and_return(connection)
|
54
|
+
expect(connection).to receive(:setup_https)
|
55
|
+
response = double(code: "200", body: "no json")
|
56
|
+
expect(connection).to receive(:request).and_return(response)
|
57
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", "api_key", {})
|
58
|
+
|
59
|
+
expect { Shipcloud::Request::Base.new(info).perform }.
|
60
|
+
to raise_error(Shipcloud::ShipcloudError)
|
25
61
|
end
|
26
62
|
end
|
27
|
-
end
|
63
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Shipcloud::ShipcloudError do
|
4
|
+
describe ".from_response" do
|
5
|
+
context "with a response with status code 400" do
|
6
|
+
it "returns a Shipcloud::InvalidRequestError" do
|
7
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 400))).to be_a(
|
8
|
+
Shipcloud::InvalidRequestError
|
9
|
+
)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with a response with status code 422" do
|
14
|
+
it "returns a Shipcloud::InvalidRequestError" do
|
15
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 422))).to be_a(
|
16
|
+
Shipcloud::InvalidRequestError
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with a response with status code 401" do
|
22
|
+
it "returns a Shipcloud::AuthenticationError" do
|
23
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 401))).to be_a(
|
24
|
+
Shipcloud::AuthenticationError
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "with a response with status code 402" do
|
30
|
+
it "returns a Shipcloud::TooManyRequests" do
|
31
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 402))).to be_a(
|
32
|
+
Shipcloud::TooManyRequests
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with a response with status code 404" do
|
38
|
+
it "returns a Shipcloud::NotFoundError" do
|
39
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 404))).to be_a(
|
40
|
+
Shipcloud::NotFoundError
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "with a response with a 4xx status code" do
|
46
|
+
it "returns a Shipcloud::ClientError" do
|
47
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 400))).to be_a(
|
48
|
+
Shipcloud::ClientError
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "with a response with a 5xx status code" do
|
54
|
+
it "returns a Shipcloud::ClientError" do
|
55
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 500))).to be_a(
|
56
|
+
Shipcloud::ServerError
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with a 200 response" do
|
62
|
+
it "returns nil" do
|
63
|
+
expect(Shipcloud::ShipcloudError.from_response(build_response(status_code: 200))).to be_nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#message" do
|
69
|
+
context "with an errors node in the response body" do
|
70
|
+
it "returns the errors formated as one string" do
|
71
|
+
errors = ["error 1", "error 2"]
|
72
|
+
response = build_response(body: { errors: errors }.to_json)
|
73
|
+
error = Shipcloud::ShipcloudError.new(response)
|
74
|
+
|
75
|
+
expect(error.message).to eq '["error 1", "error 2"]'
|
76
|
+
end
|
77
|
+
end
|
78
|
+
context "without an errors node in the response body" do
|
79
|
+
it "returns the body of the response" do
|
80
|
+
error = Shipcloud::ShipcloudError.new(build_response(body: "test"))
|
81
|
+
|
82
|
+
expect(error.message).to eq "test"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#errors" do
|
88
|
+
it "returns the errors node of the response" do
|
89
|
+
errors = ["error 1", "error 2"]
|
90
|
+
response = build_response(body: { errors: errors }.to_json)
|
91
|
+
error = Shipcloud::ShipcloudError.new(response)
|
92
|
+
|
93
|
+
expect(error.errors).to eq errors
|
94
|
+
end
|
95
|
+
context "with a response that has no errors node" do
|
96
|
+
it "returns an empty list" do
|
97
|
+
response = build_response(body: {}.to_json)
|
98
|
+
error = Shipcloud::ShipcloudError.new(response)
|
99
|
+
|
100
|
+
expect(error.errors).to eq []
|
101
|
+
end
|
102
|
+
end
|
103
|
+
context "with a response that has no JSON formated body" do
|
104
|
+
it "returns an empty list" do
|
105
|
+
response = build_response(body: "error")
|
106
|
+
error = Shipcloud::ShipcloudError.new(response)
|
107
|
+
|
108
|
+
expect(error.errors).to eq []
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "#response" do
|
114
|
+
it "returns the response" do
|
115
|
+
response = build_response
|
116
|
+
error = Shipcloud::ShipcloudError.new(response)
|
117
|
+
|
118
|
+
expect(error.response).to eq response
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def build_response(status_code: 400, body: nil)
|
123
|
+
double(code: status_code.to_s, body: body)
|
124
|
+
end
|
125
|
+
end
|
@@ -52,7 +52,7 @@ describe Shipcloud::ShipmentQuote do
|
|
52
52
|
describe ".create" do
|
53
53
|
it "makes a new POST request using the correct API endpoint" do
|
54
54
|
expect(Shipcloud).to receive(:request).
|
55
|
-
with(:post, "shipment_quotes", valid_attributes).
|
55
|
+
with(:post, "shipment_quotes", valid_attributes, api_key: nil).
|
56
56
|
and_return("data" => {})
|
57
57
|
|
58
58
|
Shipcloud::ShipmentQuote.create(valid_attributes)
|
@@ -47,28 +47,32 @@ describe Shipcloud::Shipment do
|
|
47
47
|
|
48
48
|
describe ".create" do
|
49
49
|
it "makes a new POST request using the correct API endpoint" do
|
50
|
-
Shipcloud.
|
50
|
+
expect(Shipcloud).to receive(:request).
|
51
|
+
with(:post, "shipments", valid_attributes, api_key: nil).and_return("data" => {})
|
51
52
|
Shipcloud::Shipment.create(valid_attributes)
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
56
|
describe ".find" do
|
56
57
|
it "makes a new GET request using the correct API endpoint to receive a specific subscription" do
|
57
|
-
Shipcloud.
|
58
|
+
expect(Shipcloud).to receive(:request).with(:get, "shipments/123", {}, api_key: nil).
|
59
|
+
and_return("id" => "123")
|
58
60
|
Shipcloud::Shipment.find("123")
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
62
64
|
describe ".update" do
|
63
65
|
it "makes a new PUT request using the correct API endpoint" do
|
64
|
-
Shipcloud.
|
65
|
-
|
66
|
+
expect(Shipcloud).to receive(:request).
|
67
|
+
with(:put, "shipments/123", { carrier: "ups" }, api_key: nil).and_return("data" => {})
|
68
|
+
Shipcloud::Shipment.update("123", carrier: "ups")
|
66
69
|
end
|
67
70
|
end
|
68
71
|
|
69
72
|
describe ".delete" do
|
70
73
|
it "makes a new DELETE request using the correct API endpoint" do
|
71
|
-
Shipcloud.
|
74
|
+
expect(Shipcloud).to receive(:request).with(:delete, "shipments/123", {}, api_key: nil).
|
75
|
+
and_return(true)
|
72
76
|
Shipcloud::Shipment.delete("123")
|
73
77
|
end
|
74
78
|
end
|
@@ -76,7 +80,7 @@ describe Shipcloud::Shipment do
|
|
76
80
|
describe ".all" do
|
77
81
|
it "makes a new Get request using the correct API endpoint" do
|
78
82
|
expect(Shipcloud).to receive(:request).
|
79
|
-
with(:get, "shipments", {}).
|
83
|
+
with(:get, "shipments", {}, api_key: nil).
|
80
84
|
and_return("shipments" => [])
|
81
85
|
|
82
86
|
Shipcloud::Shipment.all
|
@@ -104,7 +108,7 @@ describe Shipcloud::Shipment do
|
|
104
108
|
}
|
105
109
|
|
106
110
|
expect(Shipcloud).to receive(:request).
|
107
|
-
with(:get, "shipments", filter).
|
111
|
+
with(:get, "shipments", filter, api_key: nil).
|
108
112
|
and_return("shipments" => shipments_array)
|
109
113
|
|
110
114
|
Shipcloud::Shipment.all(filter)
|
@@ -113,7 +117,7 @@ describe Shipcloud::Shipment do
|
|
113
117
|
|
114
118
|
def stub_shipments_requests
|
115
119
|
allow(Shipcloud).to receive(:request).
|
116
|
-
with(:get, "shipments", {}).
|
120
|
+
with(:get, "shipments", {}, api_key: nil).
|
117
121
|
and_return("shipments" => shipments_array)
|
118
122
|
end
|
119
123
|
|
@@ -16,8 +16,8 @@ describe Shipcloud::Webhook do
|
|
16
16
|
|
17
17
|
describe ".create" do
|
18
18
|
it "makes a new POST request using the correct API endpoint" do
|
19
|
-
Shipcloud.
|
20
|
-
with(:post, "webhooks", valid_attributes).
|
19
|
+
expect(Shipcloud).to receive(:request).
|
20
|
+
with(:post, "webhooks", valid_attributes, api_key: nil).
|
21
21
|
and_return("data" => {})
|
22
22
|
Shipcloud::Webhook.create(valid_attributes)
|
23
23
|
end
|
@@ -25,7 +25,9 @@ describe Shipcloud::Webhook do
|
|
25
25
|
|
26
26
|
describe ".find" do
|
27
27
|
it "makes a new GET request using the correct API endpoint to receive a specific webhook" do
|
28
|
-
Shipcloud.
|
28
|
+
expect(Shipcloud).to receive(:request).
|
29
|
+
with(:get, "webhooks/123", {}, api_key: nil).
|
30
|
+
and_return("id" => "123")
|
29
31
|
Shipcloud::Webhook.find("123")
|
30
32
|
end
|
31
33
|
end
|
@@ -33,7 +35,7 @@ describe Shipcloud::Webhook do
|
|
33
35
|
describe ".all" do
|
34
36
|
it "makes a new Get request using the correct API endpoint" do
|
35
37
|
expect(Shipcloud).to receive(:request).
|
36
|
-
with(:get, "webhooks", {}).
|
38
|
+
with(:get, "webhooks", {}, api_key: nil).
|
37
39
|
and_return("webhooks" => [])
|
38
40
|
|
39
41
|
Shipcloud::Webhook.all
|
@@ -52,7 +54,7 @@ describe Shipcloud::Webhook do
|
|
52
54
|
|
53
55
|
def stub_webhooks_request
|
54
56
|
allow(Shipcloud).to receive(:request).
|
55
|
-
with(:get, "webhooks", {}).
|
57
|
+
with(:get, "webhooks", {}, api_key: nil).
|
56
58
|
and_return("webhooks" => webhooks_array)
|
57
59
|
end
|
58
60
|
|
data/spec/shipcloud_spec.rb
CHANGED
@@ -29,6 +29,20 @@ describe Shipcloud do
|
|
29
29
|
WebMock.should have_requested(:get, "https://#{Shipcloud::api_key}:@#{Shipcloud.configuration.api_base}/#{Shipcloud::API_VERSION}/transactions")
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
context "with an api key passed in as an argument" do
|
34
|
+
it "uses the given api key instead of the global one" do
|
35
|
+
WebMock.stub_request(:any, /#{Shipcloud.configuration.api_base}/).to_return(body: "{}")
|
36
|
+
Shipcloud.api_key = "global-api-key"
|
37
|
+
|
38
|
+
Shipcloud.request(:get, "transactions", {}, api_key: "123")
|
39
|
+
|
40
|
+
expect(WebMock).to have_requested(
|
41
|
+
:get,
|
42
|
+
"https://123:@#{Shipcloud.configuration.api_base}/#{Shipcloud::API_VERSION}/transactions"
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
32
46
|
end
|
33
47
|
|
34
48
|
describe '.configure' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shipcloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sthollmann
|
@@ -151,7 +151,7 @@ files:
|
|
151
151
|
- lib/shipcloud/request/base.rb
|
152
152
|
- lib/shipcloud/request/connection.rb
|
153
153
|
- lib/shipcloud/request/info.rb
|
154
|
-
- lib/shipcloud/
|
154
|
+
- lib/shipcloud/shipcloud_error.rb
|
155
155
|
- lib/shipcloud/shipment.rb
|
156
156
|
- lib/shipcloud/shipment_quote.rb
|
157
157
|
- lib/shipcloud/version.rb
|
@@ -161,7 +161,7 @@ files:
|
|
161
161
|
- spec/shipcloud/carrier_spec.rb
|
162
162
|
- spec/shipcloud/request/base_spec.rb
|
163
163
|
- spec/shipcloud/request/connection_spec.rb
|
164
|
-
- spec/shipcloud/
|
164
|
+
- spec/shipcloud/shipcloud_error_spec.rb
|
165
165
|
- spec/shipcloud/shipment_quote_spec.rb
|
166
166
|
- spec/shipcloud/shipment_spec.rb
|
167
167
|
- spec/shipcloud/webhooks_spec.rb
|
@@ -196,7 +196,7 @@ test_files:
|
|
196
196
|
- spec/shipcloud/carrier_spec.rb
|
197
197
|
- spec/shipcloud/request/base_spec.rb
|
198
198
|
- spec/shipcloud/request/connection_spec.rb
|
199
|
-
- spec/shipcloud/
|
199
|
+
- spec/shipcloud/shipcloud_error_spec.rb
|
200
200
|
- spec/shipcloud/shipment_quote_spec.rb
|
201
201
|
- spec/shipcloud/shipment_spec.rb
|
202
202
|
- spec/shipcloud/webhooks_spec.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Shipcloud
|
2
|
-
module Request
|
3
|
-
class Validator
|
4
|
-
attr_reader :info
|
5
|
-
attr_accessor :response
|
6
|
-
|
7
|
-
def initialize(info)
|
8
|
-
@info = info
|
9
|
-
end
|
10
|
-
|
11
|
-
def validated_data_for(incoming_response)
|
12
|
-
self.response = incoming_response
|
13
|
-
verify_response_code
|
14
|
-
if response.body
|
15
|
-
info.data = JSON.parse(response.body)
|
16
|
-
validate_response_data
|
17
|
-
end
|
18
|
-
info.data
|
19
|
-
end
|
20
|
-
|
21
|
-
protected
|
22
|
-
|
23
|
-
def verify_response_code
|
24
|
-
raise AuthenticationError if response.code.to_i == 401
|
25
|
-
raise APIError if response.code.to_i >= 500
|
26
|
-
end
|
27
|
-
|
28
|
-
def validate_response_data
|
29
|
-
raise APIError.new(info.data["errors"]) if info.data.is_a?(Hash) && info.data["errors"]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Shipcloud::Request::Validator do
|
4
|
-
describe "#validated_data_for" do
|
5
|
-
it "validates the data" do
|
6
|
-
info = Shipcloud::Request::Info.new(:get, "random", OpenStruct.new(id: 1))
|
7
|
-
validator = Shipcloud::Request::Validator.new info
|
8
|
-
response = OpenStruct.new(body: '{"response":"ok"}', code: 200)
|
9
|
-
|
10
|
-
validator.validated_data_for(response).should eq "response" => "ok"
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'raises an APIError if the response contains errors' do
|
14
|
-
info = Shipcloud::Request::Info.new(:get, 'random', {})
|
15
|
-
validator = Shipcloud::Request::Validator.new info
|
16
|
-
response = OpenStruct.new(body: '{"errors":["some error"]}', code: 200)
|
17
|
-
|
18
|
-
expect { validator.validated_data_for(response) }.to raise_error(
|
19
|
-
Shipcloud::APIError,
|
20
|
-
['some error'].to_s
|
21
|
-
)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|