solidus_core 2.9.6 → 2.11.0

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