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
@@ -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