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
@@ -1,19 +1,47 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
  require "active_support/log_subscriber/test_helper"
4
+ require 'json'
3
5
 
4
6
  class LogSubscriberTest < Test::Unit::TestCase
5
7
  include ActiveSupport::LogSubscriber::TestHelper
6
8
 
9
+ attr_reader :request_headers
10
+
7
11
  def setup
8
12
  super
9
- @page = { :page => { :id => 1, :title => 'Shopify API' } }.to_json
10
- @ua_header = "\"User-Agent\"=>\"ShopifyAPI/#{ShopifyAPI::VERSION} ActiveResource/#{ActiveResource::VERSION::STRING} Ruby/#{RUBY_VERSION}\""
13
+ @page = { page: { id: 1, title: 'Shopify API' } }.to_json
14
+ @ua_header = "\"User-Agent\"=>\"ShopifyAPI/#{ShopifyAPI::VERSION} " \
15
+ "ActiveResource/#{ActiveResource::VERSION::STRING} Ruby/#{RUBY_VERSION}\""
16
+ @request_headers = "Headers: {\"Accept\"=>\"application/json\", " \
17
+ "#{@ua_header}, \"X-Shopify-Access-Token\"=>\"[FILTERED]\"}"
11
18
 
12
19
  ShopifyAPI::Base.clear_session
13
- ShopifyAPI::Base.site = "https://this-is-my-test-shop.myshopify.com/admin"
20
+ fake(
21
+ "apis",
22
+ url: "https://app.shopify.com/services/apis.json",
23
+ method: :get,
24
+ status: 200,
25
+ api_version: :stub,
26
+ body: load_fixture('apis')
27
+ )
28
+ ShopifyAPI::ApiVersion.fetch_known_versions
29
+ session = ShopifyAPI::Session.new(
30
+ domain: "https://this-is-my-test-shop.myshopify.com",
31
+ token: "access_token",
32
+ api_version: '2019-01'
33
+ )
34
+
35
+ ShopifyAPI::Base.activate_session(session)
14
36
 
15
- ActiveResource::LogSubscriber.attach_to :active_resource
16
- ActiveResource::DetailedLogSubscriber.attach_to :active_resource_detailed
37
+ ActiveResource::LogSubscriber.attach_to(:active_resource)
38
+ ActiveResource::DetailedLogSubscriber.attach_to(:active_resource_detailed)
39
+ end
40
+
41
+ def teardown
42
+ super
43
+ ShopifyAPI::ApiVersion.clear_known_versions
44
+ ShopifyAPI::ApiVersion.version_lookup_mode = :raise_on_unknown
17
45
  end
18
46
 
19
47
  def set_logger(logger)
@@ -21,29 +49,95 @@ class LogSubscriberTest < Test::Unit::TestCase
21
49
  end
22
50
 
23
51
  test "logging on #find" do
24
- fake "pages/1", :method => :get, :body => @page
52
+ fake("pages/1", method: :get, body: @page)
25
53
 
26
54
  ShopifyAPI::Page.find(1)
27
55
 
28
- assert_equal 4, @logger.logged(:info).size
29
- assert_equal "GET https://this-is-my-test-shop.myshopify.com:443/admin/pages/1.json", @logger.logged(:info)[0]
30
- assert_match /\-\-\> 200/, @logger.logged(:info)[1]
31
- assert_equal "Headers: {\"Accept\"=>\"application/json\", #{@ua_header}}", @logger.logged(:info)[2]
32
- assert_match /Response:\n\{\"page\"\:\{((\"id\"\:1)|(\"title\"\:\"Shopify API\")),((\"id\"\:1)|(\"title\"\:\"Shopify API\"))\}\}/, @logger.logged(:info)[3]
33
-
56
+ assert_equal(4, @logger.logged(:info).size)
57
+ assert_equal(
58
+ "GET https://this-is-my-test-shop.myshopify.com:443/admin/api/2019-01/pages/1.json",
59
+ @logger.logged(:info)[0]
60
+ )
61
+ assert_match(/\-\-\> 200/, @logger.logged(:info)[1])
62
+ assert_equal(request_headers, @logger.logged(:info)[2])
63
+ assert_match(
64
+ %r{(Response:\n\{\"page\"\:\{\"id\"\:1,\"title\"\:\"Shopify API\"\}\})|
65
+ (Response:\n\{\"page\"\:\{\"title\"\:\"Shopify API\",\"id\"\:1\}\})},
66
+ @logger.logged(:info)[3]
67
+ )
34
68
  end
35
69
 
36
70
  test "logging on #find with an error" do
37
- fake "pages/2", :method => :get, :body => nil, :status => 404
71
+ fake("pages/2", method: :get, body: nil, status: 404)
38
72
 
39
- assert_raises ActiveResource::ResourceNotFound do
73
+ assert_raises(ActiveResource::ResourceNotFound) do
40
74
  ShopifyAPI::Page.find(2)
41
75
  end
42
76
 
43
- assert_equal 4, @logger.logged(:info).size
44
- assert_equal "GET https://this-is-my-test-shop.myshopify.com:443/admin/pages/2.json", @logger.logged(:info)[0]
45
- assert_match /\-\-\> 404/, @logger.logged(:info)[1]
46
- assert_equal "Headers: {\"Accept\"=>\"application/json\", #{@ua_header}}", @logger.logged(:info)[2]
47
- assert_equal "Response:", @logger.logged(:info)[3]
77
+ if ar_version_before?('5.1.0')
78
+ assert_equal(4, @logger.logged(:info).size)
79
+ assert_equal(
80
+ "GET https://this-is-my-test-shop.myshopify.com:443/admin/api/2019-01/pages/2.json",
81
+ @logger.logged(:info)[0]
82
+ )
83
+ assert_match(/\-\-\> 404/, @logger.logged(:info)[1])
84
+ assert_equal(request_headers, @logger.logged(:info)[2])
85
+ assert_equal("Response:", @logger.logged(:info)[3])
86
+ else
87
+ assert_equal(2, @logger.logged(:error).size)
88
+ assert_equal(
89
+ "GET https://this-is-my-test-shop.myshopify.com:443/admin/api/2019-01/pages/2.json",
90
+ @logger.logged(:error)[0]
91
+ )
92
+ assert_match(/\-\-\> 404/, @logger.logged(:error)[1])
93
+
94
+ assert_equal(2, @logger.logged(:info).size)
95
+ assert_equal(request_headers, @logger.logged(:info)[0])
96
+ assert_equal("Response:", @logger.logged(:info)[1])
97
+ end
98
+ end
99
+
100
+ test "warns when the server responds with a x-shopify-api-deprecated-reason header" do
101
+ fake(
102
+ "pages/1",
103
+ method: :get,
104
+ body: @page,
105
+ x_shopify_api_deprecated_reason: 'https://help.shopify.com/en/api/getting-started/api-deprecations'
106
+ )
107
+
108
+ ShopifyAPI::Page.find(1)
109
+
110
+ assert_equal(1, @logger.logged(:warn).size)
111
+
112
+ assert_match(
113
+ %r{\[DEPRECATED\] ShopifyAPI made a call to GET /admin/api/2019-01/pages/1.json},
114
+ @logger.logged(:warn).first
115
+ )
116
+ assert_match(
117
+ %r{See https:\/\/help.shopify.com\/en\/api\/getting-started\/api-deprecations for more details.},
118
+ @logger.logged(:warn).first
119
+ )
120
+ end
121
+
122
+ test "warns when the server responds with a x-shopify-api-version-warning header" do
123
+ fake(
124
+ "pages/1",
125
+ method: :get,
126
+ body: @page,
127
+ x_shopify_api_version_warning: 'https://shopify.dev/concepts/about-apis/versioning'
128
+ )
129
+
130
+ ShopifyAPI::Page.find(1)
131
+
132
+ assert_equal(1, @logger.logged(:warn).size)
133
+
134
+ assert_match(
135
+ %r{\[API Version Warning\] ShopifyAPI made a call to GET /admin/api/2019-01/pages/1.json},
136
+ @logger.logged(:warn).first
137
+ )
138
+ assert_match(
139
+ %r{See https:\/\/shopify.dev\/concepts\/about-apis\/versioning for more details.},
140
+ @logger.logged(:warn).first
141
+ )
48
142
  end
49
143
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class DiscountCodeBatchTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ fake('price_rules/102586120/batch/989355119', body: load_fixture('discount_code_batch'))
8
+ end
9
+
10
+ def test_get_batch
11
+ batch = ShopifyAPI::DiscountCodeBatch.find(989355119, params: { price_rule_id: 102586120 })
12
+
13
+ assert_equal(989355119, batch.id)
14
+ end
15
+
16
+ def test_get_batch_discount_codes
17
+ fake(
18
+ 'price_rules/102586120/batch/989355119/discount_codes',
19
+ method: :get,
20
+ status: 200,
21
+ body: load_fixture('discount_code_batch_discount_codes')
22
+ )
23
+ batch = ShopifyAPI::DiscountCodeBatch.find(989355119, params: { price_rule_id: 102586120 })
24
+ discount_code_job = batch.discount_code_job
25
+
26
+ assert_equal(3, discount_code_job.count)
27
+ assert(discount_code_job[2].errors.present?)
28
+ end
29
+
30
+ def test_create_batch
31
+ fake('price_rules/102586120/batch', method: :post, status: 201, body: load_fixture('discount_code_batch'))
32
+ batch = ShopifyAPI::DiscountCodeBatch.new
33
+ batch.prefix_options[:price_rule_id] = 102586120
34
+ discount_codes = [{ "code": "SUMMER1" }, { "code": "SUMMER2" }, { "code": "SUMMER3" }]
35
+ batch.discount_codes = discount_codes
36
+ batch.save
37
+
38
+ expected_body = { discount_codes: discount_codes }.to_json
39
+ assert_equal(expected_body, WebMock.last_request.body)
40
+ end
41
+ end
@@ -1,36 +1,37 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  class DiscountCodeTest < Test::Unit::TestCase
4
5
  def setup
5
6
  super
6
- fake 'price_rules/102586120/discount_codes/1002091923', body: load_fixture('discount_code')
7
+ fake('price_rules/102586120/discount_codes/1002091923', body: load_fixture('discount_code'))
7
8
 
8
- @discount_code = ShopifyAPI::DiscountCode.find(1002091923, params: {price_rule_id: 102586120})
9
+ @discount_code = ShopifyAPI::DiscountCode.find(1002091923, params: { price_rule_id: 102586120 })
9
10
  end
10
11
 
11
12
  def test_get_discount_code
12
- fake 'price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_code')
13
- discount_code = ShopifyAPI::DiscountCode.find 1002091923, params: { price_rule_id: 102586120 }
13
+ fake('price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_code'))
14
+ discount_code = ShopifyAPI::DiscountCode.find(1002091923, params: { price_rule_id: 102586120 })
14
15
 
15
- assert_equal 1002091923, discount_code.id
16
+ assert_equal(1002091923, discount_code.id)
16
17
  end
17
18
 
18
19
  def test_get_all_discount_codes
19
- fake 'price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_codes')
20
- discount_codes = ShopifyAPI::DiscountCode.all params: { price_rule_id: 102586120 }
20
+ fake('price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_codes'))
21
+ discount_codes = ShopifyAPI::DiscountCode.all(params: { price_rule_id: 102586120 })
21
22
 
22
- assert_equal 1, discount_codes.length
23
- assert_equal 1002091923, discount_codes.first.id
23
+ assert_equal(1, discount_codes.length)
24
+ assert_equal(1002091923, discount_codes.first.id)
24
25
  end
25
26
 
26
27
  def test_create_discount_code
27
- fake 'price_rules/102586120/discount_codes', method: :post, status: 201, body: load_fixture('discount_code')
28
+ fake('price_rules/102586120/discount_codes', method: :post, status: 201, body: load_fixture('discount_code'))
28
29
  discount_code = ShopifyAPI::DiscountCode.new
29
30
  discount_code.prefix_options[:price_rule_id] = 102586120
30
31
  discount_code.code = "SUMMERSALE10"
31
32
  discount_code.save
32
33
 
33
- assert_equal '{"discount_code":{"code":"SUMMERSALE10"}}', FakeWeb.last_request.body
34
+ assert_equal('{"discount_code":{"code":"SUMMERSALE10"}}', WebMock.last_request.body)
34
35
  end
35
36
 
36
37
  def test_update_discount_code
@@ -38,16 +39,21 @@ class DiscountCodeTest < Test::Unit::TestCase
38
39
  discount_code_response['discount_code']['code'] = "WINTERSALE50"
39
40
  @discount_code.code = "WINTERSALE50"
40
41
 
41
- fake 'price_rules/102586120/discount_codes/1002091923', method: :put, status: 200, body: ActiveSupport::JSON.encode(discount_code_response)
42
+ fake(
43
+ 'price_rules/102586120/discount_codes/1002091923',
44
+ method: :put,
45
+ status: 200,
46
+ body: ActiveSupport::JSON.encode(discount_code_response)
47
+ )
42
48
 
43
49
  @discount_code.save
44
-
45
- assert_equal discount_code_response['discount_code']['code'], @discount_code.code
50
+
51
+ assert_equal(discount_code_response['discount_code']['code'], @discount_code.code)
46
52
  end
47
53
 
48
54
  def test_delete_discount_code
49
- fake 'price_rules/102586120/discount_codes/1002091923', method: :delete, body: 'destroyed'
55
+ fake('price_rules/102586120/discount_codes/1002091923', method: :delete, body: 'destroyed')
50
56
 
51
- assert @discount_code.destroy
57
+ assert(@discount_code.destroy)
52
58
  end
53
59
  end
@@ -1,151 +1,167 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  class DraftOrderTest < Test::Unit::TestCase
4
5
  def setup
5
6
  super
6
7
 
7
- fake 'draft_orders/517119332', body: load_fixture('draft_order')
8
+ fake('draft_orders/517119332', body: load_fixture('draft_order'))
8
9
 
9
10
  @draft_order = ShopifyAPI::DraftOrder.find(517119332)
10
11
  end
11
12
 
12
13
  def test_get_draft_order
13
- fake 'draft_orders/517119332', method: :get, status: 200, body: load_fixture('draft_order')
14
+ fake('draft_orders/517119332', method: :get, status: 200, body: load_fixture('draft_order'))
14
15
 
15
16
  draft_order = ShopifyAPI::DraftOrder.find(517119332)
16
17
 
17
- assert_equal 517119332, draft_order.id
18
+ assert_equal(517119332, draft_order.id)
18
19
  end
19
20
 
20
21
  def test_get_all_draft_orders
21
- fake 'draft_orders', method: :get, status: 200, body: load_fixture('draft_orders')
22
+ fake('draft_orders', method: :get, status: 200, body: load_fixture('draft_orders'))
22
23
 
23
24
  draft_orders = ShopifyAPI::DraftOrder.all
24
25
 
25
- assert_equal 1, draft_orders.length
26
- assert_equal 517119332, draft_orders.first.id
26
+ assert_equal(1, draft_orders.length)
27
+ assert_equal(517119332, draft_orders.first.id)
27
28
  end
28
29
 
29
30
  def test_get_count_draft_orders
30
- fake 'draft_orders/count', method: :get, status: 200, body: '{"count": 16}'
31
+ fake('draft_orders/count', method: :get, status: 200, body: '{"count": 16}')
31
32
 
32
33
  draft_orders_count = ShopifyAPI::DraftOrder.count
33
34
 
34
- assert_equal 16, draft_orders_count
35
+ assert_equal(16, draft_orders_count)
35
36
  end
36
37
 
37
38
  def test_create_draft_order
38
- fake 'draft_orders', method: :post, status: 201, body: load_fixture('draft_order')
39
+ fake('draft_orders', method: :post, status: 201, body: load_fixture('draft_order'))
39
40
 
40
41
  draft_order = ShopifyAPI::DraftOrder.create(line_items: [{ quantity: 1, variant_id: 39072856 }])
41
42
 
42
- assert_equal '{"draft_order":{"line_items":[{"quantity":1,"variant_id":39072856}]}}', FakeWeb.last_request.body
43
- assert_equal 39072856, draft_order.line_items.first.variant_id
43
+ assert_equal('{"draft_order":{"line_items":[{"quantity":1,"variant_id":39072856}]}}', WebMock.last_request.body)
44
+ assert_equal(39072856, draft_order.line_items.first.variant_id)
44
45
  end
45
46
 
46
47
  def test_create_draft_order_202
47
- fake 'draft_orders', method: :post, status: 202, body: load_fixture('draft_order')
48
+ fake('draft_orders', method: :post, status: 202, body: load_fixture('draft_order'))
48
49
 
49
50
  draft_order = ShopifyAPI::DraftOrder.create(line_items: [{ quantity: 1, variant_id: 39072856 }])
50
51
 
51
- assert_equal 39072856, draft_order.line_items.first.variant_id
52
+ assert_equal(39072856, draft_order.line_items.first.variant_id)
52
53
  end
53
54
 
54
55
  def test_update_draft_order
55
56
  draft_order_response = ActiveSupport::JSON.decode(load_fixture('draft_order'))
56
57
  draft_order_response['draft_order']['note'] = 'Test new note'
57
58
  @draft_order.note = 'Test new note'
58
- fake 'draft_orders/517119332', method: :put, status: 200, body: ActiveSupport::JSON.encode(draft_order_response)
59
+ fake('draft_orders/517119332', method: :put, status: 200, body: ActiveSupport::JSON.encode(draft_order_response))
59
60
 
60
61
  @draft_order.save
61
62
 
62
- assert_equal draft_order_response['draft_order']['note'], @draft_order.note
63
+ assert_equal(draft_order_response['draft_order']['note'], @draft_order.note)
63
64
  end
64
65
 
65
66
  def test_send_invoice_with_no_params
66
67
  draft_order_invoice_fixture = load_fixture('draft_order_invoice')
67
68
  draft_order_invoice = ActiveSupport::JSON.decode(draft_order_invoice_fixture)
68
- fake 'draft_orders/517119332/send_invoice', method: :post, body: draft_order_invoice_fixture
69
+ fake('draft_orders/517119332/send_invoice', method: :post, body: draft_order_invoice_fixture)
69
70
 
70
71
  draft_order_invoice_response = @draft_order.send_invoice
71
72
 
72
- assert_equal '{"draft_order_invoice":{}}', FakeWeb.last_request.body
73
- assert_kind_of ShopifyAPI::DraftOrderInvoice, draft_order_invoice_response
74
- assert_equal draft_order_invoice['draft_order_invoice']['to'], draft_order_invoice_response.to
73
+ assert_equal('{"draft_order_invoice":{}}', WebMock.last_request.body)
74
+ assert_kind_of(ShopifyAPI::DraftOrderInvoice, draft_order_invoice_response)
75
+ assert_equal(draft_order_invoice['draft_order_invoice']['to'], draft_order_invoice_response.to)
75
76
  end
76
77
 
77
78
  def test_send_invoice_with_params
78
79
  draft_order_invoice_fixture = load_fixture('draft_order_invoice')
79
80
  draft_order_invoice = ActiveSupport::JSON.decode(draft_order_invoice_fixture)
80
- fake 'draft_orders/517119332/send_invoice', method: :post, body: draft_order_invoice_fixture
81
+ fake('draft_orders/517119332/send_invoice', method: :post, body: draft_order_invoice_fixture)
81
82
 
82
- draft_order_invoice_response = @draft_order.send_invoice(ShopifyAPI::DraftOrderInvoice.new(draft_order_invoice['draft_order_invoice']))
83
+ draft_order_invoice_response = @draft_order.send_invoice(
84
+ ShopifyAPI::DraftOrderInvoice.new(draft_order_invoice['draft_order_invoice'])
85
+ )
83
86
 
84
- assert_equal draft_order_invoice, ActiveSupport::JSON.decode(FakeWeb.last_request.body)
85
- assert_kind_of ShopifyAPI::DraftOrderInvoice, draft_order_invoice_response
86
- assert_equal draft_order_invoice['draft_order_invoice']['to'], draft_order_invoice_response.to
87
+ assert_equal(draft_order_invoice, ActiveSupport::JSON.decode(WebMock.last_request.body))
88
+ assert_kind_of(ShopifyAPI::DraftOrderInvoice, draft_order_invoice_response)
89
+ assert_equal(draft_order_invoice['draft_order_invoice']['to'], draft_order_invoice_response.to)
87
90
  end
88
91
 
89
92
  def test_delete_draft_order
90
- fake 'draft_orders/517119332', method: :delete, body: 'destroyed'
91
- assert @draft_order.destroy
93
+ fake('draft_orders/517119332', method: :delete, body: 'destroyed')
94
+ assert(@draft_order.destroy)
92
95
  end
93
96
 
94
97
  def test_add_metafields_to_draft_order
95
- fake 'draft_orders/517119332/metafields', method: :post, status: 201, body: load_fixture('metafield')
96
-
97
- field = @draft_order.add_metafield(ShopifyAPI::Metafield.new(namespace: 'contact', key: 'email', value: '123@example.com', value_type: 'string'))
98
-
99
- assert_equal ActiveSupport::JSON.decode('{"metafield":{"namespace":"contact","key":"email","value":"123@example.com","value_type":"string"}}'), ActiveSupport::JSON.decode(FakeWeb.last_request.body)
100
- assert !field.new_record?
101
- assert_equal 'contact', field.namespace
102
- assert_equal 'email', field.key
103
- assert_equal '123@example.com', field.value
98
+ fake('draft_orders/517119332/metafields', method: :post, status: 201, body: load_fixture('metafield'))
99
+
100
+ field = @draft_order.add_metafield(
101
+ ShopifyAPI::Metafield.new(namespace: 'contact', key: 'email', value: '123@example.com', value_type: 'string')
102
+ )
103
+
104
+ assert_equal(
105
+ ActiveSupport::JSON.decode(
106
+ '{"metafield":{"namespace":"contact","key":"email","value":"123@example.com","value_type":"string"}}'
107
+ ),
108
+ ActiveSupport::JSON.decode(WebMock.last_request.body)
109
+ )
110
+ assert(!field.new_record?)
111
+ assert_equal('contact', field.namespace)
112
+ assert_equal('email', field.key)
113
+ assert_equal('123@example.com', field.value)
104
114
  end
105
115
 
106
116
  def test_get_all_metafields_for_draft_order
107
- fake 'draft_orders/517119332/metafields', body: load_fixture('metafields')
117
+ fake('draft_orders/517119332/metafields', body: load_fixture('metafields'))
108
118
 
109
119
  metafields = @draft_order.metafields
110
120
 
111
- assert_equal 3, metafields.length
112
- assert metafields.all? { |m| m.is_a?(ShopifyAPI::Metafield) }
121
+ assert_equal(3, metafields.length)
122
+ assert(metafields.all? { |m| m.is_a?(ShopifyAPI::Metafield) })
113
123
  end
114
124
 
115
125
  def test_get_2_metafields_for_draft_order
116
- body = ActiveSupport::JSON.decode load_fixture 'metafields'
117
- body['metafields'].slice! 2, 1
126
+ body = ActiveSupport::JSON.decode(load_fixture('metafields'))
127
+ body['metafields'].slice!(2, 1)
118
128
 
119
- fake 'draft_orders/517119332/metafields.json?limit=2', body: body.to_json, extension: false
129
+ fake('draft_orders/517119332/metafields.json?limit=2', body: body.to_json, extension: false)
120
130
 
121
- metafields = @draft_order.metafields limit: 2
131
+ metafields = @draft_order.metafields(limit: 2)
122
132
 
123
- assert_equal 2, metafields.length
124
- assert metafields.all?{ |m| m.is_a? ShopifyAPI::Metafield }
133
+ assert_equal(2, metafields.length)
134
+ assert(metafields.all? { |m| m.is_a?(ShopifyAPI::Metafield) })
125
135
  end
126
136
 
127
137
  def test_complete_draft_order_with_no_params
128
138
  completed_fixture = load_fixture('draft_order_completed')
129
139
  completed_draft = ActiveSupport::JSON.decode(completed_fixture)['draft_order']
130
- fake 'draft_orders/517119332/complete', method: :put, status: 200, body: completed_fixture
140
+ fake('draft_orders/517119332/complete', method: :put, status: 200, body: completed_fixture)
131
141
 
132
142
  @draft_order.complete
133
143
 
134
- assert_equal completed_draft['status'], @draft_order.status
135
- assert_equal completed_draft['order_id'], @draft_order.order_id
136
- refute_nil @draft_order.completed_at
144
+ assert_equal(completed_draft['status'], @draft_order.status)
145
+ assert_equal(completed_draft['order_id'], @draft_order.order_id)
146
+ refute_nil(@draft_order.completed_at)
137
147
  end
138
148
 
139
149
  def test_complete_draft_order_with_params
140
150
  completed_fixture = load_fixture('draft_order_completed')
141
151
  completed_draft = ActiveSupport::JSON.decode(completed_fixture)['draft_order']
142
152
  complete_params = { payment_pending: true }
143
- fake 'draft_orders/517119332/complete.json?payment_pending=true', extension: false, method: :put, status: 200, body: completed_fixture
153
+ fake(
154
+ 'draft_orders/517119332/complete.json?payment_pending=true',
155
+ extension: false,
156
+ method: :put,
157
+ status: 200,
158
+ body: completed_fixture
159
+ )
144
160
 
145
161
  @draft_order.complete(complete_params)
146
162
 
147
- assert_equal completed_draft['status'], @draft_order.status
148
- assert_equal completed_draft['order_id'], @draft_order.order_id
149
- refute_nil @draft_order.completed_at
163
+ assert_equal(completed_draft['status'], @draft_order.status)
164
+ assert_equal(completed_draft['order_id'], @draft_order.order_id)
165
+ refute_nil(@draft_order.completed_at)
150
166
  end
151
167
  end