shipwire 0.0.5 → 2.0.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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -3
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -1
  5. data/Gemfile +0 -1
  6. data/README.md +53 -29
  7. data/Rakefile +2 -3
  8. data/lib/generators/shipwire/install/install_generator.rb +13 -0
  9. data/lib/generators/shipwire/install/templates/config/initializers/shipwire.rb +27 -0
  10. data/lib/shipwire.rb +26 -33
  11. data/lib/shipwire/api.rb +7 -0
  12. data/lib/shipwire/configuration.rb +13 -3
  13. data/lib/shipwire/orders.rb +39 -0
  14. data/lib/shipwire/param_converter.rb +39 -0
  15. data/lib/shipwire/products.rb +53 -0
  16. data/lib/shipwire/products/base.rb +9 -0
  17. data/lib/shipwire/products/insert.rb +9 -0
  18. data/lib/shipwire/products/kit.rb +9 -0
  19. data/lib/shipwire/products/virtual_kit.rb +9 -0
  20. data/lib/shipwire/rate.rb +7 -0
  21. data/lib/shipwire/receivings.rb +50 -0
  22. data/lib/shipwire/request.rb +73 -0
  23. data/lib/shipwire/response.rb +79 -0
  24. data/lib/shipwire/returns.rb +35 -0
  25. data/lib/shipwire/secret.rb +20 -0
  26. data/lib/shipwire/stock.rb +7 -0
  27. data/lib/shipwire/utility.rb +22 -0
  28. data/lib/shipwire/version.rb +1 -1
  29. data/lib/shipwire/webhooks.rb +24 -0
  30. data/shipwire.gemspec +12 -15
  31. data/spec/features/access_spec.rb +61 -0
  32. data/spec/features/orders_spec.rb +280 -0
  33. data/spec/features/product_types_spec.rb +219 -0
  34. data/spec/features/products_spec.rb +282 -0
  35. data/spec/features/rate_spec.rb +50 -0
  36. data/spec/features/receivings_spec.rb +333 -0
  37. data/spec/features/returns_spec.rb +239 -0
  38. data/spec/features/secret_spec.rb +57 -0
  39. data/spec/features/stock_spec.rb +41 -0
  40. data/spec/features/webhooks_spec.rb +106 -0
  41. data/spec/spec_helper.rb +33 -12
  42. data/spec/support/shipwire.rb +10 -0
  43. data/spec/support/vcr.rb +9 -0
  44. data/spec/support/vcr_cassettes/credentials_incorrect.yml +47 -0
  45. data/spec/support/vcr_cassettes/credentials_missing.yml +47 -0
  46. data/spec/support/vcr_cassettes/order.yml +48 -0
  47. data/spec/support/vcr_cassettes/order_cancel.yml +54 -0
  48. data/spec/support/vcr_cassettes/order_cancel_fail.yml +47 -0
  49. data/spec/support/vcr_cassettes/order_find.yml +45 -0
  50. data/spec/support/vcr_cassettes/order_find_fail.yml +45 -0
  51. data/spec/support/vcr_cassettes/order_find_with_params.yml +45 -0
  52. data/spec/support/vcr_cassettes/order_holds.yml +50 -0
  53. data/spec/support/vcr_cassettes/order_holds_fail.yml +45 -0
  54. data/spec/support/vcr_cassettes/order_holds_with_params.yml +50 -0
  55. data/spec/support/vcr_cassettes/order_items.yml +45 -0
  56. data/spec/support/vcr_cassettes/order_items_fail.yml +45 -0
  57. data/spec/support/vcr_cassettes/order_returns.yml +47 -0
  58. data/spec/support/vcr_cassettes/order_returns_fail.yml +47 -0
  59. data/spec/support/vcr_cassettes/order_trackings.yml +45 -0
  60. data/spec/support/vcr_cassettes/order_trackings_fail.yml +45 -0
  61. data/spec/support/vcr_cassettes/order_update.yml +48 -0
  62. data/spec/support/vcr_cassettes/order_update_fail.yml +50 -0
  63. data/spec/support/vcr_cassettes/order_update_with_params.yml +48 -0
  64. data/spec/support/vcr_cassettes/order_with_warnings.yml +96 -0
  65. data/spec/support/vcr_cassettes/orders_list.yml +47 -0
  66. data/spec/support/vcr_cassettes/orders_list_with_params.yml +47 -0
  67. data/spec/support/vcr_cassettes/product.yml +48 -0
  68. data/spec/support/vcr_cassettes/product_base.yml +48 -0
  69. data/spec/support/vcr_cassettes/product_base_find.yml +48 -0
  70. data/spec/support/vcr_cassettes/product_base_find_fail.yml +47 -0
  71. data/spec/support/vcr_cassettes/product_base_retire_id.yml +47 -0
  72. data/spec/support/vcr_cassettes/product_base_retire_nonexistent.yml +47 -0
  73. data/spec/support/vcr_cassettes/product_base_update.yml +48 -0
  74. data/spec/support/vcr_cassettes/product_base_update_fail.yml +48 -0
  75. data/spec/support/vcr_cassettes/product_create_fail_with_invalid_classification.yml +51 -0
  76. data/spec/support/vcr_cassettes/product_find.yml +48 -0
  77. data/spec/support/vcr_cassettes/product_find_fail.yml +47 -0
  78. data/spec/support/vcr_cassettes/product_insert.yml +50 -0
  79. data/spec/support/vcr_cassettes/product_insert_find.yml +48 -0
  80. data/spec/support/vcr_cassettes/product_insert_find_fail.yml +47 -0
  81. data/spec/support/vcr_cassettes/product_insert_retire_id.yml +47 -0
  82. data/spec/support/vcr_cassettes/product_insert_retire_nonexistent.yml +47 -0
  83. data/spec/support/vcr_cassettes/product_insert_update.yml +49 -0
  84. data/spec/support/vcr_cassettes/product_insert_update_fail.yml +48 -0
  85. data/spec/support/vcr_cassettes/product_kit.yml +48 -0
  86. data/spec/support/vcr_cassettes/product_kit_find.yml +48 -0
  87. data/spec/support/vcr_cassettes/product_kit_find_fail.yml +47 -0
  88. data/spec/support/vcr_cassettes/product_kit_retire_id.yml +47 -0
  89. data/spec/support/vcr_cassettes/product_kit_retire_nonexistent.yml +47 -0
  90. data/spec/support/vcr_cassettes/product_kit_update.yml +48 -0
  91. data/spec/support/vcr_cassettes/product_kit_update_fail.yml +47 -0
  92. data/spec/support/vcr_cassettes/product_multiple_create_fail.yml +102 -0
  93. data/spec/support/vcr_cassettes/product_multiple_create_success.yml +100 -0
  94. data/spec/support/vcr_cassettes/product_retire_id.yml +47 -0
  95. data/spec/support/vcr_cassettes/product_retire_nonexistent.yml +47 -0
  96. data/spec/support/vcr_cassettes/product_update.yml +48 -0
  97. data/spec/support/vcr_cassettes/product_update_fail.yml +48 -0
  98. data/spec/support/vcr_cassettes/product_virtual_kit.yml +48 -0
  99. data/spec/support/vcr_cassettes/product_virtual_kit_find.yml +48 -0
  100. data/spec/support/vcr_cassettes/product_virtual_kit_find_fail.yml +47 -0
  101. data/spec/support/vcr_cassettes/product_virtual_kit_retire_id.yml +47 -0
  102. data/spec/support/vcr_cassettes/product_virtual_kit_retire_nonexistent.yml +47 -0
  103. data/spec/support/vcr_cassettes/product_virtual_kit_update.yml +49 -0
  104. data/spec/support/vcr_cassettes/product_virtual_kit_update_fail.yml +47 -0
  105. data/spec/support/vcr_cassettes/products_base_list.yml +49 -0
  106. data/spec/support/vcr_cassettes/products_base_list_with_params.yml +49 -0
  107. data/spec/support/vcr_cassettes/products_insert_list.yml +47 -0
  108. data/spec/support/vcr_cassettes/products_insert_list_with_params.yml +47 -0
  109. data/spec/support/vcr_cassettes/products_kit_list.yml +47 -0
  110. data/spec/support/vcr_cassettes/products_kit_list_with_params.yml +47 -0
  111. data/spec/support/vcr_cassettes/products_list.yml +49 -0
  112. data/spec/support/vcr_cassettes/products_list_with_params.yml +49 -0
  113. data/spec/support/vcr_cassettes/products_virtual_kit_list.yml +47 -0
  114. data/spec/support/vcr_cassettes/products_virtual_kit_list_with_params.yml +47 -0
  115. data/spec/support/vcr_cassettes/rate_find.yml +53 -0
  116. data/spec/support/vcr_cassettes/rate_find_fail.yml +50 -0
  117. data/spec/support/vcr_cassettes/receiving.yml +53 -0
  118. data/spec/support/vcr_cassettes/receiving_cancel.yml +98 -0
  119. data/spec/support/vcr_cassettes/receiving_cancel_label.yml +47 -0
  120. data/spec/support/vcr_cassettes/receiving_cancel_label_nonexistent.yml +47 -0
  121. data/spec/support/vcr_cassettes/receiving_find.yml +46 -0
  122. data/spec/support/vcr_cassettes/receiving_find_fail.yml +45 -0
  123. data/spec/support/vcr_cassettes/receiving_find_with_params.yml +48 -0
  124. data/spec/support/vcr_cassettes/receiving_holds.yml +47 -0
  125. data/spec/support/vcr_cassettes/receiving_holds_fail.yml +45 -0
  126. data/spec/support/vcr_cassettes/receiving_holds_with_params.yml +47 -0
  127. data/spec/support/vcr_cassettes/receiving_instructions_recipients.yml +45 -0
  128. data/spec/support/vcr_cassettes/receiving_instructions_recipients_fail.yml +45 -0
  129. data/spec/support/vcr_cassettes/receiving_items.yml +45 -0
  130. data/spec/support/vcr_cassettes/receiving_items_fail.yml +45 -0
  131. data/spec/support/vcr_cassettes/receiving_shipments.yml +45 -0
  132. data/spec/support/vcr_cassettes/receiving_shipments_fail.yml +45 -0
  133. data/spec/support/vcr_cassettes/receiving_tracking.yml +45 -0
  134. data/spec/support/vcr_cassettes/receiving_tracking_fail.yml +45 -0
  135. data/spec/support/vcr_cassettes/receiving_update.yml +53 -0
  136. data/spec/support/vcr_cassettes/receiving_update_fail.yml +49 -0
  137. data/spec/support/vcr_cassettes/receiving_update_with_params.yml +55 -0
  138. data/spec/support/vcr_cassettes/receivings_list.yml +53 -0
  139. data/spec/support/vcr_cassettes/receivings_list_with_params.yml +46 -0
  140. data/spec/support/vcr_cassettes/return.yml +98 -0
  141. data/spec/support/vcr_cassettes/return_cancel.yml +55 -0
  142. data/spec/support/vcr_cassettes/return_cancel_fail.yml +47 -0
  143. data/spec/support/vcr_cassettes/return_find.yml +47 -0
  144. data/spec/support/vcr_cassettes/return_find_fail.yml +45 -0
  145. data/spec/support/vcr_cassettes/return_find_with_params.yml +47 -0
  146. data/spec/support/vcr_cassettes/return_holds.yml +45 -0
  147. data/spec/support/vcr_cassettes/return_holds_fail.yml +45 -0
  148. data/spec/support/vcr_cassettes/return_holds_with_params.yml +45 -0
  149. data/spec/support/vcr_cassettes/return_items.yml +45 -0
  150. data/spec/support/vcr_cassettes/return_items_fail.yml +45 -0
  151. data/spec/support/vcr_cassettes/return_labels.yml +45 -0
  152. data/spec/support/vcr_cassettes/return_labels_fail.yml +45 -0
  153. data/spec/support/vcr_cassettes/return_trackings.yml +45 -0
  154. data/spec/support/vcr_cassettes/return_trackings_fail.yml +45 -0
  155. data/spec/support/vcr_cassettes/returns_list.yml +47 -0
  156. data/spec/support/vcr_cassettes/returns_list_with_params.yml +47 -0
  157. data/spec/support/vcr_cassettes/secret.yml +47 -0
  158. data/spec/support/vcr_cassettes/secret_find.yml +45 -0
  159. data/spec/support/vcr_cassettes/secret_find_fail.yml +43 -0
  160. data/spec/support/vcr_cassettes/secret_list.yml +45 -0
  161. data/spec/support/vcr_cassettes/secret_remove.yml +45 -0
  162. data/spec/support/vcr_cassettes/stock_with_params.yml +45 -0
  163. data/spec/support/vcr_cassettes/stock_with_params_no_sku.yml +45 -0
  164. data/spec/support/vcr_cassettes/stock_without_params.yml +45 -0
  165. data/spec/support/vcr_cassettes/webhook.yml +47 -0
  166. data/spec/support/vcr_cassettes/webhooks_create_insecure.yml +50 -0
  167. data/spec/support/vcr_cassettes/webhooks_find.yml +47 -0
  168. data/spec/support/vcr_cassettes/webhooks_find_fail.yml +47 -0
  169. data/spec/support/vcr_cassettes/webhooks_list.yml +47 -0
  170. data/spec/support/vcr_cassettes/webhooks_remove.yml +47 -0
  171. data/spec/support/vcr_cassettes/webhooks_update.yml +47 -0
  172. data/spec/support/vcr_cassettes/webhooks_update_fail.yml +49 -0
  173. data/spec/unit/shipwire/response_spec.rb +46 -0
  174. metadata +354 -80
  175. data/.env +0 -4
  176. data/.env.example +0 -4
  177. data/Gemfile.lock +0 -69
  178. data/lib/shipwire/fulfillment.rb +0 -100
  179. data/lib/shipwire/inventory.rb +0 -72
  180. data/lib/shipwire/service_request.rb +0 -42
  181. data/lib/shipwire/shipping_rate.rb +0 -121
  182. data/lib/shipwire/tracking.rb +0 -101
  183. data/spec/shipwire/fulfillment_spec.rb +0 -36
  184. data/spec/shipwire/inventory_spec.rb +0 -25
  185. data/spec/shipwire/shipping_rate_spec.rb +0 -62
  186. data/spec/shipwire/tracking_spec.rb +0 -20
@@ -0,0 +1,9 @@
1
+ module Shipwire
2
+ class Products::Base < Products
3
+ protected
4
+
5
+ def product_classification
6
+ { classification: "baseProduct" }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Shipwire
2
+ class Products::Insert < Products
3
+ protected
4
+
5
+ def product_classification
6
+ { classification: "marketingInsert" }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Shipwire
2
+ class Products::Kit < Products
3
+ protected
4
+
5
+ def product_classification
6
+ { classification: "kit" }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Shipwire
2
+ class Products::VirtualKit < Products
3
+ protected
4
+
5
+ def product_classification
6
+ { classification: "virtualKit" }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Shipwire
2
+ class Rate < Api
3
+ def find(body)
4
+ request(:post, 'rate', body: body)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,50 @@
1
+ module Shipwire
2
+ class Receivings < Api
3
+ def list(params = {})
4
+ request(:get, 'receivings', params: params)
5
+ end
6
+
7
+ def create(body)
8
+ request(:post, 'receivings', body: body)
9
+ end
10
+
11
+ def find(id, params = {})
12
+ request(:get, "receivings/#{id}", params: params)
13
+ end
14
+
15
+ def update(id, body, params = {})
16
+ request(:put, "receivings/#{id}", body: body, params: params)
17
+ end
18
+
19
+ def cancel(id)
20
+ request(:post, "receivings/#{id}/cancel")
21
+ end
22
+
23
+ def labels_cancel(id)
24
+ request(:post, "receivings/#{id}/labels/cancel")
25
+ end
26
+ alias_method :label_cancel, :labels_cancel
27
+
28
+ def holds(id, params = {})
29
+ request(:get, "receivings/#{id}/holds", params: params)
30
+ end
31
+
32
+ def instructions_recipients(id)
33
+ request(:get, "receivings/#{id}/instructionsRecipients")
34
+ end
35
+ alias_method :instructions, :instructions_recipients
36
+ alias_method :recipients, :instructions_recipients
37
+
38
+ def items(id)
39
+ request(:get, "receivings/#{id}/items")
40
+ end
41
+
42
+ def shipments(id)
43
+ request(:get, "receivings/#{id}/shipments")
44
+ end
45
+
46
+ def trackings(id)
47
+ request(:get, "receivings/#{id}/trackings")
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,73 @@
1
+ module Shipwire
2
+ class Request
3
+ def self.send(**args)
4
+ new(**args).send
5
+ end
6
+
7
+ API_VERSION = 3
8
+
9
+ attr_reader :method, :path, :params, :body
10
+
11
+ def initialize(method: :get, path: '', params: {}, body: {})
12
+ @method = method
13
+ @path = path
14
+ @params = params
15
+ @body = body
16
+
17
+ @connection = build_connection
18
+ end
19
+
20
+ def send
21
+ Response.new(underlying_response: make_request)
22
+ rescue Faraday::ConnectionFailed
23
+ Response.new(error_summary: 'Unable to connect to Shipwire')
24
+ rescue Faraday::TimeoutError
25
+ Response.new(error_summary: 'Shipwire connection timeout')
26
+ end
27
+
28
+ private
29
+
30
+ def build_connection
31
+ Faraday.new(url: base_url) do |connection|
32
+ connection.request(:basic_auth, username, password)
33
+ connection.request(:json)
34
+ connection.request(:url_encoded)
35
+
36
+ if Shipwire.configuration.logger
37
+ connection.response(:logger)
38
+ end
39
+
40
+ connection.adapter(Faraday.default_adapter)
41
+ end
42
+ end
43
+
44
+ def make_request
45
+ @connection.public_send(@method, full_path) do |request|
46
+ request.params = params unless params.empty?
47
+ request.options.open_timeout = Shipwire.configuration.open_timeout
48
+ request.options.timeout = Shipwire.configuration.timeout
49
+ request.body = body unless body.empty?
50
+ end
51
+ end
52
+
53
+ def base_url
54
+ Shipwire.configuration.endpoint.chomp("/")
55
+ end
56
+
57
+ def full_path
58
+ "/api/v#{API_VERSION}/#{@path}"
59
+ end
60
+
61
+ def params
62
+ Utility.camel_case(@params)
63
+ end
64
+
65
+ def username
66
+ Shipwire.configuration.username
67
+ end
68
+
69
+ def password
70
+ Shipwire.configuration.password
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,79 @@
1
+ require 'json'
2
+
3
+ module Shipwire
4
+ class Response
5
+ attr_reader :error_summary, :validation_errors, :warnings, :body
6
+
7
+ def initialize(underlying_response: nil, error_summary: nil)
8
+ @error_summary = error_summary
9
+
10
+ @validation_errors = []
11
+ @warnings = []
12
+
13
+ if underlying_response
14
+ load_response(underlying_response)
15
+ end
16
+ end
17
+
18
+ def ok?
19
+ !has_error_summary? && !has_validation_errors?
20
+ end
21
+
22
+ def has_error_summary?
23
+ !error_summary.nil?
24
+ end
25
+
26
+ def has_validation_errors?
27
+ !validation_errors.empty?
28
+ end
29
+
30
+ def has_warnings?
31
+ !warnings.empty?
32
+ end
33
+
34
+ def error_report
35
+ report_lines = []
36
+
37
+ if has_error_summary?
38
+ report_lines << 'Error summary:'
39
+ report_lines << error_summary
40
+ end
41
+
42
+ if has_validation_errors?
43
+ report_lines << 'Validation errors:'
44
+ report_lines << validation_errors.pretty_inspect.rstrip
45
+ end
46
+
47
+ report_lines.join("\n")
48
+ end
49
+
50
+ private
51
+
52
+ def load_response(response)
53
+ @body = JSON.parse(response.body)
54
+ @warnings = parse_warnings_from(body)
55
+ @error_summary = parse_error_summary_from(body)
56
+ @validation_errors = parse_validation_errors_from(body)
57
+ end
58
+
59
+ # Errors because of a 40x or 50x error
60
+ def parse_error_summary_from(body)
61
+ if (400..599).include?(body['status']) && body.key?('message')
62
+ body['message']
63
+ else
64
+ nil
65
+ end
66
+ end
67
+
68
+ # Errors specified in Shipwire response body
69
+ def parse_validation_errors_from(body)
70
+ body.fetch('errors', {})
71
+ end
72
+
73
+ def parse_warnings_from(body)
74
+ body.fetch('warnings', []).map do |warning|
75
+ warning.fetch('message')
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,35 @@
1
+ module Shipwire
2
+ class Returns < Api
3
+ def list(params = {})
4
+ request(:get, 'returns', params: params)
5
+ end
6
+
7
+ def create(body)
8
+ request(:post, 'returns', body: body)
9
+ end
10
+
11
+ def find(id, params = {})
12
+ request(:get, "returns/#{id}", params: params)
13
+ end
14
+
15
+ def cancel(id)
16
+ request(:post, "returns/#{id}/cancel")
17
+ end
18
+
19
+ def holds(id, params = {})
20
+ request(:get, "returns/#{id}/holds", params: params)
21
+ end
22
+
23
+ def items(id)
24
+ request(:get, "returns/#{id}/items")
25
+ end
26
+
27
+ def trackings(id)
28
+ request(:get, "returns/#{id}/trackings")
29
+ end
30
+
31
+ def labels(id)
32
+ request(:get, "returns/#{id}/labels")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ module Shipwire
2
+ class Secret < Api
3
+ def list
4
+ request(:get, 'secret')
5
+ end
6
+
7
+ def create
8
+ request(:post, 'secret')
9
+ end
10
+
11
+ def find(id)
12
+ request(:get, "secret/#{id}")
13
+ end
14
+
15
+ def remove(id)
16
+ request(:delete, "secret/#{id}")
17
+ end
18
+ alias_method :delete, :remove
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ module Shipwire
2
+ class Stock < Api
3
+ def list(params = {})
4
+ request(:get, 'stock', params: params)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,22 @@
1
+ module Shipwire
2
+ module Utility
3
+ def self.camel_case(options)
4
+ ParamConverter.new(options).to_h
5
+ end
6
+
7
+ def self.split_to_integers(str, separator = ",")
8
+ str.to_s.split(separator).map(&:to_i)
9
+ end
10
+
11
+ def self.camelize(term, first_letter = :upper)
12
+ terms = term.split('_')
13
+
14
+ case first_letter
15
+ when :upper
16
+ terms.map(&:capitalize!).join
17
+ when :lower
18
+ ([terms.first] + terms.drop(1).map(&:capitalize!)).join
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module Shipwire
2
- VERSION = "0.0.5"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -0,0 +1,24 @@
1
+ module Shipwire
2
+ class Webhooks < Api
3
+ def list
4
+ request(:get, 'webhooks')
5
+ end
6
+
7
+ def create(body)
8
+ request(:post, 'webhooks', body: body)
9
+ end
10
+
11
+ def find(id)
12
+ request(:get, "webhooks/#{id}")
13
+ end
14
+
15
+ def update(id, body)
16
+ request(:put, "webhooks/#{id}", body: body)
17
+ end
18
+
19
+ def remove(id)
20
+ request(:delete, "webhooks/#{id}")
21
+ end
22
+ alias_method :delete, :remove
23
+ end
24
+ end
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Shipwire::VERSION
9
9
  spec.authors = ["Bill Rowell"]
10
10
  spec.email = ["billr578@gmail.com"]
11
- spec.summary = %q{Exchange data with Shipwire fullfillment}
12
- spec.description = %q{Provides a wrapper for API calls to Shipwire fullfillment}
11
+ spec.summary = 'Exchange data with Shipwire fullfillment'
12
+ spec.description = 'Provides a wrapper for API calls to Shipwire'
13
13
  spec.homepage = "https://github.com/morbid-enterprises/shipwire"
14
14
  spec.license = "MIT"
15
15
 
@@ -18,18 +18,15 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "faraday"
22
- spec.add_dependency "nokogiri"
21
+ spec.add_dependency "deep_merge", "~> 1.0.0"
22
+ spec.add_dependency "faraday", "~> 0.9.1"
23
+ spec.add_dependency "faraday_middleware", "~> 0.10.0"
24
+ spec.add_dependency "recursive-open-struct", "~> 0.6.4"
23
25
 
24
- spec.add_development_dependency "bundler", "~> 1.6"
25
- spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rspec"
27
- spec.add_development_dependency "mocha"
28
- spec.add_development_dependency "rack-test"
29
-
30
- spec.add_development_dependency "dotenv"
31
-
32
- spec.add_development_dependency "webmock"
33
- spec.add_development_dependency "vcr"
34
- spec.add_development_dependency "pry"
26
+ spec.add_development_dependency "rspec", "~> 3.2.0"
27
+ spec.add_development_dependency "ffaker", "~> 2.0.0"
28
+ spec.add_development_dependency "simplecov", "~> 0.10.0"
29
+ spec.add_development_dependency "vcr", "~> 2.9.3"
30
+ spec.add_development_dependency "webmock", "~> 1.21.0"
31
+ spec.add_development_dependency "pry", "~> 0.10.1"
35
32
  end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe "General access", type: :feature, vcr: true do
4
+ describe 'with missing credentials' do
5
+ before do
6
+ Shipwire.configuration.username = nil
7
+ Shipwire.configuration.password = nil
8
+ end
9
+
10
+ it "raises an error" do
11
+ VCR.use_cassette("credentials_missing") do
12
+ response = Shipwire::Secret.new.list
13
+
14
+ expect(response.ok?).to be_falsy
15
+ expect(response.error_summary).to eq(
16
+ 'Please include a valid Authorization header (Basic)'
17
+ )
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "with incorrect credentials" do
23
+ before do
24
+ Shipwire.configuration.username = 'fake@email.com'
25
+ Shipwire.configuration.password = 'fake-password'
26
+ end
27
+
28
+ it "raises an error" do
29
+ VCR.use_cassette("credentials_incorrect") do
30
+ response = Shipwire::Secret.new.list
31
+
32
+ expect(response.ok?).to be_falsy
33
+ expect(response.error_summary).to eq(
34
+ 'Please include a valid Authorization header (Basic)'
35
+ )
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "with incorrect base endpoint" do
41
+ before { Shipwire.configuration.endpoint = 'https://api.fake.shipwire.com' }
42
+
43
+ it "raises an error" do
44
+ response = Shipwire::Secret.new.list
45
+
46
+ expect(response.ok?).to be_falsy
47
+ expect(response.error_summary).to eq 'Unable to connect to Shipwire'
48
+ end
49
+ end
50
+
51
+ describe "with API timeout" do
52
+ before { Shipwire.configuration.timeout = 0.0001 }
53
+
54
+ it "raises an error" do
55
+ response = Shipwire::Secret.new.list
56
+
57
+ expect(response.ok?).to be_falsy
58
+ expect(response.error_summary).to eq 'Shipwire connection timeout'
59
+ end
60
+ end
61
+ end