atkhayar-spree-dev-api 0.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 (270) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +26 -0
  5. data/Rakefile +29 -0
  6. data/app/controllers/concerns/spree/api/v2/caching.rb +37 -0
  7. data/app/controllers/concerns/spree/api/v2/coupon_codes_helper.rb +29 -0
  8. data/app/controllers/concerns/spree/api/v2/number_resource.rb +11 -0
  9. data/app/controllers/concerns/spree/api/v2/platform/nested_set_reposition_concern.rb +37 -0
  10. data/app/controllers/concerns/spree/api/v2/platform/promotion_calculator_params.rb +17 -0
  11. data/app/controllers/concerns/spree/api/v2/platform/promotion_rule_params.rb +16 -0
  12. data/app/controllers/concerns/spree/api/v2/product_list_includes.rb +25 -0
  13. data/app/controllers/concerns/spree/api/v2/storefront/metadata_controller_concern.rb +18 -0
  14. data/app/controllers/concerns/spree/api/v2/storefront/order_concern.rb +52 -0
  15. data/app/controllers/spree/api/v2/base_controller.rb +171 -0
  16. data/app/controllers/spree/api/v2/platform/addresses_controller.rb +19 -0
  17. data/app/controllers/spree/api/v2/platform/adjustments_controller.rb +19 -0
  18. data/app/controllers/spree/api/v2/platform/classifications_controller.rb +22 -0
  19. data/app/controllers/spree/api/v2/platform/cms_pages_controller.rb +19 -0
  20. data/app/controllers/spree/api/v2/platform/cms_sections_controller.rb +29 -0
  21. data/app/controllers/spree/api/v2/platform/countries_controller.rb +19 -0
  22. data/app/controllers/spree/api/v2/platform/digital_links_controller.rb +25 -0
  23. data/app/controllers/spree/api/v2/platform/digitals_controller.rb +19 -0
  24. data/app/controllers/spree/api/v2/platform/firebase_controller.rb +76 -0
  25. data/app/controllers/spree/api/v2/platform/images_controller.rb +20 -0
  26. data/app/controllers/spree/api/v2/platform/line_items_controller.rb +59 -0
  27. data/app/controllers/spree/api/v2/platform/menu_items_controller.rb +21 -0
  28. data/app/controllers/spree/api/v2/platform/menus_controller.rb +19 -0
  29. data/app/controllers/spree/api/v2/platform/option_types_controller.rb +15 -0
  30. data/app/controllers/spree/api/v2/platform/option_values_controller.rb +19 -0
  31. data/app/controllers/spree/api/v2/platform/orders_controller.rb +163 -0
  32. data/app/controllers/spree/api/v2/platform/payment_methods_controller.rb +27 -0
  33. data/app/controllers/spree/api/v2/platform/payments_controller.rb +17 -0
  34. data/app/controllers/spree/api/v2/platform/products_controller.rb +37 -0
  35. data/app/controllers/spree/api/v2/platform/promotion_actions_controller.rb +30 -0
  36. data/app/controllers/spree/api/v2/platform/promotion_categories_controller.rb +19 -0
  37. data/app/controllers/spree/api/v2/platform/promotion_rules_controller.rb +25 -0
  38. data/app/controllers/spree/api/v2/platform/promotions_controller.rb +31 -0
  39. data/app/controllers/spree/api/v2/platform/resource_controller.rb +146 -0
  40. data/app/controllers/spree/api/v2/platform/roles_controller.rb +15 -0
  41. data/app/controllers/spree/api/v2/platform/shipments_controller.rb +143 -0
  42. data/app/controllers/spree/api/v2/platform/shipping_categories_controller.rb +15 -0
  43. data/app/controllers/spree/api/v2/platform/shipping_methods_controller.rb +24 -0
  44. data/app/controllers/spree/api/v2/platform/states_controller.rb +19 -0
  45. data/app/controllers/spree/api/v2/platform/stock_items_controller.rb +19 -0
  46. data/app/controllers/spree/api/v2/platform/stock_locations_controller.rb +19 -0
  47. data/app/controllers/spree/api/v2/platform/store_credit_categories_controller.rb +15 -0
  48. data/app/controllers/spree/api/v2/platform/store_credit_types_controller.rb +15 -0
  49. data/app/controllers/spree/api/v2/platform/store_credits_controller.rb +19 -0
  50. data/app/controllers/spree/api/v2/platform/stores_controller.rb +19 -0
  51. data/app/controllers/spree/api/v2/platform/tax_categories_controller.rb +19 -0
  52. data/app/controllers/spree/api/v2/platform/tax_rates_controller.rb +23 -0
  53. data/app/controllers/spree/api/v2/platform/taxonomies_controller.rb +19 -0
  54. data/app/controllers/spree/api/v2/platform/taxons_controller.rb +55 -0
  55. data/app/controllers/spree/api/v2/platform/users_controller.rb +32 -0
  56. data/app/controllers/spree/api/v2/platform/users_resource_controller.rb +144 -0
  57. data/app/controllers/spree/api/v2/platform/variants_controller.rb +19 -0
  58. data/app/controllers/spree/api/v2/platform/webhooks/events_controller.rb +21 -0
  59. data/app/controllers/spree/api/v2/platform/webhooks/subscribers_controller.rb +21 -0
  60. data/app/controllers/spree/api/v2/platform/wished_items_controller.rb +19 -0
  61. data/app/controllers/spree/api/v2/platform/wishlists_controller.rb +19 -0
  62. data/app/controllers/spree/api/v2/platform/zones_controller.rb +19 -0
  63. data/app/controllers/spree/api/v2/resource_controller.rb +76 -0
  64. data/app/controllers/spree/api/v2/storefront/account/addresses_controller.rb +77 -0
  65. data/app/controllers/spree/api/v2/storefront/account/credit_cards_controller.rb +52 -0
  66. data/app/controllers/spree/api/v2/storefront/account/orders_controller.rb +50 -0
  67. data/app/controllers/spree/api/v2/storefront/account_controller.rb +52 -0
  68. data/app/controllers/spree/api/v2/storefront/cart_controller.rb +245 -0
  69. data/app/controllers/spree/api/v2/storefront/checkout_controller.rb +160 -0
  70. data/app/controllers/spree/api/v2/storefront/cms_pages_controller.rb +41 -0
  71. data/app/controllers/spree/api/v2/storefront/countries_controller.rb +57 -0
  72. data/app/controllers/spree/api/v2/storefront/digitals_controller.rb +58 -0
  73. data/app/controllers/spree/api/v2/storefront/menus_controller.rb +35 -0
  74. data/app/controllers/spree/api/v2/storefront/order_status_controller.rb +34 -0
  75. data/app/controllers/spree/api/v2/storefront/products_controller.rb +61 -0
  76. data/app/controllers/spree/api/v2/storefront/stores_controller.rb +27 -0
  77. data/app/controllers/spree/api/v2/storefront/taxons_controller.rb +50 -0
  78. data/app/controllers/spree/api/v2/storefront/wishlists_controller.rb +171 -0
  79. data/app/helpers/spree/api/v2/collection_options_helpers.rb +46 -0
  80. data/app/helpers/spree/api/v2/display_money_helper.rb +43 -0
  81. data/app/helpers/spree/api/v2/store_media_serializer_images_concern.rb +35 -0
  82. data/app/jobs/spree/webhooks/subscribers/make_request_job.rb +17 -0
  83. data/app/models/concerns/spree/user_api_authentication.rb +19 -0
  84. data/app/models/concerns/spree/user_api_methods.rb +7 -0
  85. data/app/models/concerns/spree/webhooks/has_webhooks.rb +84 -0
  86. data/app/models/spree/api/webhooks/order_decorator.rb +43 -0
  87. data/app/models/spree/api/webhooks/payment_decorator.rb +26 -0
  88. data/app/models/spree/api/webhooks/product_decorator.rb +46 -0
  89. data/app/models/spree/api/webhooks/shipment_decorator.rb +21 -0
  90. data/app/models/spree/api/webhooks/stock_item_decorator.rb +43 -0
  91. data/app/models/spree/api/webhooks/stock_movement_decorator.rb +52 -0
  92. data/app/models/spree/api/webhooks/variant_decorator.rb +26 -0
  93. data/app/models/spree/oauth_access_grant.rb +7 -0
  94. data/app/models/spree/oauth_access_token.rb +7 -0
  95. data/app/models/spree/oauth_application.rb +15 -0
  96. data/app/models/spree/webhooks/base.rb +11 -0
  97. data/app/models/spree/webhooks/event.rb +12 -0
  98. data/app/models/spree/webhooks/subscriber.rb +61 -0
  99. data/app/presenters/spree/api/products/filters_presenter.rb +39 -0
  100. data/app/serializers/concerns/spree/api/v2/image_transformation_concern.rb +15 -0
  101. data/app/serializers/concerns/spree/api/v2/resource_serializer_concern.rb +34 -0
  102. data/app/serializers/concerns/spree/api/v2/taxon_image_transformation_concern.rb +15 -0
  103. data/app/serializers/spree/api/v2/base_serializer.rb +39 -0
  104. data/app/serializers/spree/api/v2/platform/address_serializer.rb +15 -0
  105. data/app/serializers/spree/api/v2/platform/adjustment_serializer.rb +20 -0
  106. data/app/serializers/spree/api/v2/platform/asset_serializer.rb +13 -0
  107. data/app/serializers/spree/api/v2/platform/base_serializer.rb +10 -0
  108. data/app/serializers/spree/api/v2/platform/calculator_serializer.rb +17 -0
  109. data/app/serializers/spree/api/v2/platform/classification_serializer.rb +14 -0
  110. data/app/serializers/spree/api/v2/platform/cms_page_serializer.rb +13 -0
  111. data/app/serializers/spree/api/v2/platform/cms_section_image_one_serializer.rb +9 -0
  112. data/app/serializers/spree/api/v2/platform/cms_section_image_three_serializer.rb +9 -0
  113. data/app/serializers/spree/api/v2/platform/cms_section_image_two_serializer.rb +9 -0
  114. data/app/serializers/spree/api/v2/platform/cms_section_serializer.rb +18 -0
  115. data/app/serializers/spree/api/v2/platform/country_serializer.rb +13 -0
  116. data/app/serializers/spree/api/v2/platform/credit_card_serializer.rb +14 -0
  117. data/app/serializers/spree/api/v2/platform/customer_return_serializer.rb +17 -0
  118. data/app/serializers/spree/api/v2/platform/digital_link_serializer.rb +16 -0
  119. data/app/serializers/spree/api/v2/platform/digital_serializer.rb +30 -0
  120. data/app/serializers/spree/api/v2/platform/feature_page_serializer.rb +11 -0
  121. data/app/serializers/spree/api/v2/platform/hero_image_serializer.rb +10 -0
  122. data/app/serializers/spree/api/v2/platform/homepage_serializer.rb +11 -0
  123. data/app/serializers/spree/api/v2/platform/icon_serializer.rb +16 -0
  124. data/app/serializers/spree/api/v2/platform/image_gallery_serializer.rb +10 -0
  125. data/app/serializers/spree/api/v2/platform/image_serializer.rb +17 -0
  126. data/app/serializers/spree/api/v2/platform/inventory_unit_serializer.rb +19 -0
  127. data/app/serializers/spree/api/v2/platform/line_item_serializer.rb +19 -0
  128. data/app/serializers/spree/api/v2/platform/log_entry_serializer.rb +13 -0
  129. data/app/serializers/spree/api/v2/platform/menu_item_serializer.rb +45 -0
  130. data/app/serializers/spree/api/v2/platform/menu_serializer.rb +13 -0
  131. data/app/serializers/spree/api/v2/platform/option_type_serializer.rb +13 -0
  132. data/app/serializers/spree/api/v2/platform/option_value_serializer.rb +13 -0
  133. data/app/serializers/spree/api/v2/platform/order_promotion_serializer.rb +14 -0
  134. data/app/serializers/spree/api/v2/platform/order_serializer.rb +31 -0
  135. data/app/serializers/spree/api/v2/platform/payment_capture_event_serializer.rb +13 -0
  136. data/app/serializers/spree/api/v2/platform/payment_method_serializer.rb +18 -0
  137. data/app/serializers/spree/api/v2/platform/payment_serializer.rb +21 -0
  138. data/app/serializers/spree/api/v2/platform/price_serializer.rb +19 -0
  139. data/app/serializers/spree/api/v2/platform/product_property_serializer.rb +11 -0
  140. data/app/serializers/spree/api/v2/platform/product_serializer.rb +82 -0
  141. data/app/serializers/spree/api/v2/platform/promotion_action_line_item_serializer.rb +14 -0
  142. data/app/serializers/spree/api/v2/platform/promotion_action_serializer.rb +19 -0
  143. data/app/serializers/spree/api/v2/platform/promotion_category_serializer.rb +13 -0
  144. data/app/serializers/spree/api/v2/platform/promotion_rule_serializer.rb +21 -0
  145. data/app/serializers/spree/api/v2/platform/promotion_serializer.rb +17 -0
  146. data/app/serializers/spree/api/v2/platform/property_serializer.rb +11 -0
  147. data/app/serializers/spree/api/v2/platform/prototype_serializer.rb +15 -0
  148. data/app/serializers/spree/api/v2/platform/refund_reason_serializer.rb +11 -0
  149. data/app/serializers/spree/api/v2/platform/refund_serializer.rb +16 -0
  150. data/app/serializers/spree/api/v2/platform/reimbursement_credit_serializer.rb +10 -0
  151. data/app/serializers/spree/api/v2/platform/reimbursement_serializer.rb +18 -0
  152. data/app/serializers/spree/api/v2/platform/reimbursement_type_serializer.rb +11 -0
  153. data/app/serializers/spree/api/v2/platform/return_authorization_reason_serializer.rb +11 -0
  154. data/app/serializers/spree/api/v2/platform/return_authorization_serializer.rb +17 -0
  155. data/app/serializers/spree/api/v2/platform/return_item_serializer.rb +16 -0
  156. data/app/serializers/spree/api/v2/platform/role_serializer.rb +11 -0
  157. data/app/serializers/spree/api/v2/platform/shipment_serializer.rb +22 -0
  158. data/app/serializers/spree/api/v2/platform/shipping_category_serializer.rb +11 -0
  159. data/app/serializers/spree/api/v2/platform/shipping_method_serializer.rb +16 -0
  160. data/app/serializers/spree/api/v2/platform/shipping_rate_serializer.rb +15 -0
  161. data/app/serializers/spree/api/v2/platform/side_by_side_image_serializer.rb +10 -0
  162. data/app/serializers/spree/api/v2/platform/standard_page_serializer.rb +11 -0
  163. data/app/serializers/spree/api/v2/platform/state_change_serializer.rb +13 -0
  164. data/app/serializers/spree/api/v2/platform/state_serializer.rb +13 -0
  165. data/app/serializers/spree/api/v2/platform/stock_item_serializer.rb +18 -0
  166. data/app/serializers/spree/api/v2/platform/stock_location_serializer.rb +14 -0
  167. data/app/serializers/spree/api/v2/platform/stock_movement_serializer.rb +11 -0
  168. data/app/serializers/spree/api/v2/platform/stock_transfer_serializer.rb +15 -0
  169. data/app/serializers/spree/api/v2/platform/store_credit_category_serializer.rb +12 -0
  170. data/app/serializers/spree/api/v2/platform/store_credit_event_serializer.rb +14 -0
  171. data/app/serializers/spree/api/v2/platform/store_credit_serializer.rb +18 -0
  172. data/app/serializers/spree/api/v2/platform/store_credit_type_serializer.rb +12 -0
  173. data/app/serializers/spree/api/v2/platform/store_serializer.rb +15 -0
  174. data/app/serializers/spree/api/v2/platform/tax_category_serializer.rb +13 -0
  175. data/app/serializers/spree/api/v2/platform/tax_rate_serializer.rb +14 -0
  176. data/app/serializers/spree/api/v2/platform/taxon_image_serializer.rb +15 -0
  177. data/app/serializers/spree/api/v2/platform/taxon_serializer.rb +38 -0
  178. data/app/serializers/spree/api/v2/platform/taxonomy_serializer.rb +14 -0
  179. data/app/serializers/spree/api/v2/platform/user_serializer.rb +39 -0
  180. data/app/serializers/spree/api/v2/platform/variant_serializer.rb +58 -0
  181. data/app/serializers/spree/api/v2/platform/webhooks/event_serializer.rb +15 -0
  182. data/app/serializers/spree/api/v2/platform/webhooks/subscriber_serializer.rb +13 -0
  183. data/app/serializers/spree/api/v2/platform/wished_item_serializer.rb +29 -0
  184. data/app/serializers/spree/api/v2/platform/wishlist_serializer.rb +19 -0
  185. data/app/serializers/spree/api/v2/platform/zone_member_serializer.rb +13 -0
  186. data/app/serializers/spree/api/v2/platform/zone_serializer.rb +13 -0
  187. data/app/serializers/spree/v2/storefront/address_serializer.rb +20 -0
  188. data/app/serializers/spree/v2/storefront/base_serializer.rb +10 -0
  189. data/app/serializers/spree/v2/storefront/cart_serializer.rb +36 -0
  190. data/app/serializers/spree/v2/storefront/cms_page_serializer.rb +14 -0
  191. data/app/serializers/spree/v2/storefront/cms_section_serializer.rb +32 -0
  192. data/app/serializers/spree/v2/storefront/country_serializer.rb +24 -0
  193. data/app/serializers/spree/v2/storefront/credit_card_serializer.rb +13 -0
  194. data/app/serializers/spree/v2/storefront/digital_link_serializer.rb +11 -0
  195. data/app/serializers/spree/v2/storefront/estimated_shipping_rate_serializer.rb +29 -0
  196. data/app/serializers/spree/v2/storefront/icon_serializer.rb +14 -0
  197. data/app/serializers/spree/v2/storefront/image_serializer.rb +13 -0
  198. data/app/serializers/spree/v2/storefront/line_item_serializer.rb +20 -0
  199. data/app/serializers/spree/v2/storefront/menu_item_serializer.rb +43 -0
  200. data/app/serializers/spree/v2/storefront/menu_serializer.rb +13 -0
  201. data/app/serializers/spree/v2/storefront/option_type_serializer.rb +13 -0
  202. data/app/serializers/spree/v2/storefront/option_value_serializer.rb +13 -0
  203. data/app/serializers/spree/v2/storefront/order_serializer.rb +9 -0
  204. data/app/serializers/spree/v2/storefront/payment_method_serializer.rb +15 -0
  205. data/app/serializers/spree/v2/storefront/payment_serializer.rb +15 -0
  206. data/app/serializers/spree/v2/storefront/product_property_serializer.rb +19 -0
  207. data/app/serializers/spree/v2/storefront/product_serializer.rb +76 -0
  208. data/app/serializers/spree/v2/storefront/promotion_serializer.rb +12 -0
  209. data/app/serializers/spree/v2/storefront/shipment_serializer.rb +24 -0
  210. data/app/serializers/spree/v2/storefront/shipping_rate_serializer.rb +16 -0
  211. data/app/serializers/spree/v2/storefront/state_serializer.rb +11 -0
  212. data/app/serializers/spree/v2/storefront/stock_location_serializer.rb +11 -0
  213. data/app/serializers/spree/v2/storefront/store_credit_category_serializer.rb +11 -0
  214. data/app/serializers/spree/v2/storefront/store_credit_event_serializer.rb +15 -0
  215. data/app/serializers/spree/v2/storefront/store_credit_serializer.rb +17 -0
  216. data/app/serializers/spree/v2/storefront/store_credit_type_serializer.rb +11 -0
  217. data/app/serializers/spree/v2/storefront/store_serializer.rb +20 -0
  218. data/app/serializers/spree/v2/storefront/taxon_image_serializer.rb +13 -0
  219. data/app/serializers/spree/v2/storefront/taxon_serializer.rb +37 -0
  220. data/app/serializers/spree/v2/storefront/taxonomy_serializer.rb +11 -0
  221. data/app/serializers/spree/v2/storefront/user_serializer.rb +31 -0
  222. data/app/serializers/spree/v2/storefront/variant_serializer.rb +49 -0
  223. data/app/serializers/spree/v2/storefront/wished_item_serializer.rb +29 -0
  224. data/app/serializers/spree/v2/storefront/wishlist_serializer.rb +17 -0
  225. data/app/services/spree/api/error_handler.rb +40 -0
  226. data/app/services/spree/webhooks/subscribers/handle_request.rb +73 -0
  227. data/app/services/spree/webhooks/subscribers/make_request.rb +82 -0
  228. data/app/services/spree/webhooks/subscribers/queue_requests.rb +23 -0
  229. data/app/services/spree/webhooks.rb +13 -0
  230. data/config/i18n-tasks.yml +40 -0
  231. data/config/initializers/doorkeeper.rb +48 -0
  232. data/config/initializers/json_api_mime_types.rb +8 -0
  233. data/config/initializers/user_class_extensions.rb +7 -0
  234. data/config/locales/en.yml +38 -0
  235. data/config/routes.rb +214 -0
  236. data/db/migrate/20100107141738_add_api_key_to_spree_users.rb +7 -0
  237. data/db/migrate/20120411123334_resize_api_key_field.rb +7 -0
  238. data/db/migrate/20120530054546_rename_api_key_to_spree_api_key.rb +7 -0
  239. data/db/migrate/20131017162334_add_index_to_user_spree_api_key.rb +7 -0
  240. data/db/migrate/20180320110726_create_doorkeeper_tables.rb +69 -0
  241. data/db/migrate/20210727102516_change_integer_id_columns_type.rb +9 -0
  242. data/db/migrate/20210902162826_create_spree_webhooks_tables.rb +16 -0
  243. data/db/migrate/20210919183228_enable_polymorphic_resource_owner.rb +21 -0
  244. data/db/migrate/20211025162826_create_spree_webhooks_events.rb +14 -0
  245. data/docs/oauth/index.yml +233 -0
  246. data/docs/v2/platform/index.yaml +21111 -0
  247. data/docs/v2/storefront/index.yaml +16504 -0
  248. data/lib/spree/api/configuration.rb +11 -0
  249. data/lib/spree/api/dependencies.rb +165 -0
  250. data/lib/spree/api/engine.rb +34 -0
  251. data/lib/spree/api/testing_support/caching.rb +10 -0
  252. data/lib/spree/api/testing_support/factories/oauth_application_factory.rb +6 -0
  253. data/lib/spree/api/testing_support/factories/webhook_event_factory.rb +27 -0
  254. data/lib/spree/api/testing_support/factories/webhook_subscriber_factory.rb +13 -0
  255. data/lib/spree/api/testing_support/factories.rb +3 -0
  256. data/lib/spree/api/testing_support/jobs.rb +18 -0
  257. data/lib/spree/api/testing_support/matchers/webhooks.rb +67 -0
  258. data/lib/spree/api/testing_support/serializers.rb +25 -0
  259. data/lib/spree/api/testing_support/spree_webhooks.rb +9 -0
  260. data/lib/spree/api/testing_support/v2/base.rb +13 -0
  261. data/lib/spree/api/testing_support/v2/current_order.rb +112 -0
  262. data/lib/spree/api/testing_support/v2/platform_contexts.rb +273 -0
  263. data/lib/spree/api/testing_support/v2/serializers_params.rb +16 -0
  264. data/lib/spree/api.rb +8 -0
  265. data/lib/spree_api.rb +3 -0
  266. data/script/rails +9 -0
  267. data/spec/fixtures/files/icon_256x256.jpg +0 -0
  268. data/spec/fixtures/thinking-cat.jpg +0 -0
  269. data/spree_api.gemspec +35 -0
  270. metadata +427 -0
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Api
3
+ class Configuration < Preferences::Configuration
4
+ preference :api_v2_serializers_cache_ttl, :integer, default: 3600 # 1 hour in seconds
5
+ preference :api_v2_collection_cache_ttl, :integer, default: 3600 # 1 hour in seconds
6
+ preference :api_v2_collection_cache_namespace, :string, default: 'api_v2_collection_cache'
7
+ preference :api_v2_content_type, :string, default: 'application/vnd.api+json'
8
+ preference :api_v2_per_page_limit, :integer, default: 500
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,165 @@
1
+ module Spree
2
+ module Api
3
+ class ApiDependencies
4
+ include Spree::DependenciesHelper
5
+
6
+ INJECTION_POINTS = [
7
+ :storefront_cart_create_service, :storefront_cart_add_item_service, :storefront_cart_remove_line_item_service,
8
+ :storefront_cart_remove_item_service, :storefront_cart_set_item_quantity_service, :storefront_cart_recalculate_service,
9
+ :storefront_cms_page_serializer, :storefront_cms_page_finder,
10
+ :storefront_cart_update, :storefront_coupon_handler, :storefront_checkout_next_service, :storefront_checkout_advance_service,
11
+ :storefront_checkout_update_service, :storefront_checkout_complete_service, :storefront_checkout_add_store_credit_service,
12
+ :storefront_checkout_remove_store_credit_service, :storefront_checkout_get_shipping_rates_service,
13
+ :storefront_cart_compare_line_items_service, :storefront_cart_serializer, :storefront_credit_card_serializer,
14
+ :storefront_credit_card_finder, :storefront_shipment_serializer, :storefront_payment_method_serializer, :storefront_country_finder,
15
+ :storefront_country_serializer, :storefront_menu_serializer, :storefront_menu_finder, :storefront_current_order_finder,
16
+ :storefront_completed_order_finder, :storefront_order_sorter, :storefront_collection_paginator, :storefront_user_serializer,
17
+ :storefront_products_sorter, :storefront_products_finder, :storefront_product_serializer, :storefront_taxon_serializer,
18
+ :storefront_taxon_finder, :storefront_find_by_variant_finder, :storefront_cart_update_service, :storefront_cart_associate_service,
19
+ :storefront_cart_estimate_shipping_rates_service, :storefront_estimated_shipment_serializer,
20
+ :storefront_store_serializer, :storefront_address_serializer, :storefront_order_serializer,
21
+ :storefront_account_create_address_service, :storefront_account_update_address_service, :storefront_address_finder,
22
+ :storefront_account_create_service, :storefront_account_update_service, :storefront_collection_sorter, :error_handler,
23
+ :storefront_cart_empty_service, :storefront_cart_destroy_service, :storefront_credit_cards_destroy_service, :platform_products_sorter,
24
+ :storefront_cart_change_currency_service, :storefront_payment_serializer,
25
+ :storefront_payment_create_service, :storefront_address_create_service, :storefront_address_update_service,
26
+ :storefront_checkout_select_shipping_method_service,
27
+
28
+ :platform_admin_user_serializer, :platform_coupon_handler, :platform_order_update_service,
29
+ :platform_order_use_store_credit_service, :platform_order_remove_store_credit_service,
30
+ :platform_order_complete_service, :platform_order_empty_service, :platform_order_destroy_service,
31
+ :platform_order_next_service, :platform_order_advance_service,
32
+ :platform_line_item_create_service, :platform_line_item_update_service, :platform_line_item_destroy_service,
33
+ :platform_order_approve_service, :platform_order_cancel_service,
34
+ :platform_shipment_change_state_service, :platform_shipment_create_service, :platform_shipment_update_service,
35
+ :platform_shipment_add_item_service, :platform_shipment_remove_item_service
36
+ ].freeze
37
+
38
+ attr_accessor *INJECTION_POINTS
39
+
40
+ def initialize
41
+ set_storefront_defaults
42
+ set_platform_defaults
43
+ end
44
+
45
+ private
46
+
47
+ def set_storefront_defaults
48
+ # cart services
49
+ @storefront_cart_create_service = Spree::Dependencies.cart_create_service
50
+ @storefront_cart_add_item_service = Spree::Dependencies.cart_add_item_service
51
+ @storefront_cart_compare_line_items_service = Spree::Dependencies.cart_compare_line_items_service
52
+ @storefront_cart_update_service = Spree::Dependencies.cart_update_service
53
+ @storefront_cart_remove_line_item_service = Spree::Dependencies.cart_remove_line_item_service
54
+ @storefront_cart_remove_item_service = Spree::Dependencies.cart_remove_item_service
55
+ @storefront_cart_set_item_quantity_service = Spree::Dependencies.cart_set_item_quantity_service
56
+ @storefront_cart_recalculate_service = Spree::Dependencies.cart_recalculate_service
57
+ @storefront_cart_estimate_shipping_rates_service = Spree::Dependencies.cart_estimate_shipping_rates_service
58
+ @storefront_cart_empty_service = Spree::Dependencies.cart_empty_service
59
+ @storefront_cart_destroy_service = Spree::Dependencies.cart_destroy_service
60
+ @storefront_cart_associate_service = Spree::Dependencies.cart_associate_service
61
+ @storefront_cart_change_currency_service = Spree::Dependencies.cart_change_currency_service
62
+
63
+ # coupon code handler
64
+ @storefront_coupon_handler = Spree::Dependencies.coupon_handler
65
+
66
+ # checkout services
67
+ @storefront_checkout_next_service = Spree::Dependencies.checkout_next_service
68
+ @storefront_checkout_advance_service = Spree::Dependencies.checkout_advance_service
69
+ @storefront_checkout_update_service = Spree::Dependencies.checkout_update_service
70
+ @storefront_checkout_complete_service = Spree::Dependencies.checkout_complete_service
71
+ @storefront_checkout_add_store_credit_service = Spree::Dependencies.checkout_add_store_credit_service
72
+ @storefront_checkout_remove_store_credit_service = Spree::Dependencies.checkout_remove_store_credit_service
73
+ @storefront_checkout_get_shipping_rates_service = Spree::Dependencies.checkout_get_shipping_rates_service
74
+ @storefront_checkout_select_shipping_method_service = Spree::Dependencies.checkout_select_shipping_method_service
75
+
76
+ # account services
77
+ @storefront_account_create_service = Spree::Dependencies.account_create_service
78
+ @storefront_account_update_service = Spree::Dependencies.account_update_service
79
+
80
+ # address services
81
+ @storefront_address_create_service = Spree::Dependencies.address_create_service
82
+ @storefront_address_update_service = Spree::Dependencies.address_update_service
83
+
84
+ # credit card services
85
+ @storefront_credit_cards_destroy_service = Spree::Dependencies.credit_cards_destroy_service
86
+
87
+ # payment services
88
+ @storefront_payment_create_service = Spree::Dependencies.payment_create_service
89
+
90
+ # serializers
91
+ @storefront_address_serializer = 'Spree::V2::Storefront::AddressSerializer'
92
+ @storefront_cart_serializer = 'Spree::V2::Storefront::CartSerializer'
93
+ @storefront_cms_page_serializer = 'Spree::V2::Storefront::CmsPageSerializer'
94
+ @storefront_credit_card_serializer = 'Spree::V2::Storefront::CreditCardSerializer'
95
+ @storefront_country_serializer = 'Spree::V2::Storefront::CountrySerializer'
96
+ @storefront_menu_serializer = 'Spree::V2::Storefront::MenuSerializer'
97
+ @storefront_user_serializer = 'Spree::V2::Storefront::UserSerializer'
98
+ @storefront_shipment_serializer = 'Spree::V2::Storefront::ShipmentSerializer'
99
+ @storefront_taxon_serializer = 'Spree::V2::Storefront::TaxonSerializer'
100
+ @storefront_payment_method_serializer = 'Spree::V2::Storefront::PaymentMethodSerializer'
101
+ @storefront_payment_serializer = 'Spree::V2::Storefront::PaymentSerializer'
102
+ @storefront_product_serializer = 'Spree::V2::Storefront::ProductSerializer'
103
+ @storefront_estimated_shipment_serializer = 'Spree::V2::Storefront::EstimatedShippingRateSerializer'
104
+ @storefront_store_serializer = 'Spree::V2::Storefront::StoreSerializer'
105
+ @storefront_order_serializer = 'Spree::V2::Storefront::OrderSerializer'
106
+
107
+ # sorters
108
+ @storefront_collection_sorter = Spree::Dependencies.collection_sorter
109
+ @storefront_order_sorter = Spree::Dependencies.collection_sorter
110
+ @storefront_products_sorter = Spree::Dependencies.products_sorter
111
+ @platform_products_sorter = Spree::Dependencies.products_sorter
112
+
113
+ # paginators
114
+ @storefront_collection_paginator = Spree::Dependencies.collection_paginator
115
+
116
+ # finders
117
+ @storefront_address_finder = Spree::Dependencies.address_finder
118
+ @storefront_country_finder = Spree::Dependencies.country_finder
119
+ @storefront_cms_page_finder = Spree::Dependencies.cms_page_finder
120
+ @storefront_menu_finder = Spree::Dependencies.menu_finder
121
+ @storefront_current_order_finder = Spree::Dependencies.current_order_finder
122
+ @storefront_completed_order_finder = Spree::Dependencies.completed_order_finder
123
+ @storefront_credit_card_finder = Spree::Dependencies.credit_card_finder
124
+ @storefront_find_by_variant_finder = Spree::Dependencies.line_item_by_variant_finder
125
+ @storefront_products_finder = Spree::Dependencies.products_finder
126
+ @storefront_taxon_finder = Spree::Dependencies.taxon_finder
127
+
128
+ @error_handler = 'Spree::Api::ErrorHandler'
129
+ end
130
+
131
+ def set_platform_defaults
132
+ # serializers
133
+ @platform_admin_user_serializer = 'Spree::Api::V2::Platform::UserSerializer'
134
+
135
+ # coupon code handler
136
+ @platform_coupon_handler = Spree::Dependencies.coupon_handler
137
+
138
+ # order services
139
+ @platform_order_recalculate_service = Spree::Dependencies.cart_recalculate_service
140
+ @platform_order_update_service = Spree::Dependencies.checkout_update_service
141
+ @platform_order_empty_service = Spree::Dependencies.cart_empty_service
142
+ @platform_order_destroy_service = Spree::Dependencies.cart_destroy_service
143
+ @platform_order_next_service = Spree::Dependencies.checkout_next_service
144
+ @platform_order_advance_service = Spree::Dependencies.checkout_advance_service
145
+ @platform_order_complete_service = Spree::Dependencies.checkout_complete_service
146
+ @platform_order_use_store_credit_service = Spree::Dependencies.checkout_add_store_credit_service
147
+ @platform_order_remove_store_credit_service = Spree::Dependencies.checkout_remove_store_credit_service
148
+ @platform_order_approve_service = Spree::Dependencies.order_approve_service
149
+ @platform_order_cancel_service = Spree::Dependencies.order_cancel_service
150
+
151
+ # line item services
152
+ @platform_line_item_create_service = Spree::Dependencies.line_item_create_service
153
+ @platform_line_item_update_service = Spree::Dependencies.line_item_update_service
154
+ @platform_line_item_destroy_service = Spree::Dependencies.line_item_destroy_service
155
+
156
+ # shipment services
157
+ @platform_shipment_create_service = Spree::Dependencies.shipment_create_service
158
+ @platform_shipment_update_service = Spree::Dependencies.shipment_update_service
159
+ @platform_shipment_change_state_service = Spree::Dependencies.shipment_change_state_service
160
+ @platform_shipment_add_item_service = Spree::Dependencies.shipment_add_item_service
161
+ @platform_shipment_remove_item_service = Spree::Dependencies.shipment_remove_item_service
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,34 @@
1
+ require 'rails/engine'
2
+
3
+ require_relative 'dependencies'
4
+ require_relative 'configuration'
5
+
6
+ module Spree
7
+ module Api
8
+ class Engine < Rails::Engine
9
+ isolate_namespace Spree
10
+ engine_name 'spree_api'
11
+
12
+ initializer 'spree.api.environment', before: :load_config_initializers do |_app|
13
+ Spree::Api::Config = Spree::Api::Configuration.new
14
+ Spree::Api::Dependencies = Spree::Api::ApiDependencies.new
15
+ end
16
+
17
+ initializer 'spree.api.checking_migrations' do
18
+ Migrations.new(config, engine_name).check
19
+ end
20
+
21
+ def self.activate
22
+ Dir.glob(File.join(File.dirname(__FILE__), '../../../app/models/spree/api/webhooks/*_decorator*.rb')) do |c|
23
+ Rails.application.config.cache_classes ? require(c) : load(c)
24
+ end
25
+ end
26
+
27
+ def self.root
28
+ @root ||= Pathname.new(File.expand_path('../../..', __dir__))
29
+ end
30
+
31
+ config.to_prepare &method(:activate).to_proc
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ RSpec.configure do |config|
2
+ config.before(:each, caching: true) do
3
+ ActionController::Base.perform_caching = true
4
+ end
5
+
6
+ config.after(:each, caching: true) do
7
+ ActionController::Base.perform_caching = false
8
+ Rails.cache.clear
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :oauth_application, class: Spree::OauthApplication do
3
+ name { "Admin Panel" }
4
+ scopes { "admin" }
5
+ end
6
+ end
@@ -0,0 +1,27 @@
1
+ FactoryBot.define do
2
+ factory :webhook_event, aliases: [:event], class: Spree::Webhooks::Event do
3
+ subscriber
4
+
5
+ execution_time { rand(1..99_999) }
6
+ name { 'order.canceled' }
7
+ request_errors { '' }
8
+ sequence(:url) { |n| "https://www.url#{n}.com/" }
9
+
10
+ trait :failed do
11
+ response_code { '500' }
12
+ success { false }
13
+ end
14
+
15
+ trait :successful do
16
+ response_code { '200' }
17
+ success { true }
18
+ end
19
+
20
+ trait :blank do
21
+ execution_time { nil }
22
+ request_errors { nil }
23
+ subscriber_id { nil }
24
+ url { nil }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ FactoryBot.define do
2
+ factory :webhook_subscriber, aliases: [:subscriber], class: Spree::Webhooks::Subscriber do
3
+ sequence(:url) { |n| "https://www.url#{n}.com/" }
4
+
5
+ trait :active do
6
+ active { true }
7
+ end
8
+
9
+ trait :inactive do
10
+ active { false }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/factories/**"].each do |f|
2
+ load File.expand_path(f)
3
+ end
@@ -0,0 +1,18 @@
1
+ RSpec.configure do |config|
2
+ # Force jobs to be executed in a synchronous way (see http://archive.today/xcb1E)
3
+ config.around do |example|
4
+ (ActiveJob::Base.descendants << ActiveJob::Base).each(&:disable_test_adapter)
5
+ ActiveJob::Base.queue_adapter = :inline
6
+ example.run
7
+ (ActiveJob::Base.descendants << ActiveJob::Base).each { |a| a.enable_test_adapter(ActiveJob::QueueAdapters::TestAdapter.new) }
8
+ ActiveJob::Base.queue_adapter = :test
9
+ end
10
+
11
+ config.before(:each, :job) do
12
+ ActiveJob::Base.queue_adapter = :test
13
+ end
14
+
15
+ config.after(:each, :job) do
16
+ ActiveJob::Base.queue_adapter = :inline
17
+ end
18
+ end
@@ -0,0 +1,67 @@
1
+ # Passes if executing the code in the block there is a
2
+ # `Spree::Webhooks::Subscribers::QueueRequests.call` method
3
+ # call with the given `event` and `webhook_payload_body` arguments just once.
4
+ #
5
+ # @example
6
+ # expect { order.complete }.to emit_webhook_event('order.paid')
7
+ # expect do
8
+ # order.start_processing
9
+ # order.complete
10
+ # end.to emit_webhook_event('order.paid')
11
+ #
12
+ # It can also be negated, resulting in the expectation
13
+ # waiting to not receive a `call` method call with the
14
+ # given `event` and `webhook_payload_body` (`once` isn't taken into consideration).
15
+ #
16
+ # @example
17
+ # expect { order.complete }.not_to emit_webhook_event('order.paid')
18
+ # expect do
19
+ # order.start_processing
20
+ # order.complete
21
+ # end.not_to emit_webhook_event('order.paid')
22
+ #
23
+ # == Notes
24
+ #
25
+ # The matcher relies on a `webhook_payload_body` method previously defined which
26
+ # isn't added to the matcher definition, because it acts in a different
27
+ # way depending on what's the resource being tested.
28
+ #
29
+ RSpec::Matchers.define :emit_webhook_event do |event_to_emit|
30
+ match do |block|
31
+ queue_requests = instance_double(Spree::Webhooks::Subscribers::QueueRequests)
32
+
33
+ allow(Spree::Webhooks::Subscribers::QueueRequests).to receive(:new).and_return(queue_requests)
34
+ allow(queue_requests).to receive(:call).with(any_args)
35
+
36
+ with_webhooks_enabled { Timecop.freeze { block.call } }
37
+
38
+ expect(queue_requests).to(
39
+ have_received(:call).with(event_name: event_to_emit, webhook_payload_body: webhook_payload_body.to_json).once
40
+ )
41
+ end
42
+
43
+ def block_definition(obj_method)
44
+ # positive look-behinds must have a fixed length, using a straightforward match instead
45
+ obj_method.source.squish[/(expect *({|do) *)(.*?)( *(}|end).(not_)*to)/, 3]
46
+ end
47
+
48
+ failure_message do |obj_method|
49
+ block_def = block_definition(obj_method)
50
+ "Expected that executing `#{block_def}` emits the `#{event_to_emit}` Webhook event.\n" \
51
+ "Check that `#{block_def}` does implement `queue_webhooks_requests!` for " \
52
+ "`#{event_to_emit}` with the following webhook_payload_body: \n\n#{webhook_payload_body}."
53
+ end
54
+
55
+ failure_message_when_negated do |obj_method|
56
+ "Expected that executing `#{block_definition(obj_method)}` does not " \
57
+ "emit the `#{event_to_emit}` Webhook event with the following webhook_payload_body: #{webhook_payload_body}."
58
+ end
59
+
60
+ supports_block_expectations
61
+ end
62
+
63
+ def with_webhooks_enabled
64
+ ENV['DISABLE_SPREE_WEBHOOKS'] = nil
65
+ yield
66
+ ENV['DISABLE_SPREE_WEBHOOKS'] = 'true'
67
+ end
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ class TestArgumentsJob < Spree::BaseJob
3
+ def perform(serializer); end
4
+ end
5
+ end
6
+
7
+ shared_examples 'an ActiveJob serializable hash' do
8
+ context 'Rails < 6', if: Rails::VERSION::MAJOR < 6 do
9
+ it 'can not be serialized by ActiveJob' do
10
+ expect { Spree::TestArgumentsJob.perform_later(subject) }.to(
11
+ raise_error(ActiveJob::SerializationError, 'Unsupported argument type: Symbol')
12
+ )
13
+ end
14
+ end
15
+
16
+ context 'Rails >= 6', if: Rails::VERSION::MAJOR >= 6 do
17
+ it 'can be serialized by ActiveJob' do
18
+ # It should fail if subject contains any custom instance (e.g Spree::Money)
19
+ expect { Spree::TestArgumentsJob.perform_later(subject) }.not_to raise_error
20
+ expect { Spree::TestArgumentsJob.perform_later(subject.merge(price: Spree::Money.new(0))) }.to(
21
+ raise_error(ActiveJob::SerializationError)
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ RSpec.configure do |config|
2
+ config.before(:each, :spree_webhooks) do
3
+ ENV['DISABLE_SPREE_WEBHOOKS'] = nil
4
+ end
5
+
6
+ config.after(:each, :spree_webhooks) do
7
+ ENV['DISABLE_SPREE_WEBHOOKS'] = 'true'
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ shared_context 'API v2 tokens' do
2
+ let(:token) { Spree::OauthAccessToken.create!(resource_owner: user, expires_in: nil) }
3
+ let(:headers_bearer) { { 'Authorization' => "Bearer #{token.token}" } }
4
+ let(:headers_order_token) { { 'X-Spree-Order-Token' => order.token } }
5
+ end
6
+
7
+ [200, 201, 204, 400, 401, 404, 403, 422].each do |status_code|
8
+ shared_examples "returns #{status_code} HTTP status" do
9
+ it "returns #{status_code}" do
10
+ expect(response.status).to eq(status_code)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,112 @@
1
+ def ensure_order_totals
2
+ order.update_totals
3
+ order.persist_totals
4
+ end
5
+
6
+ shared_context 'creates order with line item' do
7
+ let!(:line_item) { create(:line_item, order: order, currency: currency) }
8
+ let!(:headers) { headers_bearer }
9
+
10
+ before do
11
+ order.reload
12
+ ensure_order_totals
13
+ end
14
+ end
15
+
16
+ shared_context 'order with a physical line item' do
17
+ include_context 'creates order with line item'
18
+ end
19
+
20
+ shared_context 'order with a digital line item' do
21
+ let!(:digital) { create(:digital) }
22
+ let!(:variant_digital) { digital.variant }
23
+ let!(:line_item) { create(:line_item, variant: variant_digital, order: order, currency: currency) }
24
+ let!(:headers) { headers_bearer }
25
+
26
+ before do
27
+ order.reload
28
+ ensure_order_totals
29
+ end
30
+ end
31
+
32
+ shared_context 'order with a physical and digital line item' do
33
+ let!(:digital) { create(:digital) }
34
+ let!(:variant_digital) { digital.variant }
35
+ let!(:digital_line_item) { create(:line_item, variant: variant_digital, order: order, currency: currency) }
36
+ let!(:physical_line_item) { create(:line_item, order: order, currency: currency) }
37
+
38
+ let!(:headers) { headers_bearer }
39
+
40
+ before do
41
+ order.reload
42
+ ensure_order_totals
43
+ end
44
+ end
45
+
46
+ shared_context 'creates guest order with guest token' do
47
+ let(:guest_token) { 'guest_token' }
48
+ let!(:order) { create(:order, token: guest_token, store: store, currency: currency) }
49
+ let!(:line_item) { create(:line_item, order: order, currency: currency) }
50
+ let!(:headers) { headers_order_token }
51
+
52
+ before { ensure_order_totals }
53
+ end
54
+
55
+ shared_examples 'returns valid cart JSON' do
56
+ it 'returns a valid cart JSON response' do
57
+ order.reload
58
+ expect(json_response['data']).to be_present
59
+ expect(json_response['data']).to have_id(order.id.to_s)
60
+ expect(json_response['data']).to have_type('cart')
61
+ expect(json_response['data']).to have_attribute(:number).with_value(order.number)
62
+ expect(json_response['data']).to have_attribute(:state).with_value(order.state)
63
+ expect(json_response['data']).to have_attribute(:payment_state).with_value(order.payment_state)
64
+ expect(json_response['data']).to have_attribute(:shipment_state).with_value(order.shipment_state)
65
+ expect(json_response['data']).to have_attribute(:token).with_value(order.token)
66
+ expect(json_response['data']).to have_attribute(:total).with_value(order.total.to_s)
67
+ expect(json_response['data']).to have_attribute(:item_total).with_value(order.item_total.to_s)
68
+ expect(json_response['data']).to have_attribute(:ship_total).with_value(order.ship_total.to_s)
69
+ expect(json_response['data']).to have_attribute(:adjustment_total).with_value(order.adjustment_total.to_s)
70
+ expect(json_response['data']).to have_attribute(:included_tax_total).with_value(order.included_tax_total.to_s)
71
+ expect(json_response['data']).to have_attribute(:additional_tax_total).with_value(order.additional_tax_total.to_s)
72
+ expect(json_response['data']).to have_attribute(:display_additional_tax_total).with_value(order.display_additional_tax_total.to_s)
73
+ expect(json_response['data']).to have_attribute(:display_included_tax_total).with_value(order.display_included_tax_total.to_s)
74
+ expect(json_response['data']).to have_attribute(:tax_total).with_value(order.tax_total.to_s)
75
+ expect(json_response['data']).to have_attribute(:currency).with_value(order.currency.to_s)
76
+ expect(json_response['data']).to have_attribute(:email).with_value(order.email)
77
+ expect(json_response['data']).to have_attribute(:display_item_total).with_value(order.display_item_total.to_s)
78
+ expect(json_response['data']).to have_attribute(:display_ship_total).with_value(order.display_ship_total.to_s)
79
+ expect(json_response['data']).to have_attribute(:display_adjustment_total).with_value(order.display_adjustment_total.to_s)
80
+ expect(json_response['data']).to have_attribute(:display_tax_total).with_value(order.display_tax_total.to_s)
81
+ expect(json_response['data']).to have_attribute(:item_count).with_value(order.item_count)
82
+ expect(json_response['data']).to have_attribute(:special_instructions).with_value(order.special_instructions)
83
+ expect(json_response['data']).to have_attribute(:promo_total).with_value(order.promo_total.to_s)
84
+ expect(json_response['data']).to have_attribute(:display_promo_total).with_value(order.display_promo_total.to_s)
85
+ expect(json_response['data']).to have_attribute(:display_total).with_value(order.display_total.to_s)
86
+ expect(json_response['data']).to have_attribute(:pre_tax_item_amount).with_value(order.pre_tax_item_amount.to_s)
87
+ expect(json_response['data']).to have_attribute(:display_pre_tax_item_amount).with_value(order.display_pre_tax_item_amount.to_s)
88
+ expect(json_response['data']).to have_attribute(:pre_tax_total).with_value(order.pre_tax_total.to_s)
89
+ expect(json_response['data']).to have_attribute(:display_pre_tax_total).with_value(order.display_pre_tax_total.to_s)
90
+ expect(json_response['data']).to have_relationships(:user, :line_items, :variants, :billing_address, :shipping_address, :payments, :shipments, :promotions)
91
+ end
92
+ end
93
+
94
+ shared_examples 'no current order' do
95
+ context "order doesn't exist" do
96
+ before do
97
+ order.destroy
98
+ execute
99
+ end
100
+
101
+ it_behaves_like 'returns 404 HTTP status'
102
+ end
103
+
104
+ context 'already completed order' do
105
+ before do
106
+ order.update_column(:completed_at, Time.current)
107
+ execute
108
+ end
109
+
110
+ it_behaves_like 'returns 404 HTTP status'
111
+ end
112
+ end