shopify_api 4.9.0 → 9.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (281) hide show
  1. checksums.yaml +5 -5
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/ISSUE_TEMPLATE.md +36 -0
  4. data/.github/probots.yml +2 -0
  5. data/.github/workflows/build.yml +41 -0
  6. data/.gitignore +5 -1
  7. data/.rubocop.yml +28 -0
  8. data/.rubocop_todo.yml +75 -0
  9. data/CHANGELOG.md +491 -0
  10. data/CONTRIBUTING.md +1 -1
  11. data/Gemfile +6 -2
  12. data/Gemfile.lock +151 -0
  13. data/Gemfile_ar41 +5 -0
  14. data/Gemfile_ar50 +5 -0
  15. data/Gemfile_ar51 +5 -0
  16. data/Gemfile_ar_master +0 -1
  17. data/README.md +492 -100
  18. data/RELEASING +10 -9
  19. data/Rakefile +21 -5
  20. data/SECURITY.md +59 -0
  21. data/docker-compose.yml +13 -0
  22. data/docs/_config.yml +1 -0
  23. data/docs/_includes/footer.html +28 -0
  24. data/docs/_includes/head.html +28 -0
  25. data/docs/_layouts/index.html +57 -0
  26. data/docs/graphql.md +241 -0
  27. data/docs/index.md +639 -0
  28. data/lib/active_resource/connection_ext.rb +1 -0
  29. data/lib/active_resource/detailed_log_subscriber.rb +43 -7
  30. data/lib/active_resource/json_errors.rb +8 -2
  31. data/lib/shopify_api.rb +16 -6
  32. data/lib/shopify_api/api_access.rb +57 -0
  33. data/lib/shopify_api/api_version.rb +206 -0
  34. data/lib/shopify_api/connection.rb +7 -4
  35. data/lib/shopify_api/countable.rb +3 -2
  36. data/lib/shopify_api/disable_prefix_check.rb +31 -0
  37. data/lib/shopify_api/events.rb +2 -1
  38. data/lib/shopify_api/graphql.rb +103 -0
  39. data/lib/shopify_api/graphql/http_client.rb +22 -0
  40. data/lib/shopify_api/graphql/railtie.rb +17 -0
  41. data/lib/shopify_api/graphql/task.rake +100 -0
  42. data/lib/shopify_api/limits.rb +9 -9
  43. data/lib/shopify_api/message_enricher.rb +25 -0
  44. data/lib/shopify_api/meta.rb +14 -0
  45. data/lib/shopify_api/metafields.rb +5 -4
  46. data/lib/shopify_api/paginated_collection.rb +69 -0
  47. data/lib/shopify_api/pagination_link_headers.rb +34 -0
  48. data/lib/shopify_api/resources.rb +3 -1
  49. data/lib/shopify_api/resources/abandoned_checkout.rb +7 -0
  50. data/lib/shopify_api/resources/access_scope.rb +10 -0
  51. data/lib/shopify_api/resources/access_token.rb +1 -0
  52. data/lib/shopify_api/resources/address.rb +1 -0
  53. data/lib/shopify_api/resources/announcement.rb +2 -1
  54. data/lib/shopify_api/resources/api_permission.rb +9 -0
  55. data/lib/shopify_api/resources/application_charge.rb +1 -0
  56. data/lib/shopify_api/resources/application_credit.rb +1 -0
  57. data/lib/shopify_api/resources/array_base.rb +13 -0
  58. data/lib/shopify_api/resources/article.rb +3 -2
  59. data/lib/shopify_api/resources/asset.rb +28 -23
  60. data/lib/shopify_api/resources/assigned_fulfillment_order.rb +16 -0
  61. data/lib/shopify_api/resources/base.rb +101 -24
  62. data/lib/shopify_api/resources/billing_address.rb +2 -1
  63. data/lib/shopify_api/resources/blog.rb +2 -1
  64. data/lib/shopify_api/resources/carrier_service.rb +1 -0
  65. data/lib/shopify_api/resources/cart.rb +2 -1
  66. data/lib/shopify_api/resources/checkout.rb +27 -1
  67. data/lib/shopify_api/resources/collect.rb +2 -0
  68. data/lib/shopify_api/resources/collection.rb +14 -0
  69. data/lib/shopify_api/resources/collection_listing.rb +11 -1
  70. data/lib/shopify_api/resources/collection_publication.rb +10 -0
  71. data/lib/shopify_api/resources/comment.rb +20 -5
  72. data/lib/shopify_api/resources/country.rb +1 -0
  73. data/lib/shopify_api/resources/currency.rb +6 -0
  74. data/lib/shopify_api/resources/custom_collection.rb +7 -6
  75. data/lib/shopify_api/resources/customer.rb +2 -1
  76. data/lib/shopify_api/resources/customer_group.rb +1 -0
  77. data/lib/shopify_api/resources/{customer_invite_message.rb → customer_invite.rb} +1 -0
  78. data/lib/shopify_api/resources/customer_saved_search.rb +4 -1
  79. data/lib/shopify_api/resources/discount_code.rb +1 -0
  80. data/lib/shopify_api/resources/discount_code_batch.rb +34 -0
  81. data/lib/shopify_api/resources/draft_order.rb +1 -0
  82. data/lib/shopify_api/resources/draft_order_invoice.rb +1 -0
  83. data/lib/shopify_api/resources/event.rb +2 -0
  84. data/lib/shopify_api/resources/fulfillment.rb +46 -3
  85. data/lib/shopify_api/resources/fulfillment_event.rb +2 -1
  86. data/lib/shopify_api/resources/fulfillment_order.rb +151 -0
  87. data/lib/shopify_api/resources/fulfillment_order_locations_for_move.rb +5 -0
  88. data/lib/shopify_api/resources/fulfillment_request.rb +1 -0
  89. data/lib/shopify_api/resources/fulfillment_service.rb +1 -0
  90. data/lib/shopify_api/resources/fulfillment_v2.rb +21 -0
  91. data/lib/shopify_api/resources/gift_card.rb +1 -0
  92. data/lib/shopify_api/resources/image.rb +4 -3
  93. data/lib/shopify_api/resources/inventory_item.rb +6 -0
  94. data/lib/shopify_api/resources/inventory_level.rb +54 -0
  95. data/lib/shopify_api/resources/line_item.rb +10 -1
  96. data/lib/shopify_api/resources/location.rb +4 -0
  97. data/lib/shopify_api/resources/marketing_event.rb +3 -0
  98. data/lib/shopify_api/resources/metafield.rb +2 -0
  99. data/lib/shopify_api/resources/note_attribute.rb +1 -0
  100. data/lib/shopify_api/resources/option.rb +1 -0
  101. data/lib/shopify_api/resources/order.rb +25 -5
  102. data/lib/shopify_api/resources/order_risk.rb +1 -0
  103. data/lib/shopify_api/resources/page.rb +1 -0
  104. data/lib/shopify_api/resources/payment.rb +7 -0
  105. data/lib/shopify_api/resources/payment_details.rb +1 -0
  106. data/lib/shopify_api/resources/ping.rb +3 -0
  107. data/lib/shopify_api/resources/policy.rb +1 -0
  108. data/lib/shopify_api/resources/price_rule.rb +1 -1
  109. data/lib/shopify_api/resources/product.rb +33 -7
  110. data/lib/shopify_api/resources/product_listing.rb +9 -1
  111. data/lib/shopify_api/resources/product_publication.rb +10 -0
  112. data/lib/shopify_api/resources/province.rb +1 -0
  113. data/lib/shopify_api/resources/publication.rb +5 -0
  114. data/lib/shopify_api/resources/receipt.rb +1 -0
  115. data/lib/shopify_api/resources/recurring_application_charge.rb +4 -1
  116. data/lib/shopify_api/resources/redirect.rb +1 -0
  117. data/lib/shopify_api/resources/refund.rb +6 -4
  118. data/lib/shopify_api/resources/report.rb +1 -0
  119. data/lib/shopify_api/resources/resource_feedback.rb +1 -1
  120. data/lib/shopify_api/resources/rule.rb +1 -0
  121. data/lib/shopify_api/resources/script_tag.rb +1 -0
  122. data/lib/shopify_api/resources/shipping_address.rb +1 -0
  123. data/lib/shopify_api/resources/shipping_line.rb +2 -1
  124. data/lib/shopify_api/resources/shipping_rate.rb +7 -0
  125. data/lib/shopify_api/resources/shipping_zone.rb +1 -0
  126. data/lib/shopify_api/resources/shop.rb +10 -7
  127. data/lib/shopify_api/resources/smart_collection.rb +3 -3
  128. data/lib/shopify_api/resources/storefront_access_token.rb +1 -0
  129. data/lib/shopify_api/resources/tax_line.rb +1 -0
  130. data/lib/shopify_api/resources/tax_service.rb +1 -0
  131. data/lib/shopify_api/resources/tender_transaction.rb +6 -0
  132. data/lib/shopify_api/resources/theme.rb +1 -0
  133. data/lib/shopify_api/resources/transaction.rb +1 -0
  134. data/lib/shopify_api/resources/usage_charge.rb +1 -0
  135. data/lib/shopify_api/resources/user.rb +1 -0
  136. data/lib/shopify_api/resources/variant.rb +35 -0
  137. data/lib/shopify_api/resources/webhook.rb +1 -0
  138. data/lib/shopify_api/session.rb +109 -45
  139. data/lib/shopify_api/version.rb +2 -1
  140. data/lib/verify_docs.rb +8 -0
  141. data/service.yml +8 -0
  142. data/shopify_api.gemspec +19 -8
  143. data/test/abandoned_checkouts_test.rb +29 -0
  144. data/test/access_scope_test.rb +23 -0
  145. data/test/access_token_test.rb +6 -5
  146. data/test/active_resource/json_errors_test.rb +6 -6
  147. data/test/api_access_test.rb +153 -0
  148. data/test/api_permission_test.rb +9 -0
  149. data/test/api_version_test.rb +157 -0
  150. data/test/application_charge_test.rb +30 -27
  151. data/test/application_credit_test.rb +10 -9
  152. data/test/article_test.rb +34 -35
  153. data/test/asset_test.rb +14 -6
  154. data/test/assigned_fulfillment_order_test.rb +78 -0
  155. data/test/base_test.rb +147 -59
  156. data/test/blog_test.rb +4 -3
  157. data/test/carrier_service_test.rb +7 -6
  158. data/test/cart_test.rb +2 -1
  159. data/test/checkouts_test.rb +72 -4
  160. data/test/collect_test.rb +4 -3
  161. data/test/collection_listing_test.rb +56 -13
  162. data/test/collection_publication_test.rb +40 -0
  163. data/test/collection_test.rb +50 -0
  164. data/test/countable_test.rb +3 -2
  165. data/test/currency_test.rb +21 -0
  166. data/test/custom_collection_test.rb +4 -3
  167. data/test/customer_saved_search_test.rb +18 -8
  168. data/test/customer_test.rb +22 -14
  169. data/test/detailed_log_subscriber_test.rb +113 -19
  170. data/test/discount_code_batch_test.rb +41 -0
  171. data/test/discount_code_test.rb +22 -16
  172. data/test/draft_order_test.rb +68 -52
  173. data/test/fixtures/abandoned_checkout.json +184 -0
  174. data/test/fixtures/abandoned_checkouts.json +186 -0
  175. data/test/fixtures/access_scopes.json +10 -0
  176. data/test/fixtures/api_versions.json +38 -0
  177. data/test/fixtures/apis.json +42 -0
  178. data/test/fixtures/assigned_fulfillment_orders.json +80 -0
  179. data/test/fixtures/checkout.json +160 -0
  180. data/test/fixtures/checkouts.json +25 -49
  181. data/test/fixtures/collection.json +17 -0
  182. data/test/fixtures/collection_listing_product_ids2.json +1 -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/discount_code_batch.json +14 -0
  188. data/test/fixtures/discount_code_batch_discount_codes.json +21 -0
  189. data/test/fixtures/fulfillment_order.json +39 -0
  190. data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
  191. data/test/fixtures/fulfillment_orders.json +80 -0
  192. data/test/fixtures/fulfillments.json +53 -0
  193. data/test/fixtures/graphql/2019-10.json +1083 -0
  194. data/test/fixtures/graphql/dummy_schema.rb +16 -0
  195. data/test/fixtures/graphql/unstable.json +1083 -0
  196. data/test/fixtures/inventory_level.json +7 -0
  197. data/test/fixtures/inventory_levels.json +24 -0
  198. data/test/fixtures/order_with_properties.json +373 -0
  199. data/test/fixtures/payment.json +7 -0
  200. data/test/fixtures/payments.json +9 -0
  201. data/test/fixtures/ping/conversation.json +1 -0
  202. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  203. data/test/fixtures/ping/message.json +1 -0
  204. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  205. data/test/fixtures/product_listing_product_ids.json +1 -1
  206. data/test/fixtures/product_listing_product_ids2.json +1 -0
  207. data/test/fixtures/product_publication.json +11 -0
  208. data/test/fixtures/product_publications.json +13 -0
  209. data/test/fixtures/publications.json +9 -0
  210. data/test/fixtures/shipping_rates.json +12 -0
  211. data/test/fixtures/smart_collection_products.json +155 -0
  212. data/test/fixtures/tender_transactions.json +52 -0
  213. data/test/fulfillment_event_test.rb +31 -26
  214. data/test/fulfillment_order_test.rb +530 -0
  215. data/test/fulfillment_order_test_helper.rb +8 -0
  216. data/test/fulfillment_request_test.rb +10 -8
  217. data/test/fulfillment_service_test.rb +13 -12
  218. data/test/fulfillment_test.rb +198 -20
  219. data/test/fulfillment_v2_test.rb +66 -0
  220. data/test/gift_card_test.rb +6 -4
  221. data/test/graphql/http_client_test.rb +26 -0
  222. data/test/graphql_test.rb +190 -0
  223. data/test/image_test.rb +19 -17
  224. data/test/inventory_level_test.rb +68 -0
  225. data/test/lib/webmock_extensions/last_request.rb +16 -0
  226. data/test/limits_test.rb +4 -3
  227. data/test/location_test.rb +15 -0
  228. data/test/marketing_event_test.rb +21 -21
  229. data/test/message_enricher_test.rb +45 -0
  230. data/test/meta_test.rb +47 -0
  231. data/test/metafield_test.rb +30 -20
  232. data/test/order_risk_test.rb +17 -16
  233. data/test/order_test.rb +110 -17
  234. data/test/pagination_test.rb +290 -0
  235. data/test/payment_test.rb +19 -0
  236. data/test/policy_test.rb +6 -5
  237. data/test/price_rule_test.rb +20 -15
  238. data/test/product_listing_test.rb +72 -15
  239. data/test/product_publication_test.rb +40 -0
  240. data/test/product_test.rb +80 -19
  241. data/test/publication_test.rb +12 -0
  242. data/test/recurring_application_charge_test.rb +105 -50
  243. data/test/redirect_test.rb +4 -3
  244. data/test/refund_test.rb +22 -17
  245. data/test/report_test.rb +12 -10
  246. data/test/resource_feedback_test.rb +14 -13
  247. data/test/script_tag_test.rb +10 -9
  248. data/test/session_test.rb +497 -111
  249. data/test/shipping_rate_test.rb +17 -0
  250. data/test/shipping_zone_test.rb +4 -3
  251. data/test/shop_test.rb +47 -33
  252. data/test/smart_collection_test.rb +5 -4
  253. data/test/storefront_access_token_test.rb +13 -15
  254. data/test/tax_service_test.rb +7 -3
  255. data/test/tender_transaction_test.rb +18 -0
  256. data/test/test_helper.rb +98 -67
  257. data/test/transaction_test.rb +4 -3
  258. data/test/usage_charge_test.rb +12 -8
  259. data/test/user_test.rb +4 -3
  260. data/test/variant_test.rb +50 -20
  261. data/test/webhook_test.rb +10 -7
  262. metadata +196 -37
  263. data/.travis.yml +0 -36
  264. data/CHANGELOG +0 -292
  265. data/Gemfile_ar30 +0 -6
  266. data/Gemfile_ar31 +0 -6
  267. data/Gemfile_ar32 +0 -6
  268. data/Gemfile_ar40 +0 -6
  269. data/bin/shopify +0 -3
  270. data/lib/active_resource/base_ext.rb +0 -21
  271. data/lib/active_resource/disable_prefix_check.rb +0 -36
  272. data/lib/active_resource/to_query.rb +0 -10
  273. data/lib/shopify_api/json_format.rb +0 -18
  274. data/lib/shopify_api/resources/discount.rb +0 -11
  275. data/lib/shopify_api/resources/o_auth.rb +0 -9
  276. data/test/discount_test.rb +0 -52
  277. data/test/fixtures/discount.json +0 -17
  278. data/test/fixtures/discount_disabled.json +0 -17
  279. data/test/fixtures/discounts.json +0 -34
  280. data/test/fixtures/o_auth_revoke.json +0 -5
  281. data/test/o_auth_test.rb +0 -8
@@ -0,0 +1,13 @@
1
+ {
2
+ "product_publications": [
3
+ {
4
+ "id": 647162527768,
5
+ "publication_id": 55650051,
6
+ "published_at": "2018-01-29T14:06:08-05:00",
7
+ "published": true,
8
+ "created_at": "2018-01-29T14:06:08-05:00",
9
+ "updated_at": "2018-09-26T15:39:05-04:00",
10
+ "product_id": 8267093571
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "publications": [
3
+ {
4
+ "id": 55650051,
5
+ "created_at": "2016-05-20T13:12:10-04:00",
6
+ "name": "Buy Button"
7
+ }
8
+ ]
9
+ }
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "id": "canada_post-INT.TP.BOGUS-4.00",
4
+ "price": "4.00",
5
+ "title": "Small Packet International Air Bogus"
6
+ },
7
+ {
8
+ "id": "canada_post-INT.TP.BOGUS-8.00",
9
+ "price": "8.00",
10
+ "title": "Medium Packet International Air Bogus"
11
+ }
12
+ ]
@@ -0,0 +1,155 @@
1
+ {
2
+ "products": [
3
+ {
4
+ "product_type": "Cult Products",
5
+ "handle": "ipod-nano",
6
+ "created_at": "2011-10-20T14:05:13-04:00",
7
+ "body_html": "<p>It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.</p>",
8
+ "title": "IPod Nano - 8GB",
9
+ "template_suffix": null,
10
+ "updated_at": "2011-10-20T14:05:13-04:00",
11
+ "id": 632910392,
12
+ "tags": "Emotive, Flash Memory, MP3, Music",
13
+ "images": [
14
+ {
15
+ "position": 1,
16
+ "created_at": "2011-10-20T14:05:13-04:00",
17
+ "product_id": 632910392,
18
+ "updated_at": "2011-10-20T14:05:13-04:00",
19
+ "src": "http://static.shopify.com/s/files/1/6909/3384/products/ipod-nano.png?0",
20
+ "id": 850703190
21
+ }
22
+ ],
23
+ "variants": [
24
+ {
25
+ "position": 1,
26
+ "price": "199.00",
27
+ "product_id": 632910392,
28
+ "created_at": "2011-10-20T14:05:13-04:00",
29
+ "requires_shipping": true,
30
+ "title": "Pink",
31
+ "inventory_quantity": 10,
32
+ "compare_at_price": null,
33
+ "inventory_policy": "continue",
34
+ "updated_at": "2011-10-20T14:05:13-04:00",
35
+ "inventory_management": "shopify",
36
+ "id": 808950810,
37
+ "taxable": true,
38
+ "grams": 200,
39
+ "sku": "IPOD2008PINK",
40
+ "option1": "Pink",
41
+ "fulfillment_service": "manual",
42
+ "option2": null,
43
+ "option3": null
44
+ },
45
+ {
46
+ "position": 2,
47
+ "price": "199.00",
48
+ "product_id": 632910392,
49
+ "created_at": "2011-10-20T14:05:13-04:00",
50
+ "requires_shipping": true,
51
+ "title": "Red",
52
+ "inventory_quantity": 20,
53
+ "compare_at_price": null,
54
+ "inventory_policy": "continue",
55
+ "updated_at": "2011-10-20T14:05:13-04:00",
56
+ "inventory_management": "shopify",
57
+ "id": 49148385,
58
+ "taxable": true,
59
+ "grams": 200,
60
+ "sku": "IPOD2008RED",
61
+ "option1": "Red",
62
+ "fulfillment_service": "manual",
63
+ "option2": null,
64
+ "option3": null
65
+ },
66
+ {
67
+ "position": 3,
68
+ "price": "199.00",
69
+ "product_id": 632910392,
70
+ "created_at": "2011-10-20T14:05:13-04:00",
71
+ "requires_shipping": true,
72
+ "title": "Green",
73
+ "inventory_quantity": 30,
74
+ "compare_at_price": null,
75
+ "inventory_policy": "continue",
76
+ "updated_at": "2011-10-20T14:05:13-04:00",
77
+ "inventory_management": "shopify",
78
+ "id": 39072856,
79
+ "taxable": true,
80
+ "grams": 200,
81
+ "sku": "IPOD2008GREEN",
82
+ "option1": "Green",
83
+ "fulfillment_service": "manual",
84
+ "option2": null,
85
+ "option3": null
86
+ },
87
+ {
88
+ "position": 4,
89
+ "price": "199.00",
90
+ "product_id": 632910392,
91
+ "created_at": "2011-10-20T14:05:13-04:00",
92
+ "requires_shipping": true,
93
+ "title": "Black",
94
+ "inventory_quantity": 40,
95
+ "compare_at_price": null,
96
+ "inventory_policy": "continue",
97
+ "updated_at": "2011-10-20T14:05:13-04:00",
98
+ "inventory_management": "shopify",
99
+ "id": 457924702,
100
+ "taxable": true,
101
+ "grams": 200,
102
+ "sku": "IPOD2008BLACK",
103
+ "option1": "Black",
104
+ "fulfillment_service": "manual",
105
+ "option2": null,
106
+ "option3": null
107
+ }
108
+ ],
109
+ "vendor": "Apple",
110
+ "published_at": "2007-12-31T19:00:00-05:00",
111
+ "manually_sorted": true,
112
+ "options": [
113
+ {
114
+ "name": "Title"
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "product_type": "Cult Products",
120
+ "handle": "ipod-touch",
121
+ "created_at": "2018-09-26T14:05:13-04:00",
122
+ "body_html": "<p>The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.</p>",
123
+ "title": "IPod Touch 8GB",
124
+ "template_suffix": null,
125
+ "updated_at": "2018-09-26T14:05:13-04:00",
126
+ "id": 921728736,
127
+ "tags": null,
128
+ "variants": [
129
+ {
130
+ "id": 447654529,
131
+ "title": "Black",
132
+ "price": "199.00",
133
+ "sku": "IPOD2009BLACK",
134
+ "position": 1,
135
+ "inventory_policy": "continue",
136
+ "compare_at_price": null,
137
+ "fulfillment_service": "manual",
138
+ "inventory_management": "shopify",
139
+ "option1": "Black",
140
+ "option2": null,
141
+ "option3": null,
142
+ "created_at": "2018-09-26T14:05:13-04:00",
143
+ "updated_at": "2018-09-26T14:05:13-04:00",
144
+ "taxable": true,
145
+ "grams": 567,
146
+ "inventory_quantity": 13,
147
+ "requires_shipping": true
148
+ }
149
+ ],
150
+ "vendor": "Apple",
151
+ "published_at": "2018-09-26T14:05:13-04:00",
152
+ "manually_sorted": true
153
+ }
154
+ ]
155
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "tender_transactions": [
3
+ {
4
+ "id": 1,
5
+ "order_id": 450789469,
6
+ "amount": "138.46",
7
+ "currency": "CAD",
8
+ "user_id": null,
9
+ "test": true,
10
+ "processed_at": "2018-08-09T15:43:39-04:00",
11
+ "updated_at": "2018-08-09T15:43:41-04:00",
12
+ "remote_reference": "1118366",
13
+ "payment_method": "credit_card",
14
+ "payment_details": {
15
+ "credit_card_number": "•••• •••• •••• 1",
16
+ "credit_card_company": "Bogus"
17
+ }
18
+ },
19
+ {
20
+ "id": 2,
21
+ "order_id": 450789469,
22
+ "amount": "128.16",
23
+ "currency": "CAD",
24
+ "user_id": null,
25
+ "test": true,
26
+ "processed_at": "2018-08-11T15:43:39-04:00",
27
+ "updated_at": "2018-08-09T15:43:41-04:00",
28
+ "remote_reference": "1118367",
29
+ "payment_method": "credit_card",
30
+ "payment_details": {
31
+ "credit_card_number": "•••• •••• •••• 2",
32
+ "credit_card_company": "Bogus"
33
+ }
34
+ },
35
+ {
36
+ "id": 3,
37
+ "order_id": 450789469,
38
+ "amount": "28.16",
39
+ "currency": "CAD",
40
+ "user_id": null,
41
+ "test": true,
42
+ "processed_at": "2018-08-12T15:43:39-04:00",
43
+ "updated_at": "2018-08-09T15:43:41-04:00",
44
+ "remote_reference": "1118368",
45
+ "payment_method": "credit_card",
46
+ "payment_details": {
47
+ "credit_card_number": "•••• •••• •••• 3",
48
+ "credit_card_company": "Bogus"
49
+ }
50
+ }
51
+ ]
52
+ }
@@ -1,34 +1,37 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  class FulFillmentEventTest < Test::Unit::TestCase
4
5
  def test_find_all_resources
5
- fake 'orders/450789469/fulfillments/255858046/events',
6
- method: :get,
7
- body: "[#{load_fixture('fulfillment_event')}]"
8
-
6
+ fake(
7
+ 'orders/450789469/fulfillments/255858046/events',
8
+ method: :get,
9
+ body: "[#{load_fixture('fulfillment_event')}]"
10
+ )
9
11
  events = ShopifyAPI::FulfillmentEvent.all(
10
12
  params: { fulfillment_id: 255858046, order_id: 450789469 }
11
13
  )
12
14
 
13
- assert_equal 1, events.count
15
+ assert_equal(1, events.count)
14
16
  end
15
17
 
16
18
  def test_find_a_resource
17
- fake 'orders/450789469/fulfillments/255858046/events/334455',
18
- method: :get,
19
- body: load_fixture('fulfillment_event')
20
-
19
+ fake(
20
+ 'orders/450789469/fulfillments/255858046/events/334455',
21
+ method: :get,
22
+ body: load_fixture('fulfillment_event')
23
+ )
21
24
  event = ShopifyAPI::FulfillmentEvent.find(
22
25
  334455, params: { fulfillment_id: 255858046, order_id: 450789469 }
23
26
  )
24
27
 
25
- assert_equal 'in_transit', event.status
26
- assert_equal 255858046, event.fulfillment_id
27
- assert_equal 450789469, event.order_id
28
+ assert_equal('in_transit', event.status)
29
+ assert_equal(255858046, event.fulfillment_id)
30
+ assert_equal(450789469, event.order_id)
28
31
  end
29
32
 
30
33
  def test_create_a_resource
31
- fake 'orders/450789469/fulfillments/255858046/events', method: :post, body: ''
34
+ fake('orders/450789469/fulfillments/255858046/events', method: :post, body: '')
32
35
 
33
36
  event = ShopifyAPI::FulfillmentEvent.new(
34
37
  fulfillment_id: 255858046,
@@ -36,34 +39,36 @@ class FulFillmentEventTest < Test::Unit::TestCase
36
39
  status: 'in_transit'
37
40
  )
38
41
 
39
- assert event.save
42
+ assert(event.save)
40
43
  end
41
44
 
42
45
  def test_update_a_resource
43
- fake 'orders/450789469/fulfillments/255858046/events/334455',
44
- method: :get,
45
- body: load_fixture('fulfillment_event')
46
-
46
+ fake(
47
+ 'orders/450789469/fulfillments/255858046/events/334455',
48
+ method: :get,
49
+ body: load_fixture('fulfillment_event')
50
+ )
47
51
  event = ShopifyAPI::FulfillmentEvent.find(
48
52
  334455, params: { fulfillment_id: 255858046, order_id: 450789469 }
49
53
  )
50
54
 
51
- fake 'orders/450789469/fulfillments/255858046/events/334455', method: :put, body: ''
55
+ fake('orders/450789469/fulfillments/255858046/events/334455', method: :put, body: '')
52
56
 
53
- assert event.save
57
+ assert(event.save)
54
58
  end
55
59
 
56
60
  def test_destroy_a_resource
57
- fake 'orders/450789469/fulfillments/255858046/events/334455',
58
- method: :get,
59
- body: load_fixture('fulfillment_event')
60
-
61
+ fake(
62
+ 'orders/450789469/fulfillments/255858046/events/334455',
63
+ method: :get,
64
+ body: load_fixture('fulfillment_event')
65
+ )
61
66
  event = ShopifyAPI::FulfillmentEvent.find(
62
67
  334455, params: { fulfillment_id: 255858046, order_id: 450789469 }
63
68
  )
64
69
 
65
- fake 'orders/450789469/fulfillments/255858046/events/334455', method: :delete, body: ''
70
+ fake('orders/450789469/fulfillments/255858046/events/334455', method: :delete, body: '')
66
71
 
67
- assert event.destroy
72
+ assert(event.destroy)
68
73
  end
69
74
  end
@@ -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