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