duodealer_api 1.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 (322) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +13 -0
  4. data/.rubocop.yml +8 -0
  5. data/.travis.yml +23 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile_ar41 +5 -0
  8. data/Gemfile_ar50 +5 -0
  9. data/Gemfile_ar51 +5 -0
  10. data/Gemfile_ar_master +5 -0
  11. data/RELEASING +13 -0
  12. data/Rakefile +44 -0
  13. data/docker-compose.yml +13 -0
  14. data/docs/graphql.md +191 -0
  15. data/duodealer_api.gemspec +38 -0
  16. data/lib/active_resource/connection_ext.rb +10 -0
  17. data/lib/active_resource/detailed_log_subscriber.rb +52 -0
  18. data/lib/active_resource/json_errors.rb +31 -0
  19. data/lib/duodealer_api.rb +33 -0
  20. data/lib/duodealer_api/api_version.rb +205 -0
  21. data/lib/duodealer_api/connection.rb +35 -0
  22. data/lib/duodealer_api/countable.rb +14 -0
  23. data/lib/duodealer_api/disable_prefix_check.rb +31 -0
  24. data/lib/duodealer_api/events.rb +7 -0
  25. data/lib/duodealer_api/graphql.rb +79 -0
  26. data/lib/duodealer_api/graphql/http_client.rb +22 -0
  27. data/lib/duodealer_api/graphql/railtie.rb +17 -0
  28. data/lib/duodealer_api/graphql/task.rake +97 -0
  29. data/lib/duodealer_api/limits.rb +76 -0
  30. data/lib/duodealer_api/message_enricher.rb +23 -0
  31. data/lib/duodealer_api/meta.rb +15 -0
  32. data/lib/duodealer_api/metafields.rb +20 -0
  33. data/lib/duodealer_api/paginated_collection.rb +69 -0
  34. data/lib/duodealer_api/pagination_link_headers.rb +33 -0
  35. data/lib/duodealer_api/resources.rb +3 -0
  36. data/lib/duodealer_api/resources/abandoned_checkout.rb +7 -0
  37. data/lib/duodealer_api/resources/access_scope.rb +10 -0
  38. data/lib/duodealer_api/resources/access_token.rb +8 -0
  39. data/lib/duodealer_api/resources/address.rb +4 -0
  40. data/lib/duodealer_api/resources/announcement.rb +4 -0
  41. data/lib/duodealer_api/resources/api_permission.rb +9 -0
  42. data/lib/duodealer_api/resources/application_charge.rb +15 -0
  43. data/lib/duodealer_api/resources/application_credit.rb +4 -0
  44. data/lib/duodealer_api/resources/array_base.rb +13 -0
  45. data/lib/duodealer_api/resources/article.rb +21 -0
  46. data/lib/duodealer_api/resources/asset.rb +100 -0
  47. data/lib/duodealer_api/resources/assigned_fulfillment_order.rb +16 -0
  48. data/lib/duodealer_api/resources/base.rb +162 -0
  49. data/lib/duodealer_api/resources/billing_address.rb +4 -0
  50. data/lib/duodealer_api/resources/blog.rb +10 -0
  51. data/lib/duodealer_api/resources/carrier_service.rb +4 -0
  52. data/lib/duodealer_api/resources/cart.rb +4 -0
  53. data/lib/duodealer_api/resources/checkout.rb +30 -0
  54. data/lib/duodealer_api/resources/collect.rb +6 -0
  55. data/lib/duodealer_api/resources/collection.rb +14 -0
  56. data/lib/duodealer_api/resources/collection_listing.rb +18 -0
  57. data/lib/duodealer_api/resources/collection_publication.rb +10 -0
  58. data/lib/duodealer_api/resources/comment.rb +9 -0
  59. data/lib/duodealer_api/resources/country.rb +4 -0
  60. data/lib/duodealer_api/resources/currency.rb +6 -0
  61. data/lib/duodealer_api/resources/custom_collection.rb +19 -0
  62. data/lib/duodealer_api/resources/customer.rb +29 -0
  63. data/lib/duodealer_api/resources/customer_group.rb +5 -0
  64. data/lib/duodealer_api/resources/customer_invite.rb +4 -0
  65. data/lib/duodealer_api/resources/customer_saved_search.rb +11 -0
  66. data/lib/duodealer_api/resources/discount_code.rb +9 -0
  67. data/lib/duodealer_api/resources/draft_order.rb +14 -0
  68. data/lib/duodealer_api/resources/draft_order_invoice.rb +4 -0
  69. data/lib/duodealer_api/resources/event.rb +8 -0
  70. data/lib/duodealer_api/resources/fulfillment.rb +47 -0
  71. data/lib/duodealer_api/resources/fulfillment_event.rb +15 -0
  72. data/lib/duodealer_api/resources/fulfillment_order.rb +137 -0
  73. data/lib/duodealer_api/resources/fulfillment_order_locations_for_move.rb +4 -0
  74. data/lib/duodealer_api/resources/fulfillment_request.rb +15 -0
  75. data/lib/duodealer_api/resources/fulfillment_service.rb +4 -0
  76. data/lib/duodealer_api/resources/fulfillment_v2.rb +20 -0
  77. data/lib/duodealer_api/resources/gift_card.rb +7 -0
  78. data/lib/duodealer_api/resources/image.rb +16 -0
  79. data/lib/duodealer_api/resources/inventory_item.rb +6 -0
  80. data/lib/duodealer_api/resources/inventory_level.rb +55 -0
  81. data/lib/duodealer_api/resources/line_item.rb +14 -0
  82. data/lib/duodealer_api/resources/location.rb +8 -0
  83. data/lib/duodealer_api/resources/marketing_event.rb +10 -0
  84. data/lib/duodealer_api/resources/metafield.rb +13 -0
  85. data/lib/duodealer_api/resources/note_attribute.rb +4 -0
  86. data/lib/duodealer_api/resources/option.rb +4 -0
  87. data/lib/duodealer_api/resources/order.rb +43 -0
  88. data/lib/duodealer_api/resources/order_risk.rb +8 -0
  89. data/lib/duodealer_api/resources/page.rb +6 -0
  90. data/lib/duodealer_api/resources/payment.rb +7 -0
  91. data/lib/duodealer_api/resources/payment_details.rb +4 -0
  92. data/lib/duodealer_api/resources/ping.rb +3 -0
  93. data/lib/duodealer_api/resources/policy.rb +7 -0
  94. data/lib/duodealer_api/resources/price_rule.rb +8 -0
  95. data/lib/duodealer_api/resources/product.rb +35 -0
  96. data/lib/duodealer_api/resources/product_listing.rb +16 -0
  97. data/lib/duodealer_api/resources/product_publication.rb +10 -0
  98. data/lib/duodealer_api/resources/province.rb +5 -0
  99. data/lib/duodealer_api/resources/publication.rb +5 -0
  100. data/lib/duodealer_api/resources/receipt.rb +4 -0
  101. data/lib/duodealer_api/resources/recurring_application_charge.rb +31 -0
  102. data/lib/duodealer_api/resources/redirect.rb +4 -0
  103. data/lib/duodealer_api/resources/refund.rb +14 -0
  104. data/lib/duodealer_api/resources/report.rb +4 -0
  105. data/lib/duodealer_api/resources/resource_feedback.rb +19 -0
  106. data/lib/duodealer_api/resources/rule.rb +4 -0
  107. data/lib/duodealer_api/resources/script_tag.rb +4 -0
  108. data/lib/duodealer_api/resources/shipping_address.rb +4 -0
  109. data/lib/duodealer_api/resources/shipping_line.rb +4 -0
  110. data/lib/duodealer_api/resources/shipping_rate.rb +7 -0
  111. data/lib/duodealer_api/resources/shipping_zone.rb +4 -0
  112. data/lib/duodealer_api/resources/shop.rb +25 -0
  113. data/lib/duodealer_api/resources/smart_collection.rb +19 -0
  114. data/lib/duodealer_api/resources/storefront_access_token.rb +4 -0
  115. data/lib/duodealer_api/resources/tax_line.rb +4 -0
  116. data/lib/duodealer_api/resources/tax_service.rb +4 -0
  117. data/lib/duodealer_api/resources/tender_transaction.rb +6 -0
  118. data/lib/duodealer_api/resources/theme.rb +4 -0
  119. data/lib/duodealer_api/resources/transaction.rb +5 -0
  120. data/lib/duodealer_api/resources/usage_charge.rb +5 -0
  121. data/lib/duodealer_api/resources/user.rb +4 -0
  122. data/lib/duodealer_api/resources/variant.rb +8 -0
  123. data/lib/duodealer_api/resources/webhook.rb +4 -0
  124. data/lib/duodealer_api/session.rb +171 -0
  125. data/lib/duodealer_api/version.rb +3 -0
  126. data/shipit.rubygems.yml +1 -0
  127. data/test/abandoned_checkouts_test.rb +29 -0
  128. data/test/access_scope_test.rb +23 -0
  129. data/test/access_token_test.rb +19 -0
  130. data/test/active_resource/json_errors_test.rb +19 -0
  131. data/test/api_permission_test.rb +9 -0
  132. data/test/api_version_test.rb +157 -0
  133. data/test/application_charge_test.rb +79 -0
  134. data/test/application_credit_test.rb +35 -0
  135. data/test/article_test.rb +73 -0
  136. data/test/asset_test.rb +18 -0
  137. data/test/assigned_fulfillment_order_test.rb +77 -0
  138. data/test/base_test.rb +198 -0
  139. data/test/blog_test.rb +8 -0
  140. data/test/carrier_service_test.rb +17 -0
  141. data/test/cart_test.rb +13 -0
  142. data/test/checkouts_test.rb +77 -0
  143. data/test/collect_test.rb +9 -0
  144. data/test/collection_listing_test.rb +79 -0
  145. data/test/collection_publication_test.rb +40 -0
  146. data/test/collection_test.rb +49 -0
  147. data/test/countable_test.rb +13 -0
  148. data/test/currency_test.rb +21 -0
  149. data/test/custom_collection_test.rb +9 -0
  150. data/test/customer_saved_search_test.rb +27 -0
  151. data/test/customer_test.rb +50 -0
  152. data/test/detailed_log_subscriber_test.rb +139 -0
  153. data/test/discount_code_test.rb +53 -0
  154. data/test/draft_order_test.rb +151 -0
  155. data/test/fixtures/abandoned_checkout.json +184 -0
  156. data/test/fixtures/abandoned_checkouts.json +186 -0
  157. data/test/fixtures/access_scopes.json +10 -0
  158. data/test/fixtures/access_token_delegate.json +4 -0
  159. data/test/fixtures/api_versions.json +38 -0
  160. data/test/fixtures/apis.json +42 -0
  161. data/test/fixtures/application_charge.json +16 -0
  162. data/test/fixtures/application_charges.json +57 -0
  163. data/test/fixtures/application_credit.json +12 -0
  164. data/test/fixtures/application_credits.json +24 -0
  165. data/test/fixtures/article.json +15 -0
  166. data/test/fixtures/articles.json +39 -0
  167. data/test/fixtures/asset.json +9 -0
  168. data/test/fixtures/assets.json +136 -0
  169. data/test/fixtures/assigned_fulfillment_orders.json +78 -0
  170. data/test/fixtures/authors.json +1 -0
  171. data/test/fixtures/blog.json +13 -0
  172. data/test/fixtures/blogs.json +13 -0
  173. data/test/fixtures/carrier_service.json +9 -0
  174. data/test/fixtures/carts.json +43 -0
  175. data/test/fixtures/checkout.json +160 -0
  176. data/test/fixtures/checkouts.json +162 -0
  177. data/test/fixtures/collect.json +12 -0
  178. data/test/fixtures/collection.json +17 -0
  179. data/test/fixtures/collection_listing.json +11 -0
  180. data/test/fixtures/collection_listing_product_ids.json +1 -0
  181. data/test/fixtures/collection_listing_product_ids2.json +1 -0
  182. data/test/fixtures/collection_listings.json +13 -0
  183. data/test/fixtures/collection_products.json +47 -0
  184. data/test/fixtures/collection_publication.json +11 -0
  185. data/test/fixtures/collection_publications.json +13 -0
  186. data/test/fixtures/currencies.json +25 -0
  187. data/test/fixtures/custom_collection.json +17 -0
  188. data/test/fixtures/customer_invite.json +9 -0
  189. data/test/fixtures/customer_saved_search.json +9 -0
  190. data/test/fixtures/customer_saved_search_customers.json +60 -0
  191. data/test/fixtures/customers.json +59 -0
  192. data/test/fixtures/customers_account_activation_url.json +3 -0
  193. data/test/fixtures/customers_search.json +60 -0
  194. data/test/fixtures/discount_code.json +10 -0
  195. data/test/fixtures/discount_codes.json +12 -0
  196. data/test/fixtures/draft_order.json +159 -0
  197. data/test/fixtures/draft_order_completed.json +159 -0
  198. data/test/fixtures/draft_order_invoice.json +9 -0
  199. data/test/fixtures/draft_orders.json +161 -0
  200. data/test/fixtures/engagement.json +15 -0
  201. data/test/fixtures/events.json +31 -0
  202. data/test/fixtures/fulfillment.json +49 -0
  203. data/test/fixtures/fulfillment_event.json +12 -0
  204. data/test/fixtures/fulfillment_order.json +38 -0
  205. data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
  206. data/test/fixtures/fulfillment_orders.json +78 -0
  207. data/test/fixtures/fulfillment_request.json +28 -0
  208. data/test/fixtures/fulfillment_service.json +10 -0
  209. data/test/fixtures/fulfillments.json +53 -0
  210. data/test/fixtures/gift_card.json +20 -0
  211. data/test/fixtures/gift_card_disabled.json +20 -0
  212. data/test/fixtures/graphql/2019-10.json +1083 -0
  213. data/test/fixtures/graphql/dummy_schema.rb +16 -0
  214. data/test/fixtures/graphql/unstable.json +1083 -0
  215. data/test/fixtures/image.json +10 -0
  216. data/test/fixtures/images.json +20 -0
  217. data/test/fixtures/inventory_level.json +7 -0
  218. data/test/fixtures/inventory_levels.json +24 -0
  219. data/test/fixtures/marketing_event.json +28 -0
  220. data/test/fixtures/marketing_events.json +54 -0
  221. data/test/fixtures/metafield.json +12 -0
  222. data/test/fixtures/metafields.json +34 -0
  223. data/test/fixtures/order.json +297 -0
  224. data/test/fixtures/order_risk.json +14 -0
  225. data/test/fixtures/order_risks.json +28 -0
  226. data/test/fixtures/order_with_properties.json +373 -0
  227. data/test/fixtures/orders.json +299 -0
  228. data/test/fixtures/payment.json +7 -0
  229. data/test/fixtures/payments.json +9 -0
  230. data/test/fixtures/ping/conversation.json +1 -0
  231. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  232. data/test/fixtures/ping/message.json +1 -0
  233. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  234. data/test/fixtures/policies.json +8 -0
  235. data/test/fixtures/price_rule.json +27 -0
  236. data/test/fixtures/price_rules.json +28 -0
  237. data/test/fixtures/product.json +116 -0
  238. data/test/fixtures/product_listing.json +86 -0
  239. data/test/fixtures/product_listing_product_ids.json +1 -0
  240. data/test/fixtures/product_listing_product_ids2.json +1 -0
  241. data/test/fixtures/product_listings.json +174 -0
  242. data/test/fixtures/product_publication.json +11 -0
  243. data/test/fixtures/product_publications.json +13 -0
  244. data/test/fixtures/publications.json +9 -0
  245. data/test/fixtures/recurring_application_charge.json +22 -0
  246. data/test/fixtures/recurring_application_charge_adjustment.json +5 -0
  247. data/test/fixtures/recurring_application_charges.json +106 -0
  248. data/test/fixtures/redirect.json +7 -0
  249. data/test/fixtures/refund.json +112 -0
  250. data/test/fixtures/report.json +9 -0
  251. data/test/fixtures/reports.json +11 -0
  252. data/test/fixtures/script_tag.json +10 -0
  253. data/test/fixtures/script_tags.json +18 -0
  254. data/test/fixtures/shipping_rates.json +12 -0
  255. data/test/fixtures/shipping_zones.json +315 -0
  256. data/test/fixtures/shop.json +26 -0
  257. data/test/fixtures/smart_collection.json +21 -0
  258. data/test/fixtures/smart_collection_products.json +155 -0
  259. data/test/fixtures/storefront_access_token.json +9 -0
  260. data/test/fixtures/storefront_access_tokens.json +18 -0
  261. data/test/fixtures/tags.json +1 -0
  262. data/test/fixtures/tax_service.json +9 -0
  263. data/test/fixtures/tender_transactions.json +52 -0
  264. data/test/fixtures/transaction.json +29 -0
  265. data/test/fixtures/usage_charge.json +11 -0
  266. data/test/fixtures/usage_charges.json +23 -0
  267. data/test/fixtures/user.json +21 -0
  268. data/test/fixtures/users.json +42 -0
  269. data/test/fixtures/variant.json +23 -0
  270. data/test/fixtures/variants.json +88 -0
  271. data/test/fixtures/webhook.json +10 -0
  272. data/test/fixtures/webhooks.json +18 -0
  273. data/test/fulfillment_event_test.rb +69 -0
  274. data/test/fulfillment_order_test.rb +462 -0
  275. data/test/fulfillment_order_test_helper.rb +7 -0
  276. data/test/fulfillment_request_test.rb +33 -0
  277. data/test/fulfillment_service_test.rb +17 -0
  278. data/test/fulfillment_test.rb +224 -0
  279. data/test/fulfillment_v2_test.rb +62 -0
  280. data/test/gift_card_test.rb +22 -0
  281. data/test/graphql/http_client_test.rb +26 -0
  282. data/test/graphql_test.rb +147 -0
  283. data/test/image_test.rb +39 -0
  284. data/test/inventory_level_test.rb +59 -0
  285. data/test/lib/webmock_extensions/last_request.rb +16 -0
  286. data/test/limits_test.rb +38 -0
  287. data/test/location_test.rb +14 -0
  288. data/test/marketing_event_test.rb +68 -0
  289. data/test/message_enricher_test.rb +45 -0
  290. data/test/meta_test.rb +49 -0
  291. data/test/metafield_test.rb +46 -0
  292. data/test/order_risk_test.rb +46 -0
  293. data/test/order_test.rb +125 -0
  294. data/test/pagination_test.rb +257 -0
  295. data/test/payment_test.rb +19 -0
  296. data/test/policy_test.rb +19 -0
  297. data/test/price_rule_test.rb +65 -0
  298. data/test/product_listing_test.rb +97 -0
  299. data/test/product_publication_test.rb +40 -0
  300. data/test/product_test.rb +60 -0
  301. data/test/publication_test.rb +12 -0
  302. data/test/recurring_application_charge_test.rb +142 -0
  303. data/test/redirect_test.rb +9 -0
  304. data/test/refund_test.rb +32 -0
  305. data/test/report_test.rb +35 -0
  306. data/test/resource_feedback_test.rb +42 -0
  307. data/test/script_tag_test.rb +30 -0
  308. data/test/session_test.rb +366 -0
  309. data/test/shipping_rate_test.rb +17 -0
  310. data/test/shipping_zone_test.rb +10 -0
  311. data/test/shop_test.rb +68 -0
  312. data/test/smart_collection_test.rb +35 -0
  313. data/test/storefront_access_token_test.rb +32 -0
  314. data/test/tax_service_test.rb +9 -0
  315. data/test/tender_transaction_test.rb +18 -0
  316. data/test/test_helper.rb +124 -0
  317. data/test/transaction_test.rb +17 -0
  318. data/test/usage_charge_test.rb +21 -0
  319. data/test/user_test.rb +17 -0
  320. data/test/variant_test.rb +46 -0
  321. data/test/webhook_test.rb +21 -0
  322. metadata +541 -0
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class ImageTest < Test::Unit::TestCase
4
+ def test_create_image
5
+ fake "products/632910392/images", :method => :post, :body => load_fixture('image')
6
+ image = DuodealerAPI::Image.new(:product_id => 632910392)
7
+ image.position = 1
8
+ image.attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3MNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf=="
9
+ image.save
10
+
11
+ assert_equal 'http://cdn.duodealer.com/s/files/1/0006/9093/3842/products/ipod-nano.png?v=1389388540', image.src
12
+ assert_equal 850703190, image.id
13
+ end
14
+
15
+ def test_get_images
16
+ fake "products/632910392/images", :method => :get, :body => load_fixture('images')
17
+ image = DuodealerAPI::Image.find(:all, :params => {:product_id => 632910392})
18
+ assert_equal 2, image.size
19
+ end
20
+
21
+ def test_get_image
22
+ fake "products/632910392/images/850703190", :method => :get, :body => load_fixture('image')
23
+ image = DuodealerAPI::Image.find(850703190, :params => {:product_id => 632910392})
24
+ assert_equal 850703190, image.id
25
+ end
26
+
27
+ def test_delete_image
28
+ fake "products/632910392/images/850703190", :method => :get, :body => load_fixture('image')
29
+ fake "products/632910392/images/850703190", :method => :delete, :body => "destroyed"
30
+ image = DuodealerAPI::Image.find(850703190, :params => {:product_id => 632910392})
31
+ assert image.destroy
32
+ end
33
+
34
+ def test_delete_image_without_fetching
35
+ fake "products/632910392/images/850703190", :method => :delete, :body => "destroyed"
36
+ image = DuodealerAPI::Image.new(product_id: 632910392, id: 850703190)
37
+ assert image.destroy
38
+ end
39
+ end
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ class InventoryLevelTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ @inventory_level_response = ActiveSupport::JSON.decode load_fixture('inventory_level')
7
+ @inventory_level = DuodealerAPI::InventoryLevel.new(@inventory_level_response['inventory_level'])
8
+ end
9
+
10
+ test ".find with inventory_item_ids and location_ids returns expected inventory levels" do
11
+ params = { inventory_item_ids: [808950810, 39072856], location_ids: [905684977, 487838322] }
12
+ fake "inventory_levels.json?#{params.to_param}", extension: false, method: :get,
13
+ status: 200, body: load_fixture('inventory_levels')
14
+ inventory_levels = DuodealerAPI::InventoryLevel.find(:all, params: params)
15
+
16
+ assert inventory_levels.all? { |item|
17
+ params[:location_ids].include?(item.location_id) &&
18
+ params[:inventory_item_ids].include?(item.inventory_item_id)
19
+ }, message: 'Response contained inventory_items or locations not requested.'
20
+ end
21
+
22
+ test '#adjust with adjustment value returns inventory_level with available increased by adjustment value' do
23
+ adjustment = 5
24
+ updated_available = @inventory_level.available + adjustment
25
+ @inventory_level_response[:available] = updated_available
26
+
27
+ fake 'inventory_levels/adjust', method: :post, body: ActiveSupport::JSON.encode(@inventory_level_response)
28
+ @inventory_level.adjust(adjustment)
29
+ assert_equal updated_available, @inventory_level.available
30
+ end
31
+
32
+ test '#connect saves an inventory_level associated with inventory_item and location_id' do
33
+ params = { inventory_item_id: 808950810, location_id: 99999999 }
34
+ response = params.clone
35
+ response[:available] = 0
36
+
37
+ fake 'inventory_levels/connect', method: :post, body: ActiveSupport::JSON.encode(response)
38
+ inventory_level = DuodealerAPI::InventoryLevel.new(params)
39
+ inventory_level.connect
40
+ assert_equal 0, inventory_level.available, message: 'expected newly connected location to have 0 inventory'
41
+ end
42
+
43
+ test '#destroy removes inventory_level and returns nil' do
44
+ params = { inventory_item_id: @inventory_level.inventory_item_id, location_id: @inventory_level.location_id }
45
+ fake "inventory_levels.json?#{params.to_param}", extension: false, method: :delete, status: 204, body: nil
46
+ assert_nil @inventory_level.destroy
47
+ end
48
+
49
+ test '#set with available value returns inventory_level with available as the available value' do
50
+ available = 13
51
+ response = @inventory_level_response.clone
52
+ response['inventory_level']['available'] = available
53
+
54
+ fake 'inventory_levels/set', method: :post, body: ActiveSupport::JSON.encode(response)
55
+ @inventory_level.set(available)
56
+
57
+ assert_equal available, @inventory_level.available
58
+ end
59
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LastRequest
4
+ def last_request
5
+ @last_request
6
+ end
7
+
8
+ def last_request=(request_signature)
9
+ @last_request = request_signature
10
+ end
11
+ end
12
+
13
+ WebMock.extend(LastRequest)
14
+ WebMock.after_request do |request_signature, response|
15
+ WebMock.last_request = request_signature
16
+ end
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+
3
+ class LimitsTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ @header_hash = { 'X-DuoDealer-Shop-Api-Call-Limit' => '100/300' }
7
+ DuodealerAPI::Base.connection.expects(:response).at_least(0).returns(@header_hash)
8
+ end
9
+
10
+ context "Limits" do
11
+ should "fetch limit total" do
12
+ assert_equal(299, DuodealerAPI.credit_limit(:shop))
13
+ end
14
+
15
+ should "fetch used calls" do
16
+ assert_equal(100, DuodealerAPI.credit_used(:shop))
17
+ end
18
+
19
+ should "calculate remaining calls" do
20
+ assert_equal(199, DuodealerAPI.credit_left)
21
+ end
22
+
23
+ should "flag maxed out credits" do
24
+ assert !DuodealerAPI.maxed?
25
+ @header_hash = { 'X-DuoDealer-Shop-Api-Call-Limit' => '299/300' }
26
+ DuodealerAPI::Base.connection.expects(:response).at_least(1).returns(@header_hash)
27
+ assert DuodealerAPI.maxed?
28
+ end
29
+
30
+ should "raise error when header doesn't exist" do
31
+ @header_hash = {}
32
+ DuodealerAPI::Base.connection.expects(:response).at_least(1).returns(@header_hash)
33
+ assert_raises DuodealerAPI::Limits::LimitUnavailable do
34
+ DuodealerAPI.credit_left
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class LocationTest < Test::Unit::TestCase
4
+ test '#inventory_levels returns all inventory_levels associated with this location' do
5
+ location = DuodealerAPI::Location.new(id: 487838322)
6
+ expected_body = JSON.parse(load_fixture('inventory_levels'))
7
+ expected_body['inventory_levels'].delete_if {|level| level['location_id'] != location.id }
8
+ fake "locations/#{location.id}/inventory_levels", method: :get, status: 200, body: JSON(expected_body).to_s
9
+ inventory_levels = location.inventory_levels
10
+
11
+ assert inventory_levels.all? { |item| item.location_id == location.id },
12
+ message: 'Response contained locations other than the current location.'
13
+ end
14
+ end
@@ -0,0 +1,68 @@
1
+ require 'test_helper'
2
+
3
+ class MarketingEventTest < Test::Unit::TestCase
4
+
5
+ def test_get_marketing_events
6
+ fake "marketing_events", :method => :get, :body => load_fixture('marketing_events')
7
+ marketing_events = DuodealerAPI::MarketingEvent.all
8
+ assert_equal 2, marketing_events.size
9
+ end
10
+
11
+ def test_get_marketing_event
12
+ fake "marketing_events/1", :method => :get, :body => load_fixture('marketing_event')
13
+ marketing_event = DuodealerAPI::MarketingEvent.find(1)
14
+ assert_equal 1, marketing_event.id
15
+ end
16
+
17
+ def test_create_marketing_event
18
+ fake "marketing_events", :method => :post, :body => load_fixture('marketing_event')
19
+ marketing_event = DuodealerAPI::MarketingEvent.new
20
+ marketing_event.currency_code = 'GBP'
21
+ marketing_event.event_target = 'facebook'
22
+ marketing_event.event_type = 'post'
23
+ marketing_event.save
24
+
25
+ assert_equal 'facebook', marketing_event.event_target
26
+ assert_equal 1, marketing_event.id
27
+ end
28
+
29
+ def test_delete_marketing_event
30
+ fake "marketing_events/1", :method => :get, :body => load_fixture('marketing_event')
31
+ fake "marketing_events/1", :method => :delete, :body => "destroyed"
32
+ marketing_event = DuodealerAPI::MarketingEvent.find(1)
33
+ assert marketing_event.destroy
34
+ end
35
+
36
+ def test_update_marketing_event
37
+ fake 'marketing_events/1', :method => :get, :status => 200, :body => load_fixture('marketing_event')
38
+ marketing_event = DuodealerAPI::MarketingEvent.find(1)
39
+ marketing_event.currency = 'USD'
40
+ fake 'marketing_events/1', :method => :put, :status => 200, :body => load_fixture('marketing_event')
41
+ assert marketing_event.save
42
+ end
43
+
44
+ def test_count_marketing_events
45
+ fake "marketing_events/count", :method => :get, :body => '{"count": 2}'
46
+ marketing_events_count = DuodealerAPI::MarketingEvent.count
47
+ assert_equal 2, marketing_events_count
48
+ end
49
+
50
+ def test_add_engagements
51
+ fake "marketing_events/1", method: :get, body: load_fixture('marketing_event')
52
+ marketing_event = DuodealerAPI::MarketingEvent.find(1)
53
+ fake "marketing_events/1/engagements", method: :post, status: 201, body: load_fixture('engagement')
54
+ engagement = {
55
+ occurred_on: "2017-04-20",
56
+ impressions_count: nil,
57
+ views_count: nil,
58
+ clicks_count: 10,
59
+ shares_count: nil,
60
+ favorites_count: nil,
61
+ comments_count: nil,
62
+ ad_spend: nil,
63
+ is_cumulative: true
64
+ }
65
+ marketing_event.add_engagements(engagement)
66
+ assert "2017-04-20", engagement[:occurred_on]
67
+ end
68
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ class MessageEnricherTest < Test::Unit::TestCase
4
+
5
+ def test_enriches_initial_message_when_body_contains_error
6
+ response = enriched_response(422, 'InitialMessage', { error: 'My Error' })
7
+
8
+ assert_equal 'InitialMessage (My Error)', response.message
9
+ end
10
+
11
+ def test_enriches_initial_message_when_body_contains_errors_array
12
+ response = enriched_response(422, 'InitialMessage', { errors: ['My Error1', 'My Error2'] })
13
+
14
+ assert_equal 'InitialMessage (My Error1; My Error2)', response.message
15
+ end
16
+
17
+ def test_enriches_initial_message_when_body_contains_errors_single_value
18
+ response = enriched_response(422, 'InitialMessage', { errors: 'My Error1' })
19
+
20
+ assert_equal 'InitialMessage (My Error1)', response.message
21
+ end
22
+
23
+ def test_returns_initial_message_when_code_is_200
24
+ response = enriched_response(200, 'InitialMessage', { result: 'Success' })
25
+
26
+ assert_equal 'InitialMessage', response.message
27
+ end
28
+
29
+ def test_returns_initial_message_when_body_cant_be_parsed
30
+ response = enriched_response(422, 'InitialMessage', 'not a json')
31
+
32
+ assert_equal 'InitialMessage', response.message
33
+ end
34
+
35
+ private
36
+
37
+ def enriched_response(code, message, body)
38
+ mock_response =
39
+ Struct
40
+ .new(:code, :message, :body)
41
+ .new(code.to_s, message.to_s, body.to_json)
42
+
43
+ DuodealerAPI::MessageEnricher.new(mock_response)
44
+ end
45
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class ApiVersionTest < Test::Unit::TestCase
5
+ test ".admin_versions returns array of api versions for admin" do
6
+ versions = [
7
+ {
8
+ "handle": "2019-01",
9
+ "display_name": "2019-01",
10
+ "supported": true,
11
+ "latest_supported": false
12
+ },
13
+ {
14
+ "handle": "2019-04",
15
+ "latest_supported": false,
16
+ "display_name": "2019-04",
17
+ "supported": true
18
+ },
19
+ {
20
+ "handle": "2019-07",
21
+ "latest_supported": false,
22
+ "display_name": "2019-07",
23
+ "supported": true
24
+ },
25
+ {
26
+ "handle": "2019-10",
27
+ "latest_supported": false,
28
+ "display_name": "2019-10",
29
+ "supported": true
30
+ },
31
+ {
32
+ "handle": "2020-01",
33
+ "latest_supported": true,
34
+ "display_name": "2020-01 (Latest)",
35
+ "supported": true
36
+ },
37
+ {
38
+ "handle": "unstable",
39
+ "latest_supported": false,
40
+ "display_name": "unstable",
41
+ "supported": false
42
+ }
43
+ ].to_json
44
+
45
+
46
+ assert_equal versions, DuodealerAPI::Meta.admin_versions.to_json
47
+
48
+ end
49
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ class MetafieldTest < Test::Unit::TestCase
4
+ def test_get_metafields
5
+ fake "metafields", :method => :get, :body => load_fixture('metafields')
6
+ metafields = DuodealerAPI::Metafield.find(:all)
7
+ end
8
+
9
+ def test_get_metafield
10
+ fake "metafields/721389482", :method => :get, :body => load_fixture('metafield')
11
+ assert DuodealerAPI::Metafield.find(721389482)
12
+ end
13
+
14
+ def test_get_metafield_of_a_blog
15
+ fake "blogs/1008414260/metafields/721389482", :method => :get, :body => load_fixture('metafield')
16
+ metafield = DuodealerAPI::Metafield.find(721389482, :params => {:resource => "blogs", :resource_id => 1008414260})
17
+ assert_equal 1008414260, metafield.prefix_options[:resource_id]
18
+ end
19
+
20
+ def test_create_metafield_for_a_blog
21
+ fake "blogs/1008414260", :method => :get, :body => load_fixture('blog')
22
+ fake "blogs/1008414260/metafields", :method => :post, :status => 201, :body => load_fixture('metafield')
23
+
24
+ blog = DuodealerAPI::Blog.find(1008414260)
25
+ metafield = blog.add_metafield(DuodealerAPI::Metafield.new(:namespace => "summaries", :key => "First Summary", :value => "Make commerce better", :value_type => "string"))
26
+
27
+ assert_equal ActiveSupport::JSON.decode('{"metafield":{"namespace":"summaries","key":"First Summary","value":"Make commerce better","value_type":"string"}}'), ActiveSupport::JSON.decode(WebMock.last_request.body)
28
+ assert !metafield.new_record?
29
+ end
30
+
31
+ def test_update_metafield
32
+ fake "metafields/721389482", :method => :get, :body => load_fixture('metafield')
33
+ fake "metafields/721389482", :method => :put, :status => 200, :body => load_fixture('metafield')
34
+ metafield = DuodealerAPI::Metafield.find(721389482)
35
+ metafield.namespace = "teaser"
36
+ assert metafield.save
37
+ end
38
+
39
+ def test_delete_metafield
40
+ fake "metafields/721389482", :method => :get, :body => load_fixture('metafield')
41
+ fake "metafields/721389482", :method => :delete, :body => 'destroyed'
42
+ metafield = DuodealerAPI::Metafield.find(721389482)
43
+ assert metafield.destroy
44
+ end
45
+ end
46
+
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ class OrderRiskTest < Test::Unit::TestCase
4
+ def test_create_order_risk
5
+ fake "orders/450789469/risks", :method => :post, :body => load_fixture('order_risk')
6
+ v = DuodealerAPI::OrderRisk.new(:order_id => 450789469)
7
+ v.message = "This order was placed from a proxy IP"
8
+ v.recommendation = "cancel"
9
+ v.score = "1.0"
10
+ v.source = "External"
11
+ v.merchant_message = "This order was placed from a proxy IP"
12
+ v.display = true
13
+ v.cause_cancel = true
14
+ v.save
15
+
16
+ assert_equal 284138680, v.id
17
+ end
18
+
19
+ def test_get_order_risks
20
+ fake "orders/450789469/risks", :method => :get, :body => load_fixture('order_risks')
21
+ v = DuodealerAPI::OrderRisk.find(:all, :params => {:order_id => 450789469})
22
+ assert_equal 2, v.size
23
+ end
24
+
25
+ def test_get_order_risk
26
+ fake "orders/450789469/risks/284138680", :method => :get, :body => load_fixture('order_risk')
27
+ v = DuodealerAPI::OrderRisk.find(284138680, :params => {:order_id => 450789469})
28
+ assert_equal 284138680, v.id
29
+ end
30
+
31
+ def test_delete_order_risk
32
+ fake "orders/450789469/risks/284138680", :method => :get, :body => load_fixture('order_risk')
33
+ fake "orders/450789469/risks/284138680", :method => :delete, :body => "destroyed"
34
+ v = DuodealerAPI::OrderRisk.find(284138680, :params => {:order_id => 450789469})
35
+ assert v.destroy
36
+ end
37
+
38
+ def test_update_order_risk
39
+ fake "orders/450789469/risks/284138680", :method => :get, :body => load_fixture('order_risk')
40
+ fake "orders/450789469/risks/284138680", :method => :put, :body => load_fixture('order_risk')
41
+
42
+ v = DuodealerAPI::OrderRisk.find(284138680, :params => {:order_id => 450789469})
43
+ v.position = 3
44
+ v.save
45
+ end
46
+ end
@@ -0,0 +1,125 @@
1
+ require 'test_helper'
2
+ require 'fulfillment_order_test_helper'
3
+
4
+ class OrderTest < Test::Unit::TestCase
5
+ include FulfillmentOrderTestHelper
6
+
7
+ test "create should create order" do
8
+ fake 'orders', :method => :post, :status => 201, :body => load_fixture('order')
9
+ order = DuodealerAPI::Order.create(line_items: [{quantity:1, variant_id:39072856}], financial_status:"authorized")
10
+ assert_equal 39072856, order.line_items.first.variant_id
11
+ end
12
+
13
+ test "create should create an order with custom properties" do
14
+ props = [{ :"By default may label with \"Roasted for " => { :"Your First Name" => { :"\". If you want something specific on the label, enter it here:" => "" }}}]
15
+ fake 'orders', :method => :post, :status => 201, :body => load_fixture('order_with_properties')
16
+ order = DuodealerAPI::Order.create(line_items: [{quantity:1, variant_id:39072856, properties:props}], financial_status:"authorized")
17
+ assert_equal 39072856, order.line_items.first.variant_id
18
+ end
19
+
20
+ test "get should get an order" do
21
+ fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
22
+ order = DuodealerAPI::Order.find(450789469)
23
+ assert_equal 450789469, order.id
24
+ end
25
+
26
+ test "get should get an order with custom properties" do
27
+ fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order_with_properties')
28
+ order = DuodealerAPI::Order.find(450789469)
29
+ assert_equal 450789469, order.id
30
+ end
31
+
32
+ test "get all should get all orders" do
33
+ fake 'orders', :method => :get, :status => 200, :body => load_fixture('orders')
34
+ order = DuodealerAPI::Order.all
35
+ assert_equal 450789469, order.first.id
36
+ end
37
+
38
+ test "add note should add a note to order" do
39
+ fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
40
+ order = DuodealerAPI::Order.find(450789469)
41
+ order.note = "Test note"
42
+ fake 'orders/450789469', :method => :put, :status => 200, :body => load_fixture('order')
43
+ order.save
44
+ assert_equal "Test note", order.note
45
+ end
46
+
47
+ test "delete should delete an order" do
48
+ fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
49
+ fake 'orders/450789469', :method => :delete, :body => 'destroyed'
50
+ order = DuodealerAPI::Order.find(450789469)
51
+ assert order.destroy
52
+ end
53
+
54
+ test "cancel an order with params" do
55
+ fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
56
+ fake 'orders/450789469/cancel', :method => :post, :body => load_fixture('order')
57
+ order = DuodealerAPI::Order.find(450789469)
58
+ order.cancel(email: false, restock: true)
59
+ assert_request_body({'email' => false, 'restock' => true}.to_json)
60
+ end
61
+
62
+ test "capture an order with currency param" do
63
+ fake 'orders/450789469', body: load_fixture('order')
64
+ order = DuodealerAPI::Order.find(450789469)
65
+
66
+ fake 'orders/450789469/transactions', method: :post, status: 201, body: load_fixture('transaction')
67
+ order.capture(100.00, currency: 'CAD')
68
+
69
+ assert_request_body({
70
+ transaction: {
71
+ amount: 100.00,
72
+ kind: 'capture',
73
+ currency: 'CAD',
74
+ },
75
+ }.to_json)
76
+ end
77
+
78
+ test "fulfillment_orders should get fulfillment orders for an order with 2020-01 version" do
79
+ url_prefix = url_prefix_for_activated_session_for('2020-01')
80
+
81
+ fake(
82
+ 'orders',
83
+ url: "#{url_prefix}/orders/450789469.json",
84
+ method: :get,
85
+ status: 200,
86
+ body: load_fixture('order'),
87
+ extension: false
88
+ )
89
+ order = DuodealerAPI::Order.find(450789469)
90
+
91
+ fake(
92
+ 'orders',
93
+ url: "#{url_prefix}/orders/450789469/fulfillment_orders.json",
94
+ method: :get,
95
+ status: 200,
96
+ body: load_fixture('fulfillment_orders'),
97
+ extension: false
98
+ )
99
+ fulfillment_orders = order.fulfillment_orders
100
+
101
+ assert_equal [519788021, 519788022], fulfillment_orders.map(&:id).sort
102
+ fulfillment_orders.each do |fulfillment_order|
103
+ assert fulfillment_order.is_a?(DuodealerAPI::FulfillmentOrder)
104
+ assert_equal 450789469, fulfillment_order.order_id
105
+ end
106
+ end
107
+
108
+ test "fulfillment_orders raises NotImplementedError when api_version is older than 2020-01" do
109
+ url_prefix = url_prefix_for_activated_session_for('2019-10')
110
+
111
+ fake(
112
+ 'orders',
113
+ url: "#{url_prefix}/orders/450789469.json",
114
+ method: :get,
115
+ status: 200,
116
+ body: load_fixture('order'),
117
+ extension: false
118
+ )
119
+ order = DuodealerAPI::Order.find(450789469)
120
+
121
+ assert_raises NotImplementedError do
122
+ order.fulfillment_orders
123
+ end
124
+ end
125
+ end