ruby_shopify_api 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (351) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.github/CODEOWNERS +1 -0
  4. data/.github/ISSUE_TEMPLATE.md +36 -0
  5. data/.github/probots.yml +2 -0
  6. data/.github/workflows/build.yml +43 -0
  7. data/.gitignore +15 -0
  8. data/.rubocop.yml +28 -0
  9. data/.rubocop_todo.yml +75 -0
  10. data/CHANGELOG-OLD.md +501 -0
  11. data/CHANGELOG.md +5 -0
  12. data/CONTRIBUTING.md +8 -0
  13. data/CONTRIBUTORS +3 -0
  14. data/Gemfile +10 -0
  15. data/Gemfile.lock +151 -0
  16. data/Gemfile_ar41 +5 -0
  17. data/Gemfile_ar50 +5 -0
  18. data/Gemfile_ar51 +5 -0
  19. data/Gemfile_ar60 +5 -0
  20. data/Gemfile_ar_main +5 -0
  21. data/LICENSE +20 -0
  22. data/README.md +649 -0
  23. data/RELEASING +17 -0
  24. data/Rakefile +55 -0
  25. data/SECURITY.md +59 -0
  26. data/dev.yml +11 -0
  27. data/docker-compose.yml +13 -0
  28. data/docs/_config.yml +1 -0
  29. data/docs/_includes/footer.html +28 -0
  30. data/docs/_includes/head.html +28 -0
  31. data/docs/_layouts/index.html +57 -0
  32. data/docs/graphql.md +241 -0
  33. data/docs/index.md +639 -0
  34. data/lib/active_resource/connection_ext.rb +11 -0
  35. data/lib/active_resource/detailed_log_subscriber.rb +55 -0
  36. data/lib/active_resource/json_errors.rb +37 -0
  37. data/lib/shopify_api/api_access.rb +57 -0
  38. data/lib/shopify_api/api_version.rb +206 -0
  39. data/lib/shopify_api/connection.rb +36 -0
  40. data/lib/shopify_api/countable.rb +15 -0
  41. data/lib/shopify_api/disable_prefix_check.rb +31 -0
  42. data/lib/shopify_api/events.rb +8 -0
  43. data/lib/shopify_api/graphql/http_client.rb +22 -0
  44. data/lib/shopify_api/graphql/railtie.rb +17 -0
  45. data/lib/shopify_api/graphql/task.rake +100 -0
  46. data/lib/shopify_api/graphql.rb +103 -0
  47. data/lib/shopify_api/hmac_params.rb +33 -0
  48. data/lib/shopify_api/limits.rb +77 -0
  49. data/lib/shopify_api/message_enricher.rb +25 -0
  50. data/lib/shopify_api/meta.rb +14 -0
  51. data/lib/shopify_api/metafields.rb +21 -0
  52. data/lib/shopify_api/paginated_collection.rb +69 -0
  53. data/lib/shopify_api/pagination_link_headers.rb +34 -0
  54. data/lib/shopify_api/resources/abandoned_checkout.rb +7 -0
  55. data/lib/shopify_api/resources/access_scope.rb +10 -0
  56. data/lib/shopify_api/resources/access_token.rb +9 -0
  57. data/lib/shopify_api/resources/address.rb +5 -0
  58. data/lib/shopify_api/resources/announcement.rb +5 -0
  59. data/lib/shopify_api/resources/api_permission.rb +9 -0
  60. data/lib/shopify_api/resources/application_charge.rb +16 -0
  61. data/lib/shopify_api/resources/application_credit.rb +5 -0
  62. data/lib/shopify_api/resources/array_base.rb +13 -0
  63. data/lib/shopify_api/resources/article.rb +22 -0
  64. data/lib/shopify_api/resources/asset.rb +101 -0
  65. data/lib/shopify_api/resources/assigned_fulfillment_order.rb +16 -0
  66. data/lib/shopify_api/resources/base.rb +166 -0
  67. data/lib/shopify_api/resources/billing_address.rb +5 -0
  68. data/lib/shopify_api/resources/blog.rb +11 -0
  69. data/lib/shopify_api/resources/carrier_service.rb +5 -0
  70. data/lib/shopify_api/resources/cart.rb +5 -0
  71. data/lib/shopify_api/resources/checkout.rb +30 -0
  72. data/lib/shopify_api/resources/collect.rb +7 -0
  73. data/lib/shopify_api/resources/collection.rb +14 -0
  74. data/lib/shopify_api/resources/collection_listing.rb +19 -0
  75. data/lib/shopify_api/resources/collection_publication.rb +10 -0
  76. data/lib/shopify_api/resources/comment.rb +24 -0
  77. data/lib/shopify_api/resources/country.rb +5 -0
  78. data/lib/shopify_api/resources/currency.rb +6 -0
  79. data/lib/shopify_api/resources/custom_collection.rb +20 -0
  80. data/lib/shopify_api/resources/customer.rb +30 -0
  81. data/lib/shopify_api/resources/customer_group.rb +6 -0
  82. data/lib/shopify_api/resources/customer_invite.rb +5 -0
  83. data/lib/shopify_api/resources/customer_saved_search.rb +12 -0
  84. data/lib/shopify_api/resources/discount_code.rb +10 -0
  85. data/lib/shopify_api/resources/discount_code_batch.rb +34 -0
  86. data/lib/shopify_api/resources/draft_order.rb +15 -0
  87. data/lib/shopify_api/resources/draft_order_invoice.rb +5 -0
  88. data/lib/shopify_api/resources/event.rb +9 -0
  89. data/lib/shopify_api/resources/fulfillment.rb +56 -0
  90. data/lib/shopify_api/resources/fulfillment_event.rb +16 -0
  91. data/lib/shopify_api/resources/fulfillment_order.rb +151 -0
  92. data/lib/shopify_api/resources/fulfillment_order_locations_for_move.rb +5 -0
  93. data/lib/shopify_api/resources/fulfillment_request.rb +16 -0
  94. data/lib/shopify_api/resources/fulfillment_service.rb +5 -0
  95. data/lib/shopify_api/resources/fulfillment_v2.rb +21 -0
  96. data/lib/shopify_api/resources/gift_card.rb +8 -0
  97. data/lib/shopify_api/resources/image.rb +17 -0
  98. data/lib/shopify_api/resources/inventory_item.rb +6 -0
  99. data/lib/shopify_api/resources/inventory_level.rb +54 -0
  100. data/lib/shopify_api/resources/line_item.rb +15 -0
  101. data/lib/shopify_api/resources/location.rb +8 -0
  102. data/lib/shopify_api/resources/marketing_event.rb +11 -0
  103. data/lib/shopify_api/resources/metafield.rb +14 -0
  104. data/lib/shopify_api/resources/note_attribute.rb +5 -0
  105. data/lib/shopify_api/resources/option.rb +5 -0
  106. data/lib/shopify_api/resources/order.rb +44 -0
  107. data/lib/shopify_api/resources/order_risk.rb +9 -0
  108. data/lib/shopify_api/resources/page.rb +7 -0
  109. data/lib/shopify_api/resources/payment.rb +7 -0
  110. data/lib/shopify_api/resources/payment_details.rb +5 -0
  111. data/lib/shopify_api/resources/ping.rb +3 -0
  112. data/lib/shopify_api/resources/policy.rb +8 -0
  113. data/lib/shopify_api/resources/price_rule.rb +8 -0
  114. data/lib/shopify_api/resources/product.rb +59 -0
  115. data/lib/shopify_api/resources/product_listing.rb +17 -0
  116. data/lib/shopify_api/resources/product_publication.rb +10 -0
  117. data/lib/shopify_api/resources/province.rb +6 -0
  118. data/lib/shopify_api/resources/publication.rb +5 -0
  119. data/lib/shopify_api/resources/receipt.rb +5 -0
  120. data/lib/shopify_api/resources/recurring_application_charge.rb +34 -0
  121. data/lib/shopify_api/resources/redirect.rb +5 -0
  122. data/lib/shopify_api/resources/refund.rb +15 -0
  123. data/lib/shopify_api/resources/report.rb +5 -0
  124. data/lib/shopify_api/resources/resource_feedback.rb +19 -0
  125. data/lib/shopify_api/resources/rule.rb +5 -0
  126. data/lib/shopify_api/resources/script_tag.rb +5 -0
  127. data/lib/shopify_api/resources/shipping_address.rb +5 -0
  128. data/lib/shopify_api/resources/shipping_line.rb +5 -0
  129. data/lib/shopify_api/resources/shipping_rate.rb +7 -0
  130. data/lib/shopify_api/resources/shipping_zone.rb +5 -0
  131. data/lib/shopify_api/resources/shop.rb +26 -0
  132. data/lib/shopify_api/resources/smart_collection.rb +15 -0
  133. data/lib/shopify_api/resources/storefront_access_token.rb +5 -0
  134. data/lib/shopify_api/resources/tax_line.rb +5 -0
  135. data/lib/shopify_api/resources/tax_service.rb +5 -0
  136. data/lib/shopify_api/resources/tender_transaction.rb +6 -0
  137. data/lib/shopify_api/resources/theme.rb +5 -0
  138. data/lib/shopify_api/resources/transaction.rb +6 -0
  139. data/lib/shopify_api/resources/usage_charge.rb +6 -0
  140. data/lib/shopify_api/resources/user.rb +5 -0
  141. data/lib/shopify_api/resources/variant.rb +43 -0
  142. data/lib/shopify_api/resources/webhook.rb +5 -0
  143. data/lib/shopify_api/resources.rb +4 -0
  144. data/lib/shopify_api/session.rb +203 -0
  145. data/lib/shopify_api/version.rb +4 -0
  146. data/lib/shopify_api.rb +45 -0
  147. data/lib/verify_docs.rb +8 -0
  148. data/service.yml +2 -0
  149. data/shipit.rubygems.yml +1 -0
  150. data/shopify_api.gemspec +47 -0
  151. data/test/abandoned_checkouts_test.rb +29 -0
  152. data/test/access_scope_test.rb +23 -0
  153. data/test/access_token_test.rb +20 -0
  154. data/test/active_resource/json_errors_test.rb +19 -0
  155. data/test/api_access_test.rb +153 -0
  156. data/test/api_permission_test.rb +9 -0
  157. data/test/api_version_test.rb +157 -0
  158. data/test/application_charge_test.rb +82 -0
  159. data/test/application_credit_test.rb +36 -0
  160. data/test/article_test.rb +72 -0
  161. data/test/asset_test.rb +26 -0
  162. data/test/assigned_fulfillment_order_test.rb +78 -0
  163. data/test/base_test.rb +213 -0
  164. data/test/blog_test.rb +9 -0
  165. data/test/carrier_service_test.rb +18 -0
  166. data/test/cart_test.rb +14 -0
  167. data/test/checkouts_test.rb +77 -0
  168. data/test/collect_test.rb +10 -0
  169. data/test/collection_listing_test.rb +84 -0
  170. data/test/collection_publication_test.rb +40 -0
  171. data/test/collection_test.rb +50 -0
  172. data/test/countable_test.rb +14 -0
  173. data/test/currency_test.rb +21 -0
  174. data/test/custom_collection_test.rb +10 -0
  175. data/test/customer_saved_search_test.rb +37 -0
  176. data/test/customer_test.rb +58 -0
  177. data/test/detailed_log_subscriber_test.rb +143 -0
  178. data/test/discount_code_batch_test.rb +41 -0
  179. data/test/discount_code_test.rb +59 -0
  180. data/test/draft_order_test.rb +167 -0
  181. data/test/fixtures/abandoned_checkout.json +184 -0
  182. data/test/fixtures/abandoned_checkouts.json +186 -0
  183. data/test/fixtures/access_scopes.json +10 -0
  184. data/test/fixtures/access_token_delegate.json +4 -0
  185. data/test/fixtures/api_versions.json +38 -0
  186. data/test/fixtures/apis.json +42 -0
  187. data/test/fixtures/application_charge.json +16 -0
  188. data/test/fixtures/application_charges.json +57 -0
  189. data/test/fixtures/application_credit.json +12 -0
  190. data/test/fixtures/application_credits.json +24 -0
  191. data/test/fixtures/article.json +15 -0
  192. data/test/fixtures/articles.json +39 -0
  193. data/test/fixtures/asset.json +9 -0
  194. data/test/fixtures/assets.json +136 -0
  195. data/test/fixtures/assigned_fulfillment_orders.json +80 -0
  196. data/test/fixtures/authors.json +1 -0
  197. data/test/fixtures/blog.json +13 -0
  198. data/test/fixtures/blogs.json +13 -0
  199. data/test/fixtures/carrier_service.json +9 -0
  200. data/test/fixtures/carts.json +43 -0
  201. data/test/fixtures/checkout.json +160 -0
  202. data/test/fixtures/checkouts.json +162 -0
  203. data/test/fixtures/collect.json +12 -0
  204. data/test/fixtures/collection.json +17 -0
  205. data/test/fixtures/collection_listing.json +11 -0
  206. data/test/fixtures/collection_listing_product_ids.json +1 -0
  207. data/test/fixtures/collection_listing_product_ids2.json +1 -0
  208. data/test/fixtures/collection_listings.json +13 -0
  209. data/test/fixtures/collection_products.json +47 -0
  210. data/test/fixtures/collection_publication.json +11 -0
  211. data/test/fixtures/collection_publications.json +13 -0
  212. data/test/fixtures/currencies.json +25 -0
  213. data/test/fixtures/custom_collection.json +17 -0
  214. data/test/fixtures/customer_invite.json +9 -0
  215. data/test/fixtures/customer_saved_search.json +9 -0
  216. data/test/fixtures/customer_saved_search_customers.json +60 -0
  217. data/test/fixtures/customers.json +59 -0
  218. data/test/fixtures/customers_account_activation_url.json +3 -0
  219. data/test/fixtures/customers_search.json +60 -0
  220. data/test/fixtures/discount_code.json +10 -0
  221. data/test/fixtures/discount_code_batch.json +14 -0
  222. data/test/fixtures/discount_code_batch_discount_codes.json +21 -0
  223. data/test/fixtures/discount_codes.json +12 -0
  224. data/test/fixtures/draft_order.json +159 -0
  225. data/test/fixtures/draft_order_completed.json +159 -0
  226. data/test/fixtures/draft_order_invoice.json +9 -0
  227. data/test/fixtures/draft_orders.json +161 -0
  228. data/test/fixtures/engagement.json +15 -0
  229. data/test/fixtures/events.json +31 -0
  230. data/test/fixtures/fulfillment.json +49 -0
  231. data/test/fixtures/fulfillment_event.json +12 -0
  232. data/test/fixtures/fulfillment_order.json +39 -0
  233. data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
  234. data/test/fixtures/fulfillment_orders.json +80 -0
  235. data/test/fixtures/fulfillment_request.json +28 -0
  236. data/test/fixtures/fulfillment_service.json +10 -0
  237. data/test/fixtures/fulfillments.json +53 -0
  238. data/test/fixtures/gift_card.json +20 -0
  239. data/test/fixtures/gift_card_disabled.json +20 -0
  240. data/test/fixtures/graphql/2019-10.json +1083 -0
  241. data/test/fixtures/graphql/dummy_schema.rb +16 -0
  242. data/test/fixtures/graphql/unstable.json +1083 -0
  243. data/test/fixtures/image.json +10 -0
  244. data/test/fixtures/images.json +20 -0
  245. data/test/fixtures/inventory_level.json +7 -0
  246. data/test/fixtures/inventory_levels.json +24 -0
  247. data/test/fixtures/marketing_event.json +28 -0
  248. data/test/fixtures/marketing_events.json +54 -0
  249. data/test/fixtures/metafield.json +12 -0
  250. data/test/fixtures/metafields.json +34 -0
  251. data/test/fixtures/order.json +297 -0
  252. data/test/fixtures/order_risk.json +14 -0
  253. data/test/fixtures/order_risks.json +28 -0
  254. data/test/fixtures/order_with_properties.json +373 -0
  255. data/test/fixtures/orders.json +299 -0
  256. data/test/fixtures/payment.json +7 -0
  257. data/test/fixtures/payments.json +9 -0
  258. data/test/fixtures/ping/conversation.json +1 -0
  259. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  260. data/test/fixtures/ping/message.json +1 -0
  261. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  262. data/test/fixtures/policies.json +8 -0
  263. data/test/fixtures/price_rule.json +27 -0
  264. data/test/fixtures/price_rules.json +28 -0
  265. data/test/fixtures/product.json +116 -0
  266. data/test/fixtures/product_listing.json +86 -0
  267. data/test/fixtures/product_listing_product_ids.json +1 -0
  268. data/test/fixtures/product_listing_product_ids2.json +1 -0
  269. data/test/fixtures/product_listings.json +174 -0
  270. data/test/fixtures/product_publication.json +11 -0
  271. data/test/fixtures/product_publications.json +13 -0
  272. data/test/fixtures/publications.json +9 -0
  273. data/test/fixtures/recurring_application_charge.json +22 -0
  274. data/test/fixtures/recurring_application_charge_adjustment.json +5 -0
  275. data/test/fixtures/recurring_application_charges.json +106 -0
  276. data/test/fixtures/redirect.json +7 -0
  277. data/test/fixtures/refund.json +112 -0
  278. data/test/fixtures/report.json +9 -0
  279. data/test/fixtures/reports.json +11 -0
  280. data/test/fixtures/script_tag.json +10 -0
  281. data/test/fixtures/script_tags.json +18 -0
  282. data/test/fixtures/shipping_rates.json +12 -0
  283. data/test/fixtures/shipping_zones.json +315 -0
  284. data/test/fixtures/shop.json +26 -0
  285. data/test/fixtures/smart_collection.json +21 -0
  286. data/test/fixtures/smart_collection_products.json +155 -0
  287. data/test/fixtures/storefront_access_token.json +9 -0
  288. data/test/fixtures/storefront_access_tokens.json +18 -0
  289. data/test/fixtures/tags.json +1 -0
  290. data/test/fixtures/tax_service.json +9 -0
  291. data/test/fixtures/tender_transactions.json +52 -0
  292. data/test/fixtures/transaction.json +29 -0
  293. data/test/fixtures/usage_charge.json +11 -0
  294. data/test/fixtures/usage_charges.json +23 -0
  295. data/test/fixtures/user.json +21 -0
  296. data/test/fixtures/users.json +42 -0
  297. data/test/fixtures/variant.json +23 -0
  298. data/test/fixtures/variants.json +88 -0
  299. data/test/fixtures/webhook.json +10 -0
  300. data/test/fixtures/webhooks.json +18 -0
  301. data/test/fulfillment_event_test.rb +74 -0
  302. data/test/fulfillment_order_test.rb +530 -0
  303. data/test/fulfillment_order_test_helper.rb +8 -0
  304. data/test/fulfillment_request_test.rb +35 -0
  305. data/test/fulfillment_service_test.rb +18 -0
  306. data/test/fulfillment_test.rb +239 -0
  307. data/test/fulfillment_v2_test.rb +66 -0
  308. data/test/gift_card_test.rb +24 -0
  309. data/test/graphql/http_client_test.rb +26 -0
  310. data/test/graphql_test.rb +190 -0
  311. data/test/hmac_params_test.rb +25 -0
  312. data/test/image_test.rb +41 -0
  313. data/test/inventory_level_test.rb +68 -0
  314. data/test/lib/webmock_extensions/last_request.rb +16 -0
  315. data/test/limits_test.rb +39 -0
  316. data/test/location_test.rb +15 -0
  317. data/test/marketing_event_test.rb +68 -0
  318. data/test/message_enricher_test.rb +45 -0
  319. data/test/meta_test.rb +47 -0
  320. data/test/metafield_test.rb +56 -0
  321. data/test/order_risk_test.rb +47 -0
  322. data/test/order_test.rb +140 -0
  323. data/test/pagination_test.rb +290 -0
  324. data/test/payment_test.rb +19 -0
  325. data/test/policy_test.rb +20 -0
  326. data/test/price_rule_test.rb +70 -0
  327. data/test/product_listing_test.rb +97 -0
  328. data/test/product_publication_test.rb +40 -0
  329. data/test/product_test.rb +111 -0
  330. data/test/publication_test.rb +12 -0
  331. data/test/recurring_application_charge_test.rb +204 -0
  332. data/test/redirect_test.rb +10 -0
  333. data/test/refund_test.rb +37 -0
  334. data/test/report_test.rb +37 -0
  335. data/test/resource_feedback_test.rb +43 -0
  336. data/test/script_tag_test.rb +31 -0
  337. data/test/session_test.rb +640 -0
  338. data/test/shipping_rate_test.rb +17 -0
  339. data/test/shipping_zone_test.rb +11 -0
  340. data/test/shop_test.rb +82 -0
  341. data/test/smart_collection_test.rb +11 -0
  342. data/test/storefront_access_token_test.rb +30 -0
  343. data/test/tax_service_test.rb +12 -0
  344. data/test/tender_transaction_test.rb +18 -0
  345. data/test/test_helper.rb +126 -0
  346. data/test/transaction_test.rb +18 -0
  347. data/test/usage_charge_test.rb +25 -0
  348. data/test/user_test.rb +18 -0
  349. data/test/variant_test.rb +73 -0
  350. data/test/webhook_test.rb +24 -0
  351. metadata +555 -0
@@ -0,0 +1,530 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+ require 'fulfillment_order_test_helper'
4
+
5
+ class FulFillmentOrderTest < Test::Unit::TestCase
6
+ include FulfillmentOrderTestHelper
7
+
8
+ def setup
9
+ super
10
+ @url_prefix = url_prefix_for_activated_session_for('2020-01')
11
+
12
+ fake(
13
+ 'fulfillment_orders',
14
+ url: "#{@url_prefix}/fulfillment_orders/519788021.json",
15
+ method: :get,
16
+ body: load_fixture('fulfillment_order')
17
+ )
18
+ end
19
+
20
+ context "FulfillmentOrder" do
21
+ context ".new" do
22
+ should "raise NotImplementedError when api_version is older than 2020-01" do
23
+ url_prefix_for_activated_session_for('2019-10')
24
+ fulfillment_order = load_fixture('fulfillment_order')
25
+
26
+ exception = assert_raises(NotImplementedError) do
27
+ ShopifyAPI::FulfillmentOrder.new(ActiveSupport::JSON.decode(fulfillment_order))
28
+ end
29
+ assert_equal(
30
+ "The minimum supported version is 2020-01.",
31
+ exception.message
32
+ )
33
+ end
34
+ end
35
+
36
+ context ".find and .all" do
37
+ should "raise NotImplementedError when api_version is older than 2020-01" do
38
+ @url_prefix = url_prefix_for_activated_session_for('2019-10')
39
+
40
+ fake(
41
+ 'fulfillment_orders',
42
+ url: "#{@url_prefix}/fulfillment_orders/519788021.json",
43
+ method: :get,
44
+ body: load_fixture('fulfillment_order')
45
+ )
46
+ exception = assert_raises(NotImplementedError) do
47
+ ShopifyAPI::FulfillmentOrder.find(519788021)
48
+ end
49
+ assert_equal(
50
+ "The minimum supported version is 2020-01.",
51
+ exception.message
52
+ )
53
+
54
+ assert_raises(NotImplementedError) do
55
+ ShopifyAPI::FulfillmentOrder.all(params: { order_id: 450789469 })
56
+ end
57
+ end
58
+ end
59
+
60
+ context "#find" do
61
+ should "be able to find fulfillment order" do
62
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
63
+ assert(fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder))
64
+ assert_equal(519788021, fulfillment_order.id)
65
+ assert_equal(450789469, fulfillment_order.order_id)
66
+ end
67
+ end
68
+
69
+ context "#all" do
70
+ should "be able to list fulfillment orders for an order" do
71
+ fake(
72
+ 'orders',
73
+ url: "#{@url_prefix}/orders/450789469/fulfillment_orders.json",
74
+ method: :get,
75
+ body: load_fixture('fulfillment_orders')
76
+ )
77
+ fulfillment_orders = ShopifyAPI::FulfillmentOrder.all(
78
+ params: { order_id: 450789469 }
79
+ )
80
+
81
+ assert_equal([519788021, 519788022], fulfillment_orders.map(&:id).sort)
82
+ fulfillment_orders.each do |fulfillment_order|
83
+ assert(fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder))
84
+ assert_equal(450789469, fulfillment_order.order_id)
85
+ end
86
+ end
87
+
88
+ should "require order_id" do
89
+ assert_raises(ShopifyAPI::ValidationException) do
90
+ ShopifyAPI::FulfillmentOrder.all
91
+ end
92
+ end
93
+ end
94
+
95
+ context "#fulfillments" do
96
+ should "be able to list fulfillments for a fulfillment order" do
97
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
98
+ fake(
99
+ 'fulfillment_orders',
100
+ url: "#{@url_prefix}/fulfillment_orders/#{fulfillment_order.id}/fulfillments.json",
101
+ method: :get,
102
+ body: load_fixture('fulfillments')
103
+ )
104
+ fulfillments = fulfillment_order.fulfillments
105
+
106
+ assert_equal(1, fulfillments.count)
107
+ fulfillment = fulfillments.first
108
+ assert(fulfillment.is_a?(ShopifyAPI::Fulfillment))
109
+ assert_equal(450789469, fulfillment.order_id)
110
+ end
111
+ end
112
+
113
+ context "#locations_for_move" do
114
+ should "be able to list locations for a fulfillment order" do
115
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
116
+ fake(
117
+ 'fulfillment_orders',
118
+ url: "#{@url_prefix}/fulfillment_orders/#{fulfillment_order.id}/locations_for_move.json",
119
+ method: :get,
120
+ body: load_fixture('fulfillment_order_locations_for_move')
121
+ )
122
+ locations_for_move = fulfillment_order.locations_for_move
123
+
124
+ assert_equal(2, locations_for_move.count)
125
+ location_for_move = locations_for_move.first
126
+ assert(location_for_move.is_a?(ShopifyAPI::FulfillmentOrderLocationsForMove))
127
+
128
+ location = location_for_move.location
129
+ assert(location.is_a?(ShopifyAPI::Location))
130
+ assert_equal(1059367776, location.id)
131
+ end
132
+ end
133
+
134
+ context "#move" do
135
+ should "move a fulfillment order to a new_location_id" do
136
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
137
+ new_location_id = 5
138
+
139
+ fake_original_fulfillment_order = fulfillment_order.clone
140
+ fake_original_fulfillment_order.status = 'closed'
141
+ fake_moved_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
142
+ fake_moved_fulfillment_order['assigned_location_id'] = new_location_id
143
+
144
+ request_body = { fulfillment_order: { new_location_id: 5 } }
145
+ body = {
146
+ original_fulfillment_order: fake_original_fulfillment_order,
147
+ moved_fulfillment_order: fake_moved_fulfillment_order,
148
+ remaining_fulfillment_order: nil,
149
+ }
150
+ fake(
151
+ 'fulfillment_orders',
152
+ url: "#{@url_prefix}/fulfillment_orders/519788021/move.json",
153
+ method: :post,
154
+ request_body: ActiveSupport::JSON.encode(request_body),
155
+ body: ActiveSupport::JSON.encode(body)
156
+ )
157
+ response_fulfillment_orders = fulfillment_order.move(new_location_id: new_location_id)
158
+
159
+ assert_equal('closed', fulfillment_order.status)
160
+
161
+ assert_equal(3, response_fulfillment_orders.count)
162
+ original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
163
+ refute_nil original_fulfillment_order
164
+ assert(original_fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder))
165
+ assert_equal('closed', original_fulfillment_order.status)
166
+
167
+ moved_fulfillment_order = response_fulfillment_orders['moved_fulfillment_order']
168
+ refute_nil moved_fulfillment_order
169
+ assert(moved_fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder))
170
+ assert_equal('open', moved_fulfillment_order.status)
171
+ assert_equal(new_location_id, moved_fulfillment_order.assigned_location_id)
172
+
173
+ remaining_fulfillment_order = response_fulfillment_orders['remaining_fulfillment_order']
174
+ assert_nil(remaining_fulfillment_order)
175
+ end
176
+ end
177
+
178
+ context "#cancel" do
179
+ should "cancel a fulfillment order" do
180
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
181
+ assert_equal('open', fulfillment_order.status)
182
+
183
+ cancelled = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
184
+ cancelled['status'] = 'cancelled'
185
+ body = {
186
+ fulfillment_order: cancelled,
187
+ replacement_fulfillment_order: fulfillment_order,
188
+ }
189
+ fake(
190
+ 'fulfillment_orders',
191
+ url: "#{@url_prefix}/fulfillment_orders/519788021/cancel.json",
192
+ method: :post,
193
+ body: ActiveSupport::JSON.encode(body)
194
+ )
195
+ response_fulfillment_orders = fulfillment_order.cancel
196
+
197
+ assert_equal('cancelled', fulfillment_order.status)
198
+ assert_equal(2, response_fulfillment_orders.count)
199
+ fulfillment_order = response_fulfillment_orders['fulfillment_order']
200
+ assert_equal('cancelled', fulfillment_order.status)
201
+ replacement_fulfillment_order = response_fulfillment_orders['replacement_fulfillment_order']
202
+ assert_equal('open', replacement_fulfillment_order.status)
203
+ end
204
+ end
205
+
206
+ context "#close" do
207
+ should "be able to close fulfillment order" do
208
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
209
+ fulfillment_order.status = 'in_progress'
210
+
211
+ closed = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
212
+ closed['status'] = 'incomplete'
213
+ request_body = {
214
+ fulfillment_order: {
215
+ message: "Test close message.",
216
+ },
217
+ }
218
+ fake(
219
+ 'fulfillment_orders',
220
+ url: "#{@url_prefix}/fulfillment_orders/519788021/close.json",
221
+ method: :post,
222
+ request_body: ActiveSupport::JSON.encode(request_body),
223
+ body: ActiveSupport::JSON.encode(closed)
224
+ )
225
+ assert(fulfillment_order.close(message: "Test close message."))
226
+ assert_equal('incomplete', fulfillment_order.status)
227
+ end
228
+ end
229
+
230
+ context "#open" do
231
+ should "be able to open fulfillment order" do
232
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
233
+ fulfillment_order.status = 'scheduled'
234
+
235
+ opened = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
236
+ opened['status'] = 'open'
237
+ body = {
238
+ fulfillment_order: opened,
239
+ }
240
+
241
+ fake(
242
+ 'fulfillment_orders',
243
+ url: "#{@url_prefix}/fulfillment_orders/519788021/open.json",
244
+ method: :post,
245
+ body: ActiveSupport::JSON.encode(body)
246
+ )
247
+ assert(fulfillment_order.open)
248
+ assert_equal('open', fulfillment_order.status)
249
+ end
250
+ end
251
+
252
+ context "#reschedule" do
253
+ should "be able to rescheduled fulfillment order" do
254
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
255
+ fulfillment_order.status = 'scheduled'
256
+ new_fulfill_at = "2021-11-29"
257
+
258
+ rescheduled = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
259
+ rescheduled['status'] = 'scheduled'
260
+ rescheduled['fulfill_at'] = new_fulfill_at
261
+ body = {
262
+ fulfillment_order: rescheduled,
263
+ }
264
+
265
+ request_body = { fulfillment_order: { new_fulfill_at: new_fulfill_at } }
266
+
267
+ fake(
268
+ 'fulfillment_orders',
269
+ url: "#{@url_prefix}/fulfillment_orders/519788021/reschedule.json",
270
+ method: :post,
271
+ request_body: ActiveSupport::JSON.encode(request_body),
272
+ body: ActiveSupport::JSON.encode(body)
273
+ )
274
+
275
+ assert(fulfillment_order.reschedule(new_fulfill_at: new_fulfill_at))
276
+ assert_equal('scheduled', fulfillment_order.status)
277
+ assert_equal(new_fulfill_at, fulfillment_order.fulfill_at)
278
+ end
279
+ end
280
+
281
+ context "#request_fulfillment" do
282
+ should "make a fulfillment request for a fulfillment order including unsubmitted" do
283
+ fake_original_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
284
+ fake_original_fulfillment_order['status'] = 'closed'
285
+ fake_submitted_fulfillment_order = fake_original_fulfillment_order.clone
286
+ fake_submitted_fulfillment_order['id'] = 2
287
+ fake_submitted_fulfillment_order['status'] = 'open'
288
+ fake_submitted_fulfillment_order['request_status'] = 'submitted'
289
+ fake_unsubmitted_fulfillment_order = fake_original_fulfillment_order.clone
290
+ fake_unsubmitted_fulfillment_order['id'] = 3
291
+ fake_unsubmitted_fulfillment_order['status'] = 'open'
292
+ fake_unsubmitted_fulfillment_order['request_status'] = 'unsubmitted'
293
+ body = {
294
+ original_fulfillment_order: fake_original_fulfillment_order,
295
+ submitted_fulfillment_order: fake_submitted_fulfillment_order,
296
+ unsubmitted_fulfillment_order: fake_unsubmitted_fulfillment_order,
297
+ }
298
+ request_body = {
299
+ fulfillment_request: {
300
+ fulfillment_order_line_items: [
301
+ { id: 1, quantity: 1 },
302
+ ],
303
+ message: 'Fulfill this FO, please.',
304
+ },
305
+ }
306
+ fake(
307
+ 'fulfillment_orders',
308
+ url: "#{@url_prefix}/fulfillment_orders/519788021/fulfillment_request.json",
309
+ method: :post,
310
+ request_body: ActiveSupport::JSON.encode(request_body),
311
+ body: ActiveSupport::JSON.encode(body)
312
+ )
313
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
314
+ params = {
315
+ fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
316
+ message: "Fulfill this FO, please.",
317
+ }
318
+ response_fulfillment_orders = fulfillment_order.request_fulfillment(**params)
319
+
320
+ assert_equal('closed', fulfillment_order.status)
321
+ assert_equal(3, response_fulfillment_orders.size)
322
+
323
+ original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
324
+ assert_equal(519788021, original_fulfillment_order.id)
325
+ assert_equal('closed', original_fulfillment_order.status)
326
+
327
+ submitted_fulfillment_order = response_fulfillment_orders['submitted_fulfillment_order']
328
+ assert_equal(2, submitted_fulfillment_order.id)
329
+ assert_equal('open', submitted_fulfillment_order.status)
330
+ assert_equal('submitted', submitted_fulfillment_order.request_status)
331
+
332
+ unsubmitted_fulfillment_order = response_fulfillment_orders['unsubmitted_fulfillment_order']
333
+ assert_equal(3, unsubmitted_fulfillment_order.id)
334
+ assert_equal('open', unsubmitted_fulfillment_order.status)
335
+ assert_equal('unsubmitted', unsubmitted_fulfillment_order.request_status)
336
+ end
337
+
338
+ should "make a fulfillment request for a fulfillment order excluding unsubmitted" do
339
+ fake_original_fulfillment_order = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
340
+ fake_original_fulfillment_order['status'] = 'closed'
341
+ fake_submitted_fulfillment_order = fake_original_fulfillment_order.clone
342
+ fake_submitted_fulfillment_order['id'] = 2
343
+ fake_submitted_fulfillment_order['status'] = 'open'
344
+ fake_submitted_fulfillment_order['request_status'] = 'submitted'
345
+ body = {
346
+ original_fulfillment_order: fake_original_fulfillment_order,
347
+ submitted_fulfillment_order: fake_submitted_fulfillment_order,
348
+ unsubmitted_fulfillment_order: nil,
349
+ }
350
+ request_body = {
351
+ fulfillment_request: {
352
+ fulfillment_order_line_items: [
353
+ { id: 1, quantity: 1 },
354
+ ],
355
+ message: 'Fulfill this FO, please.',
356
+ },
357
+ }
358
+ fake(
359
+ 'fulfillment_orders',
360
+ url: "#{@url_prefix}/fulfillment_orders/519788021/fulfillment_request.json",
361
+ method: :post,
362
+ request_body: ActiveSupport::JSON.encode(request_body),
363
+ body: ActiveSupport::JSON.encode(body)
364
+ )
365
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
366
+ params = {
367
+ fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
368
+ message: "Fulfill this FO, please.",
369
+ }
370
+ response_fulfillment_orders = fulfillment_order.request_fulfillment(**params)
371
+
372
+ assert_equal('closed', fulfillment_order.status)
373
+ assert_equal(3, response_fulfillment_orders.size)
374
+
375
+ original_fulfillment_order = response_fulfillment_orders['original_fulfillment_order']
376
+ assert_equal(519788021, original_fulfillment_order.id)
377
+ assert_equal('closed', original_fulfillment_order.status)
378
+
379
+ submitted_fulfillment_order = response_fulfillment_orders['submitted_fulfillment_order']
380
+ assert_equal(2, submitted_fulfillment_order.id)
381
+ assert_equal('open', submitted_fulfillment_order.status)
382
+ assert_equal('submitted', submitted_fulfillment_order.request_status)
383
+
384
+ assert_nil(response_fulfillment_orders['unsubmitted_fulfillment_order'])
385
+ end
386
+ end
387
+
388
+ context "#accept_fulfillment_request" do
389
+ should "accept a fulfillment request for a fulfillment order" do
390
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
391
+
392
+ message = "LGTM. Accept this FO fulfillment request"
393
+ request_body = {
394
+ 'fulfillment_request' => {
395
+ 'message' => message,
396
+ },
397
+ }
398
+ fake_response = {
399
+ fulfillment_order: fulfillment_order.attributes.merge(status: 'in_progress', request_status: 'accepted'),
400
+ }
401
+ fake(
402
+ 'fulfillment_orders',
403
+ url: "#{@url_prefix}/fulfillment_orders/519788021/fulfillment_request/accept.json",
404
+ method: :post,
405
+ request_body: ActiveSupport::JSON.encode(request_body),
406
+ body: ActiveSupport::JSON.encode(fake_response)
407
+ )
408
+ accepted = fulfillment_order.accept_fulfillment_request(message: message)
409
+
410
+ assert_equal(true, accepted)
411
+ assert_equal('in_progress', fulfillment_order.status)
412
+ assert_equal('accepted', fulfillment_order.request_status)
413
+ end
414
+ end
415
+
416
+ context "#reject_fulfillment_request" do
417
+ should "reject a fulfillment request for a fulfillment order" do
418
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
419
+
420
+ message = "LBTM. Reject this FO fulfillment request"
421
+ request_body = {
422
+ 'fulfillment_request' => {
423
+ 'message' => message,
424
+ },
425
+ }
426
+ fake_response = {
427
+ fulfillment_order: fulfillment_order.attributes.merge(status: 'open', request_status: 'rejected'),
428
+ }
429
+ fake(
430
+ 'fulfillment_orders',
431
+ url: "#{@url_prefix}/fulfillment_orders/519788021/fulfillment_request/reject.json",
432
+ method: :post,
433
+ request_body: ActiveSupport::JSON.encode(request_body),
434
+ body: ActiveSupport::JSON.encode(fake_response)
435
+ )
436
+ rejected = fulfillment_order.reject_fulfillment_request(message: message)
437
+
438
+ assert_equal(true, rejected)
439
+ assert_equal('open', fulfillment_order.status)
440
+ assert_equal('rejected', fulfillment_order.request_status)
441
+ end
442
+ end
443
+
444
+ context "#request_cancellation" do
445
+ should "make a cancellation request for a fulfillment order" do
446
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
447
+
448
+ message = "Cancelling this please."
449
+ request_body = {
450
+ 'cancellation_request' => {
451
+ 'message' => message,
452
+ },
453
+ }
454
+ cancelling = ActiveSupport::JSON.decode(load_fixture('fulfillment_order'))
455
+ cancelling['status'] = 'in_progress'
456
+ cancelling['request_status'] = 'cancellation_requested'
457
+ fake(
458
+ 'fulfillment_orders',
459
+ url: "#{@url_prefix}/fulfillment_orders/519788021/cancellation_request.json",
460
+ method: :post,
461
+ request_body: ActiveSupport::JSON.encode(request_body),
462
+ body: ActiveSupport::JSON.encode({ fulfillment_order: cancelling })
463
+ )
464
+ cancelled = fulfillment_order.request_cancellation(message: "Cancelling this please.")
465
+
466
+ assert_equal(true, cancelled)
467
+ assert_equal('in_progress', fulfillment_order.status)
468
+ assert_equal('cancellation_requested', fulfillment_order.request_status)
469
+ end
470
+ end
471
+
472
+ context "#accept_cancellation_request" do
473
+ should "accept a cancellation request for a fulfillment order" do
474
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
475
+
476
+ message = 'Already in-progress. Reject this FO cancellation request'
477
+ request_body = {
478
+ 'cancellation_request' => {
479
+ 'message' => message,
480
+ },
481
+ }
482
+ fake_response = {
483
+ fulfillment_order: fulfillment_order.attributes.merge(status: 'cancelled',
484
+ request_status: 'cancellation_accepted'),
485
+ }
486
+ fake(
487
+ 'fulfillment_orders',
488
+ url: "#{@url_prefix}/fulfillment_orders/519788021/cancellation_request/accept.json",
489
+ method: :post,
490
+ request_body: ActiveSupport::JSON.encode(request_body),
491
+ body: ActiveSupport::JSON.encode(fake_response)
492
+ )
493
+ accepted = fulfillment_order.accept_cancellation_request(message: message)
494
+
495
+ assert_equal(true, accepted)
496
+ assert_equal('cancelled', fulfillment_order.status)
497
+ assert_equal('cancellation_accepted', fulfillment_order.request_status)
498
+ end
499
+ end
500
+
501
+ context "#reject_cancellation_request" do
502
+ should "reject a cancellation request for a fulfillment order" do
503
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
504
+
505
+ message = "Already in-progress. Reject this FO cancellation request"
506
+ request_body = {
507
+ 'cancellation_request' => {
508
+ 'message' => message,
509
+ },
510
+ }
511
+ fake_response = {
512
+ fulfillment_order: fulfillment_order.attributes.merge(status: 'in_progress',
513
+ request_status: 'cancellation_rejected'),
514
+ }
515
+ fake(
516
+ 'fulfillment_orders',
517
+ url: "#{@url_prefix}/fulfillment_orders/519788021/cancellation_request/reject.json",
518
+ method: :post,
519
+ request_body: request_body,
520
+ body: ActiveSupport::JSON.encode(fake_response)
521
+ )
522
+ rejected = fulfillment_order.reject_cancellation_request(message: message)
523
+
524
+ assert_equal(true, rejected)
525
+ assert_equal('in_progress', fulfillment_order.status)
526
+ assert_equal('cancellation_rejected', fulfillment_order.request_status)
527
+ end
528
+ end
529
+ end
530
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ module FulfillmentOrderTestHelper
3
+ def url_prefix_for_activated_session_for(version)
4
+ available_version = ShopifyAPI::Session.new(domain: 'shop2.myshopify.com', token: 'token2', api_version: version)
5
+ ShopifyAPI::Base.activate_session(available_version)
6
+ "https://shop2.myshopify.com/admin/api/#{version}"
7
+ end
8
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class FulFillmentRequestTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ fake("orders/450789469/fulfillment_requests/695890229", method: :get, body: load_fixture('fulfillment_request'))
8
+ end
9
+
10
+ context "#mark_as_failed" do
11
+ should "be able to mark_as_failed a fulfillment request" do
12
+ fulfillment_request = ShopifyAPI::FulfillmentRequest.find(695890229, params: { order_id: 450789469 })
13
+
14
+ cancelled = ActiveSupport::JSON.decode(load_fixture('fulfillment_request'))
15
+ cancelled['failure_message'] = 'failure reason'
16
+ cancelled['message'] = nil
17
+ fake(
18
+ "orders/450789469/fulfillment_requests/695890229/mark_as_failed",
19
+ method: :put,
20
+ body: ActiveSupport::JSON.encode(cancelled)
21
+ )
22
+ assert(fulfillment_request.failure_message.blank?)
23
+ assert(fulfillment_request.mark_as_failed)
24
+ assert_equal('failure reason', fulfillment_request.failure_message)
25
+ end
26
+ end
27
+
28
+ context "#find" do
29
+ should "be able to find fulfillment request" do
30
+ fulfillment_request = ShopifyAPI::FulfillmentRequest.find(695890229, params: { order_id: 450789469 })
31
+ assert_equal(695890229, fulfillment_request.id)
32
+ assert_equal(450789469, fulfillment_request.order_id)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class FulFillmentServiceTest < Test::Unit::TestCase
5
+ test 'new should create fulfillment service' do
6
+ fake("fulfillment_services", method: :post, body: load_fixture('fulfillment_service'))
7
+ fulfillment_service = ShopifyAPI::FulfillmentService.new(name: "SomeService")
8
+ fulfillment_service.save
9
+ assert_equal("SomeService", fulfillment_service.name)
10
+ end
11
+
12
+ test 'find should return the fulfillment service' do
13
+ fake("fulfillment_services/123456", method: :get, body: load_fixture('fulfillment_service'))
14
+ fulfillment_service = ShopifyAPI::FulfillmentService.find(123456)
15
+ assert_equal(123456, fulfillment_service.id)
16
+ assert_equal("SomeService", fulfillment_service.name)
17
+ end
18
+ end