solidus_core 4.1.6 → 4.5.1

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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/logo/solidus.svg +18 -1
  3. data/app/assets/images/logo/solidus_logo.png +0 -0
  4. data/app/helpers/spree/base_helper.rb +2 -2
  5. data/app/helpers/spree/core/controller_helpers/auth.rb +66 -0
  6. data/app/helpers/spree/core/controller_helpers/common.rb +82 -0
  7. data/app/helpers/spree/core/controller_helpers/order.rb +86 -0
  8. data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +165 -0
  9. data/app/helpers/spree/core/controller_helpers/pricing.rb +19 -0
  10. data/app/helpers/spree/core/controller_helpers/search.rb +16 -0
  11. data/app/helpers/spree/core/controller_helpers/store.rb +19 -0
  12. data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +74 -0
  13. data/app/mailers/spree/base_mailer.rb +1 -1
  14. data/app/mailers/spree/carton_mailer.rb +1 -1
  15. data/app/mailers/spree/order_mailer.rb +3 -3
  16. data/app/mailers/spree/reimbursement_mailer.rb +1 -1
  17. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
  18. data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
  19. data/app/models/concerns/spree/display_money.rb +1 -1
  20. data/app/models/concerns/spree/metadata.rb +64 -0
  21. data/app/models/concerns/spree/named_type.rb +2 -0
  22. data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
  23. data/app/models/concerns/spree/user_address_book.rb +8 -9
  24. data/app/models/concerns/spree/user_methods.rb +3 -3
  25. data/app/models/spree/address.rb +10 -8
  26. data/app/models/spree/adjustment.rb +15 -65
  27. data/app/models/spree/adjustment_reason.rb +2 -0
  28. data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
  29. data/app/models/spree/carton.rb +2 -2
  30. data/app/models/spree/core/state_machines/inventory_unit.rb +42 -0
  31. data/app/models/spree/core/state_machines/order/class_methods.rb +217 -0
  32. data/app/models/spree/core/state_machines/order.rb +42 -0
  33. data/app/models/spree/core/state_machines/payment.rb +61 -0
  34. data/app/models/spree/core/state_machines/reimbursement.rb +33 -0
  35. data/app/models/spree/core/state_machines/return_authorization.rb +32 -0
  36. data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
  37. data/app/models/spree/core/state_machines/return_item/reception_status.rb +42 -0
  38. data/app/models/spree/core/state_machines/shipment.rb +58 -0
  39. data/app/models/spree/credit_card.rb +12 -9
  40. data/app/models/spree/customer_return.rb +2 -0
  41. data/app/models/spree/deprecated_configurable_class.rb +40 -0
  42. data/app/models/spree/fulfilment_changer.rb +4 -4
  43. data/app/models/spree/inventory_unit.rb +2 -2
  44. data/app/models/spree/item_total.rb +28 -0
  45. data/app/models/spree/legacy_user.rb +1 -0
  46. data/app/models/spree/line_item.rb +22 -4
  47. data/app/models/spree/money.rb +120 -0
  48. data/app/models/spree/null_promotion_adjuster.rb +13 -0
  49. data/app/models/spree/null_promotion_advertiser.rb +9 -0
  50. data/app/models/spree/null_promotion_finder.rb +9 -0
  51. data/app/models/spree/null_promotion_handler.rb +44 -0
  52. data/app/models/spree/option_value.rb +1 -0
  53. data/app/models/spree/order.rb +54 -36
  54. data/app/models/spree/order_cancellations.rb +8 -8
  55. data/app/models/spree/order_inventory.rb +6 -4
  56. data/app/models/spree/order_merger.rb +1 -1
  57. data/app/models/spree/order_mutex.rb +2 -2
  58. data/app/models/spree/order_shipping.rb +9 -9
  59. data/app/models/spree/order_taxation.rb +1 -0
  60. data/app/models/spree/order_updater.rb +19 -40
  61. data/app/models/spree/payment/processing.rb +2 -2
  62. data/app/models/spree/payment.rb +3 -2
  63. data/app/models/spree/payment_create.rb +1 -1
  64. data/app/models/spree/payment_method/bogus_credit_card.rb +14 -9
  65. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +12 -6
  66. data/app/models/spree/payment_method/store_credit.rb +1 -1
  67. data/app/models/spree/payment_method.rb +3 -1
  68. data/app/models/spree/payment_source.rb +5 -1
  69. data/app/models/spree/permission_set.rb +11 -0
  70. data/app/models/spree/permission_sets/base.rb +45 -0
  71. data/app/models/spree/permission_sets/configuration_display.rb +53 -0
  72. data/app/models/spree/permission_sets/configuration_management.rb +52 -0
  73. data/app/models/spree/permission_sets/dashboard_display.rb +28 -0
  74. data/app/models/spree/permission_sets/default_customer.rb +83 -0
  75. data/app/models/spree/permission_sets/order_display.rb +50 -0
  76. data/app/models/spree/permission_sets/order_management.rb +50 -0
  77. data/app/models/spree/permission_sets/product_display.rb +43 -0
  78. data/app/models/spree/permission_sets/product_management.rb +47 -0
  79. data/app/models/spree/permission_sets/restricted_stock_display.rb +33 -0
  80. data/app/models/spree/permission_sets/restricted_stock_management.rb +33 -0
  81. data/app/models/spree/permission_sets/stock_display.rb +26 -0
  82. data/app/models/spree/permission_sets/stock_management.rb +26 -0
  83. data/app/models/spree/permission_sets/super_user.rb +26 -0
  84. data/app/models/spree/permission_sets/user_display.rb +27 -0
  85. data/app/models/spree/permission_sets/user_management.rb +44 -0
  86. data/app/models/spree/preference.rb +1 -1
  87. data/app/models/spree/product.rb +13 -9
  88. data/app/models/spree/refund.rb +3 -1
  89. data/app/models/spree/refund_reason.rb +6 -1
  90. data/app/models/spree/reimbursement.rb +4 -4
  91. data/app/models/spree/reimbursement_performer.rb +3 -3
  92. data/app/models/spree/reimbursement_tax_calculator.rb +2 -2
  93. data/app/models/spree/reimbursement_type/credit.rb +1 -1
  94. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
  95. data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
  96. data/app/models/spree/reimbursement_type.rb +6 -1
  97. data/app/models/spree/return_authorization.rb +2 -0
  98. data/app/models/spree/return_item.rb +10 -10
  99. data/app/models/spree/return_reason.rb +6 -1
  100. data/app/models/spree/role.rb +3 -1
  101. data/app/models/spree/role_permission.rb +8 -0
  102. data/app/models/spree/shipment.rb +9 -7
  103. data/app/models/spree/shipping_category.rb +2 -0
  104. data/app/models/spree/shipping_rate.rb +2 -3
  105. data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +8 -12
  106. data/app/models/spree/stock/estimator.rb +1 -1
  107. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  108. data/app/models/spree/stock/package.rb +2 -2
  109. data/app/models/spree/stock/simple_coordinator.rb +36 -22
  110. data/app/models/spree/stock_item.rb +1 -0
  111. data/app/models/spree/stock_location.rb +5 -5
  112. data/app/models/spree/store.rb +3 -1
  113. data/app/models/spree/store_credit.rb +17 -15
  114. data/app/models/spree/store_credit_event.rb +4 -3
  115. data/app/models/spree/store_credit_reason.rb +6 -1
  116. data/app/models/spree/store_selector/by_server_name.rb +1 -1
  117. data/app/models/spree/tax/tax_helpers.rb +12 -1
  118. data/app/models/spree/tax_calculator/default.rb +3 -3
  119. data/app/models/spree/tax_calculator/shipping_rate.rb +1 -1
  120. data/app/models/spree/tax_category.rb +3 -1
  121. data/app/models/spree/tax_rate.rb +7 -3
  122. data/app/models/spree/taxon.rb +22 -2
  123. data/app/models/spree/taxon_brand_selector.rb +22 -0
  124. data/app/models/spree/taxonomy.rb +2 -2
  125. data/app/models/spree/unauthorized_redirect_handler.rb +24 -0
  126. data/app/models/spree/unit_cancel.rb +1 -2
  127. data/app/models/spree/user_address.rb +9 -3
  128. data/app/models/spree/variant/scopes.rb +4 -0
  129. data/app/models/spree/variant/vat_price_generator.rb +1 -1
  130. data/app/models/spree/variant.rb +21 -8
  131. data/app/models/spree/wallet.rb +2 -2
  132. data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
  133. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  134. data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
  135. data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
  136. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +0 -1
  137. data/config/locales/en.yml +33 -90
  138. data/db/default/spree/permission_sets.rb +10 -0
  139. data/db/default/spree/return_reasons.rb +3 -1
  140. data/db/default/spree/states.rb +1 -1
  141. data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
  142. data/db/migrate/20220419170826_remove_archived_user_addresses.rb +12 -0
  143. data/db/migrate/20230427095534_drop_deprecated_address_id_from_shipments.rb +1 -1
  144. data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
  145. data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
  146. data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
  147. data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
  148. data/db/migrate/20250129061658_add_metadata_to_spree_resources.rb +28 -0
  149. data/db/migrate/20250201172950_add_gtin_and_condition_to_spree_variant.rb +6 -0
  150. data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +7 -0
  151. data/db/migrate/20250221152004_add_metadata_to_users.rb +13 -0
  152. data/db/seeds.rb +1 -0
  153. data/lib/generators/solidus/install/app_templates/authentication/custom.rb +0 -5
  154. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
  155. data/lib/generators/solidus/install/install_generator.rb +64 -15
  156. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +15 -12
  157. data/lib/generators/solidus/update/update_generator.rb +1 -1
  158. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  159. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +1 -1
  160. data/lib/generators/spree/dummy/templates/rails/database.yml +41 -93
  161. data/lib/generators/spree/dummy/templates/rails/manifest.js +3 -0
  162. data/lib/generators/spree/dummy/templates/rails/test.rb +6 -1
  163. data/lib/spree/app_configuration.rb +102 -67
  164. data/lib/spree/core/class_constantizer.rb +2 -2
  165. data/lib/spree/core/controller_helpers/auth.rb +5 -61
  166. data/lib/spree/core/controller_helpers/common.rb +5 -80
  167. data/lib/spree/core/controller_helpers/order.rb +5 -86
  168. data/lib/spree/core/controller_helpers/payment_parameters.rb +5 -163
  169. data/lib/spree/core/controller_helpers/pricing.rb +5 -17
  170. data/lib/spree/core/controller_helpers/search.rb +5 -14
  171. data/lib/spree/core/controller_helpers/store.rb +5 -17
  172. data/lib/spree/core/controller_helpers/strong_parameters.rb +5 -71
  173. data/lib/spree/core/engine.rb +13 -5
  174. data/lib/spree/core/environment/calculators.rb +35 -3
  175. data/lib/spree/core/environment/promotions.rb +25 -4
  176. data/lib/spree/core/environment_extension.rb +16 -2
  177. data/lib/spree/core/importer/order.rb +5 -5
  178. data/lib/spree/core/importer/product.rb +3 -3
  179. data/lib/spree/core/nested_class_set.rb +28 -0
  180. data/lib/spree/core/null_promotion_configuration.rb +84 -0
  181. data/lib/spree/core/product_filters.rb +1 -1
  182. data/lib/spree/core/search/variant.rb +2 -2
  183. data/lib/spree/core/state_machines/inventory_unit.rb +5 -40
  184. data/lib/spree/core/state_machines/order.rb +5 -251
  185. data/lib/spree/core/state_machines/payment.rb +5 -59
  186. data/lib/spree/core/state_machines/reimbursement.rb +5 -31
  187. data/lib/spree/core/state_machines/return_authorization.rb +5 -30
  188. data/lib/spree/core/state_machines/return_item/acceptance_status.rb +5 -49
  189. data/lib/spree/core/state_machines/return_item/reception_status.rb +5 -40
  190. data/lib/spree/core/state_machines/shipment.rb +5 -56
  191. data/lib/spree/core/state_machines.rb +48 -81
  192. data/lib/spree/core/validators/email.rb +1 -1
  193. data/lib/spree/core/version.rb +2 -2
  194. data/lib/spree/core.rb +2 -14
  195. data/lib/spree/deprecator.rb +9 -0
  196. data/lib/spree/i18n.rb +1 -1
  197. data/lib/spree/mailer_previews/carton_preview.rb +1 -1
  198. data/lib/spree/money.rb +5 -118
  199. data/lib/spree/permission_sets/base.rb +5 -30
  200. data/lib/spree/permission_sets/configuration_display.rb +5 -41
  201. data/lib/spree/permission_sets/configuration_management.rb +5 -40
  202. data/lib/spree/permission_sets/dashboard_display.rb +5 -14
  203. data/lib/spree/permission_sets/default_customer.rb +5 -71
  204. data/lib/spree/permission_sets/order_display.rb +5 -38
  205. data/lib/spree/permission_sets/order_management.rb +5 -38
  206. data/lib/spree/permission_sets/product_display.rb +5 -31
  207. data/lib/spree/permission_sets/product_management.rb +5 -35
  208. data/lib/spree/permission_sets/restricted_stock_display.rb +5 -21
  209. data/lib/spree/permission_sets/restricted_stock_management.rb +5 -21
  210. data/lib/spree/permission_sets/stock_display.rb +5 -14
  211. data/lib/spree/permission_sets/stock_management.rb +5 -14
  212. data/lib/spree/permission_sets/super_user.rb +5 -14
  213. data/lib/spree/permission_sets/user_display.rb +5 -15
  214. data/lib/spree/permission_sets/user_management.rb +5 -32
  215. data/lib/spree/permission_sets.rb +5 -18
  216. data/lib/spree/permitted_attributes.rb +21 -9
  217. data/lib/spree/preferences/configuration.rb +4 -0
  218. data/lib/spree/preferences/persistable.rb +7 -1
  219. data/lib/spree/preferences/store.rb +2 -2
  220. data/lib/spree/testing_support/capybara_ext.rb +11 -1
  221. data/lib/spree/testing_support/common_rake.rb +1 -0
  222. data/lib/spree/testing_support/dummy_ability.rb +7 -0
  223. data/lib/spree/testing_support/dummy_app/assets/stylesheets/solidus_admin/tailwind.css +1 -0
  224. data/lib/spree/testing_support/dummy_app/database.yml +37 -46
  225. data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
  226. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +3 -6
  227. data/lib/spree/testing_support/dummy_app.rb +33 -19
  228. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -2
  229. data/lib/spree/testing_support/factories/calculator_factory.rb +1 -5
  230. data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
  231. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
  232. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +3 -3
  233. data/lib/spree/testing_support/factories/order_factory.rb +13 -24
  234. data/lib/spree/testing_support/factories/product_factory.rb +1 -1
  235. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -1
  236. data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -1
  237. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
  238. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  239. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  240. data/lib/spree/testing_support/order_walkthrough.rb +3 -3
  241. data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
  242. data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
  243. data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
  244. data/lib/tasks/colorado_delivery_fee.rake +2 -2
  245. data/solidus_core.gemspec +7 -10
  246. metadata +107 -109
  247. data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
  248. data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
  249. data/app/models/spree/calculator/distributed_amount.rb +0 -33
  250. data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
  251. data/app/models/spree/calculator/flexi_rate.rb +0 -22
  252. data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
  253. data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
  254. data/app/models/spree/calculator/tiered_percent.rb +0 -62
  255. data/app/models/spree/line_item_action.rb +0 -8
  256. data/app/models/spree/order_promotion.rb +0 -27
  257. data/app/models/spree/promotion/actions/create_adjustment.rb +0 -81
  258. data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -98
  259. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
  260. data/app/models/spree/promotion/actions/free_shipping.rb +0 -59
  261. data/app/models/spree/promotion/order_adjustments_recalculator.rb +0 -92
  262. data/app/models/spree/promotion/rules/first_order.rb +0 -38
  263. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
  264. data/app/models/spree/promotion/rules/item_total.rb +0 -86
  265. data/app/models/spree/promotion/rules/nth_order.rb +0 -45
  266. data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
  267. data/app/models/spree/promotion/rules/option_value.rb +0 -50
  268. data/app/models/spree/promotion/rules/product.rb +0 -86
  269. data/app/models/spree/promotion/rules/store.rb +0 -26
  270. data/app/models/spree/promotion/rules/taxon.rb +0 -91
  271. data/app/models/spree/promotion/rules/user.rb +0 -34
  272. data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
  273. data/app/models/spree/promotion/rules/user_role.rb +0 -45
  274. data/app/models/spree/promotion.rb +0 -271
  275. data/app/models/spree/promotion_action.rb +0 -47
  276. data/app/models/spree/promotion_category.rb +0 -8
  277. data/app/models/spree/promotion_chooser.rb +0 -34
  278. data/app/models/spree/promotion_code/batch_builder.rb +0 -64
  279. data/app/models/spree/promotion_code.rb +0 -54
  280. data/app/models/spree/promotion_code_batch.rb +0 -27
  281. data/app/models/spree/promotion_handler/cart.rb +0 -75
  282. data/app/models/spree/promotion_handler/coupon.rb +0 -123
  283. data/app/models/spree/promotion_handler/page.rb +0 -26
  284. data/app/models/spree/promotion_handler/shipping.rb +0 -61
  285. data/app/models/spree/promotion_rule.rb +0 -55
  286. data/app/models/spree/promotion_rule_role.rb +0 -8
  287. data/app/models/spree/promotion_rule_store.rb +0 -10
  288. data/app/models/spree/promotion_rule_taxon.rb +0 -8
  289. data/app/models/spree/promotion_rule_user.rb +0 -10
  290. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
  291. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
  292. data/bin/rails +0 -13
  293. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
  294. data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
  295. data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
  296. data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
  297. data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +0 -20
  298. data/db/migrate/20230322085416_remove_match_policy_from_spree_promotion.rb +0 -5
  299. data/db/migrate/20230325132905_remove_unused_columns_from_promotion_rules.rb +0 -6
  300. data/db/migrate/20230325161633_drop_unused_promo_action_line_items.rb +0 -13
  301. data/lib/generators/spree/dummy/templates/rails/script/rails +0 -6
  302. data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
  303. data/lib/spree/permission_sets/promotion_display.rb +0 -25
  304. data/lib/spree/permission_sets/promotion_management.rb +0 -25
  305. data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -8
  306. data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -7
  307. data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -8
  308. data/lib/spree/testing_support/factories/promotion_factory.rb +0 -98
@@ -10,8 +10,8 @@ module DummyApp
10
10
  require lib_name
11
11
  require 'spree/testing_support/dummy_app'
12
12
  DummyApp.setup(
13
- gem_root: gem_root,
14
- lib_name: lib_name,
13
+ gem_root:,
14
+ lib_name:,
15
15
  auto_migrate: false
16
16
  )
17
17
  end
@@ -38,10 +38,7 @@ namespace :db do
38
38
  # railties:install:migrations and then db:migrate.
39
39
  # Migrations should be run one directory at a time
40
40
  ActiveRecord::Migrator.migrations_paths.each do |path|
41
- ActiveRecord::MigrationContext.new(
42
- [path],
43
- ActiveRecord::SchemaMigration
44
- ).migrate
41
+ ActiveRecord::MigrationContext.new([path]).migrate
45
42
  end
46
43
 
47
44
  ActiveRecord::Base.clear_cache!
@@ -20,6 +20,7 @@ end
20
20
 
21
21
  # @private
22
22
  class ApplicationRecord < ActiveRecord::Base
23
+ self.abstract_class = true
23
24
  end
24
25
 
25
26
  # @private
@@ -34,10 +35,19 @@ end
34
35
  module DummyApp
35
36
  def self.setup(gem_root:, lib_name:, auto_migrate: true)
36
37
  ENV["LIB_NAME"] = lib_name
37
- DummyApp::Application.config.root = File.join(gem_root, 'spec', 'dummy')
38
+ root = Pathname(gem_root).join('spec/dummy')
39
+ root.join("app/assets/config").mkpath
40
+ root.join("app/assets/config/manifest.js").write("// Intentionally empty\n")
38
41
 
42
+ DummyApp::Application.config.root = root
39
43
  DummyApp::Application.initialize! unless DummyApp::Application.initialized?
40
44
 
45
+ # Raise on deprecation warnings.
46
+ # NOTE: This needs to happen after the application is initialized.
47
+ if ENV['SOLIDUS_RAISE_DEPRECATIONS'].present?
48
+ Spree.deprecator.behavior = :raise
49
+ end
50
+
41
51
  if auto_migrate
42
52
  DummyApp::Migrations.auto_migrate
43
53
  end
@@ -45,6 +55,7 @@ module DummyApp
45
55
 
46
56
  class Application < ::Rails::Application
47
57
  config.load_defaults("#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}")
58
+
48
59
  # Make the test environment more production-like:
49
60
  config.action_controller.allow_forgery_protection = false
50
61
  config.action_controller.default_protect_from_forgery = false
@@ -62,9 +73,14 @@ module DummyApp
62
73
  config.cache_classes = true
63
74
 
64
75
  # Make debugging easier:
76
+ if Rails.gem_version >= Gem::Version.new('7.1')
77
+ config.action_controller.raise_on_missing_callback_actions = true
78
+ config.action_dispatch.show_exceptions = :none
79
+ else
80
+ config.action_dispatch.show_exceptions = false
81
+ end
65
82
  config.consider_all_requests_local = true
66
- config.action_dispatch.show_exceptions = false
67
- config.active_support.deprecation = :stderr
83
+ config.active_support.deprecation = ENV['RAILS_DEPRECATIONS_BEHAVIOR'].presence&.to_sym || :stderr
68
84
  config.log_level = :debug
69
85
 
70
86
  # Improve test suite performance:
@@ -82,22 +98,24 @@ module DummyApp
82
98
  config.secret_key_base = 'SECRET_TOKEN'
83
99
 
84
100
  # Set the preview path within the dummy app:
85
- config.action_mailer.preview_path = File.expand_path('dummy_app/mailer_previews', __dir__)
101
+ if ActionMailer::Base.respond_to? :preview_paths # Rails 7.1+
102
+ config.action_mailer.preview_paths << File.expand_path('dummy_app/mailer_previews', __dir__)
103
+ else
104
+ config.action_mailer.preview_path = File.expand_path('dummy_app/mailer_previews', __dir__)
105
+ end
86
106
 
87
107
  config.active_record.dump_schema_after_migration = false
88
108
 
89
109
  # Configure active storage to use storage within tmp folder
90
- unless (ENV['DISABLE_ACTIVE_STORAGE'] == 'true')
91
- initializer 'solidus.active_storage' do
92
- config.active_storage.service_configurations = {
93
- test: {
94
- service: 'Disk',
95
- root: Rails.root.join('tmp', 'storage')
96
- }
110
+ initializer 'solidus.active_storage' do
111
+ config.active_storage.service_configurations = {
112
+ test: {
113
+ service: 'Disk',
114
+ root: Rails.root.join('tmp', 'storage')
97
115
  }
98
- config.active_storage.service = :test
99
- config.active_storage.variant_processor = ENV.fetch('ACTIVE_STORAGE_VARIANT_PROCESSOR', :vips).to_sym
100
- end
116
+ }
117
+ config.active_storage.service = :test
118
+ config.active_storage.variant_processor = ENV.fetch('ACTIVE_STORAGE_VARIANT_PROCESSOR', :vips).to_sym
101
119
  end
102
120
 
103
121
  # Avoid issues if an old spec/dummy still exists
@@ -117,6 +135,7 @@ module DummyApp
117
135
 
118
136
  config.assets.paths << File.expand_path('dummy_app/assets/javascripts', __dir__)
119
137
  config.assets.paths << File.expand_path('dummy_app/assets/stylesheets', __dir__)
138
+ config.assets.css_compressor = nil
120
139
 
121
140
  config.paths["config/database"] = File.expand_path('dummy_app/database.yml', __dir__)
122
141
  config.paths['config/routes.rb'] = File.expand_path('dummy_app/routes.rb', __dir__)
@@ -139,8 +158,3 @@ Spree.config do |config|
139
158
  config.taxon_attachment_module = 'Spree::Taxon::PaperclipAttachment'
140
159
  end
141
160
  end
142
-
143
- # Raise on deprecation warnings
144
- if ENV['SOLIDUS_RAISE_DEPRECATIONS'].present?
145
- Spree.deprecator.behavior = :raise
146
- end
@@ -7,7 +7,6 @@ FactoryBot.define do
7
7
  amount { 100.0 }
8
8
  label { 'Shipping' }
9
9
  association(:source, factory: :tax_rate)
10
- eligible { true }
11
10
 
12
11
  after(:build) do |adjustment|
13
12
  adjustments = adjustment.adjustable.adjustments
@@ -31,7 +30,7 @@ FactoryBot.define do
31
30
  adjustment.source.tax_categories = []
32
31
  end
33
32
  adjustment.source.save
34
- adjustment.recalculate
33
+ adjustment.update!(amount: adjustment.source.compute_amount(adjustment.adjustable))
35
34
  end
36
35
  end
37
36
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  FactoryBot.define do
4
- factory :calculator, aliases: [:flat_rate_calculator], class: 'Spree::Calculator::FlatRate' do
4
+ factory :flat_rate_calculator, aliases: [:calculator], class: 'Spree::Calculator::FlatRate' do
5
5
  preferred_amount { 10.0 }
6
6
  end
7
7
 
@@ -22,8 +22,4 @@ FactoryBot.define do
22
22
  factory :shipping_no_amount_calculator, class: 'Spree::Calculator::Shipping::FlatRate' do
23
23
  preferred_amount { 0 }
24
24
  end
25
-
26
- factory :percent_on_item_calculator, class: 'Spree::Calculator::PercentOnLineItem' do
27
- preferred_percent { 10 }
28
- end
29
25
  end
@@ -13,8 +13,8 @@ FactoryBot.define do
13
13
  # ensure the shipment uses the same stock location as the carton
14
14
  shipment: build(
15
15
  :shipment,
16
- stock_location: stock_location,
17
- shipping_method: shipping_method
16
+ stock_location:,
17
+ shipping_method:
18
18
  )
19
19
  )
20
20
  ]
@@ -7,13 +7,13 @@ FactoryBot.define do
7
7
  transient do
8
8
  line_items_count { 1 }
9
9
  return_items_count { line_items_count }
10
- shipped_order { create :shipped_order, line_items_count: line_items_count }
10
+ shipped_order { create :shipped_order, line_items_count: }
11
11
  return_authorization { create :return_authorization, order: shipped_order }
12
12
  end
13
13
 
14
14
  before(:create) do |customer_return, evaluator|
15
15
  evaluator.shipped_order.inventory_units.take(evaluator.return_items_count).each do |inventory_unit|
16
- customer_return.return_items << build(:return_item, inventory_unit: inventory_unit, return_authorization: evaluator.return_authorization)
16
+ customer_return.return_items << build(:return_item, inventory_unit:, return_authorization: evaluator.return_authorization)
17
17
  end
18
18
  end
19
19
 
@@ -10,15 +10,15 @@ FactoryBot.define do
10
10
  association :variant, strategy: :create
11
11
  line_item do
12
12
  if order
13
- build(:line_item, variant: variant, order: order)
13
+ build(:line_item, variant:, order:)
14
14
  else
15
- build(:line_item, variant: variant)
15
+ build(:line_item, variant:)
16
16
  end
17
17
  end
18
18
  state { 'on_hand' }
19
19
  shipment do
20
20
  if stock_location
21
- build(:shipment, state: 'pending', order: line_item.order, stock_location: stock_location)
21
+ build(:shipment, state: 'pending', order: line_item.order, stock_location:)
22
22
  else
23
23
  build(:shipment, state: 'pending', order: line_item.order)
24
24
  end
@@ -43,36 +43,25 @@ FactoryBot.define do
43
43
  evaluator.stock_location # must evaluate before creating line items
44
44
 
45
45
  evaluator.line_items_attributes.each do |attributes|
46
- attributes = { order: order, price: evaluator.line_items_price }.merge(attributes)
46
+ attributes = { order:, price: evaluator.line_items_price }.merge(attributes).tap do |attrs|
47
+ tax_category = attributes.delete(:tax_category)
48
+ if attrs[:variant] && tax_category
49
+ attrs[:variant].update(tax_category: )
50
+ elsif tax_category
51
+ attrs[:variant] = create(:variant, tax_category: )
52
+ end
53
+ end
54
+
47
55
  create(:line_item, attributes)
48
56
  end
49
57
  order.line_items.reload
50
58
 
51
- create(:shipment, order: order, cost: evaluator.shipment_cost, shipping_method: evaluator.shipping_method, stock_location: evaluator.stock_location)
59
+ create(:shipment, order:, cost: evaluator.shipment_cost, shipping_method: evaluator.shipping_method, stock_location: evaluator.stock_location)
52
60
  order.shipments.reload
53
61
 
54
62
  order.recalculate
55
63
  end
56
64
 
57
- factory :completed_order_with_promotion do
58
- transient do
59
- completed_at { Time.current }
60
- promotion { nil }
61
- end
62
-
63
- after(:create) do |order, evaluator|
64
- promotion = evaluator.promotion || create(:promotion, code: "test")
65
- promotion_code = promotion.codes.first || create(:promotion_code, promotion: promotion)
66
-
67
- promotion.activate(order: order, promotion_code: promotion_code)
68
- order.order_promotions.create!(promotion: promotion, promotion_code: promotion_code)
69
-
70
- # Complete the order after the promotion has been activated
71
- order.update_column(:completed_at, evaluator.completed_at)
72
- order.update_column(:state, "complete")
73
- end
74
- end
75
-
76
65
  factory :order_ready_to_complete do
77
66
  state { 'confirm' }
78
67
  payment_state { 'checkout' }
@@ -84,7 +73,7 @@ FactoryBot.define do
84
73
  after(:create) do |order, evaluator|
85
74
  create(evaluator.payment_type, {
86
75
  amount: order.total,
87
- order: order,
76
+ order:,
88
77
  state: order.payment_state
89
78
  })
90
79
 
@@ -107,7 +96,7 @@ FactoryBot.define do
107
96
 
108
97
  factory :completed_order_with_pending_payment do
109
98
  after(:create) do |order|
110
- create(:payment, amount: order.total, order: order, state: 'pending')
99
+ create(:payment, amount: order.total, order:, state: 'pending')
111
100
  end
112
101
  end
113
102
 
@@ -120,7 +109,7 @@ FactoryBot.define do
120
109
  end
121
110
 
122
111
  after(:create) do |order, evaluator|
123
- create(evaluator.payment_type, amount: order.total, order: order, state: 'completed')
112
+ create(evaluator.payment_type, amount: order.total, order:, state: 'completed')
124
113
  order.shipments.each do |shipment|
125
114
  shipment.update_column('state', 'ready')
126
115
  end
@@ -40,7 +40,7 @@ FactoryBot.define do
40
40
  end
41
41
 
42
42
  factory :product_with_option_types do
43
- after(:create) { |product| create(:product_option_type, product: product) }
43
+ after(:create) { |product| create(:product_option_type, product:) }
44
44
  end
45
45
  end
46
46
  end
@@ -15,7 +15,7 @@ FactoryBot.define do
15
15
  after(:create) do |shipment, evaluator|
16
16
  shipping_method = evaluator.shipping_method || create(:shipping_method, cost: evaluator.cost)
17
17
  shipment.shipping_rates.create!(
18
- shipping_method: shipping_method,
18
+ shipping_method:,
19
19
  cost: evaluator.cost,
20
20
  selected: true
21
21
  )
@@ -6,6 +6,10 @@ FactoryBot.define do
6
6
  association :stock_location, factory: :stock_location_without_variant_propagation
7
7
  variant
8
8
 
9
- after(:create) { |object| object.adjust_count_on_hand(10) }
9
+ transient do
10
+ on_hand { 10 }
11
+ end
12
+
13
+ after(:create) { |object, evaluator| object.adjust_count_on_hand(evaluator.on_hand) }
10
14
  end
11
15
  end
@@ -14,7 +14,7 @@ FactoryBot.define do
14
14
 
15
15
  after(:build) do |package, evaluator|
16
16
  evaluator.variants_contents.each do |variant, count|
17
- package.add_multiple build_list(:inventory_unit, count, variant: variant, stock_location: evaluator.stock_location)
17
+ package.add_multiple build_list(:inventory_unit, count, variant:, stock_location: evaluator.stock_location)
18
18
  end
19
19
  end
20
20
 
@@ -14,7 +14,7 @@ FactoryBot.define do
14
14
 
15
15
  trait :with_orders do
16
16
  after(:create) do |user, _|
17
- create(:order, user: user)
17
+ create(:order, user:)
18
18
  end
19
19
  end
20
20
 
@@ -6,7 +6,7 @@ FactoryBot.define do
6
6
  zone_members do |proxy|
7
7
  zone = proxy.instance_eval { @instance }
8
8
  Spree::Country.all.map do |c|
9
- Spree::ZoneMember.create(zoneable: c, zone: zone)
9
+ Spree::ZoneMember.create(zoneable: c, zone:)
10
10
  end
11
11
  end
12
12
  end
@@ -4,7 +4,7 @@ module Spree
4
4
  module TestingSupport
5
5
  class OrderWalkthrough
6
6
  def self.up_to(state, user: nil)
7
- new.up_to(state, user: user)
7
+ new.up_to(state, user:)
8
8
  end
9
9
 
10
10
  def up_to(state, user: nil)
@@ -23,7 +23,7 @@ module Spree
23
23
  end
24
24
 
25
25
  order = Spree::Order.create!(
26
- user: user,
26
+ user:,
27
27
  email: "solidus@example.com",
28
28
  store: Spree::Store.first || ::FactoryBot.create(:store)
29
29
  )
@@ -47,7 +47,7 @@ module Spree
47
47
  private
48
48
 
49
49
  def add_line_item!(order)
50
- ::FactoryBot.create(:line_item, order: order)
50
+ ::FactoryBot.create(:line_item, order:)
51
51
  order.reload
52
52
  end
53
53
 
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.shared_examples_for 'a calculator with a description' do
4
+ describe ".description" do
5
+ subject { described_class.description }
6
+ it "has a description" do
7
+ expect(subject.size).to be > 0
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.shared_examples "shipping methods are assigned" do
4
+ context "given a shipping method" do
5
+ let(:shipping_method) { create(:shipping_method) }
6
+
7
+ it "assigns the shipping method when created" do
8
+ expect(
9
+ create(
10
+ factory,
11
+ shipping_method:
12
+ ).shipments.map(&:shipping_method)
13
+ ).to all(eq(shipping_method))
14
+ end
15
+
16
+ it "assigns the shipping method when built" do
17
+ expect(
18
+ build(
19
+ factory,
20
+ shipping_method:
21
+ ).shipments.map(&:shipping_method)
22
+ ).to all(eq(shipping_method))
23
+ end
24
+ end
25
+ end
26
+
27
+ RSpec.shared_examples "an order with line items factory" do |expected_order_state, expected_inventory_unit_state|
28
+ # This factory cannot be built correctly because Shipment#set_up_inventory
29
+ # requires records to be saved.
30
+ context "when created" do
31
+ let(:stock_location) { create(:stock_location) }
32
+ let(:first_variant) { create(:variant) }
33
+ let(:second_variant) { create(:variant) }
34
+ let(:shipping_method) { create(:shipping_method) }
35
+ let(:order) do
36
+ create(
37
+ factory,
38
+ stock_location:,
39
+ line_items_attributes: [
40
+ { variant: first_variant, quantity: 1, price: 1 },
41
+ { variant: second_variant, quantity: 2, price: 2 }
42
+ ],
43
+ shipment_cost: 3,
44
+ shipping_method:
45
+ )
46
+ end
47
+
48
+ it "has the expected attributes" do
49
+ aggregate_failures "for line items" do
50
+ expect(order.line_items.count).to eq 2
51
+ expect(order.line_items[0]).to have_attributes(
52
+ quantity: 1,
53
+ price: 1.0
54
+ )
55
+ expect(order.line_items[1]).to have_attributes(
56
+ price: 2.0,
57
+ quantity: 2
58
+ )
59
+ end
60
+
61
+ aggregate_failures "for shipments" do
62
+ expect(order.shipments.count).to eq 1
63
+ expect(order.shipments[0]).to have_attributes(
64
+ amount: 3.0,
65
+ stock_location:
66
+ )
67
+
68
+ expect(order.shipments[0].shipping_method).to eq(shipping_method)
69
+
70
+ # Explicitly order by line item id, because otherwise these can be in
71
+ # an arbitrary order.
72
+ inventory_units = order.shipments[0].inventory_units.sort_by(&:line_item_id)
73
+
74
+ expect(inventory_units.count).to eq(3)
75
+ expect(inventory_units[0]).to have_attributes(
76
+ order:,
77
+ shipment: order.shipments[0],
78
+ line_item: order.line_items[0],
79
+ variant: order.line_items[0].variant,
80
+ state: expected_inventory_unit_state
81
+ )
82
+ expect(inventory_units[1]).to have_attributes(
83
+ order:,
84
+ shipment: order.shipments[0],
85
+ line_item: order.line_items[1],
86
+ variant: order.line_items[1].variant,
87
+ state: expected_inventory_unit_state
88
+ )
89
+ expect(inventory_units[2]).to have_attributes(
90
+ order:,
91
+ shipment: order.shipments[0],
92
+ line_item: order.line_items[1],
93
+ variant: order.line_items[1].variant,
94
+ state: expected_inventory_unit_state
95
+ )
96
+ end
97
+
98
+ expect(order).to have_attributes(
99
+ item_total: 5.0,
100
+ ship_total: 3.0,
101
+ total: 8.0,
102
+ state: expected_order_state
103
+ )
104
+ end
105
+ end
106
+
107
+ context 'when shipments should be taxed' do
108
+ let!(:ship_address) { create(:address) }
109
+ let!(:tax_zone) { create(:global_zone) } # will include the above address
110
+ let!(:tax_rate) { create(:tax_rate, amount: 0.10, zone: tax_zone, tax_categories: [tax_category]) }
111
+
112
+ let(:tax_category) { create(:tax_category) }
113
+ let(:shipping_method) { create(:shipping_method, tax_category:, zones: [tax_zone]) }
114
+
115
+ it 'shipments get a tax adjustment' do
116
+ order = create(factory, ship_address:, shipping_method:)
117
+ shipment = order.shipments[0]
118
+
119
+ expect(shipment.additional_tax_total).to be > 0
120
+ end
121
+ end
122
+ end
123
+
124
+ RSpec.shared_examples 'supplied completed_at is respected' do
125
+ context 'when passed a completed_at timestamp' do
126
+ let(:completed_at) { 2.days.ago }
127
+ let(:order) { create(factory, completed_at:) }
128
+
129
+ it 'respects the timestamp' do
130
+ expect(order.completed_at).to be_within(5.seconds).of(completed_at)
131
+ end
132
+ end
133
+
134
+ context 'when no completed_at timestamp is passed' do
135
+ let(:order) { create(factory) }
136
+
137
+ it 'defaults to the current time' do
138
+ expect(order.completed_at).to be_within(2.seconds).of(Time.current)
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.shared_examples_for 'a working factory' do
4
+ it "builds successfully" do
5
+ expect(build(factory)).to be_a(factory_class)
6
+ end
7
+
8
+ it "creates successfully" do
9
+ expect(create(factory)).to be_a(factory_class)
10
+ end
11
+
12
+ it "is creates a valid record" do
13
+ expect(create(factory)).to be_valid
14
+ end
15
+ end
@@ -16,8 +16,8 @@ namespace :taxes do
16
16
  calculator = Spree::Calculator::FlatFee.new
17
17
  rate = Spree::TaxRate.create!(
18
18
  name: "Colorado Delivery Fee",
19
- calculator: calculator,
20
- zone: zone,
19
+ calculator:,
20
+ zone:,
21
21
  amount: 0.27,
22
22
  show_rate_in_label: false,
23
23
  level: "order"
data/solidus_core.gemspec CHANGED
@@ -17,27 +17,24 @@ Gem::Specification.new do |s|
17
17
  s.metadata['rubygems_mfa_required'] = 'true'
18
18
 
19
19
  s.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f.match(%r{^(spec|script)/})
20
+ f.match(%r{^(spec|bin)/})
21
21
  end
22
22
 
23
- s.required_ruby_version = '>= 3.0.0'
23
+ s.required_ruby_version = '>= 3.1.0'
24
24
  s.required_rubygems_version = '>= 1.8.23'
25
25
 
26
26
  %w[
27
27
  actionmailer actionpack actionview activejob activemodel activerecord
28
28
  activestorage activesupport railties
29
29
  ].each do |rails_dep|
30
- s.add_dependency rails_dep, ['>= 7.0', '< 7.1']
30
+ s.add_dependency rails_dep, ['>= 7.0', '< 8.1.0.beta1']
31
31
  end
32
32
 
33
33
  s.add_dependency 'activemerchant', '~> 1.66'
34
34
  s.add_dependency 'acts_as_list', '< 2.0'
35
- s.add_dependency 'awesome_nested_set', '~> 3.3'
35
+ s.add_dependency 'awesome_nested_set', ['~> 3.3', '>= 3.7.0']
36
36
  s.add_dependency 'cancancan', ['>= 2.2', '< 4.0']
37
37
  s.add_dependency 'carmen', '~> 1.1.0'
38
- # Adding a constraint here to make sure Rails 7.0 does not crash on startup
39
- # https://github.com/rails/rails/pull/54264
40
- s.add_dependency 'concurrent-ruby', '< 1.3.5'
41
38
  s.add_dependency 'discard', '~> 1.0'
42
39
  s.add_dependency 'friendly_id', '~> 5.0'
43
40
  s.add_dependency 'image_processing', '~> 1.10'
@@ -45,9 +42,9 @@ Gem::Specification.new do |s|
45
42
  s.add_dependency 'mini_magick', '~> 4.10'
46
43
  s.add_dependency 'monetize', '~> 1.8'
47
44
  s.add_dependency 'kt-paperclip', ['>= 6.3', '< 8']
48
- s.add_dependency 'psych', ['>= 4.0.1', '< 5.0']
49
- s.add_dependency 'ransack', '~> 2.0'
50
- s.add_dependency 'sprockets-rails'
45
+ s.add_dependency 'psych', ['>= 4.0.1', '< 6.0']
46
+ s.add_dependency 'ransack', ['~> 4.0', '< 5']
47
+ s.add_dependency 'sprockets-rails', '!= 3.5.0'
51
48
  s.add_dependency 'state_machines-activerecord', '~> 0.6'
52
49
  s.add_dependency 'omnes', '~> 0.2.2'
53
50