solidus_core 2.10.3 → 2.11.4

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.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (552) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.erb +31 -2
  3. data/app/controllers/spree/base_controller.rb +1 -0
  4. data/app/mailers/spree/base_mailer.rb +4 -0
  5. data/app/mailers/spree/order_mailer.rb +1 -1
  6. data/app/models/concerns/spree/active_storage_adapter.rb +116 -0
  7. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +69 -0
  8. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +39 -0
  9. data/app/models/concerns/spree/default_price.rb +1 -1
  10. data/app/models/concerns/spree/soft_deletable.rb +18 -0
  11. data/app/models/concerns/spree/user_address_book.rb +86 -32
  12. data/app/models/concerns/spree/user_methods.rb +3 -2
  13. data/app/models/spree/ability.rb +34 -10
  14. data/app/models/spree/address.rb +94 -17
  15. data/app/models/spree/address/name.rb +49 -0
  16. data/app/models/spree/address/state_validator.rb +71 -0
  17. data/app/models/spree/adjustment.rb +1 -1
  18. data/app/models/spree/base.rb +2 -2
  19. data/app/models/spree/calculator.rb +4 -4
  20. data/app/models/spree/calculator/default_tax.rb +1 -1
  21. data/app/models/spree/calculator/free_shipping.rb +1 -0
  22. data/app/models/spree/calculator/percent_per_item.rb +6 -4
  23. data/app/models/spree/calculator/price_sack.rb +2 -1
  24. data/app/models/spree/credit_card.rb +2 -2
  25. data/app/models/spree/customer_return.rb +4 -2
  26. data/app/models/spree/exchange.rb +1 -1
  27. data/app/models/spree/image/active_storage_attachment.rb +21 -0
  28. data/app/models/spree/inventory_unit.rb +1 -1
  29. data/app/models/spree/line_item.rb +13 -4
  30. data/app/models/spree/option_type.rb +1 -1
  31. data/app/models/spree/option_value.rb +2 -2
  32. data/app/models/spree/order.rb +91 -20
  33. data/app/models/spree/order/checkout.rb +1 -0
  34. data/app/models/spree/order/payments.rb +2 -2
  35. data/app/models/spree/order_inventory.rb +16 -4
  36. data/app/models/spree/order_merger.rb +6 -4
  37. data/app/models/spree/order_promotion.rb +1 -1
  38. data/app/models/spree/order_updater.rb +11 -10
  39. data/app/models/spree/payment.rb +3 -3
  40. data/app/models/spree/payment/cancellation.rb +3 -22
  41. data/app/models/spree/payment/processing.rb +54 -30
  42. data/app/models/spree/payment_method.rb +8 -9
  43. data/app/models/spree/payment_source.rb +2 -2
  44. data/app/models/spree/preference.rb +1 -1
  45. data/app/models/spree/price.rb +2 -8
  46. data/app/models/spree/product.rb +19 -14
  47. data/app/models/spree/product/scopes.rb +9 -5
  48. data/app/models/spree/promotion.rb +18 -7
  49. data/app/models/spree/promotion/actions/free_shipping.rb +6 -5
  50. data/app/models/spree/promotion_action.rb +1 -7
  51. data/app/models/spree/promotion_code.rb +6 -1
  52. data/app/models/spree/promotion_code_batch.rb +1 -1
  53. data/app/models/spree/promotion_handler/coupon.rb +2 -2
  54. data/app/models/spree/promotion_rule.rb +1 -1
  55. data/app/models/spree/promotion_rule_role.rb +1 -1
  56. data/app/models/spree/refund.rb +60 -12
  57. data/app/models/spree/reimbursement.rb +27 -0
  58. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +10 -3
  59. data/app/models/spree/return_authorization.rb +1 -1
  60. data/app/models/spree/return_item.rb +21 -10
  61. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +1 -1
  62. data/app/models/spree/role.rb +1 -1
  63. data/app/models/spree/shipment.rb +2 -2
  64. data/app/models/spree/shipping_calculator.rb +1 -1
  65. data/app/models/spree/shipping_manifest.rb +2 -2
  66. data/app/models/spree/shipping_method.rb +2 -9
  67. data/app/models/spree/shipping_rate.rb +1 -1
  68. data/app/models/spree/shipping_rate_tax.rb +1 -1
  69. data/app/models/spree/stock/inventory_unit_builder.rb +18 -7
  70. data/app/models/spree/stock/inventory_units_finalizer.rb +3 -5
  71. data/app/models/spree/stock/package.rb +1 -1
  72. data/app/models/spree/stock/simple_coordinator.rb +1 -3
  73. data/app/models/spree/stock_item.rb +2 -8
  74. data/app/models/spree/stock_movement.rb +2 -0
  75. data/app/models/spree/store.rb +1 -1
  76. data/app/models/spree/store_credit.rb +1 -7
  77. data/app/models/spree/store_credit_category.rb +30 -3
  78. data/app/models/spree/store_credit_event.rb +1 -7
  79. data/app/models/spree/store_credit_reason.rb +0 -4
  80. data/app/models/spree/tax/tax_helpers.rb +1 -1
  81. data/app/models/spree/tax_category.rb +2 -8
  82. data/app/models/spree/tax_rate.rb +7 -7
  83. data/app/models/spree/taxon.rb +1 -1
  84. data/app/models/spree/taxon/active_storage_attachment.rb +19 -0
  85. data/app/models/spree/user_address.rb +8 -2
  86. data/app/models/spree/variant.rb +7 -13
  87. data/app/models/spree/variant_property_rule.rb +5 -1
  88. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +8 -3
  89. data/app/models/spree/zone.rb +1 -1
  90. data/config/locales/en.yml +44 -5
  91. data/db/default/spree/countries.rb +1 -1
  92. data/db/default/spree/states.rb +12 -4
  93. data/db/default/spree/store_credit.rb +2 -2
  94. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +12 -0
  95. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +6 -0
  96. data/db/migrate/20200530111458_add_bcc_email_to_spree_stores.rb +7 -0
  97. data/db/migrate/20201008213609_add_discontinue_on_to_spree_products.rb +7 -0
  98. data/lib/generators/solidus/install/install_generator.rb +253 -0
  99. data/lib/generators/{spree → solidus}/install/templates/config/initializers/spree.rb.tt +36 -5
  100. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -0
  101. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -0
  102. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -0
  103. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -0
  104. data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
  105. data/lib/generators/spree/install/install_generator.rb +7 -189
  106. data/lib/solidus/migrations/promotions_with_code_handlers.rb +1 -1
  107. data/lib/spree/app_configuration.rb +117 -51
  108. data/lib/spree/awesome_nested_set_override.rb +44 -0
  109. data/lib/spree/core.rb +6 -11
  110. data/lib/spree/core/controller_helpers/auth.rb +17 -4
  111. data/lib/spree/core/controller_helpers/current_host.rb +17 -0
  112. data/lib/spree/core/controller_helpers/order.rb +8 -7
  113. data/lib/spree/core/engine.rb +39 -2
  114. data/lib/spree/core/importer/order.rb +24 -10
  115. data/lib/spree/core/permalinks.rb +1 -3
  116. data/lib/spree/core/product_filters.rb +6 -5
  117. data/lib/spree/core/state_machines.rb +20 -1
  118. data/lib/spree/core/state_machines/order.rb +249 -0
  119. data/lib/spree/core/state_machines/return_item/reception_status.rb +2 -2
  120. data/lib/spree/core/version.rb +1 -1
  121. data/lib/spree/encryptor.rb +25 -0
  122. data/lib/spree/event.rb +40 -7
  123. data/lib/spree/event/adapters/active_support_notifications.rb +32 -0
  124. data/lib/spree/event/configuration.rb +11 -6
  125. data/lib/spree/event/subscriber.rb +38 -18
  126. data/lib/spree/event/subscriber_registry.rb +92 -0
  127. data/lib/spree/i18n.rb +1 -1
  128. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  129. data/lib/spree/paranoia_deprecations.rb +32 -12
  130. data/lib/spree/permission_sets/configuration_display.rb +14 -14
  131. data/lib/spree/permission_sets/default_customer.rb +16 -16
  132. data/lib/spree/permission_sets/order_display.rb +11 -11
  133. data/lib/spree/permission_sets/order_management.rb +1 -1
  134. data/lib/spree/permission_sets/product_display.rb +9 -9
  135. data/lib/spree/permission_sets/promotion_display.rb +5 -5
  136. data/lib/spree/permission_sets/restricted_stock_display.rb +2 -2
  137. data/lib/spree/permission_sets/restricted_stock_management.rb +1 -1
  138. data/lib/spree/permission_sets/stock_display.rb +2 -2
  139. data/lib/spree/permission_sets/stock_management.rb +1 -1
  140. data/lib/spree/permission_sets/user_display.rb +3 -3
  141. data/lib/spree/permission_sets/user_management.rb +4 -3
  142. data/lib/spree/permitted_attributes.rb +9 -8
  143. data/lib/spree/preferences/preferable.rb +4 -3
  144. data/lib/spree/preferences/preferable_class_methods.rb +22 -3
  145. data/lib/spree/testing_support.rb +40 -0
  146. data/lib/spree/testing_support/ability_helpers.rb +9 -9
  147. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  148. data/lib/spree/testing_support/blacklist_urls.rb +23 -0
  149. data/lib/spree/testing_support/capybara_ext.rb +3 -0
  150. data/lib/spree/testing_support/common_rake.rb +3 -3
  151. data/lib/spree/testing_support/dummy_app.rb +44 -23
  152. data/lib/spree/testing_support/dummy_app/migrations.rb +5 -6
  153. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +1 -3
  154. data/lib/spree/testing_support/factories.rb +2 -4
  155. data/lib/spree/testing_support/factories/address_factory.rb +3 -4
  156. data/lib/spree/testing_support/factories/adjustment_factory.rb +2 -5
  157. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +3 -0
  158. data/lib/spree/testing_support/factories/calculator_factory.rb +3 -0
  159. data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
  160. data/lib/spree/testing_support/factories/country_factory.rb +3 -0
  161. data/lib/spree/testing_support/factories/credit_card_factory.rb +3 -0
  162. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -3
  163. data/lib/spree/testing_support/factories/image_factory.rb +4 -1
  164. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +2 -4
  165. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
  166. data/lib/spree/testing_support/factories/option_type_factory.rb +3 -0
  167. data/lib/spree/testing_support/factories/option_value_factory.rb +3 -0
  168. data/lib/spree/testing_support/factories/order_factory.rb +2 -6
  169. data/lib/spree/testing_support/factories/order_promotion_factory.rb +2 -2
  170. data/lib/spree/testing_support/factories/payment_factory.rb +2 -4
  171. data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -0
  172. data/lib/spree/testing_support/factories/price_factory.rb +2 -1
  173. data/lib/spree/testing_support/factories/product_factory.rb +2 -5
  174. data/lib/spree/testing_support/factories/product_option_type_factory.rb +2 -2
  175. data/lib/spree/testing_support/factories/product_property_factory.rb +2 -2
  176. data/lib/spree/testing_support/factories/promotion_category_factory.rb +3 -0
  177. data/lib/spree/testing_support/factories/promotion_code_factory.rb +2 -2
  178. data/lib/spree/testing_support/factories/promotion_factory.rb +8 -2
  179. data/lib/spree/testing_support/factories/property_factory.rb +3 -0
  180. data/lib/spree/testing_support/factories/refund_factory.rb +3 -2
  181. data/lib/spree/testing_support/factories/refund_reason_factory.rb +3 -0
  182. data/lib/spree/testing_support/factories/reimbursement_factory.rb +3 -2
  183. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +3 -0
  184. data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -3
  185. data/lib/spree/testing_support/factories/return_item_factory.rb +2 -4
  186. data/lib/spree/testing_support/factories/return_reason_factory.rb +3 -0
  187. data/lib/spree/testing_support/factories/role_factory.rb +3 -0
  188. data/lib/spree/testing_support/factories/shipment_factory.rb +2 -3
  189. data/lib/spree/testing_support/factories/shipping_category_factory.rb +3 -0
  190. data/lib/spree/testing_support/factories/shipping_method_factory.rb +2 -3
  191. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +2 -2
  192. data/lib/spree/testing_support/factories/state_factory.rb +2 -1
  193. data/lib/spree/testing_support/factories/stock_item_factory.rb +2 -2
  194. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -3
  195. data/lib/spree/testing_support/factories/stock_movement_factory.rb +2 -1
  196. data/lib/spree/testing_support/factories/stock_package_factory.rb +2 -2
  197. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +11 -0
  198. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +3 -2
  199. data/lib/spree/testing_support/factories/store_credit_factory.rb +2 -3
  200. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +6 -1
  201. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +3 -0
  202. data/lib/spree/testing_support/factories/store_factory.rb +4 -1
  203. data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -1
  204. data/lib/spree/testing_support/factories/tax_rate_factory.rb +2 -3
  205. data/lib/spree/testing_support/factories/taxon_factory.rb +6 -1
  206. data/lib/spree/testing_support/factories/taxonomy_factory.rb +3 -0
  207. data/lib/spree/testing_support/factories/user_factory.rb +2 -3
  208. data/lib/spree/testing_support/factories/variant_factory.rb +2 -4
  209. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +2 -2
  210. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +2 -3
  211. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +2 -2
  212. data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
  213. data/lib/spree/testing_support/fixtures/blank.jpg +0 -0
  214. data/lib/spree/testing_support/job_helpers.rb +24 -0
  215. data/lib/spree/testing_support/order_walkthrough.rb +1 -1
  216. data/lib/spree/testing_support/precompiled_assets.rb +15 -0
  217. data/lib/spree/testing_support/preferences.rb +3 -1
  218. data/lib/spree/testing_support/shared_examples/gallery.rb +1 -1
  219. data/lib/spree/testing_support/translations.rb +25 -0
  220. data/{app/models → lib}/spree/user_class_handle.rb +0 -0
  221. data/lib/tasks/email.rake +3 -2
  222. data/solidus_core.gemspec +8 -5
  223. metadata +97 -374
  224. data/script/rails +0 -10
  225. data/spec/fixtures/thinking-cat.jpg +0 -0
  226. data/spec/helpers/base_helper_spec.rb +0 -168
  227. data/spec/helpers/products_helper_spec.rb +0 -202
  228. data/spec/helpers/taxons_helper_spec.rb +0 -43
  229. data/spec/jobs/promotion_code_batch_job_spec.rb +0 -96
  230. data/spec/lib/calculated_adjustments_spec.rb +0 -133
  231. data/spec/lib/i18n_spec.rb +0 -97
  232. data/spec/lib/search/base_spec.rb +0 -91
  233. data/spec/lib/search/variant_spec.rb +0 -115
  234. data/spec/lib/spree/app_configuration_spec.rb +0 -140
  235. data/spec/lib/spree/core/class_constantizer_spec.rb +0 -91
  236. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -73
  237. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -126
  238. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -195
  239. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +0 -94
  240. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -21
  241. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -18
  242. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -48
  243. data/spec/lib/spree/core/current_store_spec.rb +0 -33
  244. data/spec/lib/spree/core/environment_extension_spec.rb +0 -46
  245. data/spec/lib/spree/core/importer/order_spec.rb +0 -484
  246. data/spec/lib/spree/core/role_configuration_spec.rb +0 -155
  247. data/spec/lib/spree/core/stock_configuration_spec.rb +0 -95
  248. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +0 -61
  249. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +0 -20
  250. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +0 -14
  251. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +0 -44
  252. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +0 -14
  253. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +0 -14
  254. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +0 -14
  255. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +0 -39
  256. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +0 -14
  257. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +0 -14
  258. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +0 -14
  259. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +0 -14
  260. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +0 -14
  261. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -376
  262. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +0 -14
  263. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +0 -40
  264. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +0 -32
  265. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +0 -14
  266. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +0 -32
  267. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +0 -14
  268. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +0 -14
  269. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +0 -14
  270. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +0 -14
  271. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +0 -32
  272. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +0 -14
  273. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +0 -14
  274. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +0 -14
  275. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +0 -20
  276. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +0 -14
  277. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +0 -14
  278. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +0 -20
  279. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +0 -14
  280. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +0 -20
  281. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +0 -14
  282. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +0 -14
  283. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +0 -44
  284. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +0 -14
  285. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +0 -59
  286. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +0 -14
  287. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +0 -35
  288. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +0 -14
  289. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +0 -28
  290. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +0 -14
  291. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +0 -43
  292. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +0 -14
  293. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +0 -14
  294. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +0 -20
  295. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +0 -14
  296. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +0 -14
  297. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +0 -14
  298. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +0 -14
  299. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +0 -14
  300. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +0 -24
  301. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +0 -56
  302. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +0 -14
  303. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +0 -14
  304. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +0 -14
  305. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +0 -20
  306. data/spec/lib/spree/core/testing_support/preferences_spec.rb +0 -61
  307. data/spec/lib/spree/core/validators/email_spec.rb +0 -53
  308. data/spec/lib/spree/core/version_spec.rb +0 -19
  309. data/spec/lib/spree/event/subscriber_spec.rb +0 -85
  310. data/spec/lib/spree/event_spec.rb +0 -130
  311. data/spec/lib/spree/localized_number_spec.rb +0 -45
  312. data/spec/lib/spree/migrations_spec.rb +0 -32
  313. data/spec/lib/spree/money_spec.rb +0 -298
  314. data/spec/lib/spree/permission_sets/default_customer_spec.rb +0 -22
  315. data/spec/lib/spree/permitted_attributes_spec.rb +0 -41
  316. data/spec/lib/spree/promo/environment_spec.rb +0 -53
  317. data/spec/lib/tasks/dummy_task.rake +0 -12
  318. data/spec/lib/tasks/dummy_task_spec.rb +0 -30
  319. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +0 -21
  320. data/spec/mailers/carton_mailer_spec.rb +0 -44
  321. data/spec/mailers/order_mailer_spec.rb +0 -117
  322. data/spec/mailers/promotion_code_batch_mailer_spec.rb +0 -47
  323. data/spec/mailers/reimbursement_mailer_spec.rb +0 -36
  324. data/spec/mailers/test_mailer_spec.rb +0 -13
  325. data/spec/models/spree/ability_spec.rb +0 -279
  326. data/spec/models/spree/address_spec.rb +0 -399
  327. data/spec/models/spree/adjustment_reason_spec.rb +0 -11
  328. data/spec/models/spree/adjustment_spec.rb +0 -339
  329. data/spec/models/spree/asset_spec.rb +0 -25
  330. data/spec/models/spree/calculator/default_tax_spec.rb +0 -260
  331. data/spec/models/spree/calculator/distributed_amount_spec.rb +0 -82
  332. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -39
  333. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -52
  334. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -158
  335. data/spec/models/spree/calculator/free_shipping_spec.rb +0 -8
  336. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -20
  337. data/spec/models/spree/calculator/percent_per_item_spec.rb +0 -12
  338. data/spec/models/spree/calculator/price_sack_spec.rb +0 -35
  339. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -70
  340. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -44
  341. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -18
  342. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -56
  343. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -25
  344. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -44
  345. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -99
  346. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -197
  347. data/spec/models/spree/calculator_spec.rb +0 -43
  348. data/spec/models/spree/carton_spec.rb +0 -145
  349. data/spec/models/spree/classification_spec.rb +0 -126
  350. data/spec/models/spree/concerns/display_money_spec.rb +0 -44
  351. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +0 -52
  352. data/spec/models/spree/concerns/user_address_book_spec.rb +0 -358
  353. data/spec/models/spree/concerns/user_methods_spec.rb +0 -122
  354. data/spec/models/spree/country_spec.rb +0 -154
  355. data/spec/models/spree/credit_card_spec.rb +0 -373
  356. data/spec/models/spree/customer_return_spec.rb +0 -294
  357. data/spec/models/spree/distributed_amounts_handler_spec.rb +0 -83
  358. data/spec/models/spree/exchange_spec.rb +0 -76
  359. data/spec/models/spree/fulfilment_changer_spec.rb +0 -340
  360. data/spec/models/spree/gallery/product_gallery_spec.rb +0 -21
  361. data/spec/models/spree/gallery/variant_gallery_spec.rb +0 -21
  362. data/spec/models/spree/gateway/bogus_simple.rb +0 -14
  363. data/spec/models/spree/gateway/bogus_spec.rb +0 -14
  364. data/spec/models/spree/gateway_spec.rb +0 -14
  365. data/spec/models/spree/image_spec.rb +0 -25
  366. data/spec/models/spree/inventory_unit_spec.rb +0 -309
  367. data/spec/models/spree/line_item_spec.rb +0 -240
  368. data/spec/models/spree/option_type_spec.rb +0 -16
  369. data/spec/models/spree/option_value_spec.rb +0 -52
  370. data/spec/models/spree/order/address_spec.rb +0 -52
  371. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  372. data/spec/models/spree/order/callbacks_spec.rb +0 -44
  373. data/spec/models/spree/order/checkout_spec.rb +0 -740
  374. data/spec/models/spree/order/finalizing_spec.rb +0 -92
  375. data/spec/models/spree/order/number_generator_spec.rb +0 -47
  376. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +0 -138
  377. data/spec/models/spree/order/payment_spec.rb +0 -280
  378. data/spec/models/spree/order/risk_assessment_spec.rb +0 -70
  379. data/spec/models/spree/order/state_machine_spec.rb +0 -122
  380. data/spec/models/spree/order/totals_spec.rb +0 -26
  381. data/spec/models/spree/order/validations_spec.rb +0 -17
  382. data/spec/models/spree/order_cancellations_spec.rb +0 -233
  383. data/spec/models/spree/order_capturing_spec.rb +0 -16
  384. data/spec/models/spree/order_contents_spec.rb +0 -362
  385. data/spec/models/spree/order_inventory_spec.rb +0 -285
  386. data/spec/models/spree/order_merger_spec.rb +0 -162
  387. data/spec/models/spree/order_mutex_spec.rb +0 -89
  388. data/spec/models/spree/order_promotion_spec.rb +0 -33
  389. data/spec/models/spree/order_shipping_spec.rb +0 -247
  390. data/spec/models/spree/order_spec.rb +0 -1687
  391. data/spec/models/spree/order_taxation_spec.rb +0 -128
  392. data/spec/models/spree/order_update_attributes_spec.rb +0 -49
  393. data/spec/models/spree/order_updater_spec.rb +0 -556
  394. data/spec/models/spree/payment/cancellation_spec.rb +0 -84
  395. data/spec/models/spree/payment_create_spec.rb +0 -195
  396. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +0 -10
  397. data/spec/models/spree/payment_method/check_spec.rb +0 -80
  398. data/spec/models/spree/payment_method/credit_card_spec.rb +0 -68
  399. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +0 -20
  400. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -325
  401. data/spec/models/spree/payment_method_spec.rb +0 -408
  402. data/spec/models/spree/payment_spec.rb +0 -1270
  403. data/spec/models/spree/permission_sets/base_spec.rb +0 -14
  404. data/spec/models/spree/permission_sets/configuration_display.rb +0 -79
  405. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -49
  406. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -23
  407. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -56
  408. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -43
  409. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -57
  410. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -39
  411. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -41
  412. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -29
  413. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -42
  414. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -42
  415. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -25
  416. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -23
  417. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -39
  418. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -58
  419. data/spec/models/spree/preference_spec.rb +0 -79
  420. data/spec/models/spree/preferences/configuration_spec.rb +0 -27
  421. data/spec/models/spree/preferences/preferable_spec.rb +0 -334
  422. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -62
  423. data/spec/models/spree/preferences/static_model_preferences_spec.rb +0 -79
  424. data/spec/models/spree/preferences/statically_configurable_spec.rb +0 -67
  425. data/spec/models/spree/preferences/store_spec.rb +0 -40
  426. data/spec/models/spree/price_spec.rb +0 -150
  427. data/spec/models/spree/product/scopes_spec.rb +0 -164
  428. data/spec/models/spree/product_duplicator_spec.rb +0 -92
  429. data/spec/models/spree/product_filter_spec.rb +0 -28
  430. data/spec/models/spree/product_property_spec.rb +0 -20
  431. data/spec/models/spree/product_spec.rb +0 -584
  432. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -126
  433. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -198
  434. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +0 -298
  435. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -61
  436. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -87
  437. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +0 -71
  438. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -128
  439. data/spec/models/spree/promotion/rules/nth_order_spec.rb +0 -72
  440. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -54
  441. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -96
  442. data/spec/models/spree/promotion/rules/product_spec.rb +0 -193
  443. data/spec/models/spree/promotion/rules/store_spec.rb +0 -35
  444. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -227
  445. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -33
  446. data/spec/models/spree/promotion/rules/user_role_spec.rb +0 -88
  447. data/spec/models/spree/promotion/rules/user_spec.rb +0 -39
  448. data/spec/models/spree/promotion_action_spec.rb +0 -44
  449. data/spec/models/spree/promotion_category_spec.rb +0 -19
  450. data/spec/models/spree/promotion_code/batch_builder_spec.rb +0 -107
  451. data/spec/models/spree/promotion_code_batch_spec.rb +0 -54
  452. data/spec/models/spree/promotion_code_spec.rb +0 -206
  453. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -132
  454. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -419
  455. data/spec/models/spree/promotion_handler/page_spec.rb +0 -45
  456. data/spec/models/spree/promotion_handler/shipping_spec.rb +0 -96
  457. data/spec/models/spree/promotion_rule_spec.rb +0 -34
  458. data/spec/models/spree/promotion_spec.rb +0 -945
  459. data/spec/models/spree/refund_spec.rb +0 -200
  460. data/spec/models/spree/reimbursement/credit_spec.rb +0 -38
  461. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -144
  462. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -85
  463. data/spec/models/spree/reimbursement_performer_spec.rb +0 -33
  464. data/spec/models/spree/reimbursement_spec.rb +0 -278
  465. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -52
  466. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -56
  467. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -48
  468. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -110
  469. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -111
  470. data/spec/models/spree/return_authorization_spec.rb +0 -226
  471. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -79
  472. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -59
  473. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -86
  474. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -35
  475. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -31
  476. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -42
  477. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -66
  478. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  479. data/spec/models/spree/return_item_spec.rb +0 -785
  480. data/spec/models/spree/returns_calculator_spec.rb +0 -16
  481. data/spec/models/spree/shipment_spec.rb +0 -914
  482. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  483. data/spec/models/spree/shipping_manifest_spec.rb +0 -110
  484. data/spec/models/spree/shipping_method_spec.rb +0 -292
  485. data/spec/models/spree/shipping_rate_spec.rb +0 -154
  486. data/spec/models/spree/shipping_rate_tax_spec.rb +0 -79
  487. data/spec/models/spree/state_spec.rb +0 -43
  488. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +0 -146
  489. data/spec/models/spree/stock/availability_spec.rb +0 -143
  490. data/spec/models/spree/stock/availability_validator_spec.rb +0 -140
  491. data/spec/models/spree/stock/content_item_spec.rb +0 -70
  492. data/spec/models/spree/stock/differentiator_spec.rb +0 -41
  493. data/spec/models/spree/stock/estimator_spec.rb +0 -241
  494. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -34
  495. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +0 -58
  496. data/spec/models/spree/stock/location_filter/active_spec.rb +0 -22
  497. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +0 -22
  498. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +0 -21
  499. data/spec/models/spree/stock/package_spec.rb +0 -182
  500. data/spec/models/spree/stock/quantifier_spec.rb +0 -113
  501. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +0 -18
  502. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +0 -18
  503. data/spec/models/spree/stock/simple_coordinator_spec.rb +0 -264
  504. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -31
  505. data/spec/models/spree/stock/splitter/base_spec.rb +0 -22
  506. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -48
  507. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -31
  508. data/spec/models/spree/stock/splitter_chain_spec.rb +0 -66
  509. data/spec/models/spree/stock_item_spec.rb +0 -348
  510. data/spec/models/spree/stock_location_spec.rb +0 -288
  511. data/spec/models/spree/stock_movement_spec.rb +0 -58
  512. data/spec/models/spree/stock_quantities_spec.rb +0 -249
  513. data/spec/models/spree/store_credit_category_spec.rb +0 -19
  514. data/spec/models/spree/store_credit_event_spec.rb +0 -328
  515. data/spec/models/spree/store_credit_spec.rb +0 -900
  516. data/spec/models/spree/store_selector/by_server_name_spec.rb +0 -28
  517. data/spec/models/spree/store_selector/legacy_spec.rb +0 -46
  518. data/spec/models/spree/store_spec.rb +0 -156
  519. data/spec/models/spree/tax/order_adjuster_spec.rb +0 -35
  520. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +0 -59
  521. data/spec/models/spree/tax/tax_location_spec.rb +0 -79
  522. data/spec/models/spree/tax/taxation_integration_spec.rb +0 -815
  523. data/spec/models/spree/tax_calculator/default_spec.rb +0 -56
  524. data/spec/models/spree/tax_category_spec.rb +0 -50
  525. data/spec/models/spree/tax_rate_spec.rb +0 -317
  526. data/spec/models/spree/taxon_spec.rb +0 -197
  527. data/spec/models/spree/taxonomy_spec.rb +0 -15
  528. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +0 -29
  529. data/spec/models/spree/unit_cancel_spec.rb +0 -126
  530. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +0 -31
  531. data/spec/models/spree/user_last_url_storer_spec.rb +0 -60
  532. data/spec/models/spree/user_spec.rb +0 -247
  533. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -33
  534. data/spec/models/spree/variant/price_selector_spec.rb +0 -90
  535. data/spec/models/spree/variant/pricing_options_spec.rb +0 -204
  536. data/spec/models/spree/variant/scopes_spec.rb +0 -94
  537. data/spec/models/spree/variant/vat_price_generator_spec.rb +0 -77
  538. data/spec/models/spree/variant_property_rule_condition_spec.rb +0 -17
  539. data/spec/models/spree/variant_property_rule_spec.rb +0 -85
  540. data/spec/models/spree/variant_property_rule_value_spec.rb +0 -20
  541. data/spec/models/spree/variant_spec.rb +0 -862
  542. data/spec/models/spree/wallet_payment_source_spec.rb +0 -77
  543. data/spec/models/spree/wallet_spec.rb +0 -155
  544. data/spec/models/spree/zone_spec.rb +0 -248
  545. data/spec/rails_helper.rb +0 -46
  546. data/spec/shared_examples/calculator_shared_examples.rb +0 -10
  547. data/spec/spec_helper.rb +0 -36
  548. data/spec/support/big_decimal.rb +0 -7
  549. data/spec/support/concerns/default_price.rb +0 -44
  550. data/spec/support/concerns/payment_source.rb +0 -66
  551. data/spec/support/concerns/working_factories.rb +0 -15
  552. 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
- promotion_one = TestRule.new
21
- promotion_one.promotion_id = 1
22
- promotion_one.save
23
-
24
- promotion_two = TestRule.new
25
- promotion_two.promotion_id = 1
26
- expect(promotion_two).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,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