duodealer_api 1.0.0

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 (322) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +13 -0
  4. data/.rubocop.yml +8 -0
  5. data/.travis.yml +23 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile_ar41 +5 -0
  8. data/Gemfile_ar50 +5 -0
  9. data/Gemfile_ar51 +5 -0
  10. data/Gemfile_ar_master +5 -0
  11. data/RELEASING +13 -0
  12. data/Rakefile +44 -0
  13. data/docker-compose.yml +13 -0
  14. data/docs/graphql.md +191 -0
  15. data/duodealer_api.gemspec +38 -0
  16. data/lib/active_resource/connection_ext.rb +10 -0
  17. data/lib/active_resource/detailed_log_subscriber.rb +52 -0
  18. data/lib/active_resource/json_errors.rb +31 -0
  19. data/lib/duodealer_api.rb +33 -0
  20. data/lib/duodealer_api/api_version.rb +205 -0
  21. data/lib/duodealer_api/connection.rb +35 -0
  22. data/lib/duodealer_api/countable.rb +14 -0
  23. data/lib/duodealer_api/disable_prefix_check.rb +31 -0
  24. data/lib/duodealer_api/events.rb +7 -0
  25. data/lib/duodealer_api/graphql.rb +79 -0
  26. data/lib/duodealer_api/graphql/http_client.rb +22 -0
  27. data/lib/duodealer_api/graphql/railtie.rb +17 -0
  28. data/lib/duodealer_api/graphql/task.rake +97 -0
  29. data/lib/duodealer_api/limits.rb +76 -0
  30. data/lib/duodealer_api/message_enricher.rb +23 -0
  31. data/lib/duodealer_api/meta.rb +15 -0
  32. data/lib/duodealer_api/metafields.rb +20 -0
  33. data/lib/duodealer_api/paginated_collection.rb +69 -0
  34. data/lib/duodealer_api/pagination_link_headers.rb +33 -0
  35. data/lib/duodealer_api/resources.rb +3 -0
  36. data/lib/duodealer_api/resources/abandoned_checkout.rb +7 -0
  37. data/lib/duodealer_api/resources/access_scope.rb +10 -0
  38. data/lib/duodealer_api/resources/access_token.rb +8 -0
  39. data/lib/duodealer_api/resources/address.rb +4 -0
  40. data/lib/duodealer_api/resources/announcement.rb +4 -0
  41. data/lib/duodealer_api/resources/api_permission.rb +9 -0
  42. data/lib/duodealer_api/resources/application_charge.rb +15 -0
  43. data/lib/duodealer_api/resources/application_credit.rb +4 -0
  44. data/lib/duodealer_api/resources/array_base.rb +13 -0
  45. data/lib/duodealer_api/resources/article.rb +21 -0
  46. data/lib/duodealer_api/resources/asset.rb +100 -0
  47. data/lib/duodealer_api/resources/assigned_fulfillment_order.rb +16 -0
  48. data/lib/duodealer_api/resources/base.rb +162 -0
  49. data/lib/duodealer_api/resources/billing_address.rb +4 -0
  50. data/lib/duodealer_api/resources/blog.rb +10 -0
  51. data/lib/duodealer_api/resources/carrier_service.rb +4 -0
  52. data/lib/duodealer_api/resources/cart.rb +4 -0
  53. data/lib/duodealer_api/resources/checkout.rb +30 -0
  54. data/lib/duodealer_api/resources/collect.rb +6 -0
  55. data/lib/duodealer_api/resources/collection.rb +14 -0
  56. data/lib/duodealer_api/resources/collection_listing.rb +18 -0
  57. data/lib/duodealer_api/resources/collection_publication.rb +10 -0
  58. data/lib/duodealer_api/resources/comment.rb +9 -0
  59. data/lib/duodealer_api/resources/country.rb +4 -0
  60. data/lib/duodealer_api/resources/currency.rb +6 -0
  61. data/lib/duodealer_api/resources/custom_collection.rb +19 -0
  62. data/lib/duodealer_api/resources/customer.rb +29 -0
  63. data/lib/duodealer_api/resources/customer_group.rb +5 -0
  64. data/lib/duodealer_api/resources/customer_invite.rb +4 -0
  65. data/lib/duodealer_api/resources/customer_saved_search.rb +11 -0
  66. data/lib/duodealer_api/resources/discount_code.rb +9 -0
  67. data/lib/duodealer_api/resources/draft_order.rb +14 -0
  68. data/lib/duodealer_api/resources/draft_order_invoice.rb +4 -0
  69. data/lib/duodealer_api/resources/event.rb +8 -0
  70. data/lib/duodealer_api/resources/fulfillment.rb +47 -0
  71. data/lib/duodealer_api/resources/fulfillment_event.rb +15 -0
  72. data/lib/duodealer_api/resources/fulfillment_order.rb +137 -0
  73. data/lib/duodealer_api/resources/fulfillment_order_locations_for_move.rb +4 -0
  74. data/lib/duodealer_api/resources/fulfillment_request.rb +15 -0
  75. data/lib/duodealer_api/resources/fulfillment_service.rb +4 -0
  76. data/lib/duodealer_api/resources/fulfillment_v2.rb +20 -0
  77. data/lib/duodealer_api/resources/gift_card.rb +7 -0
  78. data/lib/duodealer_api/resources/image.rb +16 -0
  79. data/lib/duodealer_api/resources/inventory_item.rb +6 -0
  80. data/lib/duodealer_api/resources/inventory_level.rb +55 -0
  81. data/lib/duodealer_api/resources/line_item.rb +14 -0
  82. data/lib/duodealer_api/resources/location.rb +8 -0
  83. data/lib/duodealer_api/resources/marketing_event.rb +10 -0
  84. data/lib/duodealer_api/resources/metafield.rb +13 -0
  85. data/lib/duodealer_api/resources/note_attribute.rb +4 -0
  86. data/lib/duodealer_api/resources/option.rb +4 -0
  87. data/lib/duodealer_api/resources/order.rb +43 -0
  88. data/lib/duodealer_api/resources/order_risk.rb +8 -0
  89. data/lib/duodealer_api/resources/page.rb +6 -0
  90. data/lib/duodealer_api/resources/payment.rb +7 -0
  91. data/lib/duodealer_api/resources/payment_details.rb +4 -0
  92. data/lib/duodealer_api/resources/ping.rb +3 -0
  93. data/lib/duodealer_api/resources/policy.rb +7 -0
  94. data/lib/duodealer_api/resources/price_rule.rb +8 -0
  95. data/lib/duodealer_api/resources/product.rb +35 -0
  96. data/lib/duodealer_api/resources/product_listing.rb +16 -0
  97. data/lib/duodealer_api/resources/product_publication.rb +10 -0
  98. data/lib/duodealer_api/resources/province.rb +5 -0
  99. data/lib/duodealer_api/resources/publication.rb +5 -0
  100. data/lib/duodealer_api/resources/receipt.rb +4 -0
  101. data/lib/duodealer_api/resources/recurring_application_charge.rb +31 -0
  102. data/lib/duodealer_api/resources/redirect.rb +4 -0
  103. data/lib/duodealer_api/resources/refund.rb +14 -0
  104. data/lib/duodealer_api/resources/report.rb +4 -0
  105. data/lib/duodealer_api/resources/resource_feedback.rb +19 -0
  106. data/lib/duodealer_api/resources/rule.rb +4 -0
  107. data/lib/duodealer_api/resources/script_tag.rb +4 -0
  108. data/lib/duodealer_api/resources/shipping_address.rb +4 -0
  109. data/lib/duodealer_api/resources/shipping_line.rb +4 -0
  110. data/lib/duodealer_api/resources/shipping_rate.rb +7 -0
  111. data/lib/duodealer_api/resources/shipping_zone.rb +4 -0
  112. data/lib/duodealer_api/resources/shop.rb +25 -0
  113. data/lib/duodealer_api/resources/smart_collection.rb +19 -0
  114. data/lib/duodealer_api/resources/storefront_access_token.rb +4 -0
  115. data/lib/duodealer_api/resources/tax_line.rb +4 -0
  116. data/lib/duodealer_api/resources/tax_service.rb +4 -0
  117. data/lib/duodealer_api/resources/tender_transaction.rb +6 -0
  118. data/lib/duodealer_api/resources/theme.rb +4 -0
  119. data/lib/duodealer_api/resources/transaction.rb +5 -0
  120. data/lib/duodealer_api/resources/usage_charge.rb +5 -0
  121. data/lib/duodealer_api/resources/user.rb +4 -0
  122. data/lib/duodealer_api/resources/variant.rb +8 -0
  123. data/lib/duodealer_api/resources/webhook.rb +4 -0
  124. data/lib/duodealer_api/session.rb +171 -0
  125. data/lib/duodealer_api/version.rb +3 -0
  126. data/shipit.rubygems.yml +1 -0
  127. data/test/abandoned_checkouts_test.rb +29 -0
  128. data/test/access_scope_test.rb +23 -0
  129. data/test/access_token_test.rb +19 -0
  130. data/test/active_resource/json_errors_test.rb +19 -0
  131. data/test/api_permission_test.rb +9 -0
  132. data/test/api_version_test.rb +157 -0
  133. data/test/application_charge_test.rb +79 -0
  134. data/test/application_credit_test.rb +35 -0
  135. data/test/article_test.rb +73 -0
  136. data/test/asset_test.rb +18 -0
  137. data/test/assigned_fulfillment_order_test.rb +77 -0
  138. data/test/base_test.rb +198 -0
  139. data/test/blog_test.rb +8 -0
  140. data/test/carrier_service_test.rb +17 -0
  141. data/test/cart_test.rb +13 -0
  142. data/test/checkouts_test.rb +77 -0
  143. data/test/collect_test.rb +9 -0
  144. data/test/collection_listing_test.rb +79 -0
  145. data/test/collection_publication_test.rb +40 -0
  146. data/test/collection_test.rb +49 -0
  147. data/test/countable_test.rb +13 -0
  148. data/test/currency_test.rb +21 -0
  149. data/test/custom_collection_test.rb +9 -0
  150. data/test/customer_saved_search_test.rb +27 -0
  151. data/test/customer_test.rb +50 -0
  152. data/test/detailed_log_subscriber_test.rb +139 -0
  153. data/test/discount_code_test.rb +53 -0
  154. data/test/draft_order_test.rb +151 -0
  155. data/test/fixtures/abandoned_checkout.json +184 -0
  156. data/test/fixtures/abandoned_checkouts.json +186 -0
  157. data/test/fixtures/access_scopes.json +10 -0
  158. data/test/fixtures/access_token_delegate.json +4 -0
  159. data/test/fixtures/api_versions.json +38 -0
  160. data/test/fixtures/apis.json +42 -0
  161. data/test/fixtures/application_charge.json +16 -0
  162. data/test/fixtures/application_charges.json +57 -0
  163. data/test/fixtures/application_credit.json +12 -0
  164. data/test/fixtures/application_credits.json +24 -0
  165. data/test/fixtures/article.json +15 -0
  166. data/test/fixtures/articles.json +39 -0
  167. data/test/fixtures/asset.json +9 -0
  168. data/test/fixtures/assets.json +136 -0
  169. data/test/fixtures/assigned_fulfillment_orders.json +78 -0
  170. data/test/fixtures/authors.json +1 -0
  171. data/test/fixtures/blog.json +13 -0
  172. data/test/fixtures/blogs.json +13 -0
  173. data/test/fixtures/carrier_service.json +9 -0
  174. data/test/fixtures/carts.json +43 -0
  175. data/test/fixtures/checkout.json +160 -0
  176. data/test/fixtures/checkouts.json +162 -0
  177. data/test/fixtures/collect.json +12 -0
  178. data/test/fixtures/collection.json +17 -0
  179. data/test/fixtures/collection_listing.json +11 -0
  180. data/test/fixtures/collection_listing_product_ids.json +1 -0
  181. data/test/fixtures/collection_listing_product_ids2.json +1 -0
  182. data/test/fixtures/collection_listings.json +13 -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/custom_collection.json +17 -0
  188. data/test/fixtures/customer_invite.json +9 -0
  189. data/test/fixtures/customer_saved_search.json +9 -0
  190. data/test/fixtures/customer_saved_search_customers.json +60 -0
  191. data/test/fixtures/customers.json +59 -0
  192. data/test/fixtures/customers_account_activation_url.json +3 -0
  193. data/test/fixtures/customers_search.json +60 -0
  194. data/test/fixtures/discount_code.json +10 -0
  195. data/test/fixtures/discount_codes.json +12 -0
  196. data/test/fixtures/draft_order.json +159 -0
  197. data/test/fixtures/draft_order_completed.json +159 -0
  198. data/test/fixtures/draft_order_invoice.json +9 -0
  199. data/test/fixtures/draft_orders.json +161 -0
  200. data/test/fixtures/engagement.json +15 -0
  201. data/test/fixtures/events.json +31 -0
  202. data/test/fixtures/fulfillment.json +49 -0
  203. data/test/fixtures/fulfillment_event.json +12 -0
  204. data/test/fixtures/fulfillment_order.json +38 -0
  205. data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
  206. data/test/fixtures/fulfillment_orders.json +78 -0
  207. data/test/fixtures/fulfillment_request.json +28 -0
  208. data/test/fixtures/fulfillment_service.json +10 -0
  209. data/test/fixtures/fulfillments.json +53 -0
  210. data/test/fixtures/gift_card.json +20 -0
  211. data/test/fixtures/gift_card_disabled.json +20 -0
  212. data/test/fixtures/graphql/2019-10.json +1083 -0
  213. data/test/fixtures/graphql/dummy_schema.rb +16 -0
  214. data/test/fixtures/graphql/unstable.json +1083 -0
  215. data/test/fixtures/image.json +10 -0
  216. data/test/fixtures/images.json +20 -0
  217. data/test/fixtures/inventory_level.json +7 -0
  218. data/test/fixtures/inventory_levels.json +24 -0
  219. data/test/fixtures/marketing_event.json +28 -0
  220. data/test/fixtures/marketing_events.json +54 -0
  221. data/test/fixtures/metafield.json +12 -0
  222. data/test/fixtures/metafields.json +34 -0
  223. data/test/fixtures/order.json +297 -0
  224. data/test/fixtures/order_risk.json +14 -0
  225. data/test/fixtures/order_risks.json +28 -0
  226. data/test/fixtures/order_with_properties.json +373 -0
  227. data/test/fixtures/orders.json +299 -0
  228. data/test/fixtures/payment.json +7 -0
  229. data/test/fixtures/payments.json +9 -0
  230. data/test/fixtures/ping/conversation.json +1 -0
  231. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  232. data/test/fixtures/ping/message.json +1 -0
  233. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  234. data/test/fixtures/policies.json +8 -0
  235. data/test/fixtures/price_rule.json +27 -0
  236. data/test/fixtures/price_rules.json +28 -0
  237. data/test/fixtures/product.json +116 -0
  238. data/test/fixtures/product_listing.json +86 -0
  239. data/test/fixtures/product_listing_product_ids.json +1 -0
  240. data/test/fixtures/product_listing_product_ids2.json +1 -0
  241. data/test/fixtures/product_listings.json +174 -0
  242. data/test/fixtures/product_publication.json +11 -0
  243. data/test/fixtures/product_publications.json +13 -0
  244. data/test/fixtures/publications.json +9 -0
  245. data/test/fixtures/recurring_application_charge.json +22 -0
  246. data/test/fixtures/recurring_application_charge_adjustment.json +5 -0
  247. data/test/fixtures/recurring_application_charges.json +106 -0
  248. data/test/fixtures/redirect.json +7 -0
  249. data/test/fixtures/refund.json +112 -0
  250. data/test/fixtures/report.json +9 -0
  251. data/test/fixtures/reports.json +11 -0
  252. data/test/fixtures/script_tag.json +10 -0
  253. data/test/fixtures/script_tags.json +18 -0
  254. data/test/fixtures/shipping_rates.json +12 -0
  255. data/test/fixtures/shipping_zones.json +315 -0
  256. data/test/fixtures/shop.json +26 -0
  257. data/test/fixtures/smart_collection.json +21 -0
  258. data/test/fixtures/smart_collection_products.json +155 -0
  259. data/test/fixtures/storefront_access_token.json +9 -0
  260. data/test/fixtures/storefront_access_tokens.json +18 -0
  261. data/test/fixtures/tags.json +1 -0
  262. data/test/fixtures/tax_service.json +9 -0
  263. data/test/fixtures/tender_transactions.json +52 -0
  264. data/test/fixtures/transaction.json +29 -0
  265. data/test/fixtures/usage_charge.json +11 -0
  266. data/test/fixtures/usage_charges.json +23 -0
  267. data/test/fixtures/user.json +21 -0
  268. data/test/fixtures/users.json +42 -0
  269. data/test/fixtures/variant.json +23 -0
  270. data/test/fixtures/variants.json +88 -0
  271. data/test/fixtures/webhook.json +10 -0
  272. data/test/fixtures/webhooks.json +18 -0
  273. data/test/fulfillment_event_test.rb +69 -0
  274. data/test/fulfillment_order_test.rb +462 -0
  275. data/test/fulfillment_order_test_helper.rb +7 -0
  276. data/test/fulfillment_request_test.rb +33 -0
  277. data/test/fulfillment_service_test.rb +17 -0
  278. data/test/fulfillment_test.rb +224 -0
  279. data/test/fulfillment_v2_test.rb +62 -0
  280. data/test/gift_card_test.rb +22 -0
  281. data/test/graphql/http_client_test.rb +26 -0
  282. data/test/graphql_test.rb +147 -0
  283. data/test/image_test.rb +39 -0
  284. data/test/inventory_level_test.rb +59 -0
  285. data/test/lib/webmock_extensions/last_request.rb +16 -0
  286. data/test/limits_test.rb +38 -0
  287. data/test/location_test.rb +14 -0
  288. data/test/marketing_event_test.rb +68 -0
  289. data/test/message_enricher_test.rb +45 -0
  290. data/test/meta_test.rb +49 -0
  291. data/test/metafield_test.rb +46 -0
  292. data/test/order_risk_test.rb +46 -0
  293. data/test/order_test.rb +125 -0
  294. data/test/pagination_test.rb +257 -0
  295. data/test/payment_test.rb +19 -0
  296. data/test/policy_test.rb +19 -0
  297. data/test/price_rule_test.rb +65 -0
  298. data/test/product_listing_test.rb +97 -0
  299. data/test/product_publication_test.rb +40 -0
  300. data/test/product_test.rb +60 -0
  301. data/test/publication_test.rb +12 -0
  302. data/test/recurring_application_charge_test.rb +142 -0
  303. data/test/redirect_test.rb +9 -0
  304. data/test/refund_test.rb +32 -0
  305. data/test/report_test.rb +35 -0
  306. data/test/resource_feedback_test.rb +42 -0
  307. data/test/script_tag_test.rb +30 -0
  308. data/test/session_test.rb +366 -0
  309. data/test/shipping_rate_test.rb +17 -0
  310. data/test/shipping_zone_test.rb +10 -0
  311. data/test/shop_test.rb +68 -0
  312. data/test/smart_collection_test.rb +35 -0
  313. data/test/storefront_access_token_test.rb +32 -0
  314. data/test/tax_service_test.rb +9 -0
  315. data/test/tender_transaction_test.rb +18 -0
  316. data/test/test_helper.rb +124 -0
  317. data/test/transaction_test.rb +17 -0
  318. data/test/usage_charge_test.rb +21 -0
  319. data/test/user_test.rb +17 -0
  320. data/test/variant_test.rb +46 -0
  321. data/test/webhook_test.rb +21 -0
  322. metadata +541 -0
@@ -0,0 +1,7 @@
1
+ module FulfillmentOrderTestHelper
2
+ def url_prefix_for_activated_session_for(version)
3
+ available_version = DuodealerAPI::Session.new(domain: 'shop2.duodealer.com', token: 'token2', api_version: version)
4
+ DuodealerAPI::Base.activate_session(available_version)
5
+ "https://shop2.duodealer.com/admin/api/#{version}"
6
+ end
7
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+
3
+ class FulFillmentRequestTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ fake "orders/450789469/fulfillment_requests/695890229", method: :get, body: load_fixture('fulfillment_request')
7
+ end
8
+
9
+ context "#mark_as_failed" do
10
+ should "be able to mark_as_failed a fulfillment request" do
11
+ fulfillment_request = DuodealerAPI::FulfillmentRequest.find(695890229, params: { order_id: 450789469 })
12
+
13
+ cancelled = ActiveSupport::JSON.decode(load_fixture('fulfillment_request'))
14
+ cancelled['failure_message'] = 'failure reason'
15
+ cancelled['message'] = nil
16
+ fake "orders/450789469/fulfillment_requests/695890229/mark_as_failed",
17
+ method: :put,
18
+ body: ActiveSupport::JSON.encode(cancelled)
19
+
20
+ assert fulfillment_request.failure_message.blank?
21
+ assert fulfillment_request.mark_as_failed
22
+ assert_equal 'failure reason', fulfillment_request.failure_message
23
+ end
24
+ end
25
+
26
+ context "#find" do
27
+ should "be able to find fulfillment request" do
28
+ fulfillment_request = DuodealerAPI::FulfillmentRequest.find(695890229, params: { order_id: 450789469 })
29
+ assert_equal 695890229, fulfillment_request.id
30
+ assert_equal 450789469, fulfillment_request.order_id
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ class FulFillmentServiceTest < Test::Unit::TestCase
4
+ test 'new should create fulfillment service' do
5
+ fake "fulfillment_services", :method => :post, :body => load_fixture('fulfillment_service')
6
+ fulfillment_service = DuodealerAPI::FulfillmentService.new(:name => "SomeService")
7
+ fulfillment_service.save
8
+ assert_equal "SomeService" , fulfillment_service.name
9
+ end
10
+
11
+ test 'find should return the fulfillment service' do
12
+ fake "fulfillment_services/123456", :method => :get, :body => load_fixture('fulfillment_service')
13
+ fulfillment_service = DuodealerAPI::FulfillmentService.find(123456)
14
+ assert_equal 123456 , fulfillment_service.id
15
+ assert_equal "SomeService", fulfillment_service.name
16
+ end
17
+ end
@@ -0,0 +1,224 @@
1
+ require 'test_helper'
2
+ require 'fulfillment_order_test_helper'
3
+
4
+ class FulFillmentTest < Test::Unit::TestCase
5
+ include FulfillmentOrderTestHelper
6
+
7
+ def setup
8
+ super
9
+ fake "orders/450789469/fulfillments/255858046", :method => :get, :body => load_fixture('fulfillment')
10
+ end
11
+
12
+ context "Fulfillment" do
13
+ context "#complete" do
14
+ should "be able to complete fulfillment" do
15
+ fulfillment = DuodealerAPI::Fulfillment.find(255858046, :params => {:order_id => 450789469})
16
+
17
+ success = ActiveSupport::JSON.decode(load_fixture('fulfillment'))
18
+ success['fulfillment']['status'] = 'success'
19
+ fake "orders/450789469/fulfillments/255858046/complete", :method => :post, :body => ActiveSupport::JSON.encode(success)
20
+
21
+ assert_equal 'pending', fulfillment.status
22
+ assert fulfillment.complete
23
+ assert_equal 'success', fulfillment.status
24
+ end
25
+ end
26
+
27
+ context "#cancel" do
28
+ should "be able to cancel fulfillment" do
29
+ fulfillment = DuodealerAPI::Fulfillment.find(255858046, :params => {:order_id => 450789469})
30
+
31
+ cancelled = ActiveSupport::JSON.decode(load_fixture('fulfillment'))
32
+ cancelled['fulfillment']['status'] = 'cancelled'
33
+ fake "orders/450789469/fulfillments/255858046/cancel", :method => :post, :body => ActiveSupport::JSON.encode(cancelled)
34
+
35
+ assert_equal 'pending', fulfillment.status
36
+ assert fulfillment.cancel
37
+ assert_equal 'cancelled', fulfillment.status
38
+ end
39
+ end
40
+
41
+ context "#open" do
42
+ should "be able to open a fulfillment" do
43
+ fulfillment = DuodealerAPI::Fulfillment.find(255858046, :params => {:order_id => 450789469})
44
+
45
+ open_fulfillment = ActiveSupport::JSON.decode(load_fixture('fulfillment'))
46
+ open_fulfillment['fulfillment']['status'] = 'open'
47
+ fake "orders/450789469/fulfillments/255858046/open", :method => :post, :body => ActiveSupport::JSON.encode(open_fulfillment)
48
+
49
+ assert_equal 'pending', fulfillment.status
50
+ assert fulfillment.open
51
+ assert_equal 'open', fulfillment.status
52
+ end
53
+ end
54
+
55
+ context "#find" do
56
+ should "be able to find fulfillment" do
57
+ fulfillment = DuodealerAPI::Fulfillment.find(255858046, :params => {:order_id => 450789469})
58
+ assert_equal 255858046, fulfillment.id
59
+ assert_equal 450789469, fulfillment.order_id
60
+ end
61
+ end
62
+
63
+ context "#create" do
64
+ should "create a fulfillment with line_items_by_fulfillment_order" do
65
+ create_fulfillment_attributes = {
66
+ message: "The message for this FO fulfillment",
67
+ notify_customer: true,
68
+ tracking_info: {
69
+ number: "XSDFHYR23475",
70
+ url: "https://tracking.example.com/XSDFHYR23475",
71
+ company: "TFTC - the fulfillment/tracking company"
72
+ },
73
+ line_items_by_fulfillment_order: [
74
+ {
75
+ fulfillment_order_id: 3,
76
+ fulfillment_order_line_items: [{ id: 2, quantity: 1 }]
77
+ }
78
+ ]
79
+ }
80
+ request_body = { fulfillment: create_fulfillment_attributes }
81
+ response_body = { fulfillment: create_fulfillment_attributes.merge(id: 346743624) }
82
+ url_prefix = url_prefix_for_activated_session_for('2020-01')
83
+ fake 'fulfillments',
84
+ url: "#{url_prefix}/fulfillments.json",
85
+ :method => :post,
86
+ request_body: ActiveSupport::JSON.encode(request_body),
87
+ body: ActiveSupport::JSON.encode(response_body)
88
+
89
+ fulfillment = DuodealerAPI::Fulfillment.create(create_fulfillment_attributes)
90
+ assert fulfillment.is_a?(DuodealerAPI::Fulfillment)
91
+ assert fulfillment.persisted?
92
+ assert_equal 346743624, fulfillment.id
93
+ end
94
+
95
+ should "raise NotImplementedError when api_version is older than 2020-01" do
96
+ create_fulfillment_attributes = {
97
+ message: "The message for this FO fulfillment",
98
+ notify_customer: true,
99
+ tracking_info: {
100
+ number: "XSDFHYR23475",
101
+ url: "https://tracking.example.com/XSDFHYR23475",
102
+ company: "TFTC - the fulfillment/tracking company"
103
+ },
104
+ line_items_by_fulfillment_order: [
105
+ {
106
+ fulfillment_order_id: 3,
107
+ fulfillment_order_line_items: [{ id: 2, quantity: 1 }]
108
+ }
109
+ ]
110
+ }
111
+ request_body = { fulfillment: create_fulfillment_attributes }
112
+ response_body = { fulfillment: create_fulfillment_attributes.merge(id: 346743624) }
113
+ url_prefix = url_prefix_for_activated_session_for('2019-10')
114
+ fake 'fulfillments',
115
+ url: "#{url_prefix}/fulfillments.json",
116
+ :method => :post,
117
+ request_body: ActiveSupport::JSON.encode(request_body),
118
+ body: ActiveSupport::JSON.encode(response_body)
119
+
120
+ assert_raises NotImplementedError do
121
+ DuodealerAPI::Fulfillment.create(create_fulfillment_attributes)
122
+ end
123
+ end
124
+ end
125
+
126
+ context "#save" do
127
+ should "save a fulfillment with line_items_by_fulfillment_order" do
128
+ create_fulfillment_attributes = {
129
+ message: "The message for this FO fulfillment",
130
+ notify_customer: true,
131
+ tracking_info: {
132
+ number: "XSDFHYR23475",
133
+ url: "https://tracking.example.com/XSDFHYR23475",
134
+ company: "TFTC - the fulfillment/tracking company"
135
+ },
136
+ line_items_by_fulfillment_order: [
137
+ {
138
+ fulfillment_order_id: 3,
139
+ fulfillment_order_line_items: [{ id: 2, quantity: 1 }]
140
+ }
141
+ ]
142
+ }
143
+ request_body = { fulfillment: create_fulfillment_attributes }
144
+ response_body = { fulfillment: create_fulfillment_attributes.merge(id: 346743624) }
145
+ url_prefix = url_prefix_for_activated_session_for('2020-01')
146
+ fake 'fulfillments',
147
+ url: "#{url_prefix}/fulfillments.json",
148
+ :method => :post,
149
+ request_body: ActiveSupport::JSON.encode(request_body),
150
+ body: ActiveSupport::JSON.encode(response_body)
151
+
152
+ fulfillment = DuodealerAPI::Fulfillment.new(create_fulfillment_attributes)
153
+ assert fulfillment.save
154
+ assert fulfillment.is_a?(DuodealerAPI::Fulfillment)
155
+ assert fulfillment.persisted?
156
+ assert_equal 346743624, fulfillment.id
157
+ end
158
+
159
+ should "save a fulfillment without line_items_by_fulfillment_order" do
160
+ order_id = 8
161
+ create_fulfillment_attributes = {
162
+ message: "The message for this FO fulfillment",
163
+ notify_customer: true,
164
+ tracking_info: {
165
+ number: "XSDFHYR23475",
166
+ url: "https://tracking.example.com/XSDFHYR23475",
167
+ company: "TFTC - the fulfillment/tracking company"
168
+ }
169
+ }
170
+ request_body = { fulfillment: create_fulfillment_attributes }
171
+ response_body = { fulfillment: create_fulfillment_attributes.merge(id: 346743624) }
172
+ fake "orders/#{order_id}/fulfillments", :method => :post,
173
+ request_body: ActiveSupport::JSON.encode(request_body),
174
+ body: ActiveSupport::JSON.encode(response_body)
175
+
176
+ fulfillment = DuodealerAPI::Fulfillment.new(create_fulfillment_attributes)
177
+ fulfillment.prefix_options[:order_id] = order_id
178
+
179
+ assert fulfillment.save
180
+ assert fulfillment.is_a?(DuodealerAPI::Fulfillment)
181
+ assert fulfillment.persisted?
182
+ assert_equal 346743624, fulfillment.id
183
+ end
184
+ end
185
+
186
+ context "#update_tracking" do
187
+ should "be able to update tracking info for a fulfillment" do
188
+ tracking_info = {
189
+ number: 'JSDHFHAG',
190
+ url: 'https://example.com/fulfillment_tracking/JSDHFHAG',
191
+ company: 'ACME co',
192
+ }
193
+ fake_fulfillment = ActiveSupport::JSON.decode(load_fixture('fulfillment'))['fulfillment']
194
+ fake_fulfillment['tracking_number'] = tracking_info[:number]
195
+ fake_fulfillment['tracking_numbers'] = [tracking_info[:number]]
196
+ fake_fulfillment['tracking_url'] = tracking_info[:url]
197
+ fake_fulfillment['tracking_urls'] = [tracking_info[:url]]
198
+ fake_fulfillment['tracking_company'] = tracking_info[:company]
199
+
200
+ request_body = {
201
+ fulfillment: {
202
+ tracking_info: tracking_info,
203
+ notify_customer: true
204
+ }
205
+ }
206
+ url_prefix = url_prefix_for_activated_session_for('2020-01')
207
+ fake 'fulfillments',
208
+ url: "#{url_prefix}/fulfillments/#{fake_fulfillment['id']}/update_tracking.json",
209
+ method: :post,
210
+ request_body: ActiveSupport::JSON.encode(request_body),
211
+ body: ActiveSupport::JSON.encode(fulfillment: fake_fulfillment)
212
+
213
+ fulfillment = DuodealerAPI::Fulfillment.new(id: fake_fulfillment['id'])
214
+ assert fulfillment.update_tracking(tracking_info: tracking_info, notify_customer: true)
215
+
216
+ assert_equal tracking_info[:number], fulfillment.tracking_number
217
+ assert_equal [tracking_info[:number]], fulfillment.tracking_numbers
218
+ assert_equal tracking_info[:url], fulfillment.tracking_url
219
+ assert_equal [tracking_info[:url]], fulfillment.tracking_urls
220
+ assert_equal tracking_info[:company], fulfillment.tracking_company
221
+ end
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,62 @@
1
+ require 'test_helper'
2
+ require 'fulfillment_order_test_helper'
3
+
4
+ class FulfillmentV2Test < Test::Unit::TestCase
5
+ include FulfillmentOrderTestHelper
6
+
7
+ def setup
8
+ super
9
+ @tracking_info = {
10
+ number: 'JSDHFHAG',
11
+ url: 'https://example.com/fulfillment_tracking/JSDHFHAG',
12
+ company: 'ACME co',
13
+ }
14
+ @fake_fulfillment = ActiveSupport::JSON.decode(load_fixture('fulfillment'))['fulfillment']
15
+ @fake_fulfillment['tracking_number'] = @tracking_info[:number]
16
+ @fake_fulfillment['tracking_numbers'] = [@tracking_info[:number]]
17
+ @fake_fulfillment['tracking_url'] = @tracking_info[:url]
18
+ @fake_fulfillment['tracking_urls'] = [@tracking_info[:url]]
19
+ @fake_fulfillment['tracking_company'] = @tracking_info[:company]
20
+
21
+ @request_body = {
22
+ fulfillment: {
23
+ tracking_info: @tracking_info,
24
+ notify_customer: true
25
+ }
26
+ }
27
+ @url_prefix = url_prefix_for_activated_session_for('2020-01')
28
+ fake 'fulfillments',
29
+ url: "#{@url_prefix}/fulfillments/#{@fake_fulfillment['id']}/update_tracking.json",
30
+ method: :post,
31
+ request_body: ActiveSupport::JSON.encode(@request_body),
32
+ body: ActiveSupport::JSON.encode(fulfillment: @fake_fulfillment)
33
+ end
34
+
35
+ context "FulfillmentV2" do
36
+ context "#update_tracking" do
37
+ should "be able to update tracking info for a fulfillment" do
38
+ fulfillment = DuodealerAPI::FulfillmentV2.new(id: @fake_fulfillment['id'])
39
+ assert fulfillment.update_tracking(tracking_info: @tracking_info, notify_customer: true)
40
+
41
+ assert_equal @tracking_info[:number], fulfillment.tracking_number
42
+ assert_equal [@tracking_info[:number]], fulfillment.tracking_numbers
43
+ assert_equal @tracking_info[:url], fulfillment.tracking_url
44
+ assert_equal [@tracking_info[:url]], fulfillment.tracking_urls
45
+ assert_equal @tracking_info[:company], fulfillment.tracking_company
46
+ end
47
+
48
+ should "raise NotImplementedError when api_version is older than 2020-01" do
49
+ @url_prefix = url_prefix_for_activated_session_for('2019-10')
50
+ fake 'fulfillments',
51
+ url: "#{@url_prefix}/fulfillments/#{@fake_fulfillment['id']}/update_tracking.json",
52
+ method: :post,
53
+ request_body: ActiveSupport::JSON.encode(@request_body),
54
+ body: ActiveSupport::JSON.encode(fulfillment: @fake_fulfillment)
55
+
56
+ assert_raises NotImplementedError do
57
+ DuodealerAPI::FulfillmentV2.new(id: @fake_fulfillment['id'])
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+
3
+ class GiftCardTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ load_gift_card
7
+ end
8
+
9
+ def test_disable
10
+ fake 'gift_cards/1023670/disable.json', :body => load_fixture('gift_card_disabled'), :method => :post, :extension => false
11
+
12
+ refute @gift_card.disabled_at
13
+ @gift_card.disable
14
+ assert @gift_card.disabled_at
15
+ end
16
+
17
+ private
18
+ def load_gift_card
19
+ fake 'gift_cards/1023670', :body => load_fixture('gift_card')
20
+ @gift_card = DuodealerAPI::GiftCard.find(1023670)
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module GraphQL
5
+ class HTTPClientTest < Test::Unit::TestCase
6
+ test '#headers uses the Base headers' do
7
+ DuodealerAPI::Base.headers['X-Custom'] = 'abc'
8
+
9
+ client = DuodealerAPI::GraphQL::HTTPClient.new('2019-07')
10
+
11
+ assert_equal 'abc', client.headers({})['X-Custom']
12
+
13
+ DuodealerAPI::Base.headers.delete('X-Custom')
14
+ end
15
+
16
+ test '#uri uses the Base site and the API version' do
17
+ DuodealerAPI::Base.site = 'https://foo:bar@www.zombo.com'
18
+ api_version = DuodealerAPI::ApiVersion.new(handle: '2019-07')
19
+
20
+ client = DuodealerAPI::GraphQL::HTTPClient.new(api_version)
21
+ expected_uri = URI('https://foo:bar@www.zombo.com/admin/api/2019-07/graphql.json')
22
+
23
+ assert_equal expected_uri, client.uri
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+ require_relative 'fixtures/graphql/dummy_schema'
4
+
5
+ class GraphQLTest < Test::Unit::TestCase
6
+ def setup
7
+ DuodealerAPI::ApiVersion.version_lookup_mode = :define_on_unknown
8
+ @fixture_location = Pathname('test/fixtures/graphql')
9
+ @site = 'https://this-is-my-test-shop.duodealer.com'
10
+ DuodealerAPI::Base.site = @site
11
+ end
12
+
13
+ def teardown
14
+ DuodealerAPI::GraphQL.clear_clients
15
+ end
16
+
17
+ test '#initialize_clients creates a GraphQL::Client from local schema file' do
18
+ version_fixtures('unstable') do |dir|
19
+ DuodealerAPI::GraphQL.initialize_clients
20
+
21
+ assert DuodealerAPI::GraphQL.client('unstable')
22
+ end
23
+ end
24
+
25
+ test '#initialize_clients handles multiple schema files' do
26
+ version_fixtures('unstable', '2019-10') do |dir|
27
+ DuodealerAPI::GraphQL.initialize_clients
28
+
29
+ assert DuodealerAPI::GraphQL.client('unstable')
30
+ assert DuodealerAPI::GraphQL.client('2019-10')
31
+ end
32
+ end
33
+
34
+ test '#initialize_clients ignores non JSON schema files' do
35
+ version_fixtures('unstable', '2019-10') do |dir|
36
+ FileUtils.touch(DuodealerAPI::GraphQL.schema_location.join('nope.txt'))
37
+
38
+ DuodealerAPI::GraphQL.initialize_clients
39
+
40
+ assert DuodealerAPI::GraphQL.client('unstable')
41
+ assert DuodealerAPI::GraphQL.client('2019-10')
42
+ end
43
+ end
44
+
45
+ test '#initialize_clients raises if a JSON schema file is not named after a version' do
46
+ version_fixtures do |dir|
47
+ DuodealerAPI::GraphQL.schema_location = dir
48
+ FileUtils.touch(DuodealerAPI::GraphQL.schema_location.join('nope.json'))
49
+
50
+ assert_raises DuodealerAPI::GraphQL::InvalidSchema do
51
+ DuodealerAPI::GraphQL.initialize_clients
52
+ end
53
+ end
54
+ end
55
+
56
+ test '#client returns default schema if only one exists' do
57
+ version_fixtures('unstable') do |dir|
58
+ DuodealerAPI::Base.api_version = 'unstable'
59
+
60
+ DuodealerAPI::GraphQL.initialize_clients
61
+
62
+ assert_instance_of ::GraphQL::Client, DuodealerAPI::GraphQL.client
63
+ end
64
+ end
65
+
66
+ test '#client accepts optional api_version parameter' do
67
+ version_fixtures('unstable') do |dir|
68
+ DuodealerAPI::Base.api_version = 'unstable'
69
+
70
+ DuodealerAPI::GraphQL.initialize_clients
71
+
72
+ assert_instance_of ::GraphQL::Client, DuodealerAPI::GraphQL.client('unstable')
73
+ end
74
+ end
75
+
76
+ test '#client executes queries on specified API version' do
77
+ version_fixtures('unstable', '2019-10') do |dir|
78
+ DuodealerAPI::Base.api_version = 'unstable'
79
+
80
+ DuodealerAPI::GraphQL.initialize_clients
81
+ DuodealerAPI::Base.site = 'https://this-is-my-test-shop.duodealer.com'
82
+
83
+ client = DuodealerAPI::GraphQL.client('2019-10')
84
+
85
+ assert_instance_of ::GraphQL::Client, client
86
+
87
+ query = client.parse <<~GRAPHQL
88
+ {
89
+ product {
90
+ name
91
+ }
92
+ }
93
+ GRAPHQL
94
+
95
+ path = DuodealerAPI::ApiVersion.new('2019-10').construct_graphql_path
96
+ stub_request(:post, "#{@site}#{path}").to_return(body: { product: { name: 'Shirt' } }.to_json)
97
+
98
+ client.query(query)
99
+ end
100
+ end
101
+
102
+ test '#client raises exception for version that does not exist' do
103
+ version_fixtures('unstable') do |dir|
104
+ DuodealerAPI::Base.api_version = '2019-10'
105
+
106
+ DuodealerAPI::GraphQL.initialize_clients
107
+
108
+ assert_raises DuodealerAPI::GraphQL::InvalidClient do
109
+ DuodealerAPI::GraphQL.client('2019-10')
110
+ end
111
+ end
112
+ end
113
+
114
+ test '#client lazily initializes clients' do
115
+ version_fixtures('unstable') do |dir|
116
+ DuodealerAPI::Base.api_version = 'unstable'
117
+
118
+ assert_raises DuodealerAPI::GraphQL::InvalidClient do
119
+ DuodealerAPI::GraphQL.client('2019-10')
120
+ end
121
+ end
122
+ end
123
+
124
+ test '#client caches lookups' do
125
+ version_fixtures('unstable') do |dir|
126
+ DuodealerAPI::Base.api_version = 'unstable'
127
+
128
+ client1 = DuodealerAPI::GraphQL.client
129
+ client2 = DuodealerAPI::GraphQL.client('unstable')
130
+
131
+ assert_equal client1, client2
132
+ end
133
+ end
134
+
135
+ private
136
+
137
+ def version_fixtures(*versions)
138
+ Dir.mktmpdir do |dir|
139
+ versions.each do |version|
140
+ FileUtils.cp(@fixture_location.join("#{version}.json"), dir)
141
+ end
142
+
143
+ DuodealerAPI::GraphQL.schema_location = dir
144
+ yield(dir)
145
+ end
146
+ end
147
+ end