solidus_core 2.10.2 → 2.11.3

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