shopify_api 4.9.0 → 9.4.1

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 (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,45 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class MessageEnricherTest < Test::Unit::TestCase
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
+ ShopifyAPI::MessageEnricher.new(mock_response)
44
+ end
45
+ end
data/test/meta_test.rb ADDED
@@ -0,0 +1,47 @@
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
+ assert_equal versions, ShopifyAPI::Meta.admin_versions.to_json
46
+ end
47
+ end
@@ -1,46 +1,56 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  class MetafieldTest < Test::Unit::TestCase
4
5
  def test_get_metafields
5
- fake "metafields", :method => :get, :body => load_fixture('metafields')
6
- metafields = ShopifyAPI::Metafield.find(:all)
6
+ fake("metafields", method: :get, body: load_fixture('metafields'))
7
+ ShopifyAPI::Metafield.find(:all)
7
8
  end
8
9
 
9
10
  def test_get_metafield
10
- fake "metafields/721389482", :method => :get, :body => load_fixture('metafield')
11
- assert ShopifyAPI::Metafield.find(721389482)
11
+ fake("metafields/721389482", method: :get, body: load_fixture('metafield'))
12
+ assert(ShopifyAPI::Metafield.find(721389482))
12
13
  end
13
14
 
14
15
  def test_get_metafield_of_a_blog
15
- fake "blogs/1008414260/metafields/721389482", :method => :get, :body => load_fixture('metafield')
16
- metafield = ShopifyAPI::Metafield.find(721389482, :params => {:resource => "blogs", :resource_id => 1008414260})
17
- assert_equal 1008414260, metafield.prefix_options[:resource_id]
16
+ fake("blogs/1008414260/metafields/721389482", method: :get, body: load_fixture('metafield'))
17
+ metafield = ShopifyAPI::Metafield.find(721389482, params: { resource: "blogs", resource_id: 1008414260 })
18
+ assert_equal(1008414260, metafield.prefix_options[:resource_id])
18
19
  end
19
20
 
20
21
  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')
22
+ fake("blogs/1008414260", method: :get, body: load_fixture('blog'))
23
+ fake("blogs/1008414260/metafields", method: :post, status: 201, body: load_fixture('metafield'))
23
24
 
24
25
  blog = ShopifyAPI::Blog.find(1008414260)
25
- metafield = blog.add_metafield(ShopifyAPI::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(FakeWeb.last_request.body)
28
- assert !metafield.new_record?
26
+ metafield = blog.add_metafield(
27
+ ShopifyAPI::Metafield.new(
28
+ namespace: "summaries", key: "First Summary", value: "Make commerce better", value_type: "string"
29
+ )
30
+ )
31
+
32
+ assert_equal(
33
+ ActiveSupport::JSON.decode(
34
+ '{"metafield":{"namespace":"summaries","key":"First Summary",' \
35
+ '"value":"Make commerce better","value_type":"string"}}'
36
+ ),
37
+ ActiveSupport::JSON.decode(WebMock.last_request.body)
38
+ )
39
+ assert(!metafield.new_record?)
29
40
  end
30
41
 
31
42
  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')
43
+ fake("metafields/721389482", method: :get, body: load_fixture('metafield'))
44
+ fake("metafields/721389482", method: :put, status: 200, body: load_fixture('metafield'))
34
45
  metafield = ShopifyAPI::Metafield.find(721389482)
35
46
  metafield.namespace = "teaser"
36
- assert metafield.save
47
+ assert(metafield.save)
37
48
  end
38
49
 
39
50
  def test_delete_metafield
40
- fake "metafields/721389482", :method => :get, :body => load_fixture('metafield')
41
- fake "metafields/721389482", :method => :delete, :body => 'destroyed'
51
+ fake("metafields/721389482", method: :get, body: load_fixture('metafield'))
52
+ fake("metafields/721389482", method: :delete, body: 'destroyed')
42
53
  metafield = ShopifyAPI::Metafield.find(721389482)
43
- assert metafield.destroy
54
+ assert(metafield.destroy)
44
55
  end
45
56
  end
46
-
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  class OrderRiskTest < Test::Unit::TestCase
4
5
  def test_create_order_risk
5
- fake "orders/450789469/risks", :method => :post, :body => load_fixture('order_risk')
6
- v = ShopifyAPI::OrderRisk.new(:order_id => 450789469)
6
+ fake("orders/450789469/risks", method: :post, body: load_fixture('order_risk'))
7
+ v = ShopifyAPI::OrderRisk.new(order_id: 450789469)
7
8
  v.message = "This order was placed from a proxy IP"
8
9
  v.recommendation = "cancel"
9
10
  v.score = "1.0"
@@ -13,33 +14,33 @@ class OrderRiskTest < Test::Unit::TestCase
13
14
  v.cause_cancel = true
14
15
  v.save
15
16
 
16
- assert_equal 284138680, v.id
17
+ assert_equal(284138680, v.id)
17
18
  end
18
19
 
19
20
  def test_get_order_risks
20
- fake "orders/450789469/risks", :method => :get, :body => load_fixture('order_risks')
21
- v = ShopifyAPI::OrderRisk.find(:all, :params => {:order_id => 450789469})
22
- assert_equal 2, v.size
21
+ fake("orders/450789469/risks", method: :get, body: load_fixture('order_risks'))
22
+ v = ShopifyAPI::OrderRisk.find(:all, params: { order_id: 450789469 })
23
+ assert_equal(2, v.size)
23
24
  end
24
25
 
25
26
  def test_get_order_risk
26
- fake "orders/450789469/risks/284138680", :method => :get, :body => load_fixture('order_risk')
27
- v = ShopifyAPI::OrderRisk.find(284138680, :params => {:order_id => 450789469})
28
- assert_equal 284138680, v.id
27
+ fake("orders/450789469/risks/284138680", method: :get, body: load_fixture('order_risk'))
28
+ v = ShopifyAPI::OrderRisk.find(284138680, params: { order_id: 450789469 })
29
+ assert_equal(284138680, v.id)
29
30
  end
30
31
 
31
32
  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 = ShopifyAPI::OrderRisk.find(284138680, :params => {:order_id => 450789469})
35
- assert v.destroy
33
+ fake("orders/450789469/risks/284138680", method: :get, body: load_fixture('order_risk'))
34
+ fake("orders/450789469/risks/284138680", method: :delete, body: "destroyed")
35
+ v = ShopifyAPI::OrderRisk.find(284138680, params: { order_id: 450789469 })
36
+ assert(v.destroy)
36
37
  end
37
38
 
38
39
  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')
40
+ fake("orders/450789469/risks/284138680", method: :get, body: load_fixture('order_risk'))
41
+ fake("orders/450789469/risks/284138680", method: :put, body: load_fixture('order_risk'))
41
42
 
42
- v = ShopifyAPI::OrderRisk.find(284138680, :params => {:order_id => 450789469})
43
+ v = ShopifyAPI::OrderRisk.find(284138680, params: { order_id: 450789469 })
43
44
  v.position = 3
44
45
  v.save
45
46
  end
data/test/order_test.rb CHANGED
@@ -1,47 +1,140 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
3
+ require 'fulfillment_order_test_helper'
2
4
 
3
5
  class OrderTest < Test::Unit::TestCase
6
+ include FulfillmentOrderTestHelper
4
7
 
5
8
  test "create should create order" do
6
- fake 'orders', :method => :post, :status => 201, :body => load_fixture('order')
7
- order = ShopifyAPI::Order.create(line_items: [{quantity:1, variant_id:39072856}], financial_status:"authorized")
8
- assert_equal 39072856, order.line_items.first.variant_id
9
+ fake('orders', method: :post, status: 201, body: load_fixture('order'))
10
+ order = ShopifyAPI::Order.create(
11
+ line_items: [{ quantity: 1, variant_id: 39072856 }],
12
+ financial_status: "authorized"
13
+ )
14
+ assert_equal(39072856, order.line_items.first.variant_id)
15
+ end
16
+
17
+ test "create should create an order with custom properties" do
18
+ props = [
19
+ {
20
+ "By default may label with \"Roasted for ": {
21
+ "Your First Name": {
22
+ "\". If you want something specific on the label, enter it here:": "",
23
+ },
24
+ },
25
+ },
26
+ ]
27
+ fake('orders', method: :post, status: 201, body: load_fixture('order_with_properties'))
28
+ order = ShopifyAPI::Order.create(
29
+ line_items: [{ quantity: 1, variant_id: 39072856, properties: props }],
30
+ financial_status: "authorized"
31
+ )
32
+ assert_equal(39072856, order.line_items.first.variant_id)
9
33
  end
10
34
 
11
35
  test "get should get an order" do
12
- fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
36
+ fake('orders/450789469', method: :get, status: 200, body: load_fixture('order'))
37
+ order = ShopifyAPI::Order.find(450789469)
38
+ assert_equal(450789469, order.id)
39
+ end
40
+
41
+ test "get should get an order with custom properties" do
42
+ fake('orders/450789469', method: :get, status: 200, body: load_fixture('order_with_properties'))
13
43
  order = ShopifyAPI::Order.find(450789469)
14
- assert_equal 450789469, order.id
44
+ assert_equal(450789469, order.id)
15
45
  end
16
46
 
17
47
  test "get all should get all orders" do
18
- fake 'orders', :method => :get, :status => 200, :body => load_fixture('orders')
48
+ fake('orders', method: :get, status: 200, body: load_fixture('orders'))
19
49
  order = ShopifyAPI::Order.all
20
- assert_equal 450789469, order.first.id
50
+ assert_equal(450789469, order.first.id)
21
51
  end
22
52
 
23
53
  test "add note should add a note to order" do
24
- fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
54
+ fake('orders/450789469', method: :get, status: 200, body: load_fixture('order'))
25
55
  order = ShopifyAPI::Order.find(450789469)
26
56
  order.note = "Test note"
27
- fake 'orders/450789469', :method => :put, :status => 200, :body => load_fixture('order')
57
+ fake('orders/450789469', method: :put, status: 200, body: load_fixture('order'))
28
58
  order.save
29
- assert_equal "Test note", order.note
59
+ assert_equal("Test note", order.note)
30
60
  end
31
61
 
32
62
  test "delete should delete an order" do
33
- fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
34
- fake 'orders/450789469', :method => :delete, :body => 'destroyed'
63
+ fake('orders/450789469', method: :get, status: 200, body: load_fixture('order'))
64
+ fake('orders/450789469', method: :delete, body: 'destroyed')
35
65
  order = ShopifyAPI::Order.find(450789469)
36
- assert order.destroy
66
+ assert(order.destroy)
37
67
  end
38
68
 
39
69
  test "cancel an order with params" do
40
- fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
41
- fake 'orders/450789469/cancel', :method => :post, :body => load_fixture('order')
70
+ fake('orders/450789469', method: :get, status: 200, body: load_fixture('order'))
71
+ fake('orders/450789469/cancel', method: :post, body: load_fixture('order'))
42
72
  order = ShopifyAPI::Order.find(450789469)
43
73
  order.cancel(email: false, restock: true)
44
- assert_request_body({'email' => false, 'restock' => true}.to_json)
74
+ assert_request_body({ 'email' => false, 'restock' => true }.to_json)
75
+ end
76
+
77
+ test "capture an order with currency param" do
78
+ fake('orders/450789469', body: load_fixture('order'))
79
+ order = ShopifyAPI::Order.find(450789469)
80
+
81
+ fake('orders/450789469/transactions', method: :post, status: 201, body: load_fixture('transaction'))
82
+ order.capture(100.00, currency: 'CAD')
83
+
84
+ assert_request_body({
85
+ transaction: {
86
+ amount: 100.00,
87
+ kind: 'capture',
88
+ currency: 'CAD',
89
+ },
90
+ }.to_json)
45
91
  end
46
- end
47
92
 
93
+ test "fulfillment_orders should get fulfillment orders for an order with 2020-01 version" do
94
+ url_prefix = url_prefix_for_activated_session_for('2020-01')
95
+
96
+ fake(
97
+ 'orders',
98
+ url: "#{url_prefix}/orders/450789469.json",
99
+ method: :get,
100
+ status: 200,
101
+ body: load_fixture('order'),
102
+ extension: false
103
+ )
104
+ order = ShopifyAPI::Order.find(450789469)
105
+
106
+ fake(
107
+ 'orders',
108
+ url: "#{url_prefix}/orders/450789469/fulfillment_orders.json",
109
+ method: :get,
110
+ status: 200,
111
+ body: load_fixture('fulfillment_orders'),
112
+ extension: false
113
+ )
114
+ fulfillment_orders = order.fulfillment_orders
115
+
116
+ assert_equal([519788021, 519788022], fulfillment_orders.map(&:id).sort)
117
+ fulfillment_orders.each do |fulfillment_order|
118
+ assert(fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder))
119
+ assert_equal(450789469, fulfillment_order.order_id)
120
+ end
121
+ end
122
+
123
+ test "fulfillment_orders raises NotImplementedError when api_version is older than 2020-01" do
124
+ url_prefix = url_prefix_for_activated_session_for('2019-10')
125
+
126
+ fake(
127
+ 'orders',
128
+ url: "#{url_prefix}/orders/450789469.json",
129
+ method: :get,
130
+ status: 200,
131
+ body: load_fixture('order'),
132
+ extension: false
133
+ )
134
+ order = ShopifyAPI::Order.find(450789469)
135
+
136
+ assert_raises(NotImplementedError) do
137
+ order.fulfillment_orders
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,290 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class PaginationTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+
8
+ @version = ShopifyAPI::ApiVersion.find_version('2019-10')
9
+ ShopifyAPI::Base.api_version = @version.to_s
10
+ @next_page_info = "eyJkaXJlY3Rpb24iOiJuZXh0IiwibGFzdF9pZCI6NDQwMDg5NDIzLCJsYXN0X3ZhbHVlIjoiNDQwMDg5NDIzIn0%3D"
11
+ @previous_page_info = "eyJsYXN0X2lkIjoxMDg4MjgzMDksImxhc3RfdmFsdWUiOiIxMDg4MjgzMDkiLCJkaXJlY3Rpb24iOiJuZXh0In0%3D"
12
+
13
+ @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
14
+ "orders.json?page_info=#{@next_page_info}>; rel=\"next\""
15
+ @previous_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
16
+ "orders.json?page_info=#{@previous_page_info}>; rel=\"previous\""
17
+ end
18
+
19
+ test "navigates using next and previous link headers with no original params" do
20
+ link_header = "#{@previous_link_header}, #{@next_link_header}"
21
+
22
+ fake('orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'), link: link_header)
23
+ orders = ShopifyAPI::Order.all
24
+
25
+ fake(
26
+ 'orders',
27
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?page_info=#{@next_page_info}",
28
+ method: :get,
29
+ status: 200,
30
+ body: load_fixture('orders')
31
+ )
32
+ next_page = orders.fetch_next_page
33
+ assert_equal(450789469, next_page.first.id)
34
+
35
+ fake(
36
+ 'orders',
37
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?page_info=#{@previous_page_info}",
38
+ method: :get,
39
+ status: 200,
40
+ body: load_fixture('orders').gsub("450789469", "1122334455")
41
+ )
42
+
43
+ previous_page = orders.fetch_previous_page
44
+ assert_equal(1122334455, previous_page.first.id)
45
+ end
46
+
47
+ test "uses all passed in querystring parameters" do
48
+ params = "page_info=#{@next_page_info}&limit=50&fields=#{CGI.escape('id,created_at')}"
49
+ @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
50
+ "orders.json?#{params}>; rel=\"next\""
51
+ fake(
52
+ 'orders',
53
+ method: :get,
54
+ status: 200,
55
+ api_version: @version,
56
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?fields=id%2Cupdated_at&limit=100",
57
+ body: load_fixture('orders'),
58
+ link: @next_link_header
59
+ )
60
+ orders = ShopifyAPI::Order.where(fields: 'id,updated_at', limit: 100)
61
+
62
+ fake(
63
+ 'orders',
64
+ method: :get,
65
+ status: 200,
66
+ api_version: @version,
67
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
68
+ "orders.json?fields=id%2Ccreated_at&limit=50&page_info=#{@next_page_info}",
69
+ body: load_fixture('orders')
70
+ )
71
+ next_page = orders.fetch_next_page
72
+ assert_equal(450789469, next_page.first.id)
73
+ end
74
+
75
+ test "returns empty next page if just the previous page is present" do
76
+ fake(
77
+ 'orders', method: :get, status: 200, api_version: @version,
78
+ body: load_fixture('orders'), link: @previous_link_header
79
+ )
80
+ orders = ShopifyAPI::Order.all
81
+
82
+ next_page = orders.fetch_next_page
83
+ assert_empty(next_page)
84
+ end
85
+
86
+ test "returns an empty previous page if just the next page is present" do
87
+ fake(
88
+ 'orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'), link: @next_link_header
89
+ )
90
+ orders = ShopifyAPI::Order.all
91
+
92
+ next_page = orders.fetch_previous_page
93
+ assert_empty(next_page)
94
+ end
95
+
96
+ test "#next_page? returns true if next page is present" do
97
+ fake(
98
+ 'orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'), link: @next_link_header
99
+ )
100
+ orders = ShopifyAPI::Order.all
101
+
102
+ assert(orders.next_page?)
103
+ end
104
+
105
+ test "#next_page? returns false if next page is not present" do
106
+ fake(
107
+ 'orders', method: :get, status: 200, api_version: @version,
108
+ body: load_fixture('orders'), link: @previous_link_header
109
+ )
110
+ orders = ShopifyAPI::Order.all
111
+
112
+ refute(orders.next_page?)
113
+ end
114
+
115
+ test "#next_page_info returns next_page_info if next page is present" do
116
+ fake(
117
+ 'orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'), link: @next_link_header
118
+ )
119
+ orders = ShopifyAPI::Order.all
120
+
121
+ assert_equal(@next_page_info, orders.next_page_info)
122
+ end
123
+
124
+ test "#next_page_info returns nil if next page is not present" do
125
+ fake(
126
+ 'orders', method: :get, status: 200, api_version: @version,
127
+ body: load_fixture('orders'), link: @previous_link_header
128
+ )
129
+ orders = ShopifyAPI::Order.all
130
+
131
+ assert_nil(orders.next_page_info)
132
+ end
133
+
134
+ test "#previous_page? returns true if previous page is present" do
135
+ fake(
136
+ 'orders', method: :get, status: 200, api_version: @version,
137
+ body: load_fixture('orders'), link: @previous_link_header
138
+ )
139
+ orders = ShopifyAPI::Order.all
140
+
141
+ assert(orders.previous_page?)
142
+ end
143
+
144
+ test "#previous_page? returns false if next page is not present" do
145
+ fake(
146
+ 'orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'), link: @next_link_header
147
+ )
148
+ orders = ShopifyAPI::Order.all
149
+
150
+ refute(orders.previous_page?)
151
+ end
152
+
153
+ test "#previous_page_info returns previous_page_info if next page is present" do
154
+ fake(
155
+ 'orders', method: :get, status: 200, api_version: @version,
156
+ body: load_fixture('orders'), link: @previous_link_header
157
+ )
158
+ orders = ShopifyAPI::Order.all
159
+
160
+ assert_equal(@previous_page_info, orders.previous_page_info)
161
+ end
162
+
163
+ test "#previous_page_info returns nil if next page is not present" do
164
+ fake(
165
+ 'orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'), link: @next_link_header
166
+ )
167
+ orders = ShopifyAPI::Order.all
168
+
169
+ assert_nil(orders.previous_page_info)
170
+ end
171
+
172
+ test "pagination handles no link headers" do
173
+ fake('orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'))
174
+ orders = ShopifyAPI::Order.all
175
+
176
+ refute(orders.next_page?)
177
+ refute(orders.previous_page?)
178
+ assert_empty(orders.fetch_next_page)
179
+ assert_empty(orders.fetch_previous_page)
180
+ end
181
+
182
+ test "raises on invalid pagination links" do
183
+ link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
184
+ "orders.json?page_info=#{@next_page_info}>;"
185
+ fake('orders', method: :get, status: 200, api_version: @version, body: load_fixture('orders'), link: link_header)
186
+
187
+ assert_raises(ShopifyAPI::InvalidPaginationLinksError) do
188
+ ShopifyAPI::Order.all
189
+ end
190
+ end
191
+
192
+ test "raises on an older API version" do
193
+ version = ShopifyAPI::ApiVersion.find_version('2019-04')
194
+ ShopifyAPI::Base.api_version = version.to_s
195
+
196
+ fake('orders', method: :get, status: 200, api_version: version, body: load_fixture('orders'))
197
+ orders = ShopifyAPI::Order.all
198
+
199
+ assert_raises(NotImplementedError) do
200
+ orders.fetch_next_page
201
+ end
202
+ end
203
+
204
+ test "raises on 2019-07 API version for models that don't support new pagination yet" do
205
+ version = ShopifyAPI::ApiVersion.find_version('2019-07')
206
+ ShopifyAPI::Base.api_version = version.to_s
207
+
208
+ fake('orders', method: :get, status: 200, api_version: version, body: load_fixture('orders'))
209
+ orders = ShopifyAPI::Order.all
210
+
211
+ assert_raises(NotImplementedError) do
212
+ orders.fetch_next_page
213
+ end
214
+ end
215
+
216
+ test "new pagination works on 2019-07 API version for select models" do
217
+ version = ShopifyAPI::ApiVersion.find_version('2019-07')
218
+ ShopifyAPI::Base.api_version = version.to_s
219
+
220
+ fake('events', method: :get, status: 200, api_version: version, body: load_fixture('events'))
221
+ events = ShopifyAPI::Event.all
222
+
223
+ assert_empty(events.fetch_next_page)
224
+ assert_empty(events.fetch_previous_page)
225
+ end
226
+
227
+ test "does not raise on the unstable version" do
228
+ version = ShopifyAPI::ApiVersion.find_version('unstable')
229
+ ShopifyAPI::Base.api_version = version.to_s
230
+ @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/" \
231
+ "orders.json?page_info=#{@next_page_info}>; rel=\"next\""
232
+
233
+ link_header = "#{@previous_link_header}, #{@next_link_header}"
234
+
235
+ fake('orders', method: :get, status: 200, api_version: version, body: load_fixture('orders'), link: link_header)
236
+ orders = ShopifyAPI::Order.all
237
+
238
+ fake(
239
+ 'orders',
240
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}",
241
+ method: :get,
242
+ status: 200,
243
+ body: load_fixture('orders')
244
+ )
245
+ assert_nothing_raised do
246
+ next_page = orders.fetch_next_page
247
+ assert_equal(450789469, next_page.first.id)
248
+ end
249
+ end
250
+
251
+ test "allows for multiple concurrent API collection objects" do
252
+ first_request_params = "page_info=#{@next_page_info}&limit=5"
253
+ fake(
254
+ 'orders',
255
+ method: :get,
256
+ status: 200,
257
+ api_version: @version,
258
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=5",
259
+ body: load_fixture('orders'),
260
+ link: "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
261
+ "orders.json?#{first_request_params}>; rel=\"next\""
262
+ )
263
+ ShopifyAPI::Order.where(limit: 5)
264
+
265
+ second_request_params = "page_info=#{@next_page_info}&limit=5"
266
+ fake(
267
+ 'orders',
268
+ method: :get,
269
+ status: 200,
270
+ api_version: @version,
271
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=10",
272
+ body: load_fixture('orders'),
273
+ link: "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
274
+ "orders.json?#{second_request_params}>; rel=\"next\""
275
+ )
276
+ orders = ShopifyAPI::Order.where(limit: 10)
277
+
278
+ fake(
279
+ 'orders',
280
+ method: :get,
281
+ status: 200,
282
+ api_version: @version,
283
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/" \
284
+ "orders.json?limit=5&page_info=#{@next_page_info}",
285
+ body: load_fixture('orders')
286
+ )
287
+ next_page = orders.fetch_next_page
288
+ assert_equal(450789469, next_page.first.id)
289
+ end
290
+ end