solidus_core_devise_token_auth 2.8.0.alpha.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 (815) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/LICENSE +26 -0
  4. data/README.md +69 -0
  5. data/Rakefile +37 -0
  6. data/app/assets/config/solidus_core_manifest.js +1 -0
  7. data/app/assets/images/logo/solidus_logo.png +0 -0
  8. data/app/assets/images/noimage/large.png +0 -0
  9. data/app/assets/images/noimage/mini.png +0 -0
  10. data/app/assets/images/noimage/product.png +0 -0
  11. data/app/assets/images/noimage/small.png +0 -0
  12. data/app/assets/javascripts/spree.js.erb +72 -0
  13. data/app/controllers/spree/base_controller.rb +15 -0
  14. data/app/helpers/spree/base_helper.rb +160 -0
  15. data/app/helpers/spree/checkout_helper.rb +33 -0
  16. data/app/helpers/spree/products_helper.rb +74 -0
  17. data/app/helpers/spree/store_helper.rb +23 -0
  18. data/app/helpers/spree/taxons_helper.rb +22 -0
  19. data/app/jobs/spree/promotion_code_batch_job.rb +26 -0
  20. data/app/mailers/spree/base_mailer.rb +18 -0
  21. data/app/mailers/spree/carton_mailer.rb +29 -0
  22. data/app/mailers/spree/order_mailer.rb +36 -0
  23. data/app/mailers/spree/promotion_code_batch_mailer.rb +15 -0
  24. data/app/mailers/spree/reimbursement_mailer.rb +13 -0
  25. data/app/mailers/spree/test_mailer.rb +11 -0
  26. data/app/models/concerns/spree/adjustment_source.rb +27 -0
  27. data/app/models/concerns/spree/calculated_adjustments.rb +40 -0
  28. data/app/models/concerns/spree/default_price.rb +27 -0
  29. data/app/models/concerns/spree/display_money.rb +34 -0
  30. data/app/models/concerns/spree/named_type.rb +14 -0
  31. data/app/models/concerns/spree/ordered_property_value_list.rb +28 -0
  32. data/app/models/concerns/spree/ransackable_attributes.rb +22 -0
  33. data/app/models/concerns/spree/user_address_book.rb +149 -0
  34. data/app/models/concerns/spree/user_methods.rb +77 -0
  35. data/app/models/concerns/spree/user_payment_source.rb +26 -0
  36. data/app/models/concerns/spree/user_reporting.rb +24 -0
  37. data/app/models/spree/ability.rb +64 -0
  38. data/app/models/spree/address.rb +222 -0
  39. data/app/models/spree/adjustment.rb +168 -0
  40. data/app/models/spree/adjustment_reason.rb +12 -0
  41. data/app/models/spree/asset.rb +8 -0
  42. data/app/models/spree/base.rb +46 -0
  43. data/app/models/spree/billing_integration.rb +23 -0
  44. data/app/models/spree/calculator/default_tax.rb +60 -0
  45. data/app/models/spree/calculator/distributed_amount.rb +33 -0
  46. data/app/models/spree/calculator/flat_percent_item_total.rb +20 -0
  47. data/app/models/spree/calculator/flat_rate.rb +18 -0
  48. data/app/models/spree/calculator/flexi_rate.rb +27 -0
  49. data/app/models/spree/calculator/free_shipping.rb +21 -0
  50. data/app/models/spree/calculator/percent_on_line_item.rb +13 -0
  51. data/app/models/spree/calculator/percent_per_item.rb +49 -0
  52. data/app/models/spree/calculator/price_sack.rb +27 -0
  53. data/app/models/spree/calculator/returns/default_refund_amount.rb +34 -0
  54. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +21 -0
  55. data/app/models/spree/calculator/shipping/flat_rate.rb +17 -0
  56. data/app/models/spree/calculator/shipping/flexi_rate.rb +34 -0
  57. data/app/models/spree/calculator/shipping/per_item.rb +21 -0
  58. data/app/models/spree/calculator/shipping/price_sack.rb +27 -0
  59. data/app/models/spree/calculator/tiered_flat_rate.rb +52 -0
  60. data/app/models/spree/calculator/tiered_percent.rb +61 -0
  61. data/app/models/spree/calculator.rb +49 -0
  62. data/app/models/spree/carton.rb +59 -0
  63. data/app/models/spree/classification.rb +13 -0
  64. data/app/models/spree/country.rb +28 -0
  65. data/app/models/spree/credit_card.rb +197 -0
  66. data/app/models/spree/customer_return.rb +78 -0
  67. data/app/models/spree/distributed_amounts_handler.rb +43 -0
  68. data/app/models/spree/exchange.rb +45 -0
  69. data/app/models/spree/fulfilment_changer.rb +135 -0
  70. data/app/models/spree/gallery/product_gallery.rb +18 -0
  71. data/app/models/spree/gallery/variant_gallery.rb +18 -0
  72. data/app/models/spree/gateway/bogus.rb +13 -0
  73. data/app/models/spree/gateway/bogus_simple.rb +13 -0
  74. data/app/models/spree/gateway.rb +14 -0
  75. data/app/models/spree/image.rb +56 -0
  76. data/app/models/spree/inventory_unit.rb +159 -0
  77. data/app/models/spree/legacy_user.rb +26 -0
  78. data/app/models/spree/line_item.rb +206 -0
  79. data/app/models/spree/line_item_action.rb +8 -0
  80. data/app/models/spree/log_entry.rb +11 -0
  81. data/app/models/spree/option_type.rb +32 -0
  82. data/app/models/spree/option_value.rb +33 -0
  83. data/app/models/spree/option_values_variant.rb +8 -0
  84. data/app/models/spree/order/checkout.rb +243 -0
  85. data/app/models/spree/order/number_generator.rb +45 -0
  86. data/app/models/spree/order/payments.rb +55 -0
  87. data/app/models/spree/order.rb +914 -0
  88. data/app/models/spree/order_cancellations.rb +125 -0
  89. data/app/models/spree/order_capturing.rb +50 -0
  90. data/app/models/spree/order_contents.rb +126 -0
  91. data/app/models/spree/order_inventory.rb +115 -0
  92. data/app/models/spree/order_merger.rb +143 -0
  93. data/app/models/spree/order_mutex.rb +35 -0
  94. data/app/models/spree/order_promotion.rb +27 -0
  95. data/app/models/spree/order_shipping.rb +89 -0
  96. data/app/models/spree/order_taxation.rb +81 -0
  97. data/app/models/spree/order_update_attributes.rb +41 -0
  98. data/app/models/spree/order_updater.rb +271 -0
  99. data/app/models/spree/payment/cancellation.rb +62 -0
  100. data/app/models/spree/payment/processing.rb +225 -0
  101. data/app/models/spree/payment.rb +284 -0
  102. data/app/models/spree/payment_capture_event.rb +11 -0
  103. data/app/models/spree/payment_create.rb +93 -0
  104. data/app/models/spree/payment_method/bogus_credit_card.rb +90 -0
  105. data/app/models/spree/payment_method/check.rb +40 -0
  106. data/app/models/spree/payment_method/credit_card.rb +43 -0
  107. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +26 -0
  108. data/app/models/spree/payment_method/store_credit.rb +122 -0
  109. data/app/models/spree/payment_method.rb +281 -0
  110. data/app/models/spree/payment_source.rb +47 -0
  111. data/app/models/spree/preference.rb +7 -0
  112. data/app/models/spree/price.rb +89 -0
  113. data/app/models/spree/product/scopes.rb +259 -0
  114. data/app/models/spree/product.rb +400 -0
  115. data/app/models/spree/product_option_type.rb +9 -0
  116. data/app/models/spree/product_promotion_rule.rb +8 -0
  117. data/app/models/spree/product_property.rb +14 -0
  118. data/app/models/spree/promotion/actions/create_adjustment.rb +80 -0
  119. data/app/models/spree/promotion/actions/create_item_adjustments.rb +102 -0
  120. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +142 -0
  121. data/app/models/spree/promotion/actions/free_shipping.rb +57 -0
  122. data/app/models/spree/promotion/rules/first_order.rb +40 -0
  123. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +36 -0
  124. data/app/models/spree/promotion/rules/item_total.rb +45 -0
  125. data/app/models/spree/promotion/rules/nth_order.rb +45 -0
  126. data/app/models/spree/promotion/rules/one_use_per_user.rb +25 -0
  127. data/app/models/spree/promotion/rules/option_value.rb +50 -0
  128. data/app/models/spree/promotion/rules/product.rb +74 -0
  129. data/app/models/spree/promotion/rules/store.rb +22 -0
  130. data/app/models/spree/promotion/rules/taxon.rb +103 -0
  131. data/app/models/spree/promotion/rules/user.rb +30 -0
  132. data/app/models/spree/promotion/rules/user_logged_in.rb +20 -0
  133. data/app/models/spree/promotion/rules/user_role.rb +45 -0
  134. data/app/models/spree/promotion.rb +260 -0
  135. data/app/models/spree/promotion_action.rb +53 -0
  136. data/app/models/spree/promotion_category.rb +8 -0
  137. data/app/models/spree/promotion_chooser.rb +34 -0
  138. data/app/models/spree/promotion_code/batch_builder.rb +78 -0
  139. data/app/models/spree/promotion_code.rb +44 -0
  140. data/app/models/spree/promotion_code_batch.rb +27 -0
  141. data/app/models/spree/promotion_handler/cart.rb +55 -0
  142. data/app/models/spree/promotion_handler/coupon.rb +92 -0
  143. data/app/models/spree/promotion_handler/free_shipping.rb +9 -0
  144. data/app/models/spree/promotion_handler/page.rb +26 -0
  145. data/app/models/spree/promotion_handler/shipping.rb +61 -0
  146. data/app/models/spree/promotion_rule.rb +51 -0
  147. data/app/models/spree/promotion_rule_role.rb +8 -0
  148. data/app/models/spree/promotion_rule_store.rb +10 -0
  149. data/app/models/spree/promotion_rule_taxon.rb +8 -0
  150. data/app/models/spree/promotion_rule_user.rb +10 -0
  151. data/app/models/spree/property.rb +20 -0
  152. data/app/models/spree/refund.rb +90 -0
  153. data/app/models/spree/refund_reason.rb +15 -0
  154. data/app/models/spree/reimbursement/credit.rb +29 -0
  155. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
  156. data/app/models/spree/reimbursement/reimbursement_type_validator.rb +17 -0
  157. data/app/models/spree/reimbursement.rb +186 -0
  158. data/app/models/spree/reimbursement_performer.rb +40 -0
  159. data/app/models/spree/reimbursement_tax_calculator.rb +35 -0
  160. data/app/models/spree/reimbursement_type/credit.rb +15 -0
  161. data/app/models/spree/reimbursement_type/exchange.rb +11 -0
  162. data/app/models/spree/reimbursement_type/original_payment.rb +15 -0
  163. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +72 -0
  164. data/app/models/spree/reimbursement_type/store_credit.rb +29 -0
  165. data/app/models/spree/reimbursement_type.rb +18 -0
  166. data/app/models/spree/return_authorization.rb +90 -0
  167. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +30 -0
  168. data/app/models/spree/return_item/eligibility_validator/default.rb +36 -0
  169. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +22 -0
  170. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +22 -0
  171. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +22 -0
  172. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +22 -0
  173. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +22 -0
  174. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +47 -0
  175. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +13 -0
  176. data/app/models/spree/return_item.rb +320 -0
  177. data/app/models/spree/return_reason.rb +14 -0
  178. data/app/models/spree/returns_calculator.rb +9 -0
  179. data/app/models/spree/role.rb +14 -0
  180. data/app/models/spree/role_user.rb +11 -0
  181. data/app/models/spree/shipment.rb +431 -0
  182. data/app/models/spree/shipping_calculator.rb +23 -0
  183. data/app/models/spree/shipping_category.rb +10 -0
  184. data/app/models/spree/shipping_manifest.rb +30 -0
  185. data/app/models/spree/shipping_method.rb +133 -0
  186. data/app/models/spree/shipping_method_category.rb +8 -0
  187. data/app/models/spree/shipping_method_stock_location.rb +6 -0
  188. data/app/models/spree/shipping_method_zone.rb +8 -0
  189. data/app/models/spree/shipping_rate.rb +48 -0
  190. data/app/models/spree/shipping_rate_tax.rb +39 -0
  191. data/app/models/spree/state.rb +40 -0
  192. data/app/models/spree/state_change.rb +17 -0
  193. data/app/models/spree/stock/availability.rb +72 -0
  194. data/app/models/spree/stock/availability_validator.rb +36 -0
  195. data/app/models/spree/stock/content_item.rb +50 -0
  196. data/app/models/spree/stock/differentiator.rb +47 -0
  197. data/app/models/spree/stock/estimator.rb +71 -0
  198. data/app/models/spree/stock/inventory_unit_builder.rb +23 -0
  199. data/app/models/spree/stock/inventory_validator.rb +16 -0
  200. data/app/models/spree/stock/location_sorter/base.rb +38 -0
  201. data/app/models/spree/stock/location_sorter/default_first.rb +15 -0
  202. data/app/models/spree/stock/location_sorter/unsorted.rb +14 -0
  203. data/app/models/spree/stock/package.rb +142 -0
  204. data/app/models/spree/stock/quantifier.rb +49 -0
  205. data/app/models/spree/stock/shipping_rate_selector.rb +17 -0
  206. data/app/models/spree/stock/shipping_rate_sorter.rb +17 -0
  207. data/app/models/spree/stock/simple_coordinator.rb +119 -0
  208. data/app/models/spree/stock/splitter/backordered.rb +23 -0
  209. data/app/models/spree/stock/splitter/base.rb +35 -0
  210. data/app/models/spree/stock/splitter/shipping_category.rb +35 -0
  211. data/app/models/spree/stock/splitter/weight.rb +32 -0
  212. data/app/models/spree/stock/splitter_chain.rb +34 -0
  213. data/app/models/spree/stock_item.rb +128 -0
  214. data/app/models/spree/stock_location.rb +127 -0
  215. data/app/models/spree/stock_movement.rb +28 -0
  216. data/app/models/spree/stock_quantities.rb +83 -0
  217. data/app/models/spree/store.rb +83 -0
  218. data/app/models/spree/store_credit.rb +293 -0
  219. data/app/models/spree/store_credit_category.rb +18 -0
  220. data/app/models/spree/store_credit_event.rb +66 -0
  221. data/app/models/spree/store_credit_type.rb +10 -0
  222. data/app/models/spree/store_credit_update_reason.rb +4 -0
  223. data/app/models/spree/store_payment_method.rb +8 -0
  224. data/app/models/spree/store_selector/by_server_name.rb +32 -0
  225. data/app/models/spree/store_selector/legacy.rb +50 -0
  226. data/app/models/spree/store_shipping_method.rb +8 -0
  227. data/app/models/spree/tax/item_tax.rb +22 -0
  228. data/app/models/spree/tax/order_adjuster.rb +22 -0
  229. data/app/models/spree/tax/order_tax.rb +20 -0
  230. data/app/models/spree/tax/shipping_rate_taxer.rb +24 -0
  231. data/app/models/spree/tax/tax_helpers.rb +17 -0
  232. data/app/models/spree/tax/tax_location.rb +39 -0
  233. data/app/models/spree/tax_calculator/default.rb +85 -0
  234. data/app/models/spree/tax_calculator/shipping_rate.rb +58 -0
  235. data/app/models/spree/tax_category.rb +30 -0
  236. data/app/models/spree/tax_rate.rb +147 -0
  237. data/app/models/spree/tax_rate_tax_category.rb +8 -0
  238. data/app/models/spree/taxon.rb +144 -0
  239. data/app/models/spree/taxonomy.rb +29 -0
  240. data/app/models/spree/unit_cancel.rb +36 -0
  241. data/app/models/spree/user_address.rb +23 -0
  242. data/app/models/spree/user_class_handle.rb +28 -0
  243. data/app/models/spree/user_stock_location.rb +8 -0
  244. data/app/models/spree/validations/db_maximum_length_validator.rb +23 -0
  245. data/app/models/spree/variant/price_selector.rb +37 -0
  246. data/app/models/spree/variant/pricing_options.rb +98 -0
  247. data/app/models/spree/variant/scopes.rb +42 -0
  248. data/app/models/spree/variant/vat_price_generator.rb +63 -0
  249. data/app/models/spree/variant.rb +465 -0
  250. data/app/models/spree/variant_property_rule.rb +44 -0
  251. data/app/models/spree/variant_property_rule_condition.rb +10 -0
  252. data/app/models/spree/variant_property_rule_value.rb +12 -0
  253. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +40 -0
  254. data/app/models/spree/wallet/default_payment_builder.rb +28 -0
  255. data/app/models/spree/wallet.rb +78 -0
  256. data/app/models/spree/wallet_payment_source.rb +19 -0
  257. data/app/models/spree/zone.rb +148 -0
  258. data/app/models/spree/zone_member.rb +10 -0
  259. data/app/views/layouts/spree/base_mailer.html.erb +784 -0
  260. data/app/views/spree/carton_mailer/shipped_email.html.erb +34 -0
  261. data/app/views/spree/carton_mailer/shipped_email.text.erb +16 -0
  262. data/app/views/spree/order_mailer/cancel_email.html.erb +45 -0
  263. data/app/views/spree/order_mailer/cancel_email.text.erb +16 -0
  264. data/app/views/spree/order_mailer/confirm_email.html.erb +84 -0
  265. data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
  266. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +26 -0
  267. data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +10 -0
  268. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
  269. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
  270. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +39 -0
  271. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +17 -0
  272. data/app/views/spree/shared/_base_mailer_footer.html.erb +1 -0
  273. data/app/views/spree/shared/_base_mailer_header.html.erb +1 -0
  274. data/app/views/spree/shared/_error_messages.html.erb +11 -0
  275. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  276. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  277. data/config/initializers/assets.rb +5 -0
  278. data/config/initializers/friendly_id.rb +90 -0
  279. data/config/locales/en.yml +2107 -0
  280. data/db/default/spree/countries.rb +45 -0
  281. data/db/default/spree/refund_reasons.rb +3 -0
  282. data/db/default/spree/return_reasons.rb +11 -0
  283. data/db/default/spree/roles.rb +3 -0
  284. data/db/default/spree/shipping_categories.rb +3 -0
  285. data/db/default/spree/states.rb +14 -0
  286. data/db/default/spree/stock_locations.rb +4 -0
  287. data/db/default/spree/store_credit.rb +22 -0
  288. data/db/default/spree/stores.rb +10 -0
  289. data/db/default/spree/zones.rb +13 -0
  290. data/db/migrate/20160101010000_solidus_one_four.rb +1102 -0
  291. data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +27 -0
  292. data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +29 -0
  293. data/db/migrate/20160924135758_remove_is_default_from_prices.rb +7 -0
  294. data/db/migrate/20161009141333_remove_currency_from_line_items.rb +7 -0
  295. data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +30 -0
  296. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +38 -0
  297. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +22 -0
  298. data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +7 -0
  299. data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +7 -0
  300. data/db/migrate/20170317035819_add_lft_and_rgt_indexes_to_taxons.rb +8 -0
  301. data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +30 -0
  302. data/db/migrate/20170412103617_transform_tax_rate_category_relation.rb +50 -0
  303. data/db/migrate/20170422134804_add_roles_unique_constraints.rb +8 -0
  304. data/db/migrate/20170522143442_add_time_range_to_tax_rate.rb +8 -0
  305. data/db/migrate/20170608074534_rename_bogus_gateways.rb +17 -0
  306. data/db/migrate/20170831201542_remove_default_tax_from_spree_zones.rb +7 -0
  307. data/db/migrate/20180202190713_create_promotion_rule_stores.rb +12 -0
  308. data/db/migrate/20180202222641_create_store_shipping_methods.rb +12 -0
  309. data/db/migrate/20180313220213_add_available_locales_to_stores.rb +9 -0
  310. data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +61 -0
  311. data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +11 -0
  312. data/db/seeds.rb +17 -0
  313. data/lib/generators/spree/custom_user/custom_user_generator.rb +43 -0
  314. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +40 -0
  315. data/lib/generators/spree/custom_user/templates/migration.rb.tt +30 -0
  316. data/lib/generators/spree/dummy/dummy_generator.rb +148 -0
  317. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +10 -0
  318. data/lib/generators/spree/dummy/templates/rails/boot.rb +6 -0
  319. data/lib/generators/spree/dummy/templates/rails/database.yml +71 -0
  320. data/lib/generators/spree/dummy/templates/rails/routes.rb +2 -0
  321. data/lib/generators/spree/dummy/templates/rails/script/rails +6 -0
  322. data/lib/generators/spree/dummy/templates/rails/test.rb +33 -0
  323. data/lib/generators/spree/install/install_generator.rb +189 -0
  324. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +67 -0
  325. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +10 -0
  326. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +10 -0
  327. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +9 -0
  328. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +9 -0
  329. data/lib/solidus/migrations/rename_gateways.rb +39 -0
  330. data/lib/solidus_core.rb +3 -0
  331. data/lib/spree/app_configuration.rb +529 -0
  332. data/lib/spree/config.rb +5 -0
  333. data/lib/spree/core/active_merchant_dependencies.rb +13 -0
  334. data/lib/spree/core/class_constantizer.rb +33 -0
  335. data/lib/spree/core/controller_helpers/auth.rb +83 -0
  336. data/lib/spree/core/controller_helpers/common.rb +82 -0
  337. data/lib/spree/core/controller_helpers/order.rb +107 -0
  338. data/lib/spree/core/controller_helpers/payment_parameters.rb +221 -0
  339. data/lib/spree/core/controller_helpers/pricing.rb +30 -0
  340. data/lib/spree/core/controller_helpers/search.rb +16 -0
  341. data/lib/spree/core/controller_helpers/store.rb +19 -0
  342. data/lib/spree/core/controller_helpers/strong_parameters.rb +63 -0
  343. data/lib/spree/core/current_store.rb +24 -0
  344. data/lib/spree/core/engine.rb +61 -0
  345. data/lib/spree/core/environment/calculators.rb +18 -0
  346. data/lib/spree/core/environment.rb +22 -0
  347. data/lib/spree/core/environment_extension.rb +31 -0
  348. data/lib/spree/core/importer/order.rb +203 -0
  349. data/lib/spree/core/importer/product.rb +65 -0
  350. data/lib/spree/core/importer.rb +11 -0
  351. data/lib/spree/core/permalinks.rb +67 -0
  352. data/lib/spree/core/product_duplicator.rb +75 -0
  353. data/lib/spree/core/product_filters.rb +197 -0
  354. data/lib/spree/core/role_configuration.rb +88 -0
  355. data/lib/spree/core/search/base.rb +120 -0
  356. data/lib/spree/core/search/variant.rb +66 -0
  357. data/lib/spree/core/stock_configuration.rb +26 -0
  358. data/lib/spree/core/validators/email.rb +30 -0
  359. data/lib/spree/core/version.rb +11 -0
  360. data/lib/spree/core.rb +92 -0
  361. data/lib/spree/deprecation.rb +7 -0
  362. data/lib/spree/i18n.rb +35 -0
  363. data/lib/spree/localized_number.rb +30 -0
  364. data/lib/spree/mailer_previews/carton_preview.rb +13 -0
  365. data/lib/spree/mailer_previews/order_preview.rb +25 -0
  366. data/lib/spree/mailer_previews/reimbursement_preview.rb +13 -0
  367. data/lib/spree/migration_helpers.rb +21 -0
  368. data/lib/spree/migrations.rb +85 -0
  369. data/lib/spree/money.rb +133 -0
  370. data/lib/spree/paranoia_deprecations.rb +21 -0
  371. data/lib/spree/permission_sets/base.rb +32 -0
  372. data/lib/spree/permission_sets/configuration_display.rb +25 -0
  373. data/lib/spree/permission_sets/configuration_management.rb +25 -0
  374. data/lib/spree/permission_sets/dashboard_display.rb +11 -0
  375. data/lib/spree/permission_sets/default_customer.rb +37 -0
  376. data/lib/spree/permission_sets/order_display.rb +21 -0
  377. data/lib/spree/permission_sets/order_management.rb +22 -0
  378. data/lib/spree/permission_sets/product_display.rb +19 -0
  379. data/lib/spree/permission_sets/product_management.rb +21 -0
  380. data/lib/spree/permission_sets/promotion_display.rb +15 -0
  381. data/lib/spree/permission_sets/promotion_management.rb +14 -0
  382. data/lib/spree/permission_sets/restricted_stock_display.rb +18 -0
  383. data/lib/spree/permission_sets/restricted_stock_management.rb +18 -0
  384. data/lib/spree/permission_sets/stock_display.rb +12 -0
  385. data/lib/spree/permission_sets/stock_management.rb +12 -0
  386. data/lib/spree/permission_sets/super_user.rb +11 -0
  387. data/lib/spree/permission_sets/user_display.rb +13 -0
  388. data/lib/spree/permission_sets/user_management.rb +21 -0
  389. data/lib/spree/permission_sets.rb +20 -0
  390. data/lib/spree/permitted_attributes.rb +133 -0
  391. data/lib/spree/preferences/configuration.rb +107 -0
  392. data/lib/spree/preferences/preferable.rb +180 -0
  393. data/lib/spree/preferences/preferable_class_methods.rb +88 -0
  394. data/lib/spree/preferences/scoped_store.rb +36 -0
  395. data/lib/spree/preferences/static_model_preferences.rb +49 -0
  396. data/lib/spree/preferences/statically_configurable.rb +39 -0
  397. data/lib/spree/preferences/store.rb +91 -0
  398. data/lib/spree/promo/environment.rb +13 -0
  399. data/lib/spree/testing_support/ability_helpers.rb +107 -0
  400. data/lib/spree/testing_support/authorization_helpers.rb +69 -0
  401. data/lib/spree/testing_support/bar_ability.rb +19 -0
  402. data/lib/spree/testing_support/caching.rb +33 -0
  403. data/lib/spree/testing_support/capybara_ext.rb +147 -0
  404. data/lib/spree/testing_support/common_rake.rb +38 -0
  405. data/lib/spree/testing_support/controller_requests.rb +108 -0
  406. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +10 -0
  407. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +10 -0
  408. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/backend/all.css +9 -0
  409. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +9 -0
  410. data/lib/spree/testing_support/dummy_app/database.yml +33 -0
  411. data/lib/spree/testing_support/dummy_app/migrations.rb +47 -0
  412. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +67 -0
  413. data/lib/spree/testing_support/dummy_app/routes.rb +5 -0
  414. data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +1 -0
  415. data/lib/spree/testing_support/dummy_app.rb +120 -0
  416. data/lib/spree/testing_support/extension_rake.rb +11 -0
  417. data/lib/spree/testing_support/factories/address_factory.rb +45 -0
  418. data/lib/spree/testing_support/factories/adjustment_factory.rb +45 -0
  419. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +8 -0
  420. data/lib/spree/testing_support/factories/calculator_factory.rb +26 -0
  421. data/lib/spree/testing_support/factories/carton_factory.rb +26 -0
  422. data/lib/spree/testing_support/factories/country_factory.rb +21 -0
  423. data/lib/spree/testing_support/factories/credit_card_factory.rb +17 -0
  424. data/lib/spree/testing_support/factories/customer_return_factory.rb +35 -0
  425. data/lib/spree/testing_support/factories/image_factory.rb +7 -0
  426. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +26 -0
  427. data/lib/spree/testing_support/factories/line_item_factory.rb +18 -0
  428. data/lib/spree/testing_support/factories/option_type_factory.rb +8 -0
  429. data/lib/spree/testing_support/factories/option_value_factory.rb +10 -0
  430. data/lib/spree/testing_support/factories/order_factory.rb +160 -0
  431. data/lib/spree/testing_support/factories/order_promotion_factory.rb +11 -0
  432. data/lib/spree/testing_support/factories/payment_factory.rb +51 -0
  433. data/lib/spree/testing_support/factories/payment_method_factory.rb +32 -0
  434. data/lib/spree/testing_support/factories/price_factory.rb +11 -0
  435. data/lib/spree/testing_support/factories/product_factory.rb +50 -0
  436. data/lib/spree/testing_support/factories/product_option_type_factory.rb +11 -0
  437. data/lib/spree/testing_support/factories/product_property_factory.rb +11 -0
  438. data/lib/spree/testing_support/factories/promotion_category_factory.rb +7 -0
  439. data/lib/spree/testing_support/factories/promotion_code_factory.rb +11 -0
  440. data/lib/spree/testing_support/factories/promotion_factory.rb +64 -0
  441. data/lib/spree/testing_support/factories/property_factory.rb +8 -0
  442. data/lib/spree/testing_support/factories/refund_factory.rb +21 -0
  443. data/lib/spree/testing_support/factories/refund_reason_factory.rb +7 -0
  444. data/lib/spree/testing_support/factories/reimbursement_factory.rb +21 -0
  445. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +9 -0
  446. data/lib/spree/testing_support/factories/return_authorization_factory.rb +20 -0
  447. data/lib/spree/testing_support/factories/return_item_factory.rb +23 -0
  448. data/lib/spree/testing_support/factories/return_reason_factory.rb +7 -0
  449. data/lib/spree/testing_support/factories/role_factory.rb +11 -0
  450. data/lib/spree/testing_support/factories/shipment_factory.rb +37 -0
  451. data/lib/spree/testing_support/factories/shipping_category_factory.rb +7 -0
  452. data/lib/spree/testing_support/factories/shipping_method_factory.rb +42 -0
  453. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +11 -0
  454. data/lib/spree/testing_support/factories/state_factory.rb +28 -0
  455. data/lib/spree/testing_support/factories/stock_item_factory.rb +14 -0
  456. data/lib/spree/testing_support/factories/stock_location_factory.rb +41 -0
  457. data/lib/spree/testing_support/factories/stock_movement_factory.rb +15 -0
  458. data/lib/spree/testing_support/factories/stock_package_factory.rb +28 -0
  459. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +7 -0
  460. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +30 -0
  461. data/lib/spree/testing_support/factories/store_credit_factory.rb +16 -0
  462. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +13 -0
  463. data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +7 -0
  464. data/lib/spree/testing_support/factories/store_factory.rb +10 -0
  465. data/lib/spree/testing_support/factories/tax_category_factory.rb +10 -0
  466. data/lib/spree/testing_support/factories/tax_rate_factory.rb +14 -0
  467. data/lib/spree/testing_support/factories/taxon_factory.rb +11 -0
  468. data/lib/spree/testing_support/factories/taxonomy_factory.rb +7 -0
  469. data/lib/spree/testing_support/factories/user_factory.rb +21 -0
  470. data/lib/spree/testing_support/factories/variant_factory.rb +43 -0
  471. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +11 -0
  472. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +22 -0
  473. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +11 -0
  474. data/lib/spree/testing_support/factories/zone_factory.rb +24 -0
  475. data/lib/spree/testing_support/factories.rb +7 -0
  476. data/lib/spree/testing_support/flash.rb +29 -0
  477. data/lib/spree/testing_support/order_walkthrough.rb +87 -0
  478. data/lib/spree/testing_support/preferences.rb +34 -0
  479. data/lib/spree/testing_support/sequences.rb +8 -0
  480. data/lib/spree/testing_support/shared_examples/gallery.rb +18 -0
  481. data/lib/spree/testing_support/url_helpers.rb +11 -0
  482. data/lib/spree_core.rb +3 -0
  483. data/lib/tasks/core.rake +104 -0
  484. data/lib/tasks/email.rake +9 -0
  485. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +115 -0
  486. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +20 -0
  487. data/lib/tasks/migrations/migrate_user_addresses.rake +31 -0
  488. data/lib/tasks/migrations/rename_gateways.rake +21 -0
  489. data/lib/tasks/order_capturing.rake +25 -0
  490. data/script/rails +10 -0
  491. data/solidus_core.gemspec +48 -0
  492. data/spec/fixtures/thinking-cat.jpg +0 -0
  493. data/spec/helpers/base_helper_spec.rb +168 -0
  494. data/spec/helpers/products_helper_spec.rb +200 -0
  495. data/spec/helpers/taxons_helper_spec.rb +41 -0
  496. data/spec/jobs/promotion_code_batch_job_spec.rb +96 -0
  497. data/spec/lib/calculated_adjustments_spec.rb +133 -0
  498. data/spec/lib/i18n_spec.rb +92 -0
  499. data/spec/lib/search/base_spec.rb +87 -0
  500. data/spec/lib/search/variant_spec.rb +115 -0
  501. data/spec/lib/spree/core/class_constantizer_spec.rb +71 -0
  502. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +69 -0
  503. data/spec/lib/spree/core/controller_helpers/order_spec.rb +126 -0
  504. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +195 -0
  505. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +81 -0
  506. data/spec/lib/spree/core/controller_helpers/search_spec.rb +21 -0
  507. data/spec/lib/spree/core/controller_helpers/store_spec.rb +18 -0
  508. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +41 -0
  509. data/spec/lib/spree/core/current_store_spec.rb +33 -0
  510. data/spec/lib/spree/core/environment_extension_spec.rb +36 -0
  511. data/spec/lib/spree/core/importer/order_spec.rb +484 -0
  512. data/spec/lib/spree/core/role_configuration_spec.rb +155 -0
  513. data/spec/lib/spree/core/stock_configuration_spec.rb +59 -0
  514. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +61 -0
  515. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +20 -0
  516. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +14 -0
  517. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +44 -0
  518. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +14 -0
  519. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +14 -0
  520. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +14 -0
  521. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +39 -0
  522. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +14 -0
  523. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +14 -0
  524. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +14 -0
  525. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +14 -0
  526. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +14 -0
  527. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +376 -0
  528. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +14 -0
  529. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +40 -0
  530. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +32 -0
  531. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +14 -0
  532. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +32 -0
  533. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +14 -0
  534. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +14 -0
  535. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +14 -0
  536. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +14 -0
  537. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +32 -0
  538. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +14 -0
  539. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +14 -0
  540. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +14 -0
  541. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +20 -0
  542. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +14 -0
  543. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +14 -0
  544. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +20 -0
  545. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +14 -0
  546. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +20 -0
  547. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +14 -0
  548. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +14 -0
  549. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +44 -0
  550. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +14 -0
  551. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +59 -0
  552. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +14 -0
  553. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +35 -0
  554. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +14 -0
  555. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +28 -0
  556. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +14 -0
  557. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +43 -0
  558. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +14 -0
  559. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +20 -0
  560. data/spec/lib/spree/core/testing_support/factories/store_credit_update_reason_factory_spec.rb +14 -0
  561. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +14 -0
  562. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +14 -0
  563. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +14 -0
  564. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +14 -0
  565. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +14 -0
  566. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +24 -0
  567. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +56 -0
  568. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +14 -0
  569. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +14 -0
  570. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +14 -0
  571. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +20 -0
  572. data/spec/lib/spree/core/testing_support/preferences_spec.rb +28 -0
  573. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  574. data/spec/lib/spree/core/version_spec.rb +19 -0
  575. data/spec/lib/spree/localized_number_spec.rb +45 -0
  576. data/spec/lib/spree/migrations_spec.rb +32 -0
  577. data/spec/lib/spree/money_spec.rb +305 -0
  578. data/spec/lib/spree/permission_sets/default_customer_spec.rb +22 -0
  579. data/spec/lib/tasks/dummy_task.rake +12 -0
  580. data/spec/lib/tasks/dummy_task_spec.rb +30 -0
  581. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +19 -0
  582. data/spec/mailers/carton_mailer_spec.rb +44 -0
  583. data/spec/mailers/order_mailer_spec.rb +117 -0
  584. data/spec/mailers/promotion_code_batch_mailer_spec.rb +47 -0
  585. data/spec/mailers/reimbursement_mailer_spec.rb +36 -0
  586. data/spec/mailers/test_mailer_spec.rb +11 -0
  587. data/spec/models/spree/ability_spec.rb +279 -0
  588. data/spec/models/spree/address_spec.rb +375 -0
  589. data/spec/models/spree/adjustment_reason_spec.rb +11 -0
  590. data/spec/models/spree/adjustment_spec.rb +339 -0
  591. data/spec/models/spree/app_configuration_spec.rb +55 -0
  592. data/spec/models/spree/asset_spec.rb +25 -0
  593. data/spec/models/spree/calculator/default_tax_spec.rb +260 -0
  594. data/spec/models/spree/calculator/distributed_amount_spec.rb +82 -0
  595. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +30 -0
  596. data/spec/models/spree/calculator/flat_rate_spec.rb +52 -0
  597. data/spec/models/spree/calculator/flexi_rate_spec.rb +158 -0
  598. data/spec/models/spree/calculator/free_shipping_spec.rb +8 -0
  599. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +20 -0
  600. data/spec/models/spree/calculator/percent_per_item_spec.rb +12 -0
  601. data/spec/models/spree/calculator/price_sack_spec.rb +35 -0
  602. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +70 -0
  603. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +39 -0
  604. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +18 -0
  605. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +56 -0
  606. data/spec/models/spree/calculator/shipping/per_item_spec.rb +25 -0
  607. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +35 -0
  608. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +99 -0
  609. data/spec/models/spree/calculator/tiered_percent_spec.rb +191 -0
  610. data/spec/models/spree/calculator_spec.rb +43 -0
  611. data/spec/models/spree/carton_spec.rb +137 -0
  612. data/spec/models/spree/classification_spec.rb +114 -0
  613. data/spec/models/spree/concerns/display_money_spec.rb +44 -0
  614. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +52 -0
  615. data/spec/models/spree/concerns/user_address_book_spec.rb +358 -0
  616. data/spec/models/spree/concerns/user_methods_spec.rb +121 -0
  617. data/spec/models/spree/country_spec.rb +78 -0
  618. data/spec/models/spree/credit_card_spec.rb +373 -0
  619. data/spec/models/spree/customer_return_spec.rb +293 -0
  620. data/spec/models/spree/distributed_amounts_handler_spec.rb +83 -0
  621. data/spec/models/spree/exchange_spec.rb +76 -0
  622. data/spec/models/spree/fulfilment_changer_spec.rb +307 -0
  623. data/spec/models/spree/gallery/product_gallery_spec.rb +21 -0
  624. data/spec/models/spree/gallery/variant_gallery_spec.rb +21 -0
  625. data/spec/models/spree/gateway/bogus_simple.rb +14 -0
  626. data/spec/models/spree/gateway/bogus_spec.rb +14 -0
  627. data/spec/models/spree/gateway_spec.rb +14 -0
  628. data/spec/models/spree/image_spec.rb +25 -0
  629. data/spec/models/spree/inventory_unit_spec.rb +312 -0
  630. data/spec/models/spree/line_item_spec.rb +240 -0
  631. data/spec/models/spree/option_type_spec.rb +16 -0
  632. data/spec/models/spree/option_value_spec.rb +52 -0
  633. data/spec/models/spree/order/address_spec.rb +52 -0
  634. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  635. data/spec/models/spree/order/callbacks_spec.rb +44 -0
  636. data/spec/models/spree/order/checkout_spec.rb +744 -0
  637. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  638. data/spec/models/spree/order/number_generator_spec.rb +47 -0
  639. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +137 -0
  640. data/spec/models/spree/order/payment_spec.rb +280 -0
  641. data/spec/models/spree/order/risk_assessment_spec.rb +70 -0
  642. data/spec/models/spree/order/state_machine_spec.rb +122 -0
  643. data/spec/models/spree/order/totals_spec.rb +26 -0
  644. data/spec/models/spree/order/updating_spec.rb +18 -0
  645. data/spec/models/spree/order/validations_spec.rb +17 -0
  646. data/spec/models/spree/order_cancellations_spec.rb +192 -0
  647. data/spec/models/spree/order_capturing_spec.rb +16 -0
  648. data/spec/models/spree/order_contents_spec.rb +362 -0
  649. data/spec/models/spree/order_inventory_spec.rb +278 -0
  650. data/spec/models/spree/order_merger_spec.rb +159 -0
  651. data/spec/models/spree/order_mutex_spec.rb +89 -0
  652. data/spec/models/spree/order_promotion_spec.rb +33 -0
  653. data/spec/models/spree/order_shipping_spec.rb +247 -0
  654. data/spec/models/spree/order_spec.rb +1633 -0
  655. data/spec/models/spree/order_taxation_spec.rb +128 -0
  656. data/spec/models/spree/order_update_attributes_spec.rb +49 -0
  657. data/spec/models/spree/order_updater_spec.rb +560 -0
  658. data/spec/models/spree/payment/cancellation_spec.rb +83 -0
  659. data/spec/models/spree/payment_create_spec.rb +205 -0
  660. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +10 -0
  661. data/spec/models/spree/payment_method/check_spec.rb +80 -0
  662. data/spec/models/spree/payment_method/credit_card_spec.rb +68 -0
  663. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +20 -0
  664. data/spec/models/spree/payment_method/store_credit_spec.rb +325 -0
  665. data/spec/models/spree/payment_method_spec.rb +408 -0
  666. data/spec/models/spree/payment_spec.rb +1274 -0
  667. data/spec/models/spree/permission_sets/base_spec.rb +14 -0
  668. data/spec/models/spree/permission_sets/configuration_display.rb +79 -0
  669. data/spec/models/spree/permission_sets/configuration_management_spec.rb +49 -0
  670. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +23 -0
  671. data/spec/models/spree/permission_sets/order_display_spec.rb +56 -0
  672. data/spec/models/spree/permission_sets/order_management_spec.rb +43 -0
  673. data/spec/models/spree/permission_sets/product_display_spec.rb +57 -0
  674. data/spec/models/spree/permission_sets/product_management_spec.rb +39 -0
  675. data/spec/models/spree/permission_sets/promotion_display_spec.rb +41 -0
  676. data/spec/models/spree/permission_sets/promotion_management_spec.rb +27 -0
  677. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +42 -0
  678. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +42 -0
  679. data/spec/models/spree/permission_sets/stock_display_spec.rb +25 -0
  680. data/spec/models/spree/permission_sets/stock_management_spec.rb +23 -0
  681. data/spec/models/spree/permission_sets/user_display_spec.rb +39 -0
  682. data/spec/models/spree/permission_sets/user_management_spec.rb +56 -0
  683. data/spec/models/spree/preference_spec.rb +79 -0
  684. data/spec/models/spree/preferences/configuration_spec.rb +27 -0
  685. data/spec/models/spree/preferences/preferable_spec.rb +334 -0
  686. data/spec/models/spree/preferences/scoped_store_spec.rb +62 -0
  687. data/spec/models/spree/preferences/static_model_preferences_spec.rb +79 -0
  688. data/spec/models/spree/preferences/statically_configurable_spec.rb +67 -0
  689. data/spec/models/spree/preferences/store_spec.rb +40 -0
  690. data/spec/models/spree/price_spec.rb +150 -0
  691. data/spec/models/spree/product/scopes_spec.rb +164 -0
  692. data/spec/models/spree/product_duplicator_spec.rb +92 -0
  693. data/spec/models/spree/product_filter_spec.rb +28 -0
  694. data/spec/models/spree/product_property_spec.rb +20 -0
  695. data/spec/models/spree/product_spec.rb +584 -0
  696. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +126 -0
  697. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +198 -0
  698. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +298 -0
  699. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +61 -0
  700. data/spec/models/spree/promotion/rules/first_order_spec.rb +77 -0
  701. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +71 -0
  702. data/spec/models/spree/promotion/rules/item_total_spec.rb +113 -0
  703. data/spec/models/spree/promotion/rules/nth_order_spec.rb +72 -0
  704. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +44 -0
  705. data/spec/models/spree/promotion/rules/option_value_spec.rb +96 -0
  706. data/spec/models/spree/promotion/rules/product_spec.rb +178 -0
  707. data/spec/models/spree/promotion/rules/store_spec.rb +35 -0
  708. data/spec/models/spree/promotion/rules/taxon_spec.rb +174 -0
  709. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +28 -0
  710. data/spec/models/spree/promotion/rules/user_role_spec.rb +88 -0
  711. data/spec/models/spree/promotion/rules/user_spec.rb +39 -0
  712. data/spec/models/spree/promotion_action_spec.rb +44 -0
  713. data/spec/models/spree/promotion_category_spec.rb +19 -0
  714. data/spec/models/spree/promotion_code/batch_builder_spec.rb +107 -0
  715. data/spec/models/spree/promotion_code_batch_spec.rb +54 -0
  716. data/spec/models/spree/promotion_code_spec.rb +206 -0
  717. data/spec/models/spree/promotion_handler/cart_spec.rb +132 -0
  718. data/spec/models/spree/promotion_handler/coupon_spec.rb +365 -0
  719. data/spec/models/spree/promotion_handler/page_spec.rb +45 -0
  720. data/spec/models/spree/promotion_handler/shipping_spec.rb +96 -0
  721. data/spec/models/spree/promotion_rule_spec.rb +34 -0
  722. data/spec/models/spree/promotion_spec.rb +834 -0
  723. data/spec/models/spree/refund_spec.rb +199 -0
  724. data/spec/models/spree/reimbursement/credit_spec.rb +38 -0
  725. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +144 -0
  726. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +85 -0
  727. data/spec/models/spree/reimbursement_performer_spec.rb +32 -0
  728. data/spec/models/spree/reimbursement_spec.rb +253 -0
  729. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +52 -0
  730. data/spec/models/spree/reimbursement_type/credit_spec.rb +55 -0
  731. data/spec/models/spree/reimbursement_type/exchange_spec.rb +47 -0
  732. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +109 -0
  733. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +99 -0
  734. data/spec/models/spree/return_authorization_spec.rb +226 -0
  735. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +79 -0
  736. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +59 -0
  737. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +86 -0
  738. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +35 -0
  739. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +31 -0
  740. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +42 -0
  741. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +66 -0
  742. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  743. data/spec/models/spree/return_item_spec.rb +776 -0
  744. data/spec/models/spree/returns_calculator_spec.rb +16 -0
  745. data/spec/models/spree/shipment_spec.rb +907 -0
  746. data/spec/models/spree/shipping_calculator_spec.rb +57 -0
  747. data/spec/models/spree/shipping_manifest_spec.rb +110 -0
  748. data/spec/models/spree/shipping_method_spec.rb +260 -0
  749. data/spec/models/spree/shipping_rate_spec.rb +154 -0
  750. data/spec/models/spree/shipping_rate_tax_spec.rb +79 -0
  751. data/spec/models/spree/state_spec.rb +43 -0
  752. data/spec/models/spree/stock/availability_spec.rb +143 -0
  753. data/spec/models/spree/stock/availability_validator_spec.rb +140 -0
  754. data/spec/models/spree/stock/content_item_spec.rb +70 -0
  755. data/spec/models/spree/stock/differentiator_spec.rb +41 -0
  756. data/spec/models/spree/stock/estimator_spec.rb +240 -0
  757. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +34 -0
  758. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +20 -0
  759. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +19 -0
  760. data/spec/models/spree/stock/package_spec.rb +182 -0
  761. data/spec/models/spree/stock/quantifier_spec.rb +113 -0
  762. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +18 -0
  763. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +18 -0
  764. data/spec/models/spree/stock/simple_coordinator_spec.rb +247 -0
  765. data/spec/models/spree/stock/splitter/backordered_spec.rb +31 -0
  766. data/spec/models/spree/stock/splitter/base_spec.rb +22 -0
  767. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +48 -0
  768. data/spec/models/spree/stock/splitter/weight_spec.rb +31 -0
  769. data/spec/models/spree/stock/splitter_chain_spec.rb +66 -0
  770. data/spec/models/spree/stock_item_spec.rb +347 -0
  771. data/spec/models/spree/stock_location_spec.rb +288 -0
  772. data/spec/models/spree/stock_movement_spec.rb +58 -0
  773. data/spec/models/spree/stock_quantities_spec.rb +249 -0
  774. data/spec/models/spree/store_credit_category_spec.rb +19 -0
  775. data/spec/models/spree/store_credit_event_spec.rb +328 -0
  776. data/spec/models/spree/store_credit_spec.rb +900 -0
  777. data/spec/models/spree/store_selector/by_server_name_spec.rb +28 -0
  778. data/spec/models/spree/store_selector/legacy_spec.rb +46 -0
  779. data/spec/models/spree/store_spec.rb +156 -0
  780. data/spec/models/spree/tax/order_adjuster_spec.rb +35 -0
  781. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +59 -0
  782. data/spec/models/spree/tax/tax_location_spec.rb +79 -0
  783. data/spec/models/spree/tax/taxation_integration_spec.rb +815 -0
  784. data/spec/models/spree/tax_calculator/default_spec.rb +56 -0
  785. data/spec/models/spree/tax_category_spec.rb +29 -0
  786. data/spec/models/spree/tax_rate_spec.rb +316 -0
  787. data/spec/models/spree/taxon_spec.rb +169 -0
  788. data/spec/models/spree/taxonomy_spec.rb +15 -0
  789. data/spec/models/spree/unit_cancel_spec.rb +61 -0
  790. data/spec/models/spree/user_spec.rb +247 -0
  791. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +33 -0
  792. data/spec/models/spree/variant/price_selector_spec.rb +90 -0
  793. data/spec/models/spree/variant/pricing_options_spec.rb +181 -0
  794. data/spec/models/spree/variant/scopes_spec.rb +94 -0
  795. data/spec/models/spree/variant/vat_price_generator_spec.rb +77 -0
  796. data/spec/models/spree/variant_property_rule_condition_spec.rb +17 -0
  797. data/spec/models/spree/variant_property_rule_spec.rb +85 -0
  798. data/spec/models/spree/variant_property_rule_value_spec.rb +20 -0
  799. data/spec/models/spree/variant_spec.rb +822 -0
  800. data/spec/models/spree/wallet_payment_source_spec.rb +48 -0
  801. data/spec/models/spree/wallet_spec.rb +155 -0
  802. data/spec/models/spree/zone_spec.rb +248 -0
  803. data/spec/rails_helper.rb +45 -0
  804. data/spec/shared_examples/calculator_shared_examples.rb +10 -0
  805. data/spec/spec_helper.rb +39 -0
  806. data/spec/support/big_decimal.rb +7 -0
  807. data/spec/support/concerns/default_price.rb +36 -0
  808. data/spec/support/concerns/payment_source.rb +66 -0
  809. data/spec/support/concerns/working_factories.rb +15 -0
  810. data/spec/support/dummy_ability.rb +7 -0
  811. data/spec/support/shared_contexts/rake.rb +32 -0
  812. data/vendor/assets/javascripts/jquery.payment.js +648 -0
  813. data/vendor/assets/javascripts/jsuri.js +2 -0
  814. data/vendor/assets/stylesheets/normalize.css +375 -0
  815. metadata +1226 -0
@@ -0,0 +1,1633 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Spree::Order, type: :model do
6
+ let(:store) { create(:store) }
7
+ let(:user) { create(:user, email: "spree@example.com") }
8
+ let(:order) { create(:order, user: user, store: store) }
9
+ let(:promotion) do
10
+ FactoryBot.create(
11
+ :promotion,
12
+ :with_order_adjustment,
13
+ code: "discount"
14
+ )
15
+ end
16
+ let(:code) { promotion.codes.first }
17
+
18
+ before do
19
+ allow(Spree::LegacyUser).to receive_messages(current: mock_model(Spree::LegacyUser, id: 123))
20
+ end
21
+
22
+ context '#store' do
23
+ it { is_expected.to respond_to(:store) }
24
+
25
+ context 'when there is no store assigned' do
26
+ subject { Spree::Order.new }
27
+
28
+ context 'when there is no default store' do
29
+ it "will not be valid" do
30
+ expect(subject).not_to be_valid
31
+ end
32
+ end
33
+
34
+ context "when there is a default store" do
35
+ let!(:store) { create(:store) }
36
+
37
+ it { is_expected.to be_valid }
38
+ end
39
+ end
40
+
41
+ context 'when a store is assigned' do
42
+ subject { Spree::Order.new(store: create(:store)) }
43
+ it { is_expected.to be_valid }
44
+ end
45
+ end
46
+
47
+ describe "#cancel!" do
48
+ subject { order.cancel! }
49
+
50
+ context "with captured store credit" do
51
+ let!(:store_credit_payment_method) { create(:store_credit_payment_method) }
52
+ let(:order_total) { 500.00 }
53
+ let(:store_credit) { create(:store_credit, amount: order_total) }
54
+ let(:order) { create(:order_with_line_items, user: store_credit.user, line_items_price: order_total) }
55
+
56
+ before do
57
+ order.add_store_credit_payments
58
+ order.finalize!
59
+ order.capture_payments!
60
+ end
61
+
62
+ it "cancels the order" do
63
+ expect{ subject }.to change{ order.can_cancel? }.from(true).to(false)
64
+ expect(order).to be_canceled
65
+ end
66
+
67
+ it "places the order into the canceled scope" do
68
+ expect{ subject }.to change{ Spree::Order.canceled.include?(order) }.from(false).to(true)
69
+ end
70
+
71
+ it "removes the order from the not_canceled scope" do
72
+ expect{ subject }.to change{ Spree::Order.not_canceled.include?(order) }.from(true).to(false)
73
+ end
74
+ end
75
+
76
+ context "with fully refunded payment" do
77
+ let(:order) { create(:completed_order_with_totals) }
78
+ let(:payment_amount) { 50 }
79
+ let(:payment) { create(:payment, order: order, amount: payment_amount, state: 'completed') }
80
+
81
+ before do
82
+ create(:refund, payment: payment, amount: payment_amount)
83
+ end
84
+
85
+ it "cancels the order" do
86
+ expect{ subject }.to change{ order.can_cancel? }.from(true).to(false)
87
+ expect(order).to be_canceled
88
+ end
89
+ end
90
+ end
91
+
92
+ context "#canceled_by" do
93
+ let(:admin_user) { create :admin_user }
94
+ let(:order) { create :order }
95
+
96
+ before do
97
+ allow(order).to receive(:cancel!)
98
+ end
99
+
100
+ subject { order.canceled_by(admin_user) }
101
+
102
+ it 'should cancel the order' do
103
+ expect(order).to receive(:cancel!)
104
+ subject
105
+ end
106
+
107
+ it 'should save canceler_id' do
108
+ subject
109
+ expect(order.reload.canceler_id).to eq(admin_user.id)
110
+ end
111
+
112
+ it 'should save canceled_at' do
113
+ subject
114
+ expect(order.reload.canceled_at).to_not be_nil
115
+ end
116
+
117
+ it 'should have canceler' do
118
+ subject
119
+ expect(order.reload.canceler).to eq(admin_user)
120
+ end
121
+ end
122
+
123
+ context "#create" do
124
+ let!(:store) { create :store }
125
+ let(:order) { Spree::Order.create }
126
+
127
+ it "should assign an order number" do
128
+ expect(order.number).not_to be_nil
129
+ end
130
+
131
+ it 'should create a randomized 22 character token' do
132
+ expect(order.guest_token.size).to eq(22)
133
+ end
134
+ end
135
+
136
+ context "creates shipments cost" do
137
+ let(:shipment) { double }
138
+
139
+ before { allow(order).to receive_messages shipments: [shipment] }
140
+
141
+ it "update and persist totals" do
142
+ expect(shipment).to receive :update_amounts
143
+ expect(order.updater).to receive :update
144
+
145
+ Spree::Deprecation.silence do
146
+ order.set_shipments_cost
147
+ end
148
+ end
149
+ end
150
+
151
+ context "insufficient_stock_lines" do
152
+ let(:line_item) { mock_model Spree::LineItem, insufficient_stock?: true }
153
+
154
+ before { allow(order).to receive_messages(line_items: [line_item]) }
155
+
156
+ it "should return line_item that has insufficient stock on hand" do
157
+ expect(order.insufficient_stock_lines.size).to eq(1)
158
+ expect(order.insufficient_stock_lines.include?(line_item)).to be true
159
+ end
160
+ end
161
+
162
+ describe '#ensure_line_item_variants_are_not_deleted' do
163
+ subject { order.ensure_line_item_variants_are_not_deleted }
164
+
165
+ let(:order) { create :order_with_line_items }
166
+
167
+ context 'when variant is destroyed' do
168
+ before do
169
+ allow(order).to receive(:restart_checkout_flow)
170
+ order.line_items.first.variant.discard
171
+ end
172
+
173
+ it 'should restart checkout flow' do
174
+ expect(order).to receive(:restart_checkout_flow).once
175
+ subject
176
+ end
177
+
178
+ it 'should have error message' do
179
+ subject
180
+ expect(order.errors[:base]).to include(I18n.t('spree.deleted_variants_present'))
181
+ end
182
+
183
+ it 'should be false' do
184
+ expect(subject).to be_falsey
185
+ end
186
+ end
187
+
188
+ context 'when no variants are destroyed' do
189
+ it 'should not restart checkout' do
190
+ expect(order).to receive(:restart_checkout_flow).never
191
+ subject
192
+ end
193
+
194
+ it 'should be true' do
195
+ expect(subject).to be_truthy
196
+ end
197
+ end
198
+ end
199
+
200
+ context "empty!" do
201
+ let!(:order) { create(:order) }
202
+
203
+ before do
204
+ create(:line_item, order: order)
205
+ create(:shipment, order: order)
206
+ create(:adjustment, adjustable: order, order: order)
207
+ promotion.activate(order: order, promotion_code: code)
208
+ order.recalculate
209
+
210
+ # Make sure we are asserting changes
211
+ expect(order.line_items).not_to be_empty
212
+ expect(order.shipments).not_to be_empty
213
+ expect(order.adjustments).not_to be_empty
214
+ expect(order.promotions).not_to be_empty
215
+ expect(order.item_total).not_to eq 0
216
+ expect(order.item_count).not_to eq 0
217
+ expect(order.shipment_total).not_to eq 0
218
+ expect(order.adjustment_total).not_to eq 0
219
+ end
220
+
221
+ it "clears out line items, adjustments and update totals" do
222
+ order.empty!
223
+ expect(order.line_items).to be_empty
224
+ expect(order.shipments).to be_empty
225
+ expect(order.adjustments).to be_empty
226
+ expect(order.promotions).to be_empty
227
+ expect(order.item_total).to eq 0
228
+ expect(order.item_count).to eq 0
229
+ expect(order.shipment_total).to eq 0
230
+ expect(order.adjustment_total).to eq 0
231
+ end
232
+ end
233
+
234
+ context '#outstanding_balance' do
235
+ let(:order) { create(:order_ready_to_ship, line_items_count: 3) }
236
+ let(:payment) { order.payments.first }
237
+
238
+ it "should handle refunds properly" do
239
+ order.cancellations.short_ship([order.inventory_units.first])
240
+ expect(order.outstanding_balance).to be_negative
241
+ expect(order.payment_state).to eq('credit_owed')
242
+ create(:refund, amount: order.outstanding_balance.abs, payment: payment, transaction_id: nil)
243
+ order.reload
244
+ expect(order.outstanding_balance).to eq(0)
245
+ expect(order.payment_state).to eq('paid')
246
+ end
247
+ end
248
+
249
+ context "#display_outstanding_balance" do
250
+ it "returns the value as a spree money" do
251
+ allow(order).to receive(:outstanding_balance) { 10.55 }
252
+ expect(order.display_outstanding_balance).to eq(Spree::Money.new(10.55))
253
+ end
254
+ end
255
+
256
+ context "#display_item_total" do
257
+ it "returns the value as a spree money" do
258
+ allow(order).to receive(:item_total) { 10.55 }
259
+ expect(order.display_item_total).to eq(Spree::Money.new(10.55))
260
+ end
261
+ end
262
+
263
+ context "#display_adjustment_total" do
264
+ it "returns the value as a spree money" do
265
+ order.adjustment_total = 10.55
266
+ expect(order.display_adjustment_total).to eq(Spree::Money.new(10.55))
267
+ end
268
+ end
269
+
270
+ context "#display_total" do
271
+ it "returns the value as a spree money" do
272
+ order.total = 10.55
273
+ expect(order.display_total).to eq(Spree::Money.new(10.55))
274
+ end
275
+ end
276
+
277
+ context "#currency" do
278
+ context "when object currency is ABC" do
279
+ before { order.currency = "ABC" }
280
+
281
+ it "returns the currency from the object" do
282
+ expect(order.currency).to eq("ABC")
283
+ end
284
+ end
285
+
286
+ context "when object currency is nil" do
287
+ before { order.currency = nil }
288
+
289
+ it "returns the globally configured currency" do
290
+ expect(order.currency).to eq("USD")
291
+ end
292
+ end
293
+ end
294
+
295
+ describe '#merge!' do
296
+ let(:order1) { create(:order_with_line_items) }
297
+ let(:order2) { create(:order_with_line_items) }
298
+
299
+ it 'merges the orders' do
300
+ order1.merge!(order2)
301
+ expect(order1.line_items.count).to eq(2)
302
+ expect(order2.destroyed?).to be_truthy
303
+ end
304
+
305
+ describe 'order_merger_class customization' do
306
+ before do
307
+ class TestOrderMerger
308
+ def initialize(order)
309
+ @order = order
310
+ end
311
+
312
+ def merge!(other_order, user = nil)
313
+ [@order, other_order, user]
314
+ end
315
+ end
316
+ Spree::Config.order_merger_class = TestOrderMerger
317
+ end
318
+
319
+ let(:user) { build(:user) }
320
+
321
+ it 'uses the configured order merger' do
322
+ expect(order1.merge!(order2, user)).to eq([order1, order2, user])
323
+ end
324
+ end
325
+ end
326
+
327
+ context "add_update_hook" do
328
+ before do
329
+ Spree::Order.class_eval do
330
+ register_update_hook :add_awesome_sauce
331
+ end
332
+ end
333
+
334
+ after do
335
+ Spree::Order.update_hooks = Set.new
336
+ end
337
+
338
+ it "calls hook during update" do
339
+ order = create(:order)
340
+ expect(order).to receive(:add_awesome_sauce)
341
+ order.recalculate
342
+ end
343
+
344
+ it "calls hook during finalize" do
345
+ order = create(:order)
346
+ expect(order).to receive(:add_awesome_sauce)
347
+ order.finalize!
348
+ end
349
+ end
350
+
351
+ context "ensure shipments will be updated" do
352
+ subject(:order) { create :order }
353
+ before do
354
+ Spree::Shipment.create!(order: order)
355
+ end
356
+
357
+ ['payment', 'confirm'].each do |order_state|
358
+ context "when ther order is in the #{order_state} state" do
359
+ before do
360
+ order.state = order_state
361
+ order.shipments.create!
362
+ end
363
+
364
+ it "destroys current shipments" do
365
+ order.ensure_updated_shipments
366
+ expect(order.shipments).to be_empty
367
+ end
368
+
369
+ it "puts order back in address state" do
370
+ order.ensure_updated_shipments
371
+ expect(order.state).to eql "cart"
372
+ end
373
+
374
+ it "resets shipment_total" do
375
+ order.update_column(:shipment_total, 5)
376
+ order.ensure_updated_shipments
377
+ expect(order.shipment_total).to eq(0)
378
+ end
379
+
380
+ it "does nothing if any shipments are ready" do
381
+ shipment = create(:shipment, order: subject, state: "ready")
382
+ expect { subject.ensure_updated_shipments }.not_to change { subject.reload.shipments.pluck(:id) }
383
+ expect { shipment.reload }.not_to raise_error
384
+ end
385
+
386
+ it "does nothing if any shipments are shipped" do
387
+ shipment = create(:shipment, order: subject, state: "shipped")
388
+ expect { subject.ensure_updated_shipments }.not_to change { subject.reload.shipments.pluck(:id) }
389
+ expect { shipment.reload }.not_to raise_error
390
+ end
391
+ end
392
+ end
393
+
394
+ context 'when the order is in address state' do
395
+ before do
396
+ order.state = 'address'
397
+ order.shipments.create!
398
+ end
399
+
400
+ it "destroys current shipments" do
401
+ order.ensure_updated_shipments
402
+ expect(order.shipments).to be_empty
403
+ end
404
+
405
+ it "resets shipment_total" do
406
+ order.update_column(:shipment_total, 5)
407
+ order.ensure_updated_shipments
408
+ expect(order.shipment_total).to eq(0)
409
+ end
410
+
411
+ it "puts the order in the cart state" do
412
+ order.ensure_updated_shipments
413
+ expect(order.state).to eq "cart"
414
+ end
415
+ end
416
+
417
+ context 'when the order is completed' do
418
+ before do
419
+ order.state = 'complete'
420
+ order.completed_at = Time.current
421
+ order.update_column(:shipment_total, 5)
422
+ order.shipments.create!
423
+ end
424
+
425
+ it "does not destroy the current shipments" do
426
+ expect {
427
+ order.ensure_updated_shipments
428
+ }.not_to change { order.shipments }
429
+ end
430
+
431
+ it "does not reset the shipment total" do
432
+ expect {
433
+ order.ensure_updated_shipments
434
+ }.not_to change { order.shipment_total }
435
+ end
436
+
437
+ it "does not put the order back in the address state" do
438
+ expect {
439
+ order.ensure_updated_shipments
440
+ }.not_to change { order.state }
441
+ end
442
+ end
443
+
444
+ context "except when order is completed, that's OrderInventory job" do
445
+ it "doesn't touch anything" do
446
+ allow(order).to receive_messages completed?: true
447
+ order.update_column(:shipment_total, 5)
448
+ order.shipments.create!
449
+
450
+ expect {
451
+ order.ensure_updated_shipments
452
+ }.not_to change { order.shipment_total }
453
+
454
+ expect {
455
+ order.ensure_updated_shipments
456
+ }.not_to change { order.shipments }
457
+
458
+ expect {
459
+ order.ensure_updated_shipments
460
+ }.not_to change { order.state }
461
+ end
462
+ end
463
+ end
464
+
465
+ describe "#tax_address" do
466
+ let(:order) { build(:order, ship_address: ship_address, bill_address: bill_address, store: store) }
467
+ let(:store) { build(:store) }
468
+
469
+ before { Spree::Config[:tax_using_ship_address] = tax_using_ship_address }
470
+ subject { order.tax_address }
471
+
472
+ context "when the order has no addresses" do
473
+ let(:ship_address) { nil }
474
+ let(:bill_address) { nil }
475
+
476
+ context "when tax_using_ship_address is true" do
477
+ let(:tax_using_ship_address) { true }
478
+
479
+ it 'returns the stores default cart tax location' do
480
+ expect(subject).to eq(store.default_cart_tax_location)
481
+ end
482
+ end
483
+
484
+ context "when tax_using_ship_address is not true" do
485
+ let(:tax_using_ship_address) { false }
486
+
487
+ it 'returns the stores default cart tax location' do
488
+ expect(subject).to eq(store.default_cart_tax_location)
489
+ end
490
+ end
491
+ end
492
+
493
+ context "when the order has addresses" do
494
+ let(:ship_address) { build(:address) }
495
+ let(:bill_address) { build(:address) }
496
+
497
+ context "when tax_using_ship_address is true" do
498
+ let(:tax_using_ship_address) { true }
499
+
500
+ it 'returns ship_address' do
501
+ expect(subject).to eq(order.ship_address)
502
+ end
503
+ end
504
+
505
+ context "when tax_using_ship_address is not true" do
506
+ let(:tax_using_ship_address) { false }
507
+
508
+ it "returns bill_address" do
509
+ expect(subject).to eq(order.bill_address)
510
+ end
511
+ end
512
+ end
513
+ end
514
+
515
+ describe "#restart_checkout_flow" do
516
+ context "when in cart state" do
517
+ let(:order) { create(:order_with_totals, state: "cart") }
518
+
519
+ it "remains in cart state" do
520
+ expect { order.restart_checkout_flow }.not_to change { order.state }
521
+ end
522
+ end
523
+ it "updates the state column to the first checkout_steps value" do
524
+ order = create(:order_with_totals, state: "delivery")
525
+ expect(order.checkout_steps).to eql %w(address delivery payment confirm complete)
526
+ expect{ order.restart_checkout_flow }.to change{ order.state }.from("delivery").to("address")
527
+ end
528
+
529
+ context "without line items" do
530
+ it "updates the state column to cart" do
531
+ order = create(:order, state: "delivery")
532
+ expect{ order.restart_checkout_flow }.to change{ order.state }.from("delivery").to("cart")
533
+ end
534
+ end
535
+ end
536
+
537
+ # Regression tests for https://github.com/spree/spree/issues/4072
538
+ context "#state_changed" do
539
+ let(:order) { FactoryBot.create(:order) }
540
+
541
+ it "logs state changes" do
542
+ order.update_column(:payment_state, 'balance_due')
543
+ order.payment_state = 'paid'
544
+ expect(order.state_changes).to be_empty
545
+ Spree::Deprecation.silence do
546
+ order.state_changed('payment')
547
+ end
548
+ state_change = order.state_changes.find_by(name: 'payment')
549
+ expect(state_change.previous_state).to eq('balance_due')
550
+ expect(state_change.next_state).to eq('paid')
551
+ end
552
+
553
+ it "does not do anything if state does not change" do
554
+ order.update_column(:payment_state, 'balance_due')
555
+ expect(order.state_changes).to be_empty
556
+ Spree::Deprecation.silence do
557
+ order.state_changed('payment')
558
+ end
559
+ expect(order.state_changes).to be_empty
560
+ end
561
+ end
562
+
563
+ # Regression test for https://github.com/spree/spree/issues/4199
564
+ context "#available_payment_methods" do
565
+ it "includes frontend payment methods" do
566
+ payment_method = Spree::PaymentMethod::Check.create!({
567
+ name: "Fake",
568
+ active: true,
569
+ available_to_users: true,
570
+ available_to_admin: false
571
+ })
572
+ expect(order.available_payment_methods).to include(payment_method)
573
+ end
574
+
575
+ it "includes 'both' payment methods" do
576
+ payment_method = Spree::PaymentMethod::Check.create!({
577
+ name: "Fake",
578
+ active: true,
579
+ available_to_users: true,
580
+ available_to_admin: true
581
+ })
582
+ expect(order.available_payment_methods).to include(payment_method)
583
+ end
584
+
585
+ it "does not include a payment method twice" do
586
+ payment_method = Spree::PaymentMethod::Check.create!({
587
+ name: "Fake",
588
+ active: true,
589
+ available_to_users: true,
590
+ available_to_admin: true
591
+ })
592
+ expect(order.available_payment_methods.count).to eq(1)
593
+ expect(order.available_payment_methods).to include(payment_method)
594
+ end
595
+
596
+ it "does not include inactive payment methods" do
597
+ Spree::PaymentMethod::Check.create!({
598
+ name: "Fake",
599
+ active: false,
600
+ available_to_users: true,
601
+ available_to_admin: true
602
+ })
603
+ expect(order.available_payment_methods.count).to eq(0)
604
+ end
605
+
606
+ context "with more than one payment method" do
607
+ subject { order.available_payment_methods }
608
+
609
+ let!(:first_method) {
610
+ FactoryBot.create(:payment_method, available_to_users: true,
611
+ available_to_admin: true)
612
+ }
613
+ let!(:second_method) {
614
+ FactoryBot.create(:payment_method, available_to_users: true,
615
+ available_to_admin: true)
616
+ }
617
+
618
+ before do
619
+ second_method.move_to_top
620
+ end
621
+
622
+ it "respects the order of methods based on position" do
623
+ expect(subject).to eq([second_method, first_method])
624
+ end
625
+ end
626
+
627
+ context 'when the order has a store' do
628
+ let(:order) { create(:order) }
629
+
630
+ let!(:store_with_payment_methods) do
631
+ create(:store,
632
+ payment_methods: [payment_method_with_store])
633
+ end
634
+ let!(:payment_method_with_store) { create(:payment_method) }
635
+ let!(:store_without_payment_methods) { create(:store) }
636
+ let!(:payment_method_without_store) { create(:payment_method) }
637
+
638
+ context 'when the store has payment methods' do
639
+ before { order.update_attributes!(store: store_with_payment_methods) }
640
+
641
+ it 'returns only the matching payment methods for that store' do
642
+ expect(order.available_payment_methods).to match_array(
643
+ [payment_method_with_store]
644
+ )
645
+ end
646
+
647
+ context 'and the store has an extra payment method unavailable to users' do
648
+ let!(:admin_only_payment_method) do
649
+ create(:payment_method,
650
+ available_to_users: false,
651
+ available_to_admin: true)
652
+ end
653
+
654
+ before do
655
+ store_with_payment_methods.payment_methods << admin_only_payment_method
656
+ end
657
+
658
+ it 'returns only the payment methods available to users for that store' do
659
+ expect(order.available_payment_methods).to match_array(
660
+ [payment_method_with_store]
661
+ )
662
+ end
663
+ end
664
+ end
665
+
666
+ context 'when the store does not have payment methods' do
667
+ before { order.update_attributes!(store: store_without_payment_methods) }
668
+
669
+ it 'returns all matching payment methods regardless of store' do
670
+ expect(order.available_payment_methods).to match_array(
671
+ [payment_method_with_store, payment_method_without_store]
672
+ )
673
+ end
674
+ end
675
+ end
676
+ end
677
+
678
+ context "#apply_shipping_promotions" do
679
+ it "calls out to the Shipping promotion handler" do
680
+ expect_any_instance_of(Spree::PromotionHandler::Shipping).to(
681
+ receive(:activate)
682
+ ).and_call_original
683
+
684
+ expect(order.updater).to receive(:update).and_call_original
685
+
686
+ order.apply_shipping_promotions
687
+ end
688
+ end
689
+
690
+ context "#products" do
691
+ before :each do
692
+ @variant1 = mock_model(Spree::Variant, product: "product1")
693
+ @variant2 = mock_model(Spree::Variant, product: "product2")
694
+ @line_items = [mock_model(Spree::LineItem, product: "product1", variant: @variant1, variant_id: @variant1.id, quantity: 1),
695
+ mock_model(Spree::LineItem, product: "product2", variant: @variant2, variant_id: @variant2.id, quantity: 2)]
696
+ allow(order).to receive_messages(line_items: @line_items)
697
+ end
698
+
699
+ it "contains?" do
700
+ expect(order.contains?(@variant1)).to be true
701
+ end
702
+
703
+ it "gets the quantity of a given variant" do
704
+ expect(order.quantity_of(@variant1)).to eq(1)
705
+
706
+ @variant3 = mock_model(Spree::Variant, product: "product3")
707
+ expect(order.quantity_of(@variant3)).to eq(0)
708
+ end
709
+
710
+ it "can find a line item matching a given variant" do
711
+ expect(order.find_line_item_by_variant(@variant1)).not_to be_nil
712
+ expect(order.find_line_item_by_variant(mock_model(Spree::Variant))).to be_nil
713
+ end
714
+
715
+ context "match line item with options" do
716
+ before do
717
+ Spree::Order.register_line_item_comparison_hook(:foos_match)
718
+ end
719
+
720
+ after do
721
+ # reset to avoid test pollution
722
+ Spree::Order.line_item_comparison_hooks = Set.new
723
+ end
724
+
725
+ it "matches line item when options match" do
726
+ allow(order).to receive(:foos_match).and_return(true)
727
+ expect(order.line_item_options_match(@line_items.first, { foos: { bar: :zoo } })).to be true
728
+ end
729
+
730
+ it "does not match line item without options" do
731
+ allow(order).to receive(:foos_match).and_return(false)
732
+ expect(order.line_item_options_match(@line_items.first, {})).to be false
733
+ end
734
+ end
735
+ end
736
+
737
+ describe "#generate_order_number" do
738
+ let(:order) { build(:order) }
739
+
740
+ context "with default app configuration" do
741
+ it 'calls the default order number generator' do
742
+ expect_any_instance_of(Spree::Order::NumberGenerator).to receive(:generate)
743
+ order.generate_order_number
744
+ end
745
+ end
746
+
747
+ context "with order number generator configured" do
748
+ class TruthNumberGenerator
749
+ def initialize(options = {}); end
750
+
751
+ def generate
752
+ '42'
753
+ end
754
+ end
755
+
756
+ before do
757
+ expect(Spree::Config).to receive(:order_number_generator) do
758
+ TruthNumberGenerator.new
759
+ end
760
+ end
761
+
762
+ it 'calls the configured order number generator' do
763
+ order.generate_order_number
764
+ expect(order.number).to eq '42'
765
+ end
766
+ end
767
+
768
+ context "with number already present" do
769
+ before do
770
+ order.number = '123'
771
+ end
772
+
773
+ it 'does not generate new number' do
774
+ order.generate_order_number
775
+ expect(order.number).to eq '123'
776
+ end
777
+ end
778
+
779
+ context "passing options" do
780
+ it 'is deprecated' do
781
+ expect(Spree::Deprecation).to receive(:warn)
782
+ order.generate_order_number(length: 2)
783
+ end
784
+ end
785
+ end
786
+
787
+ context "#associate_user!" do
788
+ let!(:user) { FactoryBot.create(:user) }
789
+
790
+ it "should associate a user with a persisted order" do
791
+ order = FactoryBot.create(:order_with_line_items, created_by: nil)
792
+ order.user = nil
793
+ order.email = nil
794
+ order.associate_user!(user)
795
+ expect(order.user).to eq(user)
796
+ expect(order.email).to eq(user.email)
797
+ expect(order.created_by).to eq(user)
798
+
799
+ # verify that the changes we made were persisted
800
+ order.reload
801
+ expect(order.user).to eq(user)
802
+ expect(order.email).to eq(user.email)
803
+ expect(order.created_by).to eq(user)
804
+ end
805
+
806
+ it "should not overwrite the created_by if it already is set" do
807
+ creator = create(:user)
808
+ order = FactoryBot.create(:order_with_line_items, created_by: creator)
809
+
810
+ order.user = nil
811
+ order.email = nil
812
+ order.associate_user!(user)
813
+ expect(order.user).to eq(user)
814
+ expect(order.email).to eq(user.email)
815
+ expect(order.created_by).to eq(creator)
816
+
817
+ # verify that the changes we made were persisted
818
+ order.reload
819
+ expect(order.user).to eq(user)
820
+ expect(order.email).to eq(user.email)
821
+ expect(order.created_by).to eq(creator)
822
+ end
823
+
824
+ it "should associate a user with a non-persisted order" do
825
+ order = Spree::Order.new
826
+
827
+ expect do
828
+ order.associate_user!(user)
829
+ end.to change { [order.user, order.email] }.from([nil, nil]).to([user, user.email])
830
+ end
831
+
832
+ it "should not persist an invalid address" do
833
+ address = Spree::Address.new
834
+ order.user = nil
835
+ order.email = nil
836
+ order.ship_address = address
837
+ expect do
838
+ order.associate_user!(user)
839
+ end.not_to change { address.persisted? }.from(false)
840
+ end
841
+ end
842
+
843
+ context "#assign_default_user_addresses" do
844
+ let(:order) { Spree::Order.new }
845
+
846
+ subject { order.assign_default_user_addresses }
847
+
848
+ context "when no user is associated to the order" do
849
+ it "does not associate any bill address" do
850
+ expect { subject }.not_to change { order.bill_address }.from(nil)
851
+ end
852
+
853
+ it "does not associate any ship address" do
854
+ expect { subject }.not_to change { order.ship_address }.from(nil)
855
+ end
856
+ end
857
+
858
+ context "when user is associated to the order" do
859
+ let(:user) { build_stubbed(:user) }
860
+ let(:bill_address) { nil }
861
+ let(:ship_address) { nil }
862
+
863
+ before do
864
+ order.associate_user!(user)
865
+ user.bill_address = bill_address
866
+ user.ship_address = ship_address
867
+ end
868
+
869
+ context "but has no bill address associated" do
870
+ it "does not associate any bill address" do
871
+ expect { subject }.not_to change { order.bill_address }.from(nil)
872
+ end
873
+ end
874
+
875
+ context "and has an invalid bill address associated " do
876
+ let(:bill_address) { build(:address, firstname: nil) } # invalid address
877
+
878
+ it "does not associate any bill address" do
879
+ expect { subject }.not_to change { order.bill_address }.from(nil)
880
+ end
881
+ end
882
+
883
+ context "and has a valid address associated " do
884
+ let(:bill_address) { build(:address) }
885
+
886
+ it "does associate user bill address" do
887
+ expect { subject }.to change { order.bill_address }.from(nil).to(bill_address)
888
+ end
889
+ end
890
+
891
+ context "but has no ship address associated" do
892
+ it "does not associate any ship address" do
893
+ expect { subject }.not_to change { order.ship_address }.from(nil)
894
+ end
895
+ end
896
+
897
+ context "and has an invalid ship address associated " do
898
+ let(:ship_address) { build(:address, firstname: nil) } # invalid address
899
+
900
+ it "does not associate any ship address" do
901
+ expect { subject }.not_to change { order.ship_address }.from(nil)
902
+ end
903
+ end
904
+
905
+ context "and has a valid ship address associated" do
906
+ let(:ship_address) { build(:address) }
907
+
908
+ it "does associate user ship address" do
909
+ expect { subject }.to change { order.ship_address }.from(nil).to(ship_address)
910
+ end
911
+
912
+ context 'when checkout step does not include delivery' do
913
+ before do
914
+ expect(order).to receive(:checkout_steps) { %w[some step] }
915
+ end
916
+
917
+ it "does not associate any ship address" do
918
+ expect { subject }.not_to change { order.ship_address }.from(nil)
919
+ end
920
+ end
921
+ end
922
+ end
923
+ end
924
+
925
+ context "#can_ship?" do
926
+ let(:order) { Spree::Order.create }
927
+
928
+ it "should be true for order in the 'complete' state" do
929
+ allow(order).to receive_messages(complete?: true)
930
+ expect(order.can_ship?).to be true
931
+ end
932
+
933
+ it "should be true for order in the 'resumed' state" do
934
+ allow(order).to receive_messages(resumed?: true)
935
+ expect(order.can_ship?).to be true
936
+ end
937
+
938
+ it "should be true for an order in the 'awaiting return' state" do
939
+ allow(order).to receive_messages(awaiting_return?: true)
940
+ expect(order.can_ship?).to be true
941
+ end
942
+
943
+ it "should be true for an order in the 'returned' state" do
944
+ allow(order).to receive_messages(returned?: true)
945
+ expect(order.can_ship?).to be true
946
+ end
947
+
948
+ it "should be false if the order is neither in the 'complete' nor 'resumed' state" do
949
+ allow(order).to receive_messages(resumed?: false, complete?: false)
950
+ expect(order.can_ship?).to be false
951
+ end
952
+ end
953
+
954
+ context "#completed?" do
955
+ it "should indicate if order is completed" do
956
+ order.completed_at = nil
957
+ expect(order.completed?).to be false
958
+
959
+ order.completed_at = Time.current
960
+ expect(order.completed?).to be true
961
+ end
962
+ end
963
+
964
+ context "#allow_checkout?" do
965
+ it "should be true if there are line_items in the order" do
966
+ allow(order).to receive_message_chain(:line_items, count: 1)
967
+ expect(order.checkout_allowed?).to be true
968
+ end
969
+ it "should be false if there are no line_items in the order" do
970
+ allow(order).to receive_message_chain(:line_items, count: 0)
971
+ expect(order.checkout_allowed?).to be false
972
+ end
973
+ end
974
+
975
+ context "#amount" do
976
+ before do
977
+ @order = create(:order, user: user)
978
+ @order.line_items = [create(:line_item, price: 1.0, quantity: 2),
979
+ create(:line_item, price: 1.0, quantity: 1)]
980
+ end
981
+ it "should return the correct lum sum of items" do
982
+ expect(@order.amount).to eq(3.0)
983
+ end
984
+ end
985
+
986
+ context "#backordered?" do
987
+ it 'is backordered if one of the shipments is backordered' do
988
+ allow(order).to receive_messages(shipments: [mock_model(Spree::Shipment, backordered?: false),
989
+ mock_model(Spree::Shipment, backordered?: true)])
990
+ expect(order).to be_backordered
991
+ end
992
+ end
993
+
994
+ context "#can_cancel?" do
995
+ it "should be false for completed order in the canceled state" do
996
+ order.state = 'canceled'
997
+ order.shipment_state = 'ready'
998
+ order.completed_at = Time.current
999
+ expect(order.can_cancel?).to be false
1000
+ end
1001
+
1002
+ it "should be true for completed order with no shipment" do
1003
+ order.state = 'complete'
1004
+ order.shipment_state = nil
1005
+ order.completed_at = Time.current
1006
+ expect(order.can_cancel?).to be true
1007
+ end
1008
+ end
1009
+
1010
+ context "#tax_total" do
1011
+ it "adds included tax and additional tax" do
1012
+ allow(order).to receive_messages(additional_tax_total: 10, included_tax_total: 20)
1013
+
1014
+ expect(order.tax_total).to eq 30
1015
+ end
1016
+ end
1017
+
1018
+ # Regression test for https://github.com/spree/spree/issues/4923
1019
+ context "locking" do
1020
+ let(:order) { Spree::Order.create } # need a persisted in order to test locking
1021
+
1022
+ it 'can lock' do
1023
+ order.with_lock {}
1024
+ end
1025
+ end
1026
+
1027
+ describe "#item_total_excluding_vat" do
1028
+ it "sums all of the line items' pre tax amounts" do
1029
+ subject.line_items = [
1030
+ Spree::LineItem.new(price: 10, quantity: 2, included_tax_total: 15.0),
1031
+ Spree::LineItem.new(price: 30, quantity: 1, included_tax_total: 16.0)
1032
+ ]
1033
+ # (2*10)-15 + 30-16 = 5 + 14 = 19
1034
+ expect(subject.item_total_excluding_vat).to eq 19.0
1035
+ end
1036
+ end
1037
+
1038
+ context "#refund_total" do
1039
+ let(:order) { create(:order_with_line_items) }
1040
+ let!(:payment) { create(:payment_with_refund, order: order, amount: 5, refund_amount: 3) }
1041
+ let!(:payment2) { create(:payment_with_refund, order: order, amount: 5, refund_amount: 2.5) }
1042
+
1043
+ it "sums the reimbursment refunds on the order" do
1044
+ expect(order.refund_total).to eq(5.5)
1045
+ end
1046
+ end
1047
+
1048
+ describe '#quantity' do
1049
+ # Uses a persisted record, as the quantity is retrieved via a DB count
1050
+ let(:order) { create :order_with_line_items, line_items_count: 3 }
1051
+
1052
+ it 'sums the quantity of all line items' do
1053
+ expect(order.quantity).to eq 3
1054
+ end
1055
+ end
1056
+
1057
+ describe '#has_non_reimbursement_related_refunds?' do
1058
+ subject do
1059
+ order.has_non_reimbursement_related_refunds?
1060
+ end
1061
+
1062
+ context 'no refunds exist' do
1063
+ it { is_expected.to eq false }
1064
+ end
1065
+
1066
+ context 'a non-reimbursement related refund exists' do
1067
+ let(:order) { refund.payment.order }
1068
+ let(:refund) { create(:refund, reimbursement_id: nil, amount: 5) }
1069
+
1070
+ it { is_expected.to eq true }
1071
+ end
1072
+
1073
+ context 'an old-style refund exists' do
1074
+ let(:order) { create(:order_ready_to_ship) }
1075
+ let(:payment) { order.payments.first.tap { |p| allow(p).to receive_messages(profiles_supported: false) } }
1076
+ let!(:refund_payment) {
1077
+ build(:payment, amount: -1, order: order, state: 'completed', source: payment).tap do |p|
1078
+ allow(p).to receive_messages(profiles_supported?: false)
1079
+ p.save!
1080
+ end
1081
+ }
1082
+
1083
+ it { is_expected.to eq true }
1084
+ end
1085
+
1086
+ context 'a reimbursement related refund exists' do
1087
+ let(:order) { refund.payment.order }
1088
+ let(:refund) { create(:refund, reimbursement_id: 123, amount: 5, payment_amount: 14) }
1089
+
1090
+ it { is_expected.to eq false }
1091
+ end
1092
+ end
1093
+
1094
+ describe "#create_proposed_shipments" do
1095
+ subject(:order) { create(:order) }
1096
+ it "assigns the coordinator returned shipments to its shipments" do
1097
+ shipment = build(:shipment)
1098
+ allow_any_instance_of(Spree::Stock::SimpleCoordinator).to receive(:shipments).and_return([shipment])
1099
+ subject.create_proposed_shipments
1100
+ expect(subject.shipments).to eq [shipment]
1101
+ end
1102
+
1103
+ it "raises an error if any shipments are ready" do
1104
+ shipment = create(:shipment, order: subject, state: "ready")
1105
+
1106
+ expect {
1107
+ expect {
1108
+ subject.create_proposed_shipments
1109
+ }.to raise_error(Spree::Order::CannotRebuildShipments)
1110
+ }.not_to change { subject.reload.shipments.pluck(:id) }
1111
+
1112
+ expect { shipment.reload }.not_to raise_error
1113
+ end
1114
+
1115
+ it "raises an error if any shipments are shipped" do
1116
+ shipment = create(:shipment, order: subject, state: "shipped")
1117
+ expect {
1118
+ expect {
1119
+ subject.create_proposed_shipments
1120
+ }.to raise_error(Spree::Order::CannotRebuildShipments)
1121
+ }.not_to change { subject.reload.shipments.pluck(:id) }
1122
+
1123
+ expect { shipment.reload }.not_to raise_error
1124
+ end
1125
+ end
1126
+
1127
+ describe "#all_inventory_units_returned?" do
1128
+ let(:order) { create(:order_with_line_items, line_items_count: 3) }
1129
+
1130
+ subject { order.all_inventory_units_returned? }
1131
+
1132
+ context "all inventory units are returned" do
1133
+ before { order.inventory_units.update_all(state: 'returned') }
1134
+
1135
+ it "is true" do
1136
+ expect(subject).to eq true
1137
+ end
1138
+ end
1139
+
1140
+ context "some inventory units are returned" do
1141
+ before do
1142
+ order.inventory_units.first.update_attribute(:state, 'returned')
1143
+ end
1144
+
1145
+ it "is false" do
1146
+ expect(subject).to eq false
1147
+ end
1148
+ end
1149
+
1150
+ context "no inventory units are returned" do
1151
+ it "is false" do
1152
+ expect(subject).to eq false
1153
+ end
1154
+ end
1155
+ end
1156
+
1157
+ context "store credit" do
1158
+ shared_examples "check total store credit from payments" do
1159
+ context "with valid payments" do
1160
+ let(:order) { payment.order }
1161
+ let!(:payment) { create(:store_credit_payment) }
1162
+ let!(:second_payment) { create(:store_credit_payment, order: order) }
1163
+
1164
+ subject { order }
1165
+
1166
+ it "returns the sum of the payment amounts" do
1167
+ expect(subject.total_applicable_store_credit).to eq(payment.amount + second_payment.amount)
1168
+ end
1169
+ end
1170
+
1171
+ context "without valid payments" do
1172
+ let(:order) { create(:order) }
1173
+
1174
+ subject { order }
1175
+
1176
+ it "returns 0" do
1177
+ expect(subject.total_applicable_store_credit).to be_zero
1178
+ end
1179
+ end
1180
+ end
1181
+
1182
+ describe "#add_store_credit_payments" do
1183
+ let(:order_total) { 500.00 }
1184
+
1185
+ before { create(:store_credit_payment_method) }
1186
+
1187
+ subject { order.add_store_credit_payments }
1188
+
1189
+ context "there is no store credit" do
1190
+ let(:order) { create(:order, total: order_total) }
1191
+
1192
+ context "there is a credit card payment" do
1193
+ let!(:cc_payment) { create(:payment, order: order, amount: order_total) }
1194
+
1195
+ before do
1196
+ # callbacks recalculate total based on line items
1197
+ # this ensures the total is what we expect
1198
+ order.update_column(:total, order_total)
1199
+ subject
1200
+ order.reload
1201
+ end
1202
+
1203
+ it "charges the outstanding balance to the credit card" do
1204
+ expect(order.errors.messages).to be_empty
1205
+ expect(order.payments.count).to eq 1
1206
+ expect(order.payments.first.source).to be_a(Spree::CreditCard)
1207
+ expect(order.payments.first.amount).to eq order_total
1208
+ end
1209
+ end
1210
+ end
1211
+
1212
+ context 'there is store credit in another currency' do
1213
+ let(:order) { create(:order_with_totals, user: user, line_items_price: order_total).tap(&:recalculate) }
1214
+ let!(:store_credit_usd) { create(:store_credit, user: user, amount: 1, currency: 'USD') }
1215
+ let!(:store_credit_gbp) { create(:store_credit, user: user, amount: 1, currency: 'GBP') }
1216
+ let(:user) { create(:user) }
1217
+
1218
+ it 'only adds the credit in the matching currency' do
1219
+ expect {
1220
+ order.add_store_credit_payments
1221
+ }.to change {
1222
+ order.payments.count
1223
+ }.by(1)
1224
+
1225
+ applied_store_credits = order.payments.store_credits.map(&:source)
1226
+ expect(applied_store_credits).to match_array([store_credit_usd])
1227
+ end
1228
+ end
1229
+
1230
+ context "there is enough store credit to pay for the entire order" do
1231
+ let(:store_credit) { create(:store_credit, amount: order_total) }
1232
+ let(:order) { create(:order_with_totals, user: store_credit.user, line_items_price: order_total).tap(&:recalculate) }
1233
+
1234
+ context "there are no other payments" do
1235
+ before do
1236
+ subject
1237
+ order.reload
1238
+ end
1239
+
1240
+ it "creates a store credit payment for the full amount" do
1241
+ expect(order.errors.messages).to be_empty
1242
+ expect(order.payments.count).to eq 1
1243
+ expect(order.payments.first).to be_store_credit
1244
+ expect(order.payments.first.amount).to eq order_total
1245
+ end
1246
+ end
1247
+
1248
+ context "there is a credit card payment" do
1249
+ it "invalidates the credit card payment" do
1250
+ cc_payment = create(:payment, order: order)
1251
+ expect { subject }.to change { cc_payment.reload.state }.to 'invalid'
1252
+ end
1253
+ end
1254
+ end
1255
+
1256
+ context "the available store credit is not enough to pay for the entire order" do
1257
+ let(:order_total) { 500 }
1258
+ let(:store_credit_total) { order_total - 100 }
1259
+ let(:store_credit) { create(:store_credit, amount: store_credit_total) }
1260
+ let(:order) { create(:order_with_totals, user: store_credit.user, line_items_price: order_total).tap(&:recalculate) }
1261
+
1262
+ context "there are no other payments" do
1263
+ it "adds an error to the model" do
1264
+ expect(subject).to be false
1265
+ expect(order.errors.full_messages).to include(I18n.t('spree.store_credit.errors.unable_to_fund'))
1266
+ end
1267
+ end
1268
+
1269
+ context "there is a completed credit card payment" do
1270
+ let!(:cc_payment) { create(:payment, order: order, state: "completed", amount: 100) }
1271
+
1272
+ it "successfully creates the store credit payments" do
1273
+ expect { subject }.to change { order.payments.count }.from(1).to(2)
1274
+ expect(order.errors).to be_empty
1275
+ end
1276
+ end
1277
+
1278
+ context "there is a credit card payment" do
1279
+ let!(:cc_payment) { create(:payment, order: order, state: "checkout") }
1280
+
1281
+ before do
1282
+ subject
1283
+ end
1284
+
1285
+ it "charges the outstanding balance to the credit card" do
1286
+ expect(order.errors.messages).to be_empty
1287
+ expect(order.payments.count).to eq 2
1288
+ expect(order.payments.first.source).to be_a(Spree::CreditCard)
1289
+ expect(order.payments.first.amount).to eq 100
1290
+ end
1291
+
1292
+ # see associated comment in order_decorator#add_store_credit_payments
1293
+ context "the store credit is already in the pending state" do
1294
+ before do
1295
+ order.payments.store_credits.last.authorize!
1296
+ order.add_store_credit_payments
1297
+ end
1298
+
1299
+ it "charges the outstanding balance to the credit card" do
1300
+ expect(order.errors.messages).to be_empty
1301
+ expect(order.payments.count).to eq 2
1302
+ expect(order.payments.first.source).to be_a(Spree::CreditCard)
1303
+ expect(order.payments.first.amount).to eq 100
1304
+ end
1305
+ end
1306
+ end
1307
+ end
1308
+
1309
+ context "there are multiple store credits" do
1310
+ context "they have different credit type priorities" do
1311
+ let(:amount_difference) { 100 }
1312
+ let!(:primary_store_credit) { create(:store_credit, amount: (order_total - amount_difference)) }
1313
+ let!(:secondary_store_credit) { create(:store_credit, amount: order_total, user: primary_store_credit.user, credit_type: create(:secondary_credit_type)) }
1314
+ let(:order) { create(:order_with_totals, user: primary_store_credit.user, line_items_price: order_total).tap(&:recalculate) }
1315
+
1316
+ before do
1317
+ subject
1318
+ order.reload
1319
+ end
1320
+
1321
+ it "uses the primary store credit type over the secondary" do
1322
+ primary_payment = order.payments.detect{ |x| x.source == primary_store_credit }
1323
+ secondary_payment = order.payments.detect{ |x| x.source == secondary_store_credit }
1324
+
1325
+ expect(order.payments.size).to eq 2
1326
+ expect(primary_payment.source).to eq primary_store_credit
1327
+ expect(secondary_payment.source).to eq secondary_store_credit
1328
+ expect(primary_payment.amount).to eq(order_total - amount_difference)
1329
+ expect(secondary_payment.amount).to eq(amount_difference)
1330
+ end
1331
+ end
1332
+ end
1333
+ end
1334
+
1335
+ describe "#covered_by_store_credit" do
1336
+ subject do
1337
+ order.covered_by_store_credit
1338
+ end
1339
+
1340
+ let(:order) { create(:order_with_line_items, user: user, store: store) }
1341
+
1342
+ context "order doesn't have an associated user" do
1343
+ let(:user) { nil }
1344
+ it { is_expected.to eq(false) }
1345
+ end
1346
+
1347
+ context "order has an associated user" do
1348
+ context "user has enough store credit to pay for the order" do
1349
+ let!(:credit) { create(:store_credit, user: user, amount: 1000) }
1350
+ it { is_expected.to eq(true) }
1351
+ end
1352
+
1353
+ context "user does not have enough store credit to pay for the order" do
1354
+ let!(:credit) { create(:store_credit, user: user, amount: 1) }
1355
+ it { is_expected.to eq(false) }
1356
+ end
1357
+ end
1358
+ end
1359
+
1360
+ describe "#total_available_store_credit" do
1361
+ subject do
1362
+ order.total_available_store_credit
1363
+ end
1364
+
1365
+ context "order does not have an associated user" do
1366
+ let(:user) { nil }
1367
+ it { is_expected.to eq(0) }
1368
+ end
1369
+
1370
+ context "order has an associated user" do
1371
+ let!(:credit) { create(:store_credit, user: user, amount: 25) }
1372
+ it { is_expected.to eq(25) }
1373
+ end
1374
+ end
1375
+
1376
+ describe "#order_total_after_store_credit" do
1377
+ let(:order_total) { 100.0 }
1378
+
1379
+ subject { create(:order, total: order_total) }
1380
+
1381
+ before do
1382
+ allow(subject).to receive_messages(total_applicable_store_credit: applicable_store_credit)
1383
+ end
1384
+
1385
+ context "order's user has store credits" do
1386
+ let(:applicable_store_credit) { 10.0 }
1387
+
1388
+ it "deducts the applicable store credit" do
1389
+ expect(subject.order_total_after_store_credit).to eq(order_total - applicable_store_credit)
1390
+ end
1391
+ end
1392
+
1393
+ context "order's user does not have any store credits" do
1394
+ let(:applicable_store_credit) { 0.0 }
1395
+
1396
+ it "returns the order total" do
1397
+ expect(subject.order_total_after_store_credit).to eq order_total
1398
+ end
1399
+ end
1400
+ end
1401
+
1402
+ describe "#total_applicable_store_credit" do
1403
+ context "order is in the confirm state" do
1404
+ before { order.update_attributes(state: 'confirm') }
1405
+ include_examples "check total store credit from payments"
1406
+ end
1407
+
1408
+ context "order is completed" do
1409
+ before { order.update_attributes(state: 'complete') }
1410
+ include_examples "check total store credit from payments"
1411
+ end
1412
+
1413
+ context "order is in any state other than confirm or complete" do
1414
+ context "the associated user has store credits" do
1415
+ let(:store_credit) { create(:store_credit) }
1416
+ let(:order) { create(:order, user: store_credit.user) }
1417
+
1418
+ subject { order }
1419
+
1420
+ context "the store credit is more than the order total" do
1421
+ let(:order_total) { store_credit.amount - 1 }
1422
+
1423
+ before { order.update_attributes(total: order_total) }
1424
+
1425
+ it "returns the order total" do
1426
+ expect(subject.total_applicable_store_credit).to eq order_total
1427
+ end
1428
+ end
1429
+
1430
+ context "the store credit is less than the order total" do
1431
+ let(:order_total) { store_credit.amount * 10 }
1432
+
1433
+ before { order.update_attributes(total: order_total) }
1434
+
1435
+ it "returns the store credit amount" do
1436
+ expect(subject.total_applicable_store_credit).to eq store_credit.amount
1437
+ end
1438
+ end
1439
+ end
1440
+
1441
+ context "the associated user does not have store credits" do
1442
+ let(:order) { create(:order) }
1443
+
1444
+ subject { order }
1445
+
1446
+ it "returns 0" do
1447
+ expect(subject.total_applicable_store_credit).to be_zero
1448
+ end
1449
+ end
1450
+
1451
+ context "the order does not have an associated user" do
1452
+ subject { create(:order, user: nil) }
1453
+
1454
+ it "returns 0" do
1455
+ expect(subject.total_applicable_store_credit).to be_zero
1456
+ end
1457
+ end
1458
+ end
1459
+ end
1460
+
1461
+ describe "#display_total_applicable_store_credit" do
1462
+ let(:total_applicable_store_credit) { 10.00 }
1463
+
1464
+ subject { create(:order) }
1465
+
1466
+ before { allow(subject).to receive_messages(total_applicable_store_credit: total_applicable_store_credit) }
1467
+
1468
+ it "returns a money instance" do
1469
+ expect(subject.display_total_applicable_store_credit).to be_a(Spree::Money)
1470
+ end
1471
+
1472
+ it "returns a negative amount" do
1473
+ expect(subject.display_total_applicable_store_credit.money.cents).to eq(total_applicable_store_credit * -100.0)
1474
+ end
1475
+ end
1476
+
1477
+ describe "#display_order_total_after_store_credit" do
1478
+ let(:order_total_after_store_credit) { 10.00 }
1479
+
1480
+ subject { create(:order) }
1481
+
1482
+ before { allow(subject).to receive_messages(order_total_after_store_credit: order_total_after_store_credit) }
1483
+
1484
+ it "returns a money instance" do
1485
+ expect(subject.display_order_total_after_store_credit).to be_a(Spree::Money)
1486
+ end
1487
+
1488
+ it "returns the order_total_after_store_credit amount" do
1489
+ expect(subject.display_order_total_after_store_credit.money.cents).to eq(order_total_after_store_credit * 100.0)
1490
+ end
1491
+ end
1492
+
1493
+ describe "#display_total_available_store_credit" do
1494
+ let(:total_available_store_credit) { 10.00 }
1495
+
1496
+ subject { create(:order) }
1497
+
1498
+ before { allow(subject).to receive_messages(total_available_store_credit: total_available_store_credit) }
1499
+
1500
+ it "returns a money instance" do
1501
+ expect(subject.display_total_available_store_credit).to be_a(Spree::Money)
1502
+ end
1503
+
1504
+ it "returns the total_available_store_credit amount" do
1505
+ expect(subject.display_total_available_store_credit.money.cents).to eq(total_available_store_credit * 100.0)
1506
+ end
1507
+ end
1508
+
1509
+ describe "#display_store_credit_remaining_after_capture" do
1510
+ let(:total_available_store_credit) { 10.00 }
1511
+ let(:total_applicable_store_credit) { 5.00 }
1512
+
1513
+ subject { create(:order) }
1514
+
1515
+ before do
1516
+ allow(subject).to receive_messages(total_available_store_credit: total_available_store_credit,
1517
+ total_applicable_store_credit: total_applicable_store_credit)
1518
+ end
1519
+
1520
+ it "returns a money instance" do
1521
+ expect(subject.display_store_credit_remaining_after_capture).to be_a(Spree::Money)
1522
+ end
1523
+
1524
+ it "returns all of the user's available store credit minus what's applied to the order amount" do
1525
+ amount_remaining = total_available_store_credit - total_applicable_store_credit
1526
+ expect(subject.display_store_credit_remaining_after_capture.money.cents).to eq(amount_remaining * 100.0)
1527
+ end
1528
+ end
1529
+
1530
+ context 'when not capturing at order completion' do
1531
+ let!(:store_credit_payment_method) do
1532
+ create(
1533
+ :store_credit_payment_method,
1534
+ auto_capture: false, # not capturing at completion time
1535
+ )
1536
+ end
1537
+
1538
+ describe '#after_cancel' do
1539
+ let(:user) { create(:user) }
1540
+ let!(:store_credit) do
1541
+ create(:store_credit, amount: 100, user: user)
1542
+ end
1543
+ let(:order) do
1544
+ create(
1545
+ :order_with_line_items,
1546
+ user: user,
1547
+ line_items_count: 1,
1548
+ # order will be $20 total:
1549
+ line_items_price: 10,
1550
+ shipment_cost: 10
1551
+ )
1552
+ end
1553
+
1554
+ before do
1555
+ order.contents.advance
1556
+ order.complete!
1557
+ end
1558
+
1559
+ it 'releases the pending store credit authorization' do
1560
+ expect {
1561
+ order.cancel!
1562
+ }.to change {
1563
+ store_credit.reload.amount_authorized
1564
+ }.from(20).to(0)
1565
+
1566
+ expect(store_credit.amount_remaining).to eq 100
1567
+ end
1568
+ end
1569
+ end
1570
+ end
1571
+
1572
+ context 'update_params_payment_source' do
1573
+ subject { described_class.new }
1574
+
1575
+ it 'is deprecated' do
1576
+ subject.instance_variable_set('@updating_params', {})
1577
+ expect(Spree::Deprecation).to receive(:warn)
1578
+ subject.send(:update_params_payment_source)
1579
+ end
1580
+ end
1581
+
1582
+ describe "#validate_payments_attributes" do
1583
+ let(:attributes) { [ActionController::Parameters.new(payment_method_id: payment_method.id)] }
1584
+ subject do
1585
+ order.validate_payments_attributes(attributes)
1586
+ end
1587
+
1588
+ context "with empty array" do
1589
+ let(:attributes) { [] }
1590
+ it "doesn't error" do
1591
+ subject
1592
+ end
1593
+ end
1594
+
1595
+ context "with no payment method specified" do
1596
+ let(:attributes) { [ActionController::Parameters.new({})] }
1597
+ it "doesn't error" do
1598
+ subject
1599
+ end
1600
+ end
1601
+
1602
+ context "with valid payment method" do
1603
+ let(:payment_method) { create(:check_payment_method) }
1604
+ it "doesn't error" do
1605
+ subject
1606
+ end
1607
+ end
1608
+
1609
+ context "with inactive payment method" do
1610
+ let(:payment_method) { create(:check_payment_method, active: false) }
1611
+
1612
+ it "raises RecordNotFound" do
1613
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1614
+ end
1615
+ end
1616
+
1617
+ context "with unavailable payment method" do
1618
+ let(:payment_method) { create(:check_payment_method, available_to_users: false) }
1619
+
1620
+ it "raises RecordNotFound" do
1621
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1622
+ end
1623
+ end
1624
+
1625
+ context "with soft-deleted payment method" do
1626
+ let(:payment_method) { create(:check_payment_method, deleted_at: Time.current) }
1627
+
1628
+ it "raises RecordNotFound" do
1629
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1630
+ end
1631
+ end
1632
+ end
1633
+ end