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,257 @@
1
+ require 'test_helper'
2
+
3
+ class PaginationTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+
7
+ @version = DuodealerAPI::ApiVersion.find_version('2019-10')
8
+ DuodealerAPI::Base.api_version = @version.to_s
9
+ @next_page_info = "eyJkaXJlY3Rpb24iOiJuZXh0IiwibGFzdF9pZCI6NDQwMDg5NDIzLCJsYXN0X3ZhbHVlIjoiNDQwMDg5NDIzIn0%3D"
10
+ @previous_page_info = "eyJsYXN0X2lkIjoxMDg4MjgzMDksImxhc3RfdmFsdWUiOiIxMDg4MjgzMDkiLCJkaXJlY3Rpb24iOiJuZXh0In0%3D"
11
+
12
+ @next_link_header = "<https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?page_info=#{@next_page_info}>; rel=\"next\""
13
+ @previous_link_header = "<https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?page_info=#{@previous_page_info}>; rel=\"previous\""
14
+ end
15
+
16
+ test "navigates using next and previous link headers with no original params" do
17
+ link_header ="#{@previous_link_header}, #{@next_link_header}"
18
+
19
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => link_header
20
+ orders = DuodealerAPI::Order.all
21
+
22
+ fake(
23
+ 'orders',
24
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?page_info=#{@next_page_info}",
25
+ method: :get,
26
+ status: 200,
27
+ body: load_fixture('orders')
28
+ )
29
+ next_page = orders.fetch_next_page
30
+ assert_equal 450789469, next_page.first.id
31
+
32
+ fake(
33
+ 'orders',
34
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?page_info=#{@previous_page_info}",
35
+ method: :get,
36
+ status: 200,
37
+ body: load_fixture('orders').gsub("450789469", "1122334455")
38
+ )
39
+
40
+ previous_page = orders.fetch_previous_page
41
+ assert_equal 1122334455, previous_page.first.id
42
+ end
43
+
44
+ test "uses all passed in querystring parameters" do
45
+ params = "page_info=#{@next_page_info}&limit=50&fields=#{CGI.escape('id,created_at')}"
46
+ @next_link_header = "<https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?#{params}>; rel=\"next\""
47
+ fake(
48
+ 'orders',
49
+ method: :get,
50
+ status: 200,
51
+ api_version: @version,
52
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?fields=id%2Cupdated_at&limit=100",
53
+ body: load_fixture('orders'),
54
+ link: @next_link_header
55
+ )
56
+ orders = DuodealerAPI::Order.where(fields: 'id,updated_at', limit: 100)
57
+
58
+ fake(
59
+ 'orders',
60
+ method: :get,
61
+ status: 200,
62
+ api_version: @version,
63
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?fields=id%2Ccreated_at&limit=50&page_info=#{@next_page_info}",
64
+ body: load_fixture('orders')
65
+ )
66
+ next_page = orders.fetch_next_page
67
+ assert_equal 450789469, next_page.first.id
68
+ end
69
+
70
+ test "returns empty next page if just the previous page is present" do
71
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
72
+ orders = DuodealerAPI::Order.all
73
+
74
+ next_page = orders.fetch_next_page
75
+ assert_empty next_page
76
+ end
77
+
78
+ test "returns an empty previous page if just the next page is present" do
79
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
80
+ orders = DuodealerAPI::Order.all
81
+
82
+ next_page = orders.fetch_previous_page
83
+ assert_empty next_page
84
+ end
85
+
86
+ test "#next_page? returns true if next page is present" do
87
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
88
+ orders = DuodealerAPI::Order.all
89
+
90
+ assert orders.next_page?
91
+ end
92
+
93
+ test "#next_page? returns false if next page is not present" do
94
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
95
+ orders = DuodealerAPI::Order.all
96
+
97
+ refute orders.next_page?
98
+ end
99
+
100
+ test "#next_page_info returns next_page_info if next page is present" do
101
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
102
+ orders = DuodealerAPI::Order.all
103
+
104
+ assert_equal @next_page_info, orders.next_page_info
105
+ end
106
+
107
+ test "#next_page_info returns nil if next page is not present" do
108
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
109
+ orders = DuodealerAPI::Order.all
110
+
111
+ assert_nil orders.next_page_info
112
+ end
113
+
114
+ test "#previous_page? returns true if previous page is present" do
115
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
116
+ orders = DuodealerAPI::Order.all
117
+
118
+ assert orders.previous_page?
119
+ end
120
+
121
+ test "#previous_page? returns false if next page is not present" do
122
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
123
+ orders = DuodealerAPI::Order.all
124
+
125
+ refute orders.previous_page?
126
+ end
127
+
128
+ test "#previous_page_info returns previous_page_info if next page is present" do
129
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
130
+ orders = DuodealerAPI::Order.all
131
+
132
+ assert_equal @previous_page_info, orders.previous_page_info
133
+ end
134
+
135
+ test "#previous_page_info returns nil if next page is not present" do
136
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
137
+ orders = DuodealerAPI::Order.all
138
+
139
+ assert_nil orders.previous_page_info
140
+ end
141
+
142
+ test "pagination handles no link headers" do
143
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders')
144
+ orders = DuodealerAPI::Order.all
145
+
146
+ refute orders.next_page?
147
+ refute orders.previous_page?
148
+ assert_empty orders.fetch_next_page
149
+ assert_empty orders.fetch_previous_page
150
+ end
151
+
152
+ test "raises on invalid pagination links" do
153
+ link_header = "<https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?page_info=#{@next_page_info}>;"
154
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => link_header
155
+
156
+ assert_raises DuodealerAPI::InvalidPaginationLinksError do
157
+ DuodealerAPI::Order.all
158
+ end
159
+ end
160
+
161
+ test "raises on an older API version" do
162
+ version = DuodealerAPI::ApiVersion.find_version('2019-04')
163
+ DuodealerAPI::Base.api_version = version.to_s
164
+
165
+ fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders')
166
+ orders = DuodealerAPI::Order.all
167
+
168
+ assert_raises NotImplementedError do
169
+ orders.fetch_next_page
170
+ end
171
+ end
172
+
173
+ test "raises on 2019-07 API version for models that don't support new pagination yet" do
174
+ version = DuodealerAPI::ApiVersion.find_version('2019-07')
175
+ DuodealerAPI::Base.api_version = version.to_s
176
+
177
+ fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders')
178
+ orders = DuodealerAPI::Order.all
179
+
180
+ assert_raises NotImplementedError do
181
+ orders.fetch_next_page
182
+ end
183
+ end
184
+
185
+ test "new pagination works on 2019-07 API version for select models" do
186
+ version = DuodealerAPI::ApiVersion.find_version('2019-07')
187
+ DuodealerAPI::Base.api_version = version.to_s
188
+
189
+ fake 'events', :method => :get, :status => 200, api_version: version, :body => load_fixture('events')
190
+ events = DuodealerAPI::Event.all
191
+
192
+ assert_empty events.fetch_next_page
193
+ assert_empty events.fetch_previous_page
194
+ end
195
+
196
+ test "does not raise on the unstable version" do
197
+ version = DuodealerAPI::ApiVersion.find_version('unstable')
198
+ DuodealerAPI::Base.api_version = version.to_s
199
+ @next_link_header = "<https://this-is-my-test-shop.duodealer.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}>; rel=\"next\""
200
+
201
+ link_header ="#{@previous_link_header}, #{@next_link_header}"
202
+
203
+ fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders'), :link => link_header
204
+ orders = DuodealerAPI::Order.all
205
+
206
+ fake(
207
+ 'orders',
208
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}",
209
+ method: :get,
210
+ status: 200,
211
+ body: load_fixture('orders')
212
+ )
213
+ assert_nothing_raised do
214
+ next_page = orders.fetch_next_page
215
+ assert_equal 450789469, next_page.first.id
216
+ end
217
+ end
218
+
219
+ test "allows for multiple concurrent API collection objects" do
220
+ first_request_params = "page_info=#{@next_page_info}&limit=5"
221
+ fake(
222
+ 'orders',
223
+ method: :get,
224
+ status: 200,
225
+ api_version: @version,
226
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?limit=5",
227
+ body: load_fixture('orders'),
228
+ link: "<https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?#{first_request_params}>; rel=\"next\""
229
+ )
230
+ orders = DuodealerAPI::Order.where(limit: 5)
231
+
232
+ second_request_params = "page_info=#{@next_page_info}&limit=5"
233
+ fake(
234
+ 'orders',
235
+ method: :get,
236
+ status: 200,
237
+ api_version: @version,
238
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?limit=10",
239
+ body: load_fixture('orders'),
240
+ link: "<https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?#{second_request_params}>; rel=\"next\""
241
+ )
242
+
243
+ orders2 = DuodealerAPI::Order.where(limit: 10)
244
+
245
+ fake(
246
+ 'orders',
247
+ method: :get,
248
+ status: 200,
249
+ api_version: @version,
250
+ url: "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/orders.json?limit=5&page_info=#{@next_page_info}",
251
+ body: load_fixture('orders')
252
+ )
253
+ next_page = orders.fetch_next_page
254
+ assert_equal 450789469, next_page.first.id
255
+ end
256
+
257
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class PaymentTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+
8
+ @checkout_id = JSON.parse(load_fixture('checkout'))['checkout']['token']
9
+ @expected_payment = JSON.parse(load_fixture('payment'))['payment']
10
+ end
11
+
12
+ test ":create creates a new payment" do
13
+ fake "checkouts/#{@checkout_id}/payments", method: :post, status: 201, body: load_fixture('payment')
14
+
15
+ new_payment = DuodealerAPI::Payment.create(checkout_id: @checkout_id)
16
+
17
+ assert_equal @expected_payment['unique_token'], new_payment.attributes['unique_token']
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ class PolicyTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ fake 'shop'
7
+ end
8
+
9
+ def test_getting_the_list_of_policies
10
+ fake 'policies'
11
+
12
+ policies = DuodealerAPI::Policy.all
13
+ assert_equal 1, policies.length
14
+
15
+ policy = policies.first
16
+ assert_equal 'Privacy Policy', policy.title
17
+ assert_equal 'Your privacy is important to us', policy.body
18
+ end
19
+ end
@@ -0,0 +1,65 @@
1
+ require 'test_helper'
2
+
3
+ class PriceRuleTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ fake 'price_rules/102586120', body: load_fixture('price_rule')
7
+
8
+ @price_rule = DuodealerAPI::PriceRule.find(102586120)
9
+ end
10
+
11
+ def test_get_price_rule
12
+ fake 'price_rules/102586120', method: :get, status: 200, body: load_fixture('price_rule')
13
+ price_rule = DuodealerAPI::PriceRule.find(102586120)
14
+
15
+ assert_equal 102586120, price_rule.id
16
+ end
17
+
18
+ def test_get_all_price_rules
19
+ fake 'price_rules', method: :get, status: 200, body: load_fixture('price_rules')
20
+ price_rules = DuodealerAPI::PriceRule.all
21
+
22
+ assert_equal 1, price_rules.length
23
+ assert_equal 102586120, price_rules.first.id
24
+ end
25
+
26
+ def test_get_all_discount_codes_for_a_price_rule
27
+ fake 'price_rules/102586120/discount_codes', method: :get, status: 200, body: load_fixture('discount_codes')
28
+ price_rule = DuodealerAPI::PriceRule.find(102586120)
29
+
30
+ assert_equal "SUMMERSALE10", price_rule.discount_codes.first.code
31
+ end
32
+
33
+ def test_create_price_rule
34
+ fake 'price_rules', method: :post, status: 201, body: load_fixture('price_rule')
35
+
36
+ price_rule = DuodealerAPI::PriceRule.create(
37
+ target_type: "line_item",
38
+ allocation_method: "across",
39
+ value_type: "fixed_amount",
40
+ value: -10.0,
41
+ customer_selection: "all",
42
+ starts_at: "2017-01-19T00:00:00Z"
43
+ )
44
+
45
+ assert_equal '{"price_rule":{"target_type":"line_item","allocation_method":"across","value_type":"fixed_amount","value":-10.0,"customer_selection":"all","starts_at":"2017-01-19T00:00:00Z"}}', WebMock.last_request.body
46
+ assert_equal -10, price_rule.value
47
+ end
48
+
49
+ def test_update_price_rule
50
+ price_rule_response = ActiveSupport::JSON.decode(load_fixture('price_rule'))
51
+ price_rule_response['price_rule']['value'] = -50.0
52
+ @price_rule.value = -50.0
53
+ fake 'price_rules/102586120', method: :put, status: 200, body: ActiveSupport::JSON.encode(price_rule_response)
54
+
55
+ @price_rule.save
56
+
57
+ assert_equal price_rule_response['price_rule']['value'], @price_rule.value
58
+ end
59
+
60
+ def test_delete_price_rule
61
+ fake 'price_rules/102586120', method: :delete, body: 'destroyed'
62
+
63
+ assert @price_rule.destroy
64
+ end
65
+ end
@@ -0,0 +1,97 @@
1
+ require 'test_helper'
2
+
3
+ class ProductListingTest < Test::Unit::TestCase
4
+
5
+ def test_get_product_listings
6
+ fake "product_listings", method: :get, status: 201, body: load_fixture('product_listings')
7
+
8
+ product_listings = DuodealerAPI::ProductListing.find(:all)
9
+ assert_equal 2, product_listings.count
10
+ assert_equal 2, product_listings.first.product_id
11
+ assert_equal 1, product_listings.last.product_id
12
+ assert_equal 'Synergistic Silk Chair', product_listings.first.title
13
+ assert_equal 'Rustic Copper Bottle', product_listings.last.title
14
+ end
15
+
16
+ def test_get_product_listing
17
+ fake "product_listings/2", method: :get, status: 201, body: load_fixture('product_listing')
18
+
19
+ product_listing = DuodealerAPI::ProductListing.find(2)
20
+ assert_equal 'Synergistic Silk Chair', product_listing.title
21
+ end
22
+
23
+ def test_reload_product_listing
24
+ fake "product_listings/2", method: :get, status: 201, body: load_fixture('product_listing')
25
+
26
+ product_listing = DuodealerAPI::ProductListing.new(product_id: 2)
27
+ product_listing.reload
28
+
29
+ assert_equal 'Synergistic Silk Chair', product_listing.title
30
+ end
31
+
32
+ def test_get_product_listing_product_ids
33
+ fake "product_listings/product_ids", method: :get, status: 201, body: load_fixture('product_listing_product_ids')
34
+
35
+ product_ids = DuodealerAPI::ProductListing.product_ids
36
+ assert_equal 2, product_ids.count
37
+ assert_equal 4, product_ids.first
38
+ assert_equal 3, product_ids.last
39
+ end
40
+
41
+ def test_get_product_listing_product_ids_multi_page_with_cursor
42
+ version = DuodealerAPI::ApiVersion.find_version('2019-10')
43
+ DuodealerAPI::Base.api_version = version.to_s
44
+
45
+ url = "https://this-is-my-test-shop.duodealer.com/admin/api/2019-10/product_listings/product_ids.json"
46
+
47
+ next_page_info = "notarealpageinfobutthatsokay"
48
+ next_page_url = "#{url}?page_info=#{next_page_info}"
49
+ link_header = "<#{next_page_url}>; rel=\"next\""
50
+
51
+ fake(
52
+ "product_listings/product_ids",
53
+ method: :get,
54
+ status: 201,
55
+ url: url,
56
+ body: load_fixture('product_listing_product_ids'),
57
+ link: link_header,
58
+ )
59
+
60
+ product_ids = DuodealerAPI::ProductListing.product_ids
61
+ assert_equal [4, 3], product_ids
62
+ assert product_ids.next_page?
63
+
64
+ fake(
65
+ "product_listings/product_ids",
66
+ method: :get,
67
+ status: 201,
68
+ url: next_page_url,
69
+ body: load_fixture('product_listing_product_ids2'),
70
+ link: link_header,
71
+ )
72
+
73
+ next_page = product_ids.fetch_next_page
74
+ assert_equal [2, 1], next_page
75
+ end
76
+
77
+ def test_get_product_listing_product_ids_multi_page_with_cursor_fails_on_older_api_version
78
+ version = DuodealerAPI::ApiVersion.find_version('2019-07')
79
+ DuodealerAPI::Base.api_version = version.to_s
80
+
81
+ url = "https://this-is-my-test-shop.duodealer.com/admin/api/2019-07/product_listings/product_ids.json"
82
+
83
+ fake(
84
+ "product_listings/product_ids",
85
+ method: :get,
86
+ status: 201,
87
+ url: url,
88
+ body: load_fixture('product_listing_product_ids'),
89
+ )
90
+
91
+ product_ids = DuodealerAPI::ProductListing.product_ids
92
+ assert_equal [4, 3], product_ids
93
+ assert_raises NotImplementedError do
94
+ product_ids.next_page?
95
+ end
96
+ end
97
+ end