solidus_core 2.10.1 → 2.11.2

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 (496) 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/mailers/spree/base_mailer.rb +4 -0
  5. data/app/mailers/spree/order_mailer.rb +1 -1
  6. data/app/models/concerns/spree/active_storage_adapter.rb +116 -0
  7. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +69 -0
  8. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +39 -0
  9. data/app/models/concerns/spree/default_price.rb +1 -1
  10. data/app/models/concerns/spree/soft_deletable.rb +18 -0
  11. data/app/models/concerns/spree/user_address_book.rb +86 -32
  12. data/app/models/concerns/spree/user_methods.rb +3 -2
  13. data/app/models/spree/ability.rb +34 -10
  14. data/app/models/spree/address.rb +94 -17
  15. data/app/models/spree/address/name.rb +49 -0
  16. data/app/models/spree/address/state_validator.rb +71 -0
  17. data/app/models/spree/adjustment.rb +1 -1
  18. data/app/models/spree/base.rb +1 -0
  19. data/app/models/spree/calculator/default_tax.rb +1 -1
  20. data/app/models/spree/calculator/percent_per_item.rb +4 -4
  21. data/app/models/spree/calculator/price_sack.rb +1 -1
  22. data/app/models/spree/credit_card.rb +2 -2
  23. data/app/models/spree/customer_return.rb +4 -2
  24. data/app/models/spree/exchange.rb +1 -1
  25. data/app/models/spree/image/active_storage_attachment.rb +21 -0
  26. data/app/models/spree/inventory_unit.rb +1 -1
  27. data/app/models/spree/line_item.rb +13 -4
  28. data/app/models/spree/option_type.rb +1 -1
  29. data/app/models/spree/option_value.rb +2 -2
  30. data/app/models/spree/order.rb +91 -20
  31. data/app/models/spree/order/checkout.rb +1 -0
  32. data/app/models/spree/order_inventory.rb +16 -4
  33. data/app/models/spree/order_merger.rb +6 -4
  34. data/app/models/spree/order_promotion.rb +1 -1
  35. data/app/models/spree/order_updater.rb +11 -10
  36. data/app/models/spree/payment.rb +3 -3
  37. data/app/models/spree/payment/cancellation.rb +3 -3
  38. data/app/models/spree/payment/processing.rb +54 -30
  39. data/app/models/spree/payment_method.rb +8 -9
  40. data/app/models/spree/preference.rb +1 -1
  41. data/app/models/spree/price.rb +2 -8
  42. data/app/models/spree/product.rb +19 -14
  43. data/app/models/spree/product/scopes.rb +9 -4
  44. data/app/models/spree/promotion.rb +18 -7
  45. data/app/models/spree/promotion/actions/free_shipping.rb +6 -5
  46. data/app/models/spree/promotion_action.rb +1 -7
  47. data/app/models/spree/promotion_code.rb +6 -1
  48. data/app/models/spree/promotion_code_batch.rb +1 -1
  49. data/app/models/spree/promotion_handler/coupon.rb +2 -2
  50. data/app/models/spree/promotion_rule.rb +1 -1
  51. data/app/models/spree/promotion_rule_role.rb +1 -1
  52. data/app/models/spree/refund.rb +60 -12
  53. data/app/models/spree/reimbursement.rb +27 -0
  54. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +10 -3
  55. data/app/models/spree/return_authorization.rb +1 -1
  56. data/app/models/spree/return_item.rb +21 -10
  57. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +1 -1
  58. data/app/models/spree/role.rb +1 -1
  59. data/app/models/spree/shipment.rb +2 -2
  60. data/app/models/spree/shipping_calculator.rb +1 -1
  61. data/app/models/spree/shipping_manifest.rb +2 -2
  62. data/app/models/spree/shipping_method.rb +2 -9
  63. data/app/models/spree/shipping_rate.rb +1 -1
  64. data/app/models/spree/shipping_rate_tax.rb +1 -1
  65. data/app/models/spree/stock/inventory_unit_builder.rb +18 -7
  66. data/app/models/spree/stock/inventory_units_finalizer.rb +3 -5
  67. data/app/models/spree/stock/package.rb +1 -1
  68. data/app/models/spree/stock/simple_coordinator.rb +1 -3
  69. data/app/models/spree/stock_item.rb +2 -8
  70. data/app/models/spree/stock_movement.rb +2 -0
  71. data/app/models/spree/store.rb +1 -1
  72. data/app/models/spree/store_credit.rb +1 -7
  73. data/app/models/spree/store_credit_category.rb +30 -3
  74. data/app/models/spree/store_credit_event.rb +1 -7
  75. data/app/models/spree/store_credit_reason.rb +0 -4
  76. data/app/models/spree/tax/tax_helpers.rb +1 -1
  77. data/app/models/spree/tax_category.rb +2 -8
  78. data/app/models/spree/tax_rate.rb +7 -7
  79. data/app/models/spree/taxon.rb +1 -1
  80. data/app/models/spree/taxon/active_storage_attachment.rb +19 -0
  81. data/app/models/spree/user_address.rb +8 -2
  82. data/app/models/spree/variant.rb +7 -13
  83. data/app/models/spree/variant_property_rule.rb +5 -1
  84. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +8 -3
  85. data/app/models/spree/zone.rb +1 -1
  86. data/config/locales/en.yml +44 -5
  87. data/db/default/spree/countries.rb +1 -1
  88. data/db/default/spree/states.rb +12 -4
  89. data/db/default/spree/store_credit.rb +2 -2
  90. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +12 -0
  91. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +6 -0
  92. data/db/migrate/20200530111458_add_bcc_email_to_spree_stores.rb +7 -0
  93. data/db/migrate/20201008213609_add_discontinue_on_to_spree_products.rb +7 -0
  94. data/lib/generators/solidus/install/install_generator.rb +253 -0
  95. data/lib/generators/{spree → solidus}/install/templates/config/initializers/spree.rb.tt +36 -5
  96. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -0
  97. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -0
  98. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -0
  99. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -0
  100. data/lib/generators/spree/install/install_generator.rb +7 -189
  101. data/lib/solidus/migrations/promotions_with_code_handlers.rb +1 -1
  102. data/lib/spree/app_configuration.rb +117 -51
  103. data/lib/spree/awesome_nested_set_override.rb +44 -0
  104. data/lib/spree/core.rb +5 -11
  105. data/lib/spree/core/controller_helpers/auth.rb +17 -4
  106. data/lib/spree/core/controller_helpers/current_host.rb +17 -0
  107. data/lib/spree/core/controller_helpers/order.rb +8 -7
  108. data/lib/spree/core/controller_helpers/strong_parameters.rb +21 -7
  109. data/lib/spree/core/engine.rb +39 -2
  110. data/lib/spree/core/importer/order.rb +26 -11
  111. data/lib/spree/core/permalinks.rb +1 -3
  112. data/lib/spree/core/product_filters.rb +6 -5
  113. data/lib/spree/core/state_machines.rb +20 -1
  114. data/lib/spree/core/state_machines/order.rb +249 -0
  115. data/lib/spree/core/state_machines/return_item/reception_status.rb +2 -2
  116. data/lib/spree/core/version.rb +1 -1
  117. data/lib/spree/encryptor.rb +25 -0
  118. data/lib/spree/event.rb +40 -7
  119. data/lib/spree/event/adapters/active_support_notifications.rb +32 -0
  120. data/lib/spree/event/configuration.rb +11 -6
  121. data/lib/spree/event/subscriber.rb +38 -18
  122. data/lib/spree/event/subscriber_registry.rb +92 -0
  123. data/lib/spree/i18n.rb +1 -1
  124. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  125. data/lib/spree/paranoia_deprecations.rb +32 -12
  126. data/lib/spree/permission_sets/configuration_display.rb +14 -14
  127. data/lib/spree/permission_sets/default_customer.rb +16 -16
  128. data/lib/spree/permission_sets/order_display.rb +11 -11
  129. data/lib/spree/permission_sets/order_management.rb +1 -1
  130. data/lib/spree/permission_sets/product_display.rb +9 -9
  131. data/lib/spree/permission_sets/promotion_display.rb +5 -5
  132. data/lib/spree/permission_sets/restricted_stock_display.rb +2 -2
  133. data/lib/spree/permission_sets/restricted_stock_management.rb +1 -1
  134. data/lib/spree/permission_sets/stock_display.rb +2 -2
  135. data/lib/spree/permission_sets/stock_management.rb +1 -1
  136. data/lib/spree/permission_sets/user_display.rb +3 -3
  137. data/lib/spree/permission_sets/user_management.rb +4 -3
  138. data/lib/spree/permitted_attributes.rb +79 -9
  139. data/lib/spree/preferences/preferable.rb +4 -3
  140. data/lib/spree/preferences/preferable_class_methods.rb +22 -3
  141. data/lib/spree/testing_support/ability_helpers.rb +9 -9
  142. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  143. data/lib/spree/testing_support/blacklist_urls.rb +23 -0
  144. data/lib/spree/testing_support/capybara_ext.rb +3 -0
  145. data/lib/spree/testing_support/common_rake.rb +3 -3
  146. data/lib/spree/testing_support/dummy_app.rb +44 -23
  147. data/lib/spree/testing_support/dummy_app/migrations.rb +5 -6
  148. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +1 -3
  149. data/lib/spree/testing_support/factories/address_factory.rb +1 -2
  150. data/lib/spree/testing_support/factories/image_factory.rb +1 -1
  151. data/lib/spree/testing_support/factories/promotion_factory.rb +6 -0
  152. data/lib/spree/testing_support/factories/refund_factory.rb +1 -0
  153. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  154. data/lib/spree/testing_support/factories/return_item_factory.rb +0 -1
  155. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +8 -0
  156. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -0
  157. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +3 -1
  158. data/lib/spree/testing_support/factories/taxon_factory.rb +4 -0
  159. data/lib/spree/testing_support/factories/user_factory.rb +4 -1
  160. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  161. data/lib/spree/testing_support/fixtures/blank.jpg +0 -0
  162. data/lib/spree/testing_support/job_helpers.rb +24 -0
  163. data/lib/spree/testing_support/precompiled_assets.rb +15 -0
  164. data/lib/spree/testing_support/preferences.rb +3 -1
  165. data/lib/spree/testing_support/shared_examples/gallery.rb +1 -1
  166. data/lib/spree/testing_support/translations.rb +25 -0
  167. data/solidus_core.gemspec +8 -5
  168. metadata +99 -376
  169. data/script/rails +0 -10
  170. data/spec/fixtures/thinking-cat.jpg +0 -0
  171. data/spec/helpers/base_helper_spec.rb +0 -168
  172. data/spec/helpers/products_helper_spec.rb +0 -202
  173. data/spec/helpers/taxons_helper_spec.rb +0 -43
  174. data/spec/jobs/promotion_code_batch_job_spec.rb +0 -96
  175. data/spec/lib/calculated_adjustments_spec.rb +0 -133
  176. data/spec/lib/i18n_spec.rb +0 -97
  177. data/spec/lib/search/base_spec.rb +0 -91
  178. data/spec/lib/search/variant_spec.rb +0 -115
  179. data/spec/lib/spree/app_configuration_spec.rb +0 -140
  180. data/spec/lib/spree/core/class_constantizer_spec.rb +0 -91
  181. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -73
  182. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -126
  183. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -195
  184. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +0 -94
  185. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -21
  186. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -18
  187. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -41
  188. data/spec/lib/spree/core/current_store_spec.rb +0 -33
  189. data/spec/lib/spree/core/environment_extension_spec.rb +0 -46
  190. data/spec/lib/spree/core/importer/order_spec.rb +0 -484
  191. data/spec/lib/spree/core/role_configuration_spec.rb +0 -155
  192. data/spec/lib/spree/core/stock_configuration_spec.rb +0 -95
  193. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +0 -61
  194. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +0 -20
  195. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +0 -14
  196. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +0 -44
  197. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +0 -14
  198. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +0 -14
  199. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +0 -14
  200. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +0 -39
  201. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +0 -14
  202. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +0 -14
  203. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +0 -14
  204. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +0 -14
  205. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +0 -14
  206. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -376
  207. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +0 -14
  208. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +0 -40
  209. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +0 -32
  210. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +0 -14
  211. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +0 -32
  212. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +0 -14
  213. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +0 -14
  214. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +0 -14
  215. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +0 -14
  216. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +0 -32
  217. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +0 -14
  218. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +0 -14
  219. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +0 -14
  220. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +0 -20
  221. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +0 -14
  222. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +0 -14
  223. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +0 -20
  224. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +0 -14
  225. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +0 -20
  226. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +0 -14
  227. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +0 -14
  228. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +0 -44
  229. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +0 -14
  230. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +0 -59
  231. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +0 -14
  232. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +0 -35
  233. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +0 -14
  234. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +0 -28
  235. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +0 -14
  236. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +0 -43
  237. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +0 -14
  238. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +0 -14
  239. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +0 -20
  240. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +0 -14
  241. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +0 -14
  242. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +0 -14
  243. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +0 -14
  244. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +0 -14
  245. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +0 -24
  246. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +0 -56
  247. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +0 -14
  248. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +0 -14
  249. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +0 -14
  250. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +0 -20
  251. data/spec/lib/spree/core/testing_support/preferences_spec.rb +0 -61
  252. data/spec/lib/spree/core/validators/email_spec.rb +0 -53
  253. data/spec/lib/spree/core/version_spec.rb +0 -19
  254. data/spec/lib/spree/event/subscriber_spec.rb +0 -85
  255. data/spec/lib/spree/event_spec.rb +0 -130
  256. data/spec/lib/spree/localized_number_spec.rb +0 -45
  257. data/spec/lib/spree/migrations_spec.rb +0 -32
  258. data/spec/lib/spree/money_spec.rb +0 -298
  259. data/spec/lib/spree/permission_sets/default_customer_spec.rb +0 -22
  260. data/spec/lib/spree/promo/environment_spec.rb +0 -53
  261. data/spec/lib/tasks/dummy_task.rake +0 -12
  262. data/spec/lib/tasks/dummy_task_spec.rb +0 -30
  263. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +0 -21
  264. data/spec/mailers/carton_mailer_spec.rb +0 -44
  265. data/spec/mailers/order_mailer_spec.rb +0 -117
  266. data/spec/mailers/promotion_code_batch_mailer_spec.rb +0 -47
  267. data/spec/mailers/reimbursement_mailer_spec.rb +0 -36
  268. data/spec/mailers/test_mailer_spec.rb +0 -13
  269. data/spec/models/spree/ability_spec.rb +0 -279
  270. data/spec/models/spree/address_spec.rb +0 -399
  271. data/spec/models/spree/adjustment_reason_spec.rb +0 -11
  272. data/spec/models/spree/adjustment_spec.rb +0 -339
  273. data/spec/models/spree/asset_spec.rb +0 -25
  274. data/spec/models/spree/calculator/default_tax_spec.rb +0 -260
  275. data/spec/models/spree/calculator/distributed_amount_spec.rb +0 -82
  276. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -39
  277. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -52
  278. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -158
  279. data/spec/models/spree/calculator/free_shipping_spec.rb +0 -8
  280. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -20
  281. data/spec/models/spree/calculator/percent_per_item_spec.rb +0 -12
  282. data/spec/models/spree/calculator/price_sack_spec.rb +0 -35
  283. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -70
  284. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -44
  285. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -18
  286. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -56
  287. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -25
  288. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -44
  289. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -99
  290. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -197
  291. data/spec/models/spree/calculator_spec.rb +0 -43
  292. data/spec/models/spree/carton_spec.rb +0 -145
  293. data/spec/models/spree/classification_spec.rb +0 -126
  294. data/spec/models/spree/concerns/display_money_spec.rb +0 -44
  295. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +0 -52
  296. data/spec/models/spree/concerns/user_address_book_spec.rb +0 -358
  297. data/spec/models/spree/concerns/user_methods_spec.rb +0 -122
  298. data/spec/models/spree/country_spec.rb +0 -154
  299. data/spec/models/spree/credit_card_spec.rb +0 -373
  300. data/spec/models/spree/customer_return_spec.rb +0 -294
  301. data/spec/models/spree/distributed_amounts_handler_spec.rb +0 -83
  302. data/spec/models/spree/exchange_spec.rb +0 -76
  303. data/spec/models/spree/fulfilment_changer_spec.rb +0 -340
  304. data/spec/models/spree/gallery/product_gallery_spec.rb +0 -21
  305. data/spec/models/spree/gallery/variant_gallery_spec.rb +0 -21
  306. data/spec/models/spree/gateway/bogus_simple.rb +0 -14
  307. data/spec/models/spree/gateway/bogus_spec.rb +0 -14
  308. data/spec/models/spree/gateway_spec.rb +0 -14
  309. data/spec/models/spree/image_spec.rb +0 -25
  310. data/spec/models/spree/inventory_unit_spec.rb +0 -309
  311. data/spec/models/spree/line_item_spec.rb +0 -240
  312. data/spec/models/spree/option_type_spec.rb +0 -16
  313. data/spec/models/spree/option_value_spec.rb +0 -52
  314. data/spec/models/spree/order/address_spec.rb +0 -52
  315. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  316. data/spec/models/spree/order/callbacks_spec.rb +0 -44
  317. data/spec/models/spree/order/checkout_spec.rb +0 -740
  318. data/spec/models/spree/order/finalizing_spec.rb +0 -92
  319. data/spec/models/spree/order/number_generator_spec.rb +0 -47
  320. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +0 -138
  321. data/spec/models/spree/order/payment_spec.rb +0 -280
  322. data/spec/models/spree/order/risk_assessment_spec.rb +0 -70
  323. data/spec/models/spree/order/state_machine_spec.rb +0 -122
  324. data/spec/models/spree/order/totals_spec.rb +0 -26
  325. data/spec/models/spree/order/validations_spec.rb +0 -17
  326. data/spec/models/spree/order_cancellations_spec.rb +0 -233
  327. data/spec/models/spree/order_capturing_spec.rb +0 -16
  328. data/spec/models/spree/order_contents_spec.rb +0 -362
  329. data/spec/models/spree/order_inventory_spec.rb +0 -285
  330. data/spec/models/spree/order_merger_spec.rb +0 -162
  331. data/spec/models/spree/order_mutex_spec.rb +0 -89
  332. data/spec/models/spree/order_promotion_spec.rb +0 -33
  333. data/spec/models/spree/order_shipping_spec.rb +0 -247
  334. data/spec/models/spree/order_spec.rb +0 -1687
  335. data/spec/models/spree/order_taxation_spec.rb +0 -128
  336. data/spec/models/spree/order_update_attributes_spec.rb +0 -49
  337. data/spec/models/spree/order_updater_spec.rb +0 -556
  338. data/spec/models/spree/payment/cancellation_spec.rb +0 -84
  339. data/spec/models/spree/payment_create_spec.rb +0 -195
  340. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +0 -10
  341. data/spec/models/spree/payment_method/check_spec.rb +0 -80
  342. data/spec/models/spree/payment_method/credit_card_spec.rb +0 -68
  343. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +0 -20
  344. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -325
  345. data/spec/models/spree/payment_method_spec.rb +0 -408
  346. data/spec/models/spree/payment_spec.rb +0 -1270
  347. data/spec/models/spree/permission_sets/base_spec.rb +0 -14
  348. data/spec/models/spree/permission_sets/configuration_display.rb +0 -79
  349. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -49
  350. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -23
  351. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -56
  352. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -43
  353. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -57
  354. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -39
  355. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -41
  356. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -29
  357. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -42
  358. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -42
  359. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -25
  360. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -23
  361. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -39
  362. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -58
  363. data/spec/models/spree/preference_spec.rb +0 -79
  364. data/spec/models/spree/preferences/configuration_spec.rb +0 -27
  365. data/spec/models/spree/preferences/preferable_spec.rb +0 -334
  366. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -62
  367. data/spec/models/spree/preferences/static_model_preferences_spec.rb +0 -79
  368. data/spec/models/spree/preferences/statically_configurable_spec.rb +0 -67
  369. data/spec/models/spree/preferences/store_spec.rb +0 -40
  370. data/spec/models/spree/price_spec.rb +0 -150
  371. data/spec/models/spree/product/scopes_spec.rb +0 -164
  372. data/spec/models/spree/product_duplicator_spec.rb +0 -92
  373. data/spec/models/spree/product_filter_spec.rb +0 -28
  374. data/spec/models/spree/product_property_spec.rb +0 -20
  375. data/spec/models/spree/product_spec.rb +0 -584
  376. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -126
  377. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -198
  378. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +0 -298
  379. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -61
  380. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -87
  381. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +0 -71
  382. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -128
  383. data/spec/models/spree/promotion/rules/nth_order_spec.rb +0 -72
  384. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -54
  385. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -96
  386. data/spec/models/spree/promotion/rules/product_spec.rb +0 -193
  387. data/spec/models/spree/promotion/rules/store_spec.rb +0 -35
  388. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -226
  389. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -33
  390. data/spec/models/spree/promotion/rules/user_role_spec.rb +0 -88
  391. data/spec/models/spree/promotion/rules/user_spec.rb +0 -39
  392. data/spec/models/spree/promotion_action_spec.rb +0 -44
  393. data/spec/models/spree/promotion_category_spec.rb +0 -19
  394. data/spec/models/spree/promotion_code/batch_builder_spec.rb +0 -107
  395. data/spec/models/spree/promotion_code_batch_spec.rb +0 -54
  396. data/spec/models/spree/promotion_code_spec.rb +0 -206
  397. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -132
  398. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -419
  399. data/spec/models/spree/promotion_handler/page_spec.rb +0 -45
  400. data/spec/models/spree/promotion_handler/shipping_spec.rb +0 -96
  401. data/spec/models/spree/promotion_rule_spec.rb +0 -34
  402. data/spec/models/spree/promotion_spec.rb +0 -945
  403. data/spec/models/spree/refund_spec.rb +0 -200
  404. data/spec/models/spree/reimbursement/credit_spec.rb +0 -38
  405. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -144
  406. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -85
  407. data/spec/models/spree/reimbursement_performer_spec.rb +0 -33
  408. data/spec/models/spree/reimbursement_spec.rb +0 -278
  409. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -52
  410. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -56
  411. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -48
  412. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -110
  413. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -111
  414. data/spec/models/spree/return_authorization_spec.rb +0 -226
  415. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -79
  416. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -59
  417. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -86
  418. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -35
  419. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -31
  420. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -42
  421. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -66
  422. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  423. data/spec/models/spree/return_item_spec.rb +0 -785
  424. data/spec/models/spree/returns_calculator_spec.rb +0 -16
  425. data/spec/models/spree/shipment_spec.rb +0 -914
  426. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  427. data/spec/models/spree/shipping_manifest_spec.rb +0 -110
  428. data/spec/models/spree/shipping_method_spec.rb +0 -292
  429. data/spec/models/spree/shipping_rate_spec.rb +0 -154
  430. data/spec/models/spree/shipping_rate_tax_spec.rb +0 -79
  431. data/spec/models/spree/state_spec.rb +0 -43
  432. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +0 -146
  433. data/spec/models/spree/stock/availability_spec.rb +0 -143
  434. data/spec/models/spree/stock/availability_validator_spec.rb +0 -140
  435. data/spec/models/spree/stock/content_item_spec.rb +0 -70
  436. data/spec/models/spree/stock/differentiator_spec.rb +0 -41
  437. data/spec/models/spree/stock/estimator_spec.rb +0 -241
  438. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -34
  439. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +0 -58
  440. data/spec/models/spree/stock/location_filter/active_spec.rb +0 -22
  441. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +0 -22
  442. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +0 -21
  443. data/spec/models/spree/stock/package_spec.rb +0 -182
  444. data/spec/models/spree/stock/quantifier_spec.rb +0 -113
  445. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +0 -18
  446. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +0 -18
  447. data/spec/models/spree/stock/simple_coordinator_spec.rb +0 -264
  448. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -31
  449. data/spec/models/spree/stock/splitter/base_spec.rb +0 -22
  450. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -48
  451. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -31
  452. data/spec/models/spree/stock/splitter_chain_spec.rb +0 -66
  453. data/spec/models/spree/stock_item_spec.rb +0 -348
  454. data/spec/models/spree/stock_location_spec.rb +0 -288
  455. data/spec/models/spree/stock_movement_spec.rb +0 -58
  456. data/spec/models/spree/stock_quantities_spec.rb +0 -249
  457. data/spec/models/spree/store_credit_category_spec.rb +0 -19
  458. data/spec/models/spree/store_credit_event_spec.rb +0 -328
  459. data/spec/models/spree/store_credit_spec.rb +0 -900
  460. data/spec/models/spree/store_selector/by_server_name_spec.rb +0 -28
  461. data/spec/models/spree/store_selector/legacy_spec.rb +0 -46
  462. data/spec/models/spree/store_spec.rb +0 -156
  463. data/spec/models/spree/tax/order_adjuster_spec.rb +0 -35
  464. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +0 -59
  465. data/spec/models/spree/tax/tax_location_spec.rb +0 -79
  466. data/spec/models/spree/tax/taxation_integration_spec.rb +0 -815
  467. data/spec/models/spree/tax_calculator/default_spec.rb +0 -56
  468. data/spec/models/spree/tax_category_spec.rb +0 -50
  469. data/spec/models/spree/tax_rate_spec.rb +0 -317
  470. data/spec/models/spree/taxon_spec.rb +0 -197
  471. data/spec/models/spree/taxonomy_spec.rb +0 -15
  472. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +0 -29
  473. data/spec/models/spree/unit_cancel_spec.rb +0 -126
  474. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +0 -31
  475. data/spec/models/spree/user_last_url_storer_spec.rb +0 -60
  476. data/spec/models/spree/user_spec.rb +0 -247
  477. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -33
  478. data/spec/models/spree/variant/price_selector_spec.rb +0 -90
  479. data/spec/models/spree/variant/pricing_options_spec.rb +0 -204
  480. data/spec/models/spree/variant/scopes_spec.rb +0 -94
  481. data/spec/models/spree/variant/vat_price_generator_spec.rb +0 -77
  482. data/spec/models/spree/variant_property_rule_condition_spec.rb +0 -17
  483. data/spec/models/spree/variant_property_rule_spec.rb +0 -85
  484. data/spec/models/spree/variant_property_rule_value_spec.rb +0 -20
  485. data/spec/models/spree/variant_spec.rb +0 -862
  486. data/spec/models/spree/wallet_payment_source_spec.rb +0 -77
  487. data/spec/models/spree/wallet_spec.rb +0 -155
  488. data/spec/models/spree/zone_spec.rb +0 -248
  489. data/spec/rails_helper.rb +0 -46
  490. data/spec/shared_examples/calculator_shared_examples.rb +0 -10
  491. data/spec/spec_helper.rb +0 -36
  492. data/spec/support/big_decimal.rb +0 -7
  493. data/spec/support/concerns/default_price.rb +0 -44
  494. data/spec/support/concerns/payment_source.rb +0 -66
  495. data/spec/support/concerns/working_factories.rb +0 -15
  496. data/spec/support/dummy_ability.rb +0 -7
@@ -1,132 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- module Spree
6
- module PromotionHandler
7
- RSpec.describe Cart, type: :model do
8
- let(:line_item) { create(:line_item) }
9
- let(:order) { line_item.order }
10
- let(:promotion) { create(:promotion, apply_automatically: true) }
11
- let(:calculator) { Calculator::FlatPercentItemTotal.new(preferred_flat_percent: 10) }
12
-
13
- subject { Cart.new(order, line_item) }
14
-
15
- shared_context "creates the adjustment" do
16
- it "creates the adjustment" do
17
- expect {
18
- subject.activate
19
- }.to change { adjustable.adjustments.count }.by(1)
20
- end
21
- end
22
-
23
- shared_context "creates an order promotion" do
24
- it "connects the promotion to the order" do
25
- expect {
26
- subject.activate
27
- }.to change { order.promotions.reload.to_a }.from([]).to([promotion])
28
- end
29
- end
30
-
31
- context "activates in LineItem level" do
32
- let!(:action) { Promotion::Actions::CreateItemAdjustments.create(promotion: promotion, calculator: calculator) }
33
- let(:adjustable) { line_item }
34
-
35
- context "promotion with no rules" do
36
- include_context "creates the adjustment"
37
- include_context "creates an order promotion"
38
-
39
- context "for a non-sale promotion" do
40
- let(:promotion) { create(:promotion, apply_automatically: false) }
41
-
42
- it "doesn't connect the promotion to the order" do
43
- expect {
44
- subject.activate
45
- }.to change { order.promotions.count }.by(0)
46
- end
47
-
48
- it "doesn't create an adjustment" do
49
- expect {
50
- subject.activate
51
- }.to change { adjustable.adjustments.count }.by(0)
52
- end
53
- end
54
- end
55
-
56
- context "promotion includes item involved" do
57
- let!(:rule) { Promotion::Rules::Product.create(products: [line_item.product], promotion: promotion) }
58
-
59
- include_context "creates the adjustment"
60
- include_context "creates an order promotion"
61
- end
62
-
63
- context "promotion has item total rule" do
64
- let(:shirt) { create(:product) }
65
- let!(:rule) { Promotion::Rules::ItemTotal.create(preferred_operator: 'gt', preferred_amount: 50, promotion: promotion) }
66
-
67
- before do
68
- # Makes the order eligible for this promotion
69
- order.item_total = 100
70
- order.save
71
- end
72
-
73
- include_context "creates the adjustment"
74
- include_context "creates an order promotion"
75
- end
76
- end
77
-
78
- context "activates in Order level" do
79
- let!(:action) { Promotion::Actions::CreateAdjustment.create(promotion: promotion, calculator: calculator) }
80
- let(:adjustable) { order }
81
-
82
- context "promotion with no rules" do
83
- before do
84
- # Gives the calculator something to discount
85
- order.item_total = 10
86
- order.save
87
- end
88
-
89
- include_context "creates the adjustment"
90
- include_context "creates an order promotion"
91
- end
92
-
93
- context "promotion has item total rule" do
94
- let(:shirt) { create(:product) }
95
- let!(:rule) { Promotion::Rules::ItemTotal.create(preferred_operator: 'gt', preferred_amount: 50, promotion: promotion) }
96
-
97
- before do
98
- # Makes the order eligible for this promotion
99
- order.item_total = 100
100
- order.save
101
- end
102
-
103
- include_context "creates the adjustment"
104
- include_context "creates an order promotion"
105
- end
106
- end
107
-
108
- context "activates promotions associated with the order" do
109
- let(:promotion) { create :promotion, :with_order_adjustment, code: 'promo' }
110
- let(:promotion_code) { promotion.codes.first }
111
- let(:adjustable) { order }
112
-
113
- before do
114
- Spree::OrderPromotion.create!(promotion: promotion, order: order, promotion_code: promotion_code)
115
- order.recalculate
116
- end
117
-
118
- include_context "creates the adjustment"
119
-
120
- it "records the promotion code in the adjustment" do
121
- subject.activate
122
- expect(adjustable.adjustments.map(&:promotion_code)).to eq [promotion_code]
123
- end
124
-
125
- it "checks if the promotion code is eligible" do
126
- expect_any_instance_of(Spree::Promotion).to receive(:eligible?).at_least(2).times.with(anything, promotion_code: promotion_code).and_return(false)
127
- subject.activate
128
- end
129
- end
130
- end
131
- end
132
- end
@@ -1,419 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- module Spree
6
- module PromotionHandler
7
- RSpec.describe Coupon, type: :model do
8
- let(:order) { double("Order", coupon_code: "10off").as_null_object }
9
-
10
- subject { Coupon.new(order) }
11
-
12
- def expect_order_connection(order:, promotion:, promotion_code: nil)
13
- expect(order.promotions.to_a).to include(promotion)
14
- expect(order.order_promotions.flat_map(&:promotion_code)).to include(promotion_code)
15
- end
16
-
17
- def expect_adjustment_creation(adjustable:, promotion:, promotion_code: nil)
18
- expect(adjustable.adjustments.map(&:source).map(&:promotion)).to include(promotion)
19
- expect(adjustable.adjustments.map(&:promotion_code)).to include(promotion_code)
20
- end
21
-
22
- it "returns self in apply" do
23
- expect(subject.apply).to be_a Coupon
24
- end
25
-
26
- context 'status messages' do
27
- let(:coupon) { Coupon.new(order) }
28
-
29
- describe "#set_success_code" do
30
- let(:status) { :coupon_code_applied }
31
- subject { coupon.set_success_code status }
32
-
33
- it 'should have status_code' do
34
- subject
35
- expect(coupon.status_code).to eq(status)
36
- end
37
-
38
- it 'should have success message' do
39
- subject
40
- expect(coupon.success).to eq(I18n.t(status, scope: 'spree'))
41
- end
42
- end
43
-
44
- describe "#set_error_code" do
45
- subject { coupon.set_error_code status }
46
-
47
- context 'not found' do
48
- let(:status) { :coupon_code_not_found }
49
-
50
- it 'has status_code' do
51
- subject
52
- expect(coupon.status_code).to eq(status)
53
- end
54
-
55
- it 'has error message' do
56
- subject
57
- expect(coupon.error).to eq(I18n.t(status, scope: 'spree'))
58
- end
59
- end
60
-
61
- context 'not present' do
62
- let(:status) { :coupon_code_not_present }
63
-
64
- it 'has status_code' do
65
- subject
66
- expect(coupon.status_code).to eq(status)
67
- end
68
-
69
- it 'has error message' do
70
- subject
71
- expect(coupon.error).to eq(I18n.t(status, scope: 'spree'))
72
- end
73
- end
74
- end
75
- end
76
-
77
- context "coupon code promotion doesnt exist" do
78
- before { create(:promotion) }
79
-
80
- it "doesnt fetch any promotion" do
81
- expect(subject.promotion).to be_blank
82
- end
83
-
84
- context "with no actions defined" do
85
- before { create(:promotion, code: "10off") }
86
-
87
- it "populates error message" do
88
- subject.apply
89
- expect(subject.error).to eq I18n.t('spree.coupon_code_not_found')
90
- end
91
- end
92
- end
93
-
94
- context "existing coupon code promotion" do
95
- let!(:promotion) { promotion_code.promotion }
96
- let(:promotion_code) { create(:promotion_code, value: '10off') }
97
- let!(:action) { Promotion::Actions::CreateItemAdjustments.create(promotion: promotion, calculator: calculator) }
98
- let(:calculator) { Calculator::FlatRate.new(preferred_amount: 10) }
99
-
100
- it "fetches with given code" do
101
- expect(subject.promotion).to eq promotion
102
- end
103
-
104
- context "with a per-item adjustment action" do
105
- let(:order) { create(:order_with_line_items, line_items_count: 3) }
106
-
107
- context "right coupon given" do
108
- context "with correct coupon code casing" do
109
- before { order.coupon_code = "10off" }
110
-
111
- it "successfully activates promo" do
112
- expect(order.total).to eq(130)
113
- subject.apply
114
- expect(subject.success).to be_present
115
- expect_order_connection(order: order, promotion: promotion, promotion_code: promotion_code)
116
- order.line_items.each do |line_item|
117
- expect_adjustment_creation(adjustable: line_item, promotion: promotion, promotion_code: promotion_code)
118
- end
119
- # Ensure that applying the adjustment actually affects the order's total!
120
- expect(order.reload.total).to eq(100)
121
- end
122
-
123
- it "coupon already applied to the order" do
124
- subject.apply
125
- expect(subject.success).to be_present
126
- subject.apply
127
- expect(subject.error).to eq I18n.t('spree.coupon_code_already_applied')
128
- end
129
- end
130
-
131
- # Regression test for https://github.com/spree/spree/issues/4211
132
- context "with incorrect coupon code casing" do
133
- before { order.coupon_code = "10OFF" }
134
- it "successfully activates promo" do
135
- expect(order.total).to eq(130)
136
- subject.apply
137
- expect(subject.success).to be_present
138
- expect_order_connection(order: order, promotion: promotion, promotion_code: promotion_code)
139
- order.line_items.each do |line_item|
140
- expect_adjustment_creation(adjustable: line_item, promotion: promotion, promotion_code: promotion_code)
141
- end
142
- # Ensure that applying the adjustment actually affects the order's total!
143
- expect(order.reload.total).to eq(100)
144
- end
145
- end
146
- end
147
-
148
- context "coexists with a non coupon code promo" do
149
- let!(:order) { create(:order) }
150
-
151
- before do
152
- order.coupon_code = "10off"
153
- calculator = Calculator::FlatRate.new(preferred_amount: 10)
154
- general_promo = create(:promotion, apply_automatically: true, name: "General Promo")
155
- Promotion::Actions::CreateItemAdjustments.create(promotion: general_promo, calculator: calculator)
156
-
157
- order.contents.add create(:variant)
158
- end
159
-
160
- # regression spec for https://github.com/spree/spree/issues/4515
161
- it "successfully activates promo" do
162
- subject.apply
163
- expect(subject).to be_successful
164
- expect_order_connection(order: order, promotion: promotion, promotion_code: promotion_code)
165
- order.line_items.each do |line_item|
166
- expect_adjustment_creation(adjustable: line_item, promotion: promotion, promotion_code: promotion_code)
167
- end
168
- end
169
- end
170
-
171
- context "applied alongside another valid promotion " do
172
- let!(:order) { Order.create }
173
-
174
- before do
175
- order.coupon_code = "10off"
176
- calculator = Calculator::FlatPercentItemTotal.new(preferred_flat_percent: 10)
177
- general_promo = create(:promotion, apply_automatically: true, name: "General Promo")
178
- Promotion::Actions::CreateItemAdjustments.create!(promotion: general_promo, calculator: calculator)
179
-
180
- order.contents.add create(:variant, price: 500)
181
- order.contents.add create(:variant, price: 10)
182
-
183
- Spree::PromotionHandler::Cart.new(order).activate
184
- end
185
-
186
- it "successfully activates both promotions and returns success" do
187
- subject.apply
188
- expect(subject).to be_successful
189
- order.line_items.each do |line_item|
190
- expect(line_item.adjustments.count).to eq 2
191
- expect_adjustment_creation(adjustable: line_item, promotion: promotion, promotion_code: promotion_code)
192
- end
193
- end
194
- end
195
- end
196
-
197
- context "with a free-shipping adjustment action" do
198
- let!(:action) { Promotion::Actions::FreeShipping.create!(promotion: promotion) }
199
- context "right coupon code given" do
200
- let(:order) { create(:order_with_line_items, line_items_count: 3) }
201
-
202
- before { order.coupon_code = "10off" }
203
-
204
- it "successfully activates promo" do
205
- expect(order.total).to eq(130)
206
- subject.apply
207
- expect(subject.success).to be_present
208
-
209
- expect_order_connection(order: order, promotion: promotion, promotion_code: promotion_code)
210
- order.shipments.each do |shipment|
211
- expect_adjustment_creation(adjustable: shipment, promotion: promotion, promotion_code: promotion_code)
212
- end
213
- end
214
-
215
- it "coupon already applied to the order" do
216
- subject.apply
217
- expect(subject.success).to be_present
218
- subject.apply
219
- expect(subject.error).to eq I18n.t('spree.coupon_code_already_applied')
220
- end
221
- end
222
- end
223
-
224
- context "with a whole-order adjustment action" do
225
- let!(:action) { Promotion::Actions::CreateAdjustment.create(promotion: promotion, calculator: calculator) }
226
- context "right coupon given" do
227
- let(:order) { create(:order) }
228
- let(:calculator) { Calculator::FlatRate.new(preferred_amount: 10) }
229
-
230
- before do
231
- allow(order).to receive_messages({
232
- coupon_code: "10off",
233
- # These need to be here so that promotion adjustment "wins"
234
- item_total: 50,
235
- ship_total: 10
236
- })
237
- end
238
-
239
- it "successfully activates promo" do
240
- subject.apply
241
- expect(subject.success).to be_present
242
- expect(order.adjustments.count).to eq(1)
243
- expect_order_connection(order: order, promotion: promotion, promotion_code: promotion_code)
244
- expect_adjustment_creation(adjustable: order, promotion: promotion, promotion_code: promotion_code)
245
- end
246
-
247
- context "when the coupon is already applied to the order" do
248
- before { subject.apply }
249
-
250
- it "is not successful" do
251
- subject.apply
252
- expect(subject.successful?).to be false
253
- end
254
-
255
- it "returns a coupon has already been applied error" do
256
- subject.apply
257
- expect(subject.error).to eq I18n.t('spree.coupon_code_already_applied')
258
- end
259
- end
260
-
261
- context "when the coupon fails to activate" do
262
- before { allow_any_instance_of(Spree::Promotion).to receive(:activate).and_return false }
263
-
264
- it "is not successful" do
265
- subject.apply
266
- expect(subject.successful?).to be false
267
- end
268
-
269
- it "returns a coupon failed to activate error" do
270
- subject.apply
271
- expect(subject.error).to eq I18n.t('spree.coupon_code_unknown_error')
272
- end
273
- end
274
-
275
- context "when the promotion exceeds its usage limit" do
276
- let!(:second_order) { FactoryBot.create(:completed_order_with_promotion, promotion: promotion) }
277
-
278
- before do
279
- promotion.update!(usage_limit: 1)
280
- Coupon.new(second_order).apply
281
- end
282
-
283
- it "is not successful" do
284
- subject.apply
285
- expect(subject.successful?).to be false
286
- end
287
-
288
- it "returns a coupon is at max usage error" do
289
- subject.apply
290
- expect(subject.error).to eq I18n.t('spree.coupon_code_max_usage')
291
- end
292
- end
293
- end
294
- end
295
-
296
- context "for an order with taxable line items" do
297
- let(:store) { create(:store) }
298
- let(:order) { create(:order, store: store) }
299
- let(:tax_category) { create(:tax_category, name: "Taxable Foo") }
300
- let(:zone) { create(:zone, :with_country) }
301
- let!(:tax_rate) { create(:tax_rate, amount: 0.1, tax_categories: [tax_category], zone: zone ) }
302
-
303
- before(:each) do
304
- expect(order).to receive(:tax_address).at_least(:once).and_return(Spree::Tax::TaxLocation.new(country: zone.countries.first))
305
- end
306
-
307
- context "and the product price is less than promo discount" do
308
- before(:each) do
309
- order.coupon_code = "10off"
310
-
311
- 3.times do |_i|
312
- taxable = create(:product, tax_category: tax_category, price: 9.0)
313
- order.contents.add(taxable.master, 1)
314
- end
315
- end
316
-
317
- it "successfully applies the promo" do
318
- # 3 * (9 + 0.9)
319
- expect(order.total).to eq(29.7)
320
- coupon = Coupon.new(order)
321
- coupon.apply
322
- expect(coupon.success).to be_present
323
- # 3 * ((9 - [9,10].min) + 0)
324
- expect(order.reload.total).to eq(0)
325
- expect(order.additional_tax_total).to eq(0)
326
- end
327
- end
328
-
329
- context "and the product price is greater than promo discount" do
330
- before(:each) do
331
- order.coupon_code = "10off"
332
-
333
- 3.times do |_i|
334
- taxable = create(:product, tax_category: tax_category, price: 11.0)
335
- order.contents.add(taxable.master, 2)
336
- end
337
- end
338
-
339
- it "successfully applies the promo" do
340
- # 3 * (22 + 2.2)
341
- expect(order.total.to_f).to eq(72.6)
342
- coupon = Coupon.new(order)
343
- coupon.apply
344
- expect(coupon.success).to be_present
345
- # 3 * ( (22 - 10) + 1.2)
346
- expect(order.reload.total).to eq(39.6)
347
- expect(order.additional_tax_total).to eq(3.6)
348
- end
349
- end
350
-
351
- context "and multiple quantity per line item" do
352
- before(:each) do
353
- twnty_off = create(:promotion, name: "promo", code: "20off")
354
- twnty_off_calc = Calculator::FlatRate.new(preferred_amount: 20)
355
- Promotion::Actions::CreateItemAdjustments.create(promotion: twnty_off,
356
- calculator: twnty_off_calc)
357
-
358
- order.coupon_code = "20off"
359
-
360
- 3.times do |_i|
361
- taxable = create(:product, tax_category: tax_category, price: 10.0)
362
- order.contents.add(taxable.master, 2)
363
- end
364
- end
365
-
366
- it "successfully applies the promo" do
367
- # 3 * ((2 * 10) + 2.0)
368
- expect(order.total.to_f).to eq(66)
369
- coupon = Coupon.new(order)
370
- coupon.apply
371
- expect(coupon.success).to be_present
372
- # 0
373
- expect(order.reload.total).to eq(0)
374
- expect(order.additional_tax_total).to eq(0)
375
- end
376
- end
377
- end
378
- end
379
-
380
- context 'removing a coupon code from an order' do
381
- let!(:promotion) { promotion_code.promotion }
382
- let(:promotion_code) { create(:promotion_code, value: '10off') }
383
- let!(:action) { Promotion::Actions::CreateItemAdjustments.create(promotion: promotion, calculator: calculator) }
384
- let(:calculator) { Calculator::FlatRate.new(preferred_amount: 10) }
385
- let(:order) { create(:order_with_line_items, line_items_count: 3) }
386
-
387
- context 'with an already applied coupon' do
388
- before do
389
- order.coupon_code = '10off'
390
- subject.apply
391
- order.reload
392
- expect(order.total).to eq(100)
393
- end
394
-
395
- it 'successfully removes the coupon code from the order' do
396
- subject.remove
397
- expect(subject.error).to eq nil
398
- expect(subject.success).to eq I18n.t('spree.coupon_code_removed')
399
- expect(order.reload.total).to eq(130)
400
- end
401
- end
402
-
403
- context 'with a coupon code not applied to an order' do
404
- before do
405
- order.coupon_code = '10off'
406
- expect(order.total).to eq(130)
407
- end
408
-
409
- it 'returns an error' do
410
- subject.remove
411
- expect(subject.success).to eq nil
412
- expect(subject.error).to eq I18n.t('spree.coupon_code_not_present')
413
- expect(order.reload.total).to eq(130)
414
- end
415
- end
416
- end
417
- end
418
- end
419
- end