solidus_core 2.10.5 → 3.0.8

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 (618) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.erb +0 -22
  3. data/app/controllers/spree/base_controller.rb +1 -0
  4. data/app/helpers/spree/store_helper.rb +0 -11
  5. data/app/mailers/spree/base_mailer.rb +4 -0
  6. data/app/mailers/spree/carton_mailer.rb +1 -5
  7. data/app/mailers/spree/order_mailer.rb +1 -1
  8. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +71 -0
  9. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +39 -0
  10. data/app/models/concerns/spree/active_storage_adapter.rb +118 -0
  11. data/app/models/concerns/spree/adjustment_source.rb +0 -15
  12. data/app/models/concerns/spree/calculated_adjustments.rb +0 -18
  13. data/app/models/concerns/spree/default_price.rb +1 -1
  14. data/app/models/concerns/spree/soft_deletable.rb +16 -0
  15. data/app/models/concerns/spree/user_address_book.rb +61 -44
  16. data/app/models/concerns/spree/user_methods.rb +23 -12
  17. data/app/models/spree/ability.rb +0 -13
  18. data/app/models/spree/address/name.rb +31 -0
  19. data/app/models/spree/address/state_validator.rb +71 -0
  20. data/app/models/spree/address.rb +17 -95
  21. data/app/models/spree/adjustment.rb +1 -29
  22. data/app/models/spree/base.rb +1 -28
  23. data/app/models/spree/calculator/default_tax.rb +1 -1
  24. data/app/models/spree/calculator/flexi_rate.rb +0 -5
  25. data/app/models/spree/calculator.rb +8 -11
  26. data/app/models/spree/country.rb +1 -6
  27. data/app/models/spree/credit_card.rb +2 -29
  28. data/app/models/spree/customer_return.rb +5 -6
  29. data/app/models/spree/exchange.rb +1 -1
  30. data/app/models/spree/image/active_storage_attachment.rb +29 -0
  31. data/app/models/spree/image/paperclip_attachment.rb +1 -1
  32. data/app/models/spree/image.rb +0 -7
  33. data/app/models/spree/inventory_unit.rb +1 -22
  34. data/app/models/spree/line_item.rb +12 -46
  35. data/app/models/spree/log_entry.rb +74 -1
  36. data/app/models/spree/option_type.rb +1 -1
  37. data/app/models/spree/option_value.rb +2 -2
  38. data/app/models/spree/order/payments.rb +2 -2
  39. data/app/models/spree/order.rb +70 -132
  40. data/app/models/spree/order_cancellations.rb +4 -24
  41. data/app/models/spree/order_inventory.rb +16 -4
  42. data/app/models/spree/order_merger.rb +7 -5
  43. data/app/models/spree/order_promotion.rb +1 -1
  44. data/app/models/spree/order_shipping.rb +6 -9
  45. data/app/models/spree/order_updater.rb +7 -15
  46. data/app/models/spree/payment/cancellation.rb +3 -22
  47. data/app/models/spree/payment/processing.rb +54 -30
  48. data/app/models/spree/payment.rb +13 -9
  49. data/app/models/spree/payment_create.rb +1 -13
  50. data/app/models/spree/payment_method/bogus_credit_card.rb +13 -9
  51. data/app/models/spree/payment_method/credit_card.rb +1 -3
  52. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +4 -4
  53. data/app/models/spree/payment_method.rb +7 -106
  54. data/app/models/spree/payment_source.rb +2 -2
  55. data/app/models/spree/preference.rb +1 -1
  56. data/app/models/spree/price.rb +3 -9
  57. data/app/models/spree/product/scopes.rb +9 -32
  58. data/app/models/spree/product.rb +24 -52
  59. data/app/models/spree/promotion/actions/create_adjustment.rb +0 -3
  60. data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -3
  61. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -3
  62. data/app/models/spree/promotion/actions/free_shipping.rb +6 -5
  63. data/app/models/spree/promotion/rules/taxon.rb +2 -15
  64. data/app/models/spree/promotion.rb +15 -8
  65. data/app/models/spree/promotion_action.rb +5 -15
  66. data/app/models/spree/promotion_code/batch_builder.rb +0 -14
  67. data/app/models/spree/promotion_code.rb +8 -3
  68. data/app/models/spree/promotion_code_batch.rb +1 -1
  69. data/app/models/spree/promotion_handler/coupon.rb +2 -2
  70. data/app/models/spree/promotion_rule.rb +5 -1
  71. data/app/models/spree/promotion_rule_role.rb +1 -1
  72. data/app/models/spree/refund.rb +19 -13
  73. data/app/models/spree/reimbursement.rb +11 -22
  74. data/app/models/spree/reimbursement_performer.rb +2 -8
  75. data/app/models/spree/reimbursement_type/credit.rb +1 -4
  76. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +8 -2
  77. data/app/models/spree/reimbursement_type/store_credit.rb +1 -4
  78. data/app/models/spree/return_authorization.rb +2 -5
  79. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +1 -1
  80. data/app/models/spree/return_item.rb +10 -18
  81. data/app/models/spree/role.rb +1 -1
  82. data/app/models/spree/shipment.rb +3 -56
  83. data/app/models/spree/shipping_calculator.rb +1 -1
  84. data/app/models/spree/shipping_manifest.rb +2 -2
  85. data/app/models/spree/shipping_method.rb +3 -35
  86. data/app/models/spree/shipping_rate.rb +1 -3
  87. data/app/models/spree/shipping_rate_tax.rb +1 -1
  88. data/app/models/spree/state.rb +0 -4
  89. data/app/models/spree/stock/availability_validator.rb +2 -2
  90. data/app/models/spree/stock/inventory_unit_builder.rb +18 -7
  91. data/app/models/spree/stock/inventory_units_finalizer.rb +3 -5
  92. data/app/models/spree/stock/inventory_validator.rb +2 -2
  93. data/app/models/spree/stock/package.rb +1 -1
  94. data/app/models/spree/stock/simple_coordinator.rb +7 -18
  95. data/app/models/spree/stock/splitter/base.rb +2 -7
  96. data/app/models/spree/stock_item.rb +3 -15
  97. data/app/models/spree/stock_movement.rb +2 -0
  98. data/app/models/spree/store.rb +1 -13
  99. data/app/models/spree/store_credit.rb +9 -7
  100. data/app/models/spree/store_credit_category.rb +3 -8
  101. data/app/models/spree/store_credit_event.rb +1 -7
  102. data/app/models/spree/store_credit_reason.rb +0 -4
  103. data/app/models/spree/tax/tax_helpers.rb +1 -1
  104. data/app/models/spree/tax_calculator/shipping_rate.rb +1 -12
  105. data/app/models/spree/tax_category.rb +2 -8
  106. data/app/models/spree/tax_rate.rb +7 -34
  107. data/app/models/spree/taxon/active_storage_attachment.rb +13 -0
  108. data/app/models/spree/taxon/paperclip_attachment.rb +0 -4
  109. data/app/models/spree/taxon.rb +1 -12
  110. data/app/models/spree/user_address.rb +3 -2
  111. data/app/models/spree/variant.rb +8 -58
  112. data/app/models/spree/variant_property_rule.rb +5 -1
  113. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +8 -3
  114. data/app/models/spree/zone.rb +1 -1
  115. data/config/locales/en.yml +293 -13
  116. data/db/default/spree/countries.rb +1 -1
  117. data/db/default/spree/states.rb +12 -4
  118. data/db/default/spree/store_credit.rb +2 -2
  119. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +12 -0
  120. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +6 -0
  121. data/db/migrate/20200530111458_add_bcc_email_to_spree_stores.rb +7 -0
  122. data/db/migrate/20201008213609_add_discontinue_on_to_spree_products.rb +7 -0
  123. data/db/migrate/20210122110141_add_name_to_spree_addresses.rb +13 -0
  124. data/lib/generators/{spree → solidus}/install/install_generator.rb +82 -14
  125. data/lib/generators/{spree → solidus}/install/templates/config/initializers/spree.rb.tt +4 -9
  126. data/lib/generators/spree/dummy/dummy_generator.rb +2 -1
  127. data/lib/generators/spree/dummy/templates/rails/database.yml +6 -1
  128. data/lib/generators/spree/dummy/templates/rails/storage.yml +3 -0
  129. data/lib/generators/spree/dummy/templates/rails/test.rb +6 -1
  130. data/lib/solidus/migrations/promotions_with_code_handlers.rb +1 -1
  131. data/lib/spree/app_configuration.rb +104 -72
  132. data/lib/spree/core/class_constantizer.rb +2 -0
  133. data/lib/spree/core/controller_helpers/auth.rb +4 -4
  134. data/lib/spree/core/controller_helpers/current_host.rb +17 -0
  135. data/lib/spree/core/controller_helpers/order.rb +8 -27
  136. data/lib/spree/core/controller_helpers/payment_parameters.rb +0 -54
  137. data/lib/spree/core/controller_helpers/pricing.rb +0 -8
  138. data/lib/spree/core/controller_helpers/strong_parameters.rb +0 -4
  139. data/lib/spree/core/engine.rb +23 -8
  140. data/lib/spree/core/environment_extension.rb +0 -9
  141. data/lib/spree/core/importer/order.rb +24 -10
  142. data/lib/spree/core/permalinks.rb +1 -3
  143. data/lib/spree/core/product_filters.rb +5 -44
  144. data/lib/spree/core/role_configuration.rb +0 -14
  145. data/lib/spree/core/search/base.rb +0 -26
  146. data/lib/spree/core/state_machines/order.rb +249 -0
  147. data/lib/spree/core/state_machines/return_item/reception_status.rb +2 -2
  148. data/lib/spree/core/state_machines.rb +11 -1
  149. data/lib/spree/core/validators/email.rb +2 -2
  150. data/lib/spree/core/version.rb +1 -1
  151. data/lib/spree/core.rb +11 -19
  152. data/lib/spree/deprecation.rb +1 -1
  153. data/lib/spree/encryptor.rb +25 -0
  154. data/lib/spree/event/adapters/active_support_notifications.rb +32 -0
  155. data/lib/spree/event/configuration.rb +7 -7
  156. data/lib/spree/event/subscriber.rb +22 -20
  157. data/lib/spree/event/subscriber_registry.rb +94 -0
  158. data/lib/spree/event.rb +20 -18
  159. data/lib/spree/i18n.rb +0 -22
  160. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  161. data/lib/spree/money.rb +3 -18
  162. data/lib/spree/permission_sets/configuration_display.rb +14 -14
  163. data/lib/spree/permission_sets/default_customer.rb +16 -16
  164. data/lib/spree/permission_sets/order_display.rb +11 -11
  165. data/lib/spree/permission_sets/order_management.rb +1 -1
  166. data/lib/spree/permission_sets/product_display.rb +9 -9
  167. data/lib/spree/permission_sets/promotion_display.rb +5 -5
  168. data/lib/spree/permission_sets/restricted_stock_display.rb +2 -2
  169. data/lib/spree/permission_sets/restricted_stock_management.rb +1 -1
  170. data/lib/spree/permission_sets/stock_display.rb +2 -2
  171. data/lib/spree/permission_sets/stock_management.rb +1 -1
  172. data/lib/spree/permission_sets/user_display.rb +3 -3
  173. data/lib/spree/permission_sets/user_management.rb +4 -3
  174. data/lib/spree/permitted_attributes.rb +12 -56
  175. data/lib/spree/preferences/persistable.rb +23 -0
  176. data/lib/spree/preferences/preferable.rb +4 -3
  177. data/lib/spree/preferences/preferable_class_methods.rb +22 -3
  178. data/lib/spree/testing_support/ability_helpers.rb +9 -9
  179. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  180. data/lib/spree/testing_support/blacklist_urls.rb +23 -0
  181. data/lib/spree/testing_support/capybara_ext.rb +3 -30
  182. data/lib/spree/testing_support/common_rake.rb +3 -3
  183. data/lib/spree/testing_support/controller_requests.rb +0 -82
  184. data/lib/spree/testing_support/dummy_app/mailer_previews/test_mailer_preview.rb +4 -0
  185. data/lib/spree/testing_support/dummy_app/migrations.rb +2 -6
  186. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +1 -3
  187. data/lib/spree/testing_support/dummy_app.rb +41 -24
  188. data/lib/spree/testing_support/factories/address_factory.rb +7 -4
  189. data/lib/spree/testing_support/factories/adjustment_factory.rb +10 -5
  190. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +5 -0
  191. data/lib/spree/testing_support/factories/calculator_factory.rb +5 -0
  192. data/lib/spree/testing_support/factories/carton_factory.rb +7 -2
  193. data/lib/spree/testing_support/factories/country_factory.rb +5 -0
  194. data/lib/spree/testing_support/factories/credit_card_factory.rb +5 -0
  195. data/lib/spree/testing_support/factories/customer_return_factory.rb +8 -3
  196. data/lib/spree/testing_support/factories/image_factory.rb +6 -1
  197. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +9 -4
  198. data/lib/spree/testing_support/factories/line_item_factory.rb +7 -2
  199. data/lib/spree/testing_support/factories/option_type_factory.rb +8 -0
  200. data/lib/spree/testing_support/factories/option_value_factory.rb +5 -0
  201. data/lib/spree/testing_support/factories/order_factory.rb +11 -7
  202. data/lib/spree/testing_support/factories/order_promotion_factory.rb +7 -2
  203. data/lib/spree/testing_support/factories/payment_factory.rb +9 -4
  204. data/lib/spree/testing_support/factories/payment_method_factory.rb +5 -0
  205. data/lib/spree/testing_support/factories/price_factory.rb +6 -1
  206. data/lib/spree/testing_support/factories/product_factory.rb +10 -5
  207. data/lib/spree/testing_support/factories/product_option_type_factory.rb +7 -2
  208. data/lib/spree/testing_support/factories/product_property_factory.rb +7 -2
  209. data/lib/spree/testing_support/factories/promotion_category_factory.rb +5 -0
  210. data/lib/spree/testing_support/factories/promotion_code_factory.rb +7 -2
  211. data/lib/spree/testing_support/factories/promotion_factory.rb +13 -2
  212. data/lib/spree/testing_support/factories/property_factory.rb +5 -0
  213. data/lib/spree/testing_support/factories/refund_factory.rb +7 -2
  214. data/lib/spree/testing_support/factories/refund_reason_factory.rb +5 -0
  215. data/lib/spree/testing_support/factories/reimbursement_factory.rb +7 -2
  216. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +5 -0
  217. data/lib/spree/testing_support/factories/return_authorization_factory.rb +8 -3
  218. data/lib/spree/testing_support/factories/return_item_factory.rb +8 -4
  219. data/lib/spree/testing_support/factories/return_reason_factory.rb +5 -0
  220. data/lib/spree/testing_support/factories/role_factory.rb +5 -0
  221. data/lib/spree/testing_support/factories/shipment_factory.rb +9 -3
  222. data/lib/spree/testing_support/factories/shipping_category_factory.rb +5 -0
  223. data/lib/spree/testing_support/factories/shipping_method_factory.rb +8 -3
  224. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +7 -2
  225. data/lib/spree/testing_support/factories/state_factory.rb +7 -1
  226. data/lib/spree/testing_support/factories/stock_item_factory.rb +7 -2
  227. data/lib/spree/testing_support/factories/stock_location_factory.rb +8 -3
  228. data/lib/spree/testing_support/factories/stock_movement_factory.rb +6 -1
  229. data/lib/spree/testing_support/factories/stock_package_factory.rb +7 -2
  230. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +13 -0
  231. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -2
  232. data/lib/spree/testing_support/factories/store_credit_factory.rb +8 -3
  233. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +8 -1
  234. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +5 -0
  235. data/lib/spree/testing_support/factories/store_factory.rb +6 -1
  236. data/lib/spree/testing_support/factories/tax_category_factory.rb +7 -1
  237. data/lib/spree/testing_support/factories/tax_rate_factory.rb +8 -3
  238. data/lib/spree/testing_support/factories/taxon_factory.rb +10 -1
  239. data/lib/spree/testing_support/factories/taxonomy_factory.rb +5 -0
  240. data/lib/spree/testing_support/factories/user_factory.rb +14 -3
  241. data/lib/spree/testing_support/factories/variant_factory.rb +9 -4
  242. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +7 -2
  243. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +8 -3
  244. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +7 -2
  245. data/lib/spree/testing_support/factories/zone_factory.rb +8 -3
  246. data/lib/spree/testing_support/factories.rb +8 -4
  247. data/lib/spree/testing_support/factory_bot.rb +68 -0
  248. data/lib/spree/testing_support/fixtures/blank.jpg +0 -0
  249. data/lib/spree/testing_support/fixtures/file.txt +1 -0
  250. data/lib/spree/testing_support/job_helpers.rb +24 -0
  251. data/lib/spree/testing_support/order_walkthrough.rb +10 -13
  252. data/lib/spree/testing_support/precompiled_assets.rb +15 -0
  253. data/lib/spree/testing_support/preferences.rb +0 -23
  254. data/lib/spree/testing_support/sequences.rb +4 -1
  255. data/lib/spree/testing_support/shared_examples/gallery.rb +1 -1
  256. data/lib/spree/testing_support/translations.rb +25 -0
  257. data/lib/spree/testing_support.rb +31 -0
  258. data/lib/tasks/solidus/check_orders_with_invalid_email.rake +18 -0
  259. data/lib/tasks/upgrade.rake +15 -0
  260. data/solidus_core.gemspec +30 -7
  261. metadata +137 -408
  262. data/app/mailers/spree/test_mailer.rb +0 -13
  263. data/app/models/concerns/spree/user_payment_source.rb +0 -26
  264. data/app/models/spree/calculator/free_shipping.rb +0 -21
  265. data/app/models/spree/calculator/percent_per_item.rb +0 -49
  266. data/app/models/spree/calculator/price_sack.rb +0 -27
  267. data/app/models/spree/gateway/bogus.rb +0 -13
  268. data/app/models/spree/gateway/bogus_simple.rb +0 -13
  269. data/app/models/spree/gateway.rb +0 -14
  270. data/app/models/spree/order/checkout.rb +0 -243
  271. data/app/models/spree/order_capturing.rb +0 -50
  272. data/app/models/spree/promotion_handler/free_shipping.rb +0 -9
  273. data/lib/solidus/migrations/rename_gateways.rb +0 -41
  274. data/lib/spree/core/current_store.rb +0 -24
  275. data/lib/spree/paranoia_deprecations.rb +0 -21
  276. data/lib/spree/promo/environment.rb +0 -12
  277. data/lib/spree/testing_support/bar_ability.rb +0 -19
  278. data/lib/tasks/core.rake +0 -104
  279. data/lib/tasks/email.rake +0 -11
  280. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -119
  281. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +0 -22
  282. data/lib/tasks/migrations/migrate_user_addresses.rake +0 -34
  283. data/lib/tasks/migrations/rename_gateways.rake +0 -23
  284. data/lib/tasks/order_capturing.rake +0 -27
  285. data/script/rails +0 -10
  286. data/spec/fixtures/thinking-cat.jpg +0 -0
  287. data/spec/helpers/base_helper_spec.rb +0 -168
  288. data/spec/helpers/products_helper_spec.rb +0 -202
  289. data/spec/helpers/taxons_helper_spec.rb +0 -43
  290. data/spec/jobs/promotion_code_batch_job_spec.rb +0 -96
  291. data/spec/lib/calculated_adjustments_spec.rb +0 -133
  292. data/spec/lib/i18n_spec.rb +0 -97
  293. data/spec/lib/search/base_spec.rb +0 -91
  294. data/spec/lib/search/variant_spec.rb +0 -115
  295. data/spec/lib/spree/app_configuration_spec.rb +0 -140
  296. data/spec/lib/spree/core/class_constantizer_spec.rb +0 -91
  297. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -73
  298. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -126
  299. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -195
  300. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +0 -94
  301. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -21
  302. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -18
  303. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -48
  304. data/spec/lib/spree/core/current_store_spec.rb +0 -33
  305. data/spec/lib/spree/core/environment_extension_spec.rb +0 -46
  306. data/spec/lib/spree/core/importer/order_spec.rb +0 -484
  307. data/spec/lib/spree/core/role_configuration_spec.rb +0 -155
  308. data/spec/lib/spree/core/stock_configuration_spec.rb +0 -95
  309. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +0 -61
  310. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +0 -20
  311. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +0 -14
  312. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +0 -44
  313. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +0 -14
  314. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +0 -14
  315. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +0 -14
  316. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +0 -39
  317. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +0 -14
  318. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +0 -14
  319. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +0 -14
  320. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +0 -14
  321. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +0 -14
  322. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -376
  323. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +0 -14
  324. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +0 -40
  325. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +0 -32
  326. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +0 -14
  327. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +0 -32
  328. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +0 -14
  329. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +0 -14
  330. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +0 -14
  331. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +0 -14
  332. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +0 -32
  333. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +0 -14
  334. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +0 -14
  335. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +0 -14
  336. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +0 -20
  337. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +0 -14
  338. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +0 -14
  339. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +0 -20
  340. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +0 -14
  341. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +0 -20
  342. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +0 -14
  343. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +0 -14
  344. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +0 -44
  345. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +0 -14
  346. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +0 -59
  347. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +0 -14
  348. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +0 -35
  349. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +0 -14
  350. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +0 -28
  351. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +0 -14
  352. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +0 -43
  353. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +0 -14
  354. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +0 -14
  355. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +0 -20
  356. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +0 -14
  357. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +0 -14
  358. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +0 -14
  359. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +0 -14
  360. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +0 -14
  361. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +0 -24
  362. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +0 -56
  363. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +0 -14
  364. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +0 -14
  365. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +0 -14
  366. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +0 -20
  367. data/spec/lib/spree/core/testing_support/preferences_spec.rb +0 -61
  368. data/spec/lib/spree/core/validators/email_spec.rb +0 -53
  369. data/spec/lib/spree/core/version_spec.rb +0 -19
  370. data/spec/lib/spree/event/subscriber_spec.rb +0 -85
  371. data/spec/lib/spree/event_spec.rb +0 -130
  372. data/spec/lib/spree/localized_number_spec.rb +0 -45
  373. data/spec/lib/spree/migrations_spec.rb +0 -32
  374. data/spec/lib/spree/money_spec.rb +0 -298
  375. data/spec/lib/spree/permission_sets/default_customer_spec.rb +0 -22
  376. data/spec/lib/spree/permitted_attributes_spec.rb +0 -41
  377. data/spec/lib/spree/promo/environment_spec.rb +0 -53
  378. data/spec/lib/tasks/dummy_task.rake +0 -12
  379. data/spec/lib/tasks/dummy_task_spec.rb +0 -30
  380. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +0 -21
  381. data/spec/mailers/carton_mailer_spec.rb +0 -44
  382. data/spec/mailers/order_mailer_spec.rb +0 -117
  383. data/spec/mailers/promotion_code_batch_mailer_spec.rb +0 -47
  384. data/spec/mailers/reimbursement_mailer_spec.rb +0 -36
  385. data/spec/mailers/test_mailer_spec.rb +0 -13
  386. data/spec/models/spree/ability_spec.rb +0 -279
  387. data/spec/models/spree/address_spec.rb +0 -399
  388. data/spec/models/spree/adjustment_reason_spec.rb +0 -11
  389. data/spec/models/spree/adjustment_spec.rb +0 -339
  390. data/spec/models/spree/asset_spec.rb +0 -25
  391. data/spec/models/spree/calculator/default_tax_spec.rb +0 -260
  392. data/spec/models/spree/calculator/distributed_amount_spec.rb +0 -82
  393. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -39
  394. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -52
  395. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -158
  396. data/spec/models/spree/calculator/free_shipping_spec.rb +0 -8
  397. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -20
  398. data/spec/models/spree/calculator/percent_per_item_spec.rb +0 -12
  399. data/spec/models/spree/calculator/price_sack_spec.rb +0 -35
  400. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -70
  401. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -44
  402. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -18
  403. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -56
  404. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -25
  405. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -44
  406. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -99
  407. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -197
  408. data/spec/models/spree/calculator_spec.rb +0 -43
  409. data/spec/models/spree/carton_spec.rb +0 -145
  410. data/spec/models/spree/classification_spec.rb +0 -126
  411. data/spec/models/spree/concerns/display_money_spec.rb +0 -44
  412. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +0 -52
  413. data/spec/models/spree/concerns/user_address_book_spec.rb +0 -358
  414. data/spec/models/spree/concerns/user_methods_spec.rb +0 -122
  415. data/spec/models/spree/country_spec.rb +0 -154
  416. data/spec/models/spree/credit_card_spec.rb +0 -373
  417. data/spec/models/spree/customer_return_spec.rb +0 -294
  418. data/spec/models/spree/distributed_amounts_handler_spec.rb +0 -83
  419. data/spec/models/spree/exchange_spec.rb +0 -76
  420. data/spec/models/spree/fulfilment_changer_spec.rb +0 -340
  421. data/spec/models/spree/gallery/product_gallery_spec.rb +0 -21
  422. data/spec/models/spree/gallery/variant_gallery_spec.rb +0 -21
  423. data/spec/models/spree/gateway/bogus_simple.rb +0 -14
  424. data/spec/models/spree/gateway/bogus_spec.rb +0 -14
  425. data/spec/models/spree/gateway_spec.rb +0 -14
  426. data/spec/models/spree/image_spec.rb +0 -25
  427. data/spec/models/spree/inventory_unit_spec.rb +0 -309
  428. data/spec/models/spree/line_item_spec.rb +0 -240
  429. data/spec/models/spree/option_type_spec.rb +0 -16
  430. data/spec/models/spree/option_value_spec.rb +0 -52
  431. data/spec/models/spree/order/address_spec.rb +0 -52
  432. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  433. data/spec/models/spree/order/callbacks_spec.rb +0 -44
  434. data/spec/models/spree/order/checkout_spec.rb +0 -740
  435. data/spec/models/spree/order/finalizing_spec.rb +0 -92
  436. data/spec/models/spree/order/number_generator_spec.rb +0 -47
  437. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +0 -138
  438. data/spec/models/spree/order/payment_spec.rb +0 -280
  439. data/spec/models/spree/order/risk_assessment_spec.rb +0 -70
  440. data/spec/models/spree/order/state_machine_spec.rb +0 -122
  441. data/spec/models/spree/order/totals_spec.rb +0 -26
  442. data/spec/models/spree/order/validations_spec.rb +0 -17
  443. data/spec/models/spree/order_cancellations_spec.rb +0 -233
  444. data/spec/models/spree/order_capturing_spec.rb +0 -16
  445. data/spec/models/spree/order_contents_spec.rb +0 -362
  446. data/spec/models/spree/order_inventory_spec.rb +0 -285
  447. data/spec/models/spree/order_merger_spec.rb +0 -162
  448. data/spec/models/spree/order_mutex_spec.rb +0 -89
  449. data/spec/models/spree/order_promotion_spec.rb +0 -33
  450. data/spec/models/spree/order_shipping_spec.rb +0 -247
  451. data/spec/models/spree/order_spec.rb +0 -1687
  452. data/spec/models/spree/order_taxation_spec.rb +0 -128
  453. data/spec/models/spree/order_update_attributes_spec.rb +0 -49
  454. data/spec/models/spree/order_updater_spec.rb +0 -556
  455. data/spec/models/spree/payment/cancellation_spec.rb +0 -84
  456. data/spec/models/spree/payment_create_spec.rb +0 -195
  457. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +0 -10
  458. data/spec/models/spree/payment_method/check_spec.rb +0 -80
  459. data/spec/models/spree/payment_method/credit_card_spec.rb +0 -68
  460. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +0 -20
  461. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -325
  462. data/spec/models/spree/payment_method_spec.rb +0 -408
  463. data/spec/models/spree/payment_spec.rb +0 -1270
  464. data/spec/models/spree/permission_sets/base_spec.rb +0 -14
  465. data/spec/models/spree/permission_sets/configuration_display.rb +0 -79
  466. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -49
  467. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -23
  468. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -56
  469. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -43
  470. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -57
  471. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -39
  472. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -41
  473. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -29
  474. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -42
  475. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -42
  476. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -25
  477. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -23
  478. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -39
  479. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -58
  480. data/spec/models/spree/preference_spec.rb +0 -79
  481. data/spec/models/spree/preferences/configuration_spec.rb +0 -27
  482. data/spec/models/spree/preferences/preferable_spec.rb +0 -334
  483. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -62
  484. data/spec/models/spree/preferences/static_model_preferences_spec.rb +0 -79
  485. data/spec/models/spree/preferences/statically_configurable_spec.rb +0 -67
  486. data/spec/models/spree/preferences/store_spec.rb +0 -40
  487. data/spec/models/spree/price_spec.rb +0 -150
  488. data/spec/models/spree/product/scopes_spec.rb +0 -164
  489. data/spec/models/spree/product_duplicator_spec.rb +0 -92
  490. data/spec/models/spree/product_filter_spec.rb +0 -28
  491. data/spec/models/spree/product_property_spec.rb +0 -20
  492. data/spec/models/spree/product_spec.rb +0 -584
  493. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -126
  494. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -198
  495. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +0 -298
  496. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -61
  497. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -87
  498. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +0 -71
  499. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -128
  500. data/spec/models/spree/promotion/rules/nth_order_spec.rb +0 -72
  501. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -54
  502. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -96
  503. data/spec/models/spree/promotion/rules/product_spec.rb +0 -193
  504. data/spec/models/spree/promotion/rules/store_spec.rb +0 -35
  505. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -227
  506. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -33
  507. data/spec/models/spree/promotion/rules/user_role_spec.rb +0 -88
  508. data/spec/models/spree/promotion/rules/user_spec.rb +0 -39
  509. data/spec/models/spree/promotion_action_spec.rb +0 -44
  510. data/spec/models/spree/promotion_category_spec.rb +0 -19
  511. data/spec/models/spree/promotion_code/batch_builder_spec.rb +0 -107
  512. data/spec/models/spree/promotion_code_batch_spec.rb +0 -54
  513. data/spec/models/spree/promotion_code_spec.rb +0 -206
  514. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -132
  515. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -419
  516. data/spec/models/spree/promotion_handler/page_spec.rb +0 -45
  517. data/spec/models/spree/promotion_handler/shipping_spec.rb +0 -96
  518. data/spec/models/spree/promotion_rule_spec.rb +0 -34
  519. data/spec/models/spree/promotion_spec.rb +0 -945
  520. data/spec/models/spree/refund_spec.rb +0 -200
  521. data/spec/models/spree/reimbursement/credit_spec.rb +0 -38
  522. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -144
  523. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -85
  524. data/spec/models/spree/reimbursement_performer_spec.rb +0 -33
  525. data/spec/models/spree/reimbursement_spec.rb +0 -278
  526. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -52
  527. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -56
  528. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -48
  529. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -110
  530. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -111
  531. data/spec/models/spree/return_authorization_spec.rb +0 -226
  532. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -79
  533. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -59
  534. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -86
  535. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -35
  536. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -31
  537. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -42
  538. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -66
  539. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  540. data/spec/models/spree/return_item_spec.rb +0 -785
  541. data/spec/models/spree/returns_calculator_spec.rb +0 -16
  542. data/spec/models/spree/shipment_spec.rb +0 -914
  543. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  544. data/spec/models/spree/shipping_manifest_spec.rb +0 -110
  545. data/spec/models/spree/shipping_method_spec.rb +0 -292
  546. data/spec/models/spree/shipping_rate_spec.rb +0 -154
  547. data/spec/models/spree/shipping_rate_tax_spec.rb +0 -79
  548. data/spec/models/spree/state_spec.rb +0 -43
  549. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +0 -146
  550. data/spec/models/spree/stock/availability_spec.rb +0 -143
  551. data/spec/models/spree/stock/availability_validator_spec.rb +0 -140
  552. data/spec/models/spree/stock/content_item_spec.rb +0 -70
  553. data/spec/models/spree/stock/differentiator_spec.rb +0 -41
  554. data/spec/models/spree/stock/estimator_spec.rb +0 -241
  555. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -34
  556. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +0 -58
  557. data/spec/models/spree/stock/location_filter/active_spec.rb +0 -22
  558. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +0 -22
  559. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +0 -21
  560. data/spec/models/spree/stock/package_spec.rb +0 -182
  561. data/spec/models/spree/stock/quantifier_spec.rb +0 -113
  562. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +0 -18
  563. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +0 -18
  564. data/spec/models/spree/stock/simple_coordinator_spec.rb +0 -264
  565. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -31
  566. data/spec/models/spree/stock/splitter/base_spec.rb +0 -22
  567. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -48
  568. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -31
  569. data/spec/models/spree/stock/splitter_chain_spec.rb +0 -66
  570. data/spec/models/spree/stock_item_spec.rb +0 -348
  571. data/spec/models/spree/stock_location_spec.rb +0 -288
  572. data/spec/models/spree/stock_movement_spec.rb +0 -58
  573. data/spec/models/spree/stock_quantities_spec.rb +0 -249
  574. data/spec/models/spree/store_credit_category_spec.rb +0 -19
  575. data/spec/models/spree/store_credit_event_spec.rb +0 -328
  576. data/spec/models/spree/store_credit_spec.rb +0 -900
  577. data/spec/models/spree/store_selector/by_server_name_spec.rb +0 -28
  578. data/spec/models/spree/store_selector/legacy_spec.rb +0 -46
  579. data/spec/models/spree/store_spec.rb +0 -156
  580. data/spec/models/spree/tax/order_adjuster_spec.rb +0 -35
  581. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +0 -59
  582. data/spec/models/spree/tax/tax_location_spec.rb +0 -79
  583. data/spec/models/spree/tax/taxation_integration_spec.rb +0 -815
  584. data/spec/models/spree/tax_calculator/default_spec.rb +0 -56
  585. data/spec/models/spree/tax_category_spec.rb +0 -50
  586. data/spec/models/spree/tax_rate_spec.rb +0 -317
  587. data/spec/models/spree/taxon_spec.rb +0 -197
  588. data/spec/models/spree/taxonomy_spec.rb +0 -15
  589. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +0 -29
  590. data/spec/models/spree/unit_cancel_spec.rb +0 -126
  591. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +0 -31
  592. data/spec/models/spree/user_last_url_storer_spec.rb +0 -60
  593. data/spec/models/spree/user_spec.rb +0 -247
  594. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -33
  595. data/spec/models/spree/variant/price_selector_spec.rb +0 -90
  596. data/spec/models/spree/variant/pricing_options_spec.rb +0 -204
  597. data/spec/models/spree/variant/scopes_spec.rb +0 -94
  598. data/spec/models/spree/variant/vat_price_generator_spec.rb +0 -77
  599. data/spec/models/spree/variant_property_rule_condition_spec.rb +0 -17
  600. data/spec/models/spree/variant_property_rule_spec.rb +0 -85
  601. data/spec/models/spree/variant_property_rule_value_spec.rb +0 -20
  602. data/spec/models/spree/variant_spec.rb +0 -862
  603. data/spec/models/spree/wallet_payment_source_spec.rb +0 -77
  604. data/spec/models/spree/wallet_spec.rb +0 -155
  605. data/spec/models/spree/zone_spec.rb +0 -248
  606. data/spec/rails_helper.rb +0 -46
  607. data/spec/shared_examples/calculator_shared_examples.rb +0 -10
  608. data/spec/spec_helper.rb +0 -36
  609. data/spec/support/big_decimal.rb +0 -7
  610. data/spec/support/concerns/default_price.rb +0 -44
  611. data/spec/support/concerns/payment_source.rb +0 -66
  612. data/spec/support/concerns/working_factories.rb +0 -15
  613. data/spec/support/dummy_ability.rb +0 -7
  614. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -0
  615. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -0
  616. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -0
  617. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -0
  618. /data/{app/models → lib}/spree/user_class_handle.rb +0 -0
@@ -1,945 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Spree::Promotion, type: :model do
6
- let(:promotion) { Spree::Promotion.new }
7
-
8
- describe "validations" do
9
- before :each do
10
- @valid_promotion = Spree::Promotion.new name: "A promotion"
11
- end
12
-
13
- it "valid_promotion is valid" do
14
- expect(@valid_promotion).to be_valid
15
- end
16
-
17
- it "validates usage limit" do
18
- @valid_promotion.usage_limit = -1
19
- expect(@valid_promotion).not_to be_valid
20
-
21
- @valid_promotion.usage_limit = 100
22
- expect(@valid_promotion).to be_valid
23
- end
24
-
25
- it "validates name" do
26
- @valid_promotion.name = nil
27
- expect(@valid_promotion).not_to be_valid
28
- end
29
- end
30
-
31
- describe ".applied" do
32
- it "scopes promotions that have been applied to an order only" do
33
- promotion = Spree::Promotion.create! name: "test"
34
- expect(Spree::Promotion.applied).to be_empty
35
-
36
- promotion.orders << create(:order)
37
- expect(Spree::Promotion.applied.first).to eq promotion
38
- end
39
- end
40
-
41
- describe ".advertised" do
42
- let(:promotion) { create(:promotion) }
43
- let(:advertised_promotion) { create(:promotion, advertise: true) }
44
-
45
- it "only shows advertised promotions" do
46
- advertised = Spree::Promotion.advertised
47
- expect(advertised).to include(advertised_promotion)
48
- expect(advertised).not_to include(promotion)
49
- end
50
- end
51
-
52
- describe ".coupons" do
53
- let(:promotion_code) { create(:promotion_code) }
54
- let!(:promotion_with_code) { promotion_code.promotion }
55
- let!(:another_promotion_code) { create(:promotion_code, promotion: promotion_with_code) }
56
- let!(:promotion_without_code) { create(:promotion) }
57
-
58
- subject { described_class.coupons }
59
-
60
- it "returns only distinct promotions with a code associated" do
61
- expect(subject).to eq [promotion_with_code]
62
- end
63
- end
64
-
65
- describe "#apply_automatically" do
66
- subject { build(:promotion) }
67
-
68
- it "defaults to false" do
69
- expect(subject.apply_automatically).to eq(false)
70
- end
71
-
72
- context "when set to true" do
73
- before { subject.apply_automatically = true }
74
-
75
- it "should remain valid" do
76
- expect(subject).to be_valid
77
- end
78
-
79
- it "invalidates the promotion when it has a code" do
80
- subject.codes.build(value: "foo")
81
- expect(subject).to_not be_valid
82
- expect(subject.errors).to include(:apply_automatically)
83
- end
84
-
85
- it "invalidates the promotion when it has a path" do
86
- subject.path = "foo"
87
- expect(subject).to_not be_valid
88
- expect(subject.errors).to include(:apply_automatically)
89
- end
90
- end
91
- end
92
-
93
- describe "#save" do
94
- let(:promotion) { Spree::Promotion.create(name: "delete me") }
95
-
96
- before(:each) do
97
- promotion.actions << Spree::Promotion::Actions::CreateAdjustment.new
98
- promotion.rules << Spree::Promotion::Rules::FirstOrder.new
99
- promotion.save!
100
- end
101
-
102
- it "should deeply autosave records and preferences" do
103
- promotion.actions[0].calculator.preferred_flat_percent = 10
104
- promotion.save!
105
- expect(Spree::Calculator.first.preferred_flat_percent).to eq(10)
106
- end
107
- end
108
-
109
- describe "#activate" do
110
- let(:promotion) { create(:promotion) }
111
-
112
- before do
113
- @action1 = Spree::Promotion::Actions::CreateAdjustment.create!
114
- @action2 = Spree::Promotion::Actions::CreateAdjustment.create!
115
- allow(@action1).to receive_messages perform: true
116
- allow(@action2).to receive_messages perform: true
117
-
118
- promotion.promotion_actions = [@action1, @action2]
119
- promotion.created_at = 2.days.ago
120
-
121
- @user = create(:user)
122
- @order = create(:order, user: @user, created_at: Time.current)
123
- @payload = { order: @order, user: @user }
124
- end
125
-
126
- it "should check path if present" do
127
- promotion.path = 'content/cvv'
128
- @payload[:path] = 'content/cvv'
129
- expect(@action1).to receive(:perform).with(hash_including(@payload))
130
- expect(@action2).to receive(:perform).with(hash_including(@payload))
131
- promotion.activate(@payload)
132
- end
133
-
134
- it "does not perform actions against an order in a finalized state" do
135
- expect(@action1).not_to receive(:perform)
136
-
137
- @order.state = 'complete'
138
- promotion.activate(@payload)
139
-
140
- @order.state = 'awaiting_return'
141
- promotion.activate(@payload)
142
-
143
- @order.state = 'returned'
144
- promotion.activate(@payload)
145
- end
146
-
147
- it "does activate if newer then order" do
148
- expect(@action1).to receive(:perform).with(hash_including(@payload))
149
- promotion.created_at = Time.current + 2
150
- expect(promotion.activate(@payload)).to be true
151
- end
152
-
153
- context "keeps track of the orders" do
154
- context "when activated" do
155
- it "assigns the order" do
156
- expect(promotion.orders).to be_empty
157
- expect(promotion.activate(@payload)).to be true
158
- expect(promotion.orders.first).to eql @order
159
- end
160
-
161
- it 'keeps in-memory associations updated' do
162
- # load all the relevant associations into memory
163
- promotion.order_promotions.to_a
164
- promotion.orders.to_a
165
- @order.order_promotions.to_a
166
- @order.promotions.to_a
167
-
168
- expect(promotion.order_promotions.size).to eq(0)
169
- expect(promotion.orders.size).to eq(0)
170
- expect(@order.order_promotions.size).to eq(0)
171
- expect(@order.promotions.size).to eq(0)
172
-
173
- expect(
174
- promotion.activate(@payload)
175
- ).to eq(true)
176
-
177
- aggregate_failures do
178
- expect(promotion.order_promotions.size).to eq(1)
179
- expect(promotion.orders.size).to eq(1)
180
- expect(@order.order_promotions.size).to eq(1)
181
- expect(@order.promotions.size).to eq(1)
182
- end
183
- end
184
- end
185
- context "when not activated" do
186
- it "will not assign the order" do
187
- @order.state = 'complete'
188
- expect(promotion.orders).to be_empty
189
- expect(promotion.activate(@payload)).to be_falsey
190
- expect(promotion.orders).to be_empty
191
- end
192
- end
193
- context "when the order is already associated" do
194
- before do
195
- expect(promotion.orders).to be_empty
196
- expect(promotion.activate(@payload)).to be true
197
- expect(promotion.orders.to_a).to eql [@order]
198
- end
199
-
200
- it "will not assign the order again" do
201
- expect(promotion.activate(@payload)).to be true
202
- expect(promotion.orders.reload.to_a).to eql [@order]
203
- end
204
- end
205
- end
206
-
207
- context "when there is a code" do
208
- let(:promotion_code) { create(:promotion_code) }
209
- let(:promotion) { promotion_code.promotion }
210
-
211
- it "assigns the code" do
212
- expect(promotion.activate(order: @order, promotion_code: promotion_code)).to be true
213
- expect(promotion.order_promotions.map(&:promotion_code)).to eq [promotion_code]
214
- end
215
- end
216
- end
217
-
218
- describe '#remove_from' do
219
- let(:promotion) { create(:promotion, :with_line_item_adjustment) }
220
- let(:order) { create(:order_with_line_items) }
221
-
222
- before do
223
- promotion.activate(order: order)
224
- end
225
-
226
- it 'removes the promotion' do
227
- expect(order.promotions).to include(promotion)
228
- expect(order.line_items.flat_map(&:adjustments)).to be_present
229
-
230
- promotion.remove_from(order)
231
-
232
- expect(order.promotions).to be_empty
233
- expect(order.line_items.flat_map(&:adjustments)).to be_empty
234
- end
235
- end
236
-
237
- describe "#usage_limit_exceeded?" do
238
- subject { promotion.usage_limit_exceeded? }
239
-
240
- shared_examples "it should" do
241
- context "when there is a usage limit" do
242
- context "and the limit is not exceeded" do
243
- let(:usage_limit) { 10 }
244
- it { is_expected.to be_falsy }
245
- end
246
- context "and the limit is exceeded" do
247
- let(:usage_limit) { 1 }
248
- context "on a different order" do
249
- before do
250
- FactoryBot.create(
251
- :completed_order_with_promotion,
252
- promotion: promotion
253
- )
254
- promotion.actions.first.adjustments.update_all(eligible: true)
255
- end
256
- it { is_expected.to be_truthy }
257
- end
258
- context "on the same order" do
259
- it { is_expected.to be_falsy }
260
- end
261
- end
262
- end
263
- context "when there is no usage limit" do
264
- let(:usage_limit) { nil }
265
- it { is_expected.to be_falsy }
266
- end
267
- end
268
-
269
- context "with an order-level adjustment" do
270
- let(:promotion) do
271
- FactoryBot.create(
272
- :promotion,
273
- :with_order_adjustment,
274
- code: "discount",
275
- usage_limit: usage_limit
276
- )
277
- end
278
- let(:promotable) do
279
- FactoryBot.create(
280
- :completed_order_with_promotion,
281
- promotion: promotion
282
- )
283
- end
284
- it_behaves_like "it should"
285
- end
286
-
287
- context "with an item-level adjustment" do
288
- let(:promotion) do
289
- FactoryBot.create(
290
- :promotion,
291
- :with_line_item_adjustment,
292
- code: "discount",
293
- usage_limit: usage_limit
294
- )
295
- end
296
- before do
297
- promotion.actions.first.perform({
298
- order: order,
299
- promotion: promotion,
300
- promotion_code: promotion.codes.first
301
- })
302
- end
303
- context "when there are multiple line items" do
304
- let(:order) { FactoryBot.create(:order_with_line_items, line_items_count: 2) }
305
- describe "the first item" do
306
- let(:promotable) { order.line_items.first }
307
- it_behaves_like "it should"
308
- end
309
- describe "the second item" do
310
- let(:promotable) { order.line_items.last }
311
- it_behaves_like "it should"
312
- end
313
- end
314
- context "when there is a single line item" do
315
- let(:order) { FactoryBot.create(:order_with_line_items) }
316
- let(:promotable) { order.line_items.first }
317
- it_behaves_like "it should"
318
- end
319
- end
320
- end
321
-
322
- describe "#usage_count" do
323
- let(:promotion) do
324
- FactoryBot.create(
325
- :promotion,
326
- :with_order_adjustment,
327
- code: "discount"
328
- )
329
- end
330
-
331
- subject { promotion.usage_count }
332
-
333
- context "when the code is applied to a non-complete order" do
334
- let(:order) { FactoryBot.create(:order_with_line_items) }
335
- before { promotion.activate(order: order, promotion_code: promotion.codes.first) }
336
- it { is_expected.to eq 0 }
337
- end
338
- context "when the code is applied to a complete order" do
339
- let!(:order) do
340
- FactoryBot.create(
341
- :completed_order_with_promotion,
342
- promotion: promotion
343
- )
344
- end
345
- context "and the promo is eligible" do
346
- it { is_expected.to eq 1 }
347
- end
348
- context "and the promo is ineligible" do
349
- before { order.adjustments.promotion.update_all(eligible: false) }
350
- it { is_expected.to eq 0 }
351
- end
352
- end
353
- end
354
-
355
- context "#inactive" do
356
- it "should not be exipired" do
357
- expect(promotion).not_to be_inactive
358
- end
359
-
360
- it "should be inactive if it hasn't started yet" do
361
- promotion.starts_at = Time.current + 1.day
362
- expect(promotion).to be_inactive
363
- end
364
-
365
- it "should be inactive if it has already ended" do
366
- promotion.expires_at = Time.current - 1.day
367
- expect(promotion).to be_inactive
368
- end
369
-
370
- it "should not be inactive if it has started already" do
371
- promotion.starts_at = Time.current - 1.day
372
- expect(promotion).not_to be_inactive
373
- end
374
-
375
- it "should not be inactive if it has not ended yet" do
376
- promotion.expires_at = Time.current + 1.day
377
- expect(promotion).not_to be_inactive
378
- end
379
-
380
- it "should not be inactive if current time is within starts_at and expires_at range" do
381
- promotion.starts_at = Time.current - 1.day
382
- promotion.expires_at = Time.current + 1.day
383
- expect(promotion).not_to be_inactive
384
- end
385
- end
386
-
387
- describe '#not_started?' do
388
- let(:promotion) { Spree::Promotion.new(starts_at: starts_at) }
389
- subject { promotion.not_started? }
390
-
391
- context 'no starts_at date' do
392
- let(:starts_at) { nil }
393
- it { is_expected.to be_falsey }
394
- end
395
-
396
- context 'when starts_at date is in the past' do
397
- let(:starts_at) { Time.current - 1.day }
398
- it { is_expected.to be_falsey }
399
- end
400
-
401
- context 'when starts_at date is not already reached' do
402
- let(:starts_at) { Time.current + 1.day }
403
- it { is_expected.to be_truthy }
404
- end
405
- end
406
-
407
- describe '#started?' do
408
- let(:promotion) { Spree::Promotion.new(starts_at: starts_at) }
409
- subject { promotion.started? }
410
-
411
- context 'when no starts_at date' do
412
- let(:starts_at) { nil }
413
- it { is_expected.to be_truthy }
414
- end
415
-
416
- context 'when starts_at date is in the past' do
417
- let(:starts_at) { Time.current - 1.day }
418
- it { is_expected.to be_truthy }
419
- end
420
-
421
- context 'when starts_at date is not already reached' do
422
- let(:starts_at) { Time.current + 1.day }
423
- it { is_expected.to be_falsey }
424
- end
425
- end
426
-
427
- describe '#expired?' do
428
- let(:promotion) { Spree::Promotion.new(expires_at: expires_at) }
429
- subject { promotion.expired? }
430
-
431
- context 'when no expires_at date' do
432
- let(:expires_at) { nil }
433
- it { is_expected.to be_falsey }
434
- end
435
-
436
- context 'when expires_at date is not already reached' do
437
- let(:expires_at) { Time.current + 1.day }
438
- it { is_expected.to be_falsey }
439
- end
440
-
441
- context 'when expires_at date is in the past' do
442
- let(:expires_at) { Time.current - 1.day }
443
- it { is_expected.to be_truthy }
444
- end
445
- end
446
-
447
- describe '#not_expired?' do
448
- let(:promotion) { Spree::Promotion.new(expires_at: expires_at) }
449
- subject { promotion.not_expired? }
450
-
451
- context 'when no expired_at date' do
452
- let(:expires_at) { nil }
453
- it { is_expected.to be_truthy }
454
- end
455
-
456
- context 'when expires_at date is not already reached' do
457
- let(:expires_at) { Time.current + 1.day }
458
- it { is_expected.to be_truthy }
459
- end
460
-
461
- context 'when expires_at date is in the past' do
462
- let(:expires_at) { Time.current - 1.day }
463
- it { is_expected.to be_falsey }
464
- end
465
- end
466
-
467
- context "#active" do
468
- it "should be active" do
469
- expect(promotion.active?).to eq(true)
470
- end
471
-
472
- it "should not be active if it hasn't started yet" do
473
- promotion.starts_at = Time.current + 1.day
474
- expect(promotion.active?).to eq(false)
475
- end
476
-
477
- it "should not be active if it has already ended" do
478
- promotion.expires_at = Time.current - 1.day
479
- expect(promotion.active?).to eq(false)
480
- end
481
-
482
- it "should be active if it has started already" do
483
- promotion.starts_at = Time.current - 1.day
484
- expect(promotion.active?).to eq(true)
485
- end
486
-
487
- it "should be active if it has not ended yet" do
488
- promotion.expires_at = Time.current + 1.day
489
- expect(promotion.active?).to eq(true)
490
- end
491
-
492
- it "should be active if current time is within starts_at and expires_at range" do
493
- promotion.starts_at = Time.current - 1.day
494
- promotion.expires_at = Time.current + 1.day
495
- expect(promotion.active?).to eq(true)
496
- end
497
-
498
- it "should be active if there are no start and end times set" do
499
- promotion.starts_at = nil
500
- promotion.expires_at = nil
501
- expect(promotion.active?).to eq(true)
502
- end
503
- end
504
-
505
- context "#usage_count" do
506
- let!(:promotion) do
507
- create(
508
- :promotion,
509
- name: "Foo",
510
- code: "XXX"
511
- )
512
- end
513
-
514
- let!(:action) do
515
- calculator = Spree::Calculator::FlatRate.new
516
- action_params = { promotion: promotion, calculator: calculator }
517
- action = Spree::Promotion::Actions::CreateAdjustment.create(action_params)
518
- promotion.actions << action
519
- action
520
- end
521
-
522
- let!(:adjustment) do
523
- order = create(:order)
524
- Spree::Adjustment.create!(
525
- order: order,
526
- adjustable: order,
527
- source: action,
528
- promotion_code: promotion.codes.first,
529
- amount: 10,
530
- label: 'Promotional adjustment'
531
- )
532
- end
533
-
534
- it "counts eligible adjustments" do
535
- adjustment.update_column(:eligible, true)
536
- expect(promotion.usage_count).to eq(0)
537
- end
538
-
539
- # Regression test for https://github.com/spree/spree/issues/4112
540
- it "does not count ineligible adjustments" do
541
- adjustment.update_column(:eligible, false)
542
- expect(promotion.usage_count).to eq(0)
543
- end
544
- end
545
-
546
- context "#products" do
547
- let(:promotion) { create(:promotion) }
548
-
549
- context "when it has product rules with products associated" do
550
- let(:promotion_rule) { Spree::Promotion::Rules::Product.new }
551
-
552
- before do
553
- promotion_rule.promotion = promotion
554
- promotion_rule.products << create(:product)
555
- promotion_rule.save
556
- end
557
-
558
- it "should have products" do
559
- expect(promotion.reload.products.size).to eq(1)
560
- end
561
- end
562
-
563
- context "when there's no product rule associated" do
564
- it "should not have products but still return an empty array" do
565
- expect(promotion.products).to be_blank
566
- end
567
- end
568
- end
569
-
570
- context "#eligible?" do
571
- subject do
572
- promotion.eligible?(promotable, promotion_code: promotion.codes.first)
573
- end
574
-
575
- shared_examples "a promotable" do
576
- context "when empty" do
577
- it { is_expected.to be true }
578
- end
579
-
580
- context "when promotion is expired" do
581
- before { promotion.expires_at = Time.current - 10.days }
582
-
583
- it { is_expected.to be false }
584
- end
585
-
586
- context "when promotion's usage limit is exceeded" do
587
- before do
588
- promotion.usage_limit = 1
589
- create(:completed_order_with_promotion, promotion: promotion)
590
- end
591
-
592
- it { is_expected.to be false }
593
- end
594
-
595
- context "when promotion code's usage limit is exceeded" do
596
- before do
597
- promotion.per_code_usage_limit = 1
598
- create(:completed_order_with_promotion, promotion: promotion)
599
- promotion.codes.first.adjustments.update_all(eligible: true)
600
- end
601
-
602
- it { is_expected.to be false }
603
- end
604
-
605
- context "when promotion is at last usage on the same order" do
606
- let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
607
- let(:promotable) { order }
608
-
609
- before do
610
- promotion.usage_limit = 1
611
- end
612
-
613
- it { is_expected.to be true }
614
- end
615
-
616
- context "when promotion code is at last usage on the same order" do
617
- let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
618
- let(:promotable) { order }
619
-
620
- before do
621
- promotion.per_code_usage_limit = 1
622
- end
623
-
624
- it { is_expected.to be true }
625
- end
626
- end
627
-
628
- context "when promotable is a Spree::Order" do
629
- let(:promotion) { create(:promotion, :with_order_adjustment) }
630
- let(:promotable) { create :order }
631
-
632
- it_behaves_like "a promotable"
633
-
634
- context "when it contains items" do
635
- let!(:line_item) { create(:line_item, order: promotable) }
636
- let!(:line_item2) { create(:line_item, order: promotable) }
637
-
638
- context "and at least one item is non-promotionable" do
639
- before do
640
- line_item.product.update_column(:promotionable, false)
641
- end
642
-
643
- it { is_expected.to be false }
644
- end
645
-
646
- context "and the items are all non-promotionable" do
647
- before do
648
- line_item.product.update_column(:promotionable, false)
649
- line_item2.product.update_column(:promotionable, false)
650
- end
651
-
652
- it { is_expected.to be false }
653
- end
654
-
655
- context "and at least one item is promotionable" do
656
- it { is_expected.to be true }
657
- end
658
- end
659
- end
660
-
661
- context "when promotable is a Spree::LineItem" do
662
- let(:promotion) { create(:promotion, :with_line_item_adjustment) }
663
- let(:promotable) { create(:line_item) }
664
-
665
- it_behaves_like "a promotable"
666
-
667
- context "and product is promotionable" do
668
- before { promotable.product.promotionable = true }
669
-
670
- it { is_expected.to be true }
671
- end
672
-
673
- context "and product is not promotionable" do
674
- before { promotable.product.promotionable = false }
675
-
676
- it { is_expected.to be false }
677
- end
678
- end
679
-
680
- context "when promotable is a Spree::Shipment" do
681
- let(:promotion) { create(:promotion, :with_free_shipping) }
682
- let(:promotable) { create(:shipment) }
683
-
684
- it_behaves_like "a promotable"
685
- end
686
- end
687
-
688
- context "#eligible_rules" do
689
- let(:promotable) { double('Promotable') }
690
- it "true if there are no rules" do
691
- expect(promotion.eligible_rules(promotable)).to eq []
692
- end
693
-
694
- it "true if there are no applicable rules" do
695
- promotion.promotion_rules = [stub_model(Spree::PromotionRule, eligible?: true, applicable?: false)]
696
- allow(promotion.promotion_rules).to receive(:for).and_return([])
697
- expect(promotion.eligible_rules(promotable)).to eq []
698
- end
699
-
700
- context "with 'all' match policy" do
701
- let(:rule1) { Spree::PromotionRule.create!(promotion: promotion) }
702
- let(:rule2) { Spree::PromotionRule.create!(promotion: promotion) }
703
-
704
- before { promotion.match_policy = 'all' }
705
-
706
- context "when all rules are eligible" do
707
- before do
708
- allow(rule1).to receive_messages(eligible?: true, applicable?: true)
709
- allow(rule2).to receive_messages(eligible?: true, applicable?: true)
710
-
711
- promotion.promotion_rules = [rule1, rule2]
712
- allow(promotion).to receive_message_chain(:rules, :none?).and_return(false)
713
- allow(promotion).to receive_message_chain(:rules, :for).and_return(promotion.promotion_rules)
714
- end
715
- it "returns the eligible rules" do
716
- expect(promotion.eligible_rules(promotable)).to eq [rule1, rule2]
717
- end
718
- it "does set anything to eligiblity errors" do
719
- promotion.eligible_rules(promotable)
720
- expect(promotion.eligibility_errors).to be_nil
721
- end
722
- end
723
-
724
- context "when any of the rules is not eligible" do
725
- let(:errors) { double ActiveModel::Errors, empty?: false }
726
- before do
727
- allow(rule1).to receive_messages(eligible?: true, applicable?: true, eligibility_errors: nil)
728
- allow(rule2).to receive_messages(eligible?: false, applicable?: true, eligibility_errors: errors)
729
-
730
- promotion.promotion_rules = [rule1, rule2]
731
- allow(promotion).to receive_message_chain(:rules, :none?).and_return(false)
732
- allow(promotion).to receive_message_chain(:rules, :for).and_return(promotion.promotion_rules)
733
- end
734
- it "returns nil" do
735
- expect(promotion.eligible_rules(promotable)).to be_nil
736
- end
737
- it "sets eligibility errors to the first non-nil one" do
738
- promotion.eligible_rules(promotable)
739
- expect(promotion.eligibility_errors).to eq errors
740
- end
741
- end
742
- end
743
-
744
- context "with 'any' match policy" do
745
- let(:promotable) { double('Promotable') }
746
-
747
- before do
748
- promotion.match_policy = 'any'
749
- end
750
-
751
- it "should have eligible rules if any of the rules are eligible" do
752
- true_rule = mock_model(Spree::PromotionRule, eligible?: true, applicable?: true)
753
- promotion.promotion_rules = [true_rule]
754
- allow(promotion.rules).to receive(:for) { promotion.rules }
755
- expect(promotion.eligible_rules(promotable)).to eq [true_rule]
756
- end
757
-
758
- context "when none of the rules are eligible" do
759
- let(:rule) { Spree::PromotionRule.create!(promotion: promotion) }
760
- let(:errors) { double ActiveModel::Errors, empty?: false }
761
- before do
762
- allow(rule).to receive_messages(eligible?: false, applicable?: true, eligibility_errors: errors)
763
-
764
- promotion.promotion_rules = [rule]
765
- allow(promotion).to receive_message_chain(:rules, :for).and_return(promotion.promotion_rules)
766
- allow(promotion).to receive_message_chain(:rules, :none?).and_return(false)
767
- end
768
- it "returns nil" do
769
- expect(promotion.eligible_rules(promotable)).to be_nil
770
- end
771
- it "sets eligibility errors to the first non-nil one" do
772
- promotion.eligible_rules(promotable)
773
- expect(promotion.eligibility_errors).to eq errors
774
- end
775
- end
776
- end
777
- end
778
-
779
- describe '#line_item_actionable?' do
780
- let(:order) { double Spree::Order }
781
- let(:line_item) { double Spree::LineItem }
782
- let(:true_rule) { mock_model Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: true }
783
- let(:false_rule) { mock_model Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: false }
784
- let(:rules) { [] }
785
-
786
- before do
787
- promotion.promotion_rules = rules
788
- allow(promotion.rules).to receive(:for) { rules }
789
- end
790
-
791
- subject { promotion.line_item_actionable? order, line_item }
792
-
793
- context 'when the order is eligible for promotion' do
794
- context 'when there are no rules' do
795
- it { is_expected.to be }
796
- end
797
-
798
- context 'when there are rules' do
799
- context 'when the match policy is all' do
800
- before { promotion.match_policy = 'all' }
801
-
802
- context 'when all rules allow action on the line item' do
803
- let(:rules) { [true_rule] }
804
- it { is_expected.to be }
805
- end
806
-
807
- context 'when at least one rule does not allow action on the line item' do
808
- let(:rules) { [true_rule, false_rule] }
809
- it { is_expected.not_to be }
810
- end
811
- end
812
-
813
- context 'when the match policy is any' do
814
- before { promotion.match_policy = 'any' }
815
-
816
- context 'when at least one rule allows action on the line item' do
817
- let(:rules) { [true_rule, false_rule] }
818
- it { is_expected.to be }
819
- end
820
-
821
- context 'when no rules allow action on the line item' do
822
- let(:rules) { [false_rule] }
823
- it { is_expected.not_to be }
824
- end
825
- end
826
-
827
- context 'when the line item has an non-promotionable product' do
828
- let(:rules) { [true_rule] }
829
- let(:line_item) { build(:line_item) { |li| li.product.promotionable = false } }
830
- it { is_expected.not_to be }
831
- end
832
- end
833
- end
834
-
835
- context 'when the order is not eligible for the promotion' do
836
- context "due to promotion expiration" do
837
- before { promotion.starts_at = Time.current + 2.days }
838
- it { is_expected.not_to be }
839
- end
840
-
841
- context "due to promotion code not being eligible" do
842
- let(:order) { create(:order) }
843
- let(:promotion) { create(:promotion, per_code_usage_limit: 0) }
844
- let(:promotion_code) { create(:promotion_code, promotion: promotion) }
845
-
846
- subject { promotion.line_item_actionable? order, line_item, promotion_code: promotion_code }
847
-
848
- it "returns false" do
849
- expect(subject).to eq false
850
- end
851
- end
852
- end
853
- end
854
-
855
- # regression for https://github.com/spree/spree/issues/4059
856
- # admin form posts the code and path as empty string
857
- describe "normalize blank values for path" do
858
- it "will save blank value as nil value instead" do
859
- promotion = Spree::Promotion.create(name: "A promotion", path: "")
860
- expect(promotion.path).to be_nil
861
- end
862
- end
863
-
864
- describe '#used_by?' do
865
- subject { promotion.used_by? user, [excluded_order] }
866
-
867
- let(:promotion) { create :promotion, :with_order_adjustment }
868
- let(:user) { create :user }
869
- let(:order) { create :order_with_line_items, user: user }
870
- let(:excluded_order) { create :order_with_line_items, user: user }
871
-
872
- before do
873
- order.user_id = user.id
874
- order.save!
875
- end
876
-
877
- context 'when the user has used this promo' do
878
- before do
879
- promotion.activate(order: order)
880
- order.recalculate
881
- order.completed_at = Time.current
882
- order.save!
883
- end
884
-
885
- context 'when the order is complete' do
886
- it { is_expected.to be true }
887
-
888
- context 'when the promotion was not eligible' do
889
- let(:adjustment) { order.adjustments.first }
890
-
891
- before do
892
- adjustment.eligible = false
893
- adjustment.save!
894
- end
895
-
896
- it { is_expected.to be false }
897
- end
898
-
899
- context 'when the only matching order is the excluded order' do
900
- let(:excluded_order) { order }
901
- it { is_expected.to be false }
902
- end
903
- end
904
-
905
- context 'when the order is not complete' do
906
- let(:order) { create :order, user: user }
907
-
908
- # The before clause above sets the completed at
909
- # value for this order
910
- before { order.update completed_at: nil }
911
-
912
- it { is_expected.to be false }
913
- end
914
- end
915
-
916
- context 'when the user has not used this promo' do
917
- it { is_expected.to be false }
918
- end
919
- end
920
-
921
- describe "adding items to the cart" do
922
- let(:order) { create :order }
923
- let(:line_item) { create :line_item, order: order }
924
- let(:promo) { create :promotion_with_item_adjustment, adjustment_rate: 5, code: 'promo' }
925
- let(:promotion_code) { promo.codes.first }
926
- let(:variant) { create :variant }
927
-
928
- it "updates the promotions for new line items" do
929
- expect(line_item.adjustments).to be_empty
930
- expect(order.adjustment_total).to eq 0
931
-
932
- promo.activate order: order, promotion_code: promotion_code
933
- order.recalculate
934
-
935
- expect(line_item.adjustments.size).to eq(1)
936
- expect(order.adjustment_total).to eq(-5)
937
-
938
- other_line_item = order.contents.add(variant, 1, currency: order.currency)
939
-
940
- expect(other_line_item).not_to eq line_item
941
- expect(other_line_item.adjustments.size).to eq(1)
942
- expect(order.adjustment_total).to eq(-10)
943
- end
944
- end
945
- end