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,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Spree::VariantPropertyRuleCondition, type: :model do
6
- context "touching" do
7
- let(:rule_condition) { create(:variant_property_rule_condition) }
8
-
9
- before do
10
- rule_condition.variant_property_rule.update_columns(updated_at: 1.day.ago)
11
- end
12
-
13
- it "should update the variant property rule" do
14
- expect { rule_condition.touch }.to change { rule_condition.reload.variant_property_rule.updated_at }
15
- end
16
- end
17
- end
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Spree::VariantPropertyRule, type: :model do
6
- context "touching" do
7
- let(:rule) { create(:variant_property_rule) }
8
-
9
- before do
10
- rule.product.update_columns(updated_at: 1.day.ago)
11
- end
12
-
13
- it "should update the product" do
14
- expect { rule.touch }.to change { rule.reload.product.updated_at }
15
- end
16
- end
17
-
18
- describe "#matches_option_value_ids?" do
19
- let(:first_condition_option_value) { create(:option_value) }
20
- let(:second_condition_option_value) { create(:option_value) }
21
- let!(:second_condition) do
22
- create(:variant_property_rule_condition,
23
- variant_property_rule: rule,
24
- option_value: second_condition_option_value)
25
- end
26
- let(:rule) { create(:variant_property_rule, option_value: first_condition_option_value) }
27
-
28
- context "provided ids are the same as the rule's condition's option value ids" do
29
- subject do
30
- rule.matches_option_value_ids?([second_condition_option_value.id, first_condition_option_value.id])
31
- end
32
-
33
- it { is_expected.to eq true }
34
- end
35
-
36
- context "some of the provided ids are the same as the rule's condition's option value ids" do
37
- subject do
38
- rule.matches_option_value_ids?([first_condition_option_value.id])
39
- end
40
-
41
- it { is_expected.to eq false }
42
- end
43
-
44
- context "none of the provided ids are the same as the rule's condition's option value ids" do
45
- let(:other_option_value) { create(:option_value) }
46
-
47
- subject do
48
- rule.matches_option_value_ids?([other_option_value.id])
49
- end
50
-
51
- it { is_expected.to eq false }
52
- end
53
- end
54
-
55
- describe "#applies_to_variant?" do
56
- let(:variant_option_value_1) { create(:option_value) }
57
- let(:variant_option_value_2) { create(:option_value) }
58
- let!(:variant) { create(:variant, option_values: option_values) }
59
-
60
- let(:rule_option_value) { create(:option_value) }
61
- let(:rule) { create(:variant_property_rule, option_value: rule_option_value) }
62
- let!(:rule_condition_1) { create(:variant_property_rule_condition, variant_property_rule: rule, option_value: variant_option_value_1) }
63
- let!(:rule_condition_2) { create(:variant_property_rule_condition, variant_property_rule: rule, option_value: variant_option_value_2) }
64
-
65
- subject { rule.applies_to_variant?(variant) }
66
-
67
- context "variant matches some of the rule's conditions" do
68
- let(:option_values) { [variant_option_value_1, variant_option_value_2] }
69
-
70
- it { is_expected.to eq true }
71
- end
72
-
73
- context "variant matches none of the rule's conditions" do
74
- let(:option_values) { [create(:option_value)] }
75
-
76
- it { is_expected.to eq false }
77
- end
78
-
79
- context "variant matches all of the rule's conditions" do
80
- let(:option_values) { [rule_option_value, variant_option_value_1, variant_option_value_2] }
81
-
82
- it { is_expected.to eq true }
83
- end
84
- end
85
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Spree::VariantPropertyRuleValue, type: :model do
6
- context "touching" do
7
- let(:rule_value) { create(:variant_property_rule_value) }
8
- let(:rule) { rule_value.variant_property_rule }
9
-
10
- before do
11
- rule.update_columns(updated_at: 1.day.ago)
12
- end
13
-
14
- subject { rule_value.touch }
15
-
16
- it "touches the variant property rule" do
17
- expect { subject }.to change { rule.reload.updated_at }
18
- end
19
- end
20
- end
@@ -1,862 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Spree::Variant, type: :model do
6
- it { is_expected.to be_invalid }
7
-
8
- let!(:variant) { create(:variant) }
9
-
10
- it_behaves_like 'default_price'
11
-
12
- context "validations" do
13
- it "should validate price is greater than 0" do
14
- variant.price = -1
15
- expect(variant).to be_invalid
16
- end
17
-
18
- it "should validate price is 0" do
19
- variant.price = 0
20
- expect(variant).to be_valid
21
- end
22
-
23
- it "should require a product" do
24
- expect(variant).to be_valid
25
- variant.product = nil
26
- expect(variant).to be_invalid
27
- variant.price = nil
28
- expect(variant).to be_invalid
29
- end
30
- end
31
-
32
- context "after create" do
33
- let!(:product) { create(:product) }
34
-
35
- it "propagate to stock items" do
36
- expect_any_instance_of(Spree::StockLocation).to receive(:propagate_variant)
37
- product.variants.create!
38
- end
39
-
40
- context "stock location has disable propagate all variants" do
41
- before { Spree::StockLocation.update_all propagate_all_variants: false }
42
-
43
- it "propagate to stock items" do
44
- expect_any_instance_of(Spree::StockLocation).not_to receive(:propagate_variant)
45
- product.variants.create!
46
- end
47
- end
48
-
49
- describe 'mark_master_out_of_stock' do
50
- before do
51
- product.master.stock_items.first.set_count_on_hand(5)
52
- end
53
- context 'when product is created without variants but with stock' do
54
- it { expect(product.master).to be_in_stock }
55
- end
56
-
57
- context 'when a variant is created' do
58
- before(:each) do
59
- product.variants.create!
60
- end
61
-
62
- it { expect(product.master).to_not be_in_stock }
63
- end
64
- end
65
-
66
- context "when several countries have VAT" do
67
- let(:germany) { create(:country, iso: "DE") }
68
- let(:denmark) { create(:country, iso: "DK") }
69
- let(:france) { create(:country, iso: "FR") }
70
-
71
- let(:high_vat_zone) { create(:zone, countries: [germany, denmark]) }
72
- let(:low_vat_zone) { create(:zone, countries: [france]) }
73
-
74
- let(:tax_category) { create(:tax_category) }
75
-
76
- let!(:high_vat) { create(:tax_rate, included_in_price: true, amount: 0.25, zone: high_vat_zone, tax_categories: [tax_category]) }
77
- let!(:low_vat) { create(:tax_rate, included_in_price: true, amount: 0.15, zone: low_vat_zone, tax_categories: [tax_category]) }
78
-
79
- let(:product) { build(:product, tax_category: tax_category) }
80
-
81
- subject(:new_variant) { build(:variant, price: 15) }
82
-
83
- it "creates the appropriate prices for them" do
84
- product.variants << new_variant
85
- product.save!
86
- expect(new_variant.prices.find_by(country_iso: "FR").amount).to eq(17.25)
87
- expect(new_variant.prices.find_by(country_iso: "DE").amount).to eq(18.75)
88
- expect(new_variant.prices.find_by(country_iso: "DK").amount).to eq(18.75)
89
- expect(new_variant.prices.find_by(country_iso: nil).amount).to eq(15.00)
90
- # default price + FR, DE, DK
91
- expect(new_variant.prices.count).to eq(4)
92
- end
93
-
94
- context "when the products price changes" do
95
- context "and rebuild_vat_prices is set to true" do
96
- subject { variant.update(price: 99, rebuild_vat_prices: true, tax_category: tax_category) }
97
-
98
- it "creates new appropriate prices for this variant" do
99
- expect { subject }.to change { Spree::Price.count }.by(3)
100
- expect(variant.prices.find_by(country_iso: "FR").amount).to eq(113.85)
101
- expect(variant.prices.find_by(country_iso: "DE").amount).to eq(123.75)
102
- expect(variant.prices.find_by(country_iso: "DK").amount).to eq(123.75)
103
- expect(variant.prices.find_by(country_iso: nil).amount).to eq(99.00)
104
- end
105
- end
106
-
107
- context "and rebuild_vat_prices is not set" do
108
- subject { variant.update(price: 99, tax_category: tax_category) }
109
-
110
- it "does not create new prices" do
111
- expect { subject }.not_to change { Spree::Price.count }
112
- end
113
- end
114
- end
115
- end
116
- end
117
-
118
- context "product has other variants" do
119
- describe "option value accessors" do
120
- before {
121
- @multi_variant = FactoryBot.create :variant, product: variant.product
122
- variant.product.reload
123
- }
124
-
125
- let(:multi_variant) { @multi_variant }
126
-
127
- it "should set option value" do
128
- expect(multi_variant.option_value('media_type')).to be_nil
129
-
130
- multi_variant.set_option_value('media_type', 'DVD')
131
- expect(multi_variant.option_value('media_type')).to eql 'DVD'
132
-
133
- multi_variant.set_option_value('media_type', 'CD')
134
- expect(multi_variant.option_value('media_type')).to eql 'CD'
135
- end
136
-
137
- it "should not duplicate associated option values when set multiple times" do
138
- multi_variant.set_option_value('media_type', 'CD')
139
-
140
- expect {
141
- multi_variant.set_option_value('media_type', 'DVD')
142
- }.to_not change(multi_variant.option_values, :count)
143
-
144
- expect {
145
- multi_variant.set_option_value('coolness_type', 'awesome')
146
- }.to change(multi_variant.option_values, :count).by(1)
147
- end
148
-
149
- context "and a variant is soft-deleted" do
150
- let!(:old_options_text) { variant.options_text }
151
-
152
- before { variant.discard }
153
-
154
- it "still keeps the option values for that variant" do
155
- expect(variant.reload.options_text).to eq(old_options_text)
156
- end
157
- end
158
-
159
- context "and a variant is really deleted" do
160
- let!(:old_option_values_variant_ids) { variant.option_values_variants.pluck(:id) }
161
-
162
- before { variant.really_destroy! }
163
-
164
- it "leaves no stale records behind" do
165
- expect(old_option_values_variant_ids).to be_present
166
- expect(Spree::OptionValuesVariant.where(id: old_option_values_variant_ids)).to be_empty
167
- end
168
- end
169
- end
170
- end
171
-
172
- context "#cost_price=" do
173
- it "should use LocalizedNumber.parse" do
174
- expect(Spree::LocalizedNumber).to receive(:parse).with('1,599.99')
175
- subject.cost_price = '1,599.99'
176
- end
177
- end
178
-
179
- context "#price=" do
180
- it "should use LocalizedNumber.parse" do
181
- expect(Spree::LocalizedNumber).to receive(:parse).with('1,599.99')
182
- subject.price = '1,599.99'
183
- end
184
- end
185
-
186
- context "#weight=" do
187
- it "should use LocalizedNumber.parse" do
188
- expect(Spree::LocalizedNumber).to receive(:parse).with('1,599.99')
189
- subject.weight = '1,599.99'
190
- end
191
- end
192
-
193
- context "#display_amount" do
194
- it "returns a Spree::Money" do
195
- variant.price = 21.22
196
- expect(variant.display_amount.to_s).to eql "$21.22"
197
- end
198
- end
199
-
200
- context "#cost_currency" do
201
- context "when cost currency is nil" do
202
- before { variant.cost_currency = nil }
203
- it "populates cost currency with the default value on save" do
204
- variant.save!
205
- expect(variant.cost_currency).to eql "USD"
206
- end
207
- end
208
- end
209
-
210
- context "#default_price" do
211
- context "when multiple prices are present in addition to a default price" do
212
- let(:pricing_options_germany) { Spree::Config.pricing_options_class.new(currency: "EUR") }
213
- let(:pricing_options_united_states) { Spree::Config.pricing_options_class.new(currency: "USD") }
214
- before do
215
- variant.prices.create(currency: "EUR", amount: 29.99)
216
- variant.reload
217
- end
218
-
219
- it "the default stays the same" do
220
- expect(variant.default_price.amount).to eq(19.99)
221
- end
222
-
223
- it "displays default price" do
224
- expect(variant.price_for(pricing_options_united_states).to_s).to eq("$19.99")
225
- expect(variant.price_for(pricing_options_germany).to_s).to eq("€29.99")
226
- end
227
- end
228
-
229
- context "when adding multiple prices" do
230
- it "it can reassign a default price" do
231
- expect(variant.default_price.amount).to eq(19.99)
232
- variant.prices.create(currency: "USD", amount: 12.12)
233
- expect(variant.reload.default_price.amount).to eq(12.12)
234
- end
235
- end
236
- end
237
-
238
- context "#price_selector" do
239
- subject { variant.price_selector }
240
-
241
- it "returns an instance of a price selector" do
242
- expect(variant.price_selector).to be_a(Spree::Config.variant_price_selector_class)
243
- end
244
-
245
- it "is instacached" do
246
- expect(variant.price_selector.object_id).to eq(variant.price_selector.object_id)
247
- end
248
- end
249
-
250
- context "#price_for(price_options)" do
251
- let(:price_options) { Spree::Config.variant_price_selector_class.pricing_options_class.new }
252
-
253
- it "calls the price selector with the given options object" do
254
- expect(variant.price_selector).to receive(:price_for).with(price_options)
255
- variant.price_for(price_options)
256
- end
257
- end
258
-
259
- context "#price_difference_from_master" do
260
- let(:pricing_options) { Spree::Config.default_pricing_options }
261
-
262
- subject { variant.price_difference_from_master(pricing_options) }
263
-
264
- it "can be called without pricing options" do
265
- expect(variant.price_difference_from_master).to eq(Spree::Money.new(0))
266
- end
267
-
268
- context "for the master variant" do
269
- let(:variant) { create(:product).master }
270
-
271
- it { is_expected.to eq(Spree::Money.new(0, currency: Spree::Config.currency)) }
272
- end
273
-
274
- context "when both variants have a price" do
275
- let(:product) { create(:product, price: 25) }
276
- let(:variant) { create(:variant, product: product, price: 35) }
277
-
278
- it { is_expected.to eq(Spree::Money.new(10, currency: Spree::Config.currency)) }
279
- end
280
-
281
- context "when the master variant does not have a price" do
282
- let(:product) { create(:product, price: 25) }
283
- let(:variant) { create(:variant, product: product, price: 35) }
284
-
285
- before do
286
- allow(product.master).to receive(:price_for).and_return(nil)
287
- end
288
-
289
- it { is_expected.to be_nil }
290
- end
291
-
292
- context "when the variant does not have a price" do
293
- let(:product) { create(:product, price: 25) }
294
- let(:variant) { create(:variant, product: product, price: 35) }
295
-
296
- before do
297
- allow(variant).to receive(:price_for).and_return(nil)
298
- end
299
-
300
- it { is_expected.to be_nil }
301
- end
302
- end
303
-
304
- context "#price_same_as_master?" do
305
- context "when the price is the same as the master price" do
306
- let(:master) { create(:product, price: 10).master }
307
- let(:variant) { create(:variant, price: 10, product: master.product) }
308
-
309
- subject { variant.price_same_as_master? }
310
-
311
- it { is_expected.to be true }
312
- end
313
-
314
- context "when the price is different from the master price" do
315
- let(:master) { create(:product, price: 11).master }
316
- let(:variant) { create(:variant, price: 10, product: master.product) }
317
-
318
- subject { variant.price_same_as_master? }
319
-
320
- it { is_expected.to be false }
321
- end
322
-
323
- context "when the master variant does not have a price" do
324
- let(:master) { create(:product).master }
325
- let(:variant) { create(:variant, price: 10, product: master.product) }
326
-
327
- before do
328
- allow(master).to receive(:price_for).and_return(nil)
329
- end
330
-
331
- subject { variant.price_same_as_master? }
332
-
333
- it { is_expected.to be_falsey }
334
- end
335
-
336
- context "when the variant itself does not have a price" do
337
- let(:master) { create(:product).master }
338
- let(:variant) { create(:variant, price: 10, product: master.product) }
339
-
340
- before do
341
- allow(variant).to receive(:price_for).and_return(nil)
342
- end
343
-
344
- subject { variant.price_same_as_master? }
345
-
346
- it { is_expected.to be_falsey }
347
- end
348
- end
349
-
350
- describe '.price_in' do
351
- before do
352
- variant.prices << create(:price, variant: variant, currency: "EUR", amount: 33.33)
353
- end
354
-
355
- subject do
356
- Spree::Deprecation.silence { variant.price_in(currency) }
357
- end
358
-
359
- context "when currency is not specified" do
360
- let(:currency) { nil }
361
-
362
- it "returns nil" do
363
- expect(subject).to be_nil
364
- end
365
- end
366
-
367
- context "when currency is EUR" do
368
- let(:currency) { 'EUR' }
369
-
370
- it "returns the value in the EUR" do
371
- expect(subject.display_price.to_s).to eql "€33.33"
372
- end
373
- end
374
-
375
- context "when currency is USD" do
376
- let(:currency) { 'USD' }
377
-
378
- it "returns the value in the USD" do
379
- expect(subject.display_price.to_s).to eql "$19.99"
380
- end
381
- end
382
- end
383
-
384
- describe '.amount_in' do
385
- before do
386
- variant.prices << create(:price, variant: variant, currency: "EUR", amount: 33.33)
387
- end
388
-
389
- subject do
390
- Spree::Deprecation.silence { variant.amount_in(currency) }
391
- end
392
-
393
- context "when currency is not specified" do
394
- let(:currency) { nil }
395
-
396
- it "returns the amount in the default currency" do
397
- expect(subject).to be_nil
398
- end
399
- end
400
-
401
- context "when currency is EUR" do
402
- let(:currency) { 'EUR' }
403
-
404
- it "returns the value in the EUR" do
405
- expect(subject).to eql 33.33
406
- end
407
- end
408
-
409
- context "when currency is USD" do
410
- let(:currency) { 'USD' }
411
-
412
- it "returns the value in the USD" do
413
- expect(subject).to eql 19.99
414
- end
415
- end
416
- end
417
-
418
- # Regression test for https://github.com/spree/spree/issues/2432
419
- describe 'options_text' do
420
- let!(:variant) { create(:variant, option_values: []) }
421
- let!(:master) { create(:master_variant) }
422
-
423
- before do
424
- # Order bar than foo
425
- variant.option_values << create(:option_value, { name: 'Foo', presentation: 'Foo', option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type') })
426
- variant.option_values << create(:option_value, { name: 'Bar', presentation: 'Bar', option_type: create(:option_type, position: 1, name: 'Bar Type', presentation: 'Bar Type') })
427
- end
428
-
429
- it 'should order by bar than foo' do
430
- expect(variant.options_text).to eql 'Bar Type: Bar, Foo Type: Foo'
431
- end
432
- end
433
-
434
- describe 'exchange_name' do
435
- let!(:variant) { create(:variant, option_values: []) }
436
- let!(:master) { create(:master_variant) }
437
-
438
- before do
439
- variant.option_values << create(:option_value, {
440
- name: 'Foo',
441
- presentation: 'Foo',
442
- option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')
443
- })
444
- end
445
-
446
- context 'master variant' do
447
- it 'should return name' do
448
- expect(master.exchange_name).to eql master.name
449
- end
450
- end
451
-
452
- context 'variant' do
453
- it 'should return options text' do
454
- expect(variant.exchange_name).to eql 'Foo Type: Foo'
455
- end
456
- end
457
- end
458
-
459
- describe 'exchange_name' do
460
- let!(:variant) { create(:variant, option_values: []) }
461
- let!(:master) { create(:master_variant) }
462
-
463
- before do
464
- variant.option_values << create(:option_value, {
465
- name: 'Foo',
466
- presentation: 'Foo',
467
- option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')
468
- })
469
- end
470
-
471
- context 'master variant' do
472
- it 'should return name' do
473
- expect(master.exchange_name).to eql master.name
474
- end
475
- end
476
-
477
- context 'variant' do
478
- it 'should return options text' do
479
- expect(variant.exchange_name).to eql 'Foo Type: Foo'
480
- end
481
- end
482
- end
483
-
484
- describe 'descriptive_name' do
485
- let!(:variant) { create(:variant, option_values: []) }
486
- let!(:master) { create(:master_variant) }
487
-
488
- before do
489
- variant.option_values << create(:option_value, {
490
- name: 'Foo',
491
- presentation: 'Foo',
492
- option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')
493
- })
494
- end
495
-
496
- context 'master variant' do
497
- it 'should return name with Master identifier' do
498
- expect(master.descriptive_name).to eql master.name + ' - Master'
499
- end
500
- end
501
-
502
- context 'variant' do
503
- it 'should return options text with name' do
504
- expect(variant.descriptive_name).to eql variant.name + ' - Foo Type: Foo'
505
- end
506
- end
507
- end
508
-
509
- # Regression test for https://github.com/spree/spree/issues/2744
510
- describe "set_position" do
511
- it "sets variant position after creation" do
512
- variant = create(:variant)
513
- expect(variant.position).to_not be_nil
514
- end
515
- end
516
-
517
- describe '#in_stock?' do
518
- before do
519
- stub_spree_preferences(track_inventory_levels: true)
520
- end
521
-
522
- context 'when stock_items are not backorderable' do
523
- before do
524
- allow_any_instance_of(Spree::StockItem).to receive_messages(backorderable: false)
525
- end
526
-
527
- context 'when stock_items in stock' do
528
- before do
529
- variant.stock_items.first.update_column(:count_on_hand, 10)
530
- end
531
-
532
- it 'returns true if stock_items in stock' do
533
- expect(variant.in_stock?).to be true
534
- end
535
- end
536
-
537
- context 'when stock_items out of stock' do
538
- before do
539
- allow_any_instance_of(Spree::StockItem).to receive_messages(backorderable: false)
540
- allow_any_instance_of(Spree::StockItem).to receive_messages(count_on_hand: 0)
541
- end
542
-
543
- it 'return false if stock_items out of stock' do
544
- expect(variant.in_stock?).to be false
545
- end
546
- end
547
- end
548
-
549
- describe "#can_supply?" do
550
- it "calls out to quantifier" do
551
- expect(Spree::Stock::Quantifier).to receive(:new).and_return(quantifier = double)
552
- expect(quantifier).to receive(:can_supply?).with(10)
553
- variant.can_supply?(10)
554
- end
555
- end
556
-
557
- context 'when stock_items are backorderable' do
558
- before do
559
- allow_any_instance_of(Spree::StockItem).to receive_messages(backorderable: true)
560
- end
561
-
562
- context 'when stock_items out of stock' do
563
- before do
564
- allow_any_instance_of(Spree::StockItem).to receive_messages(count_on_hand: 0)
565
- end
566
-
567
- it 'in_stock? returns false' do
568
- expect(variant.in_stock?).to be false
569
- end
570
-
571
- it 'can_supply? return true' do
572
- expect(variant.can_supply?).to be true
573
- end
574
- end
575
- end
576
-
577
- describe "cache clearing on update" do
578
- it "correctly reports after updating track_inventory" do
579
- variant.stock_items.first.set_count_on_hand 0
580
- expect(variant).not_to be_in_stock
581
-
582
- variant.update!(track_inventory: false)
583
- expect(variant).to be_in_stock
584
- end
585
- end
586
- end
587
-
588
- describe '#is_backorderable' do
589
- let(:variant) { build(:variant) }
590
- subject { variant.is_backorderable? }
591
-
592
- it 'should invoke Spree::Stock::Quantifier' do
593
- expect_any_instance_of(Spree::Stock::Quantifier).to receive(:backorderable?) { true }
594
- subject
595
- end
596
- end
597
-
598
- describe '#total_on_hand' do
599
- it 'should be infinite if track_inventory_levels is false' do
600
- stub_spree_preferences(track_inventory_levels: false)
601
- expect(build(:variant).total_on_hand).to eql(Float::INFINITY)
602
- end
603
-
604
- it 'should match quantifier total_on_hand' do
605
- variant = build(:variant)
606
- expect(variant.total_on_hand).to eq(Spree::Stock::Quantifier.new(variant).total_on_hand)
607
- end
608
- end
609
-
610
- describe '#tax_category' do
611
- context 'when tax_category is nil' do
612
- let(:product) { build(:product) }
613
- let(:variant) { build(:variant, product: product, tax_category_id: nil) }
614
- it 'returns the parent products tax_category' do
615
- expect(variant.tax_category).to eq(product.tax_category)
616
- end
617
- end
618
-
619
- context 'when tax_category is set' do
620
- let(:tax_category) { create(:tax_category) }
621
- let(:variant) { build(:variant, tax_category: tax_category) }
622
- it 'returns the tax_category set on itself' do
623
- expect(variant.tax_category).to eq(tax_category)
624
- end
625
- end
626
- end
627
-
628
- describe "touching" do
629
- it "updates a product" do
630
- variant.product.update_column(:updated_at, 1.day.ago)
631
- variant.touch
632
- expect(variant.product.reload.updated_at).to be_within(3.seconds).of(Time.current)
633
- end
634
-
635
- it "clears the in_stock cache key" do
636
- expect(Rails.cache).to receive(:delete).with(variant.send(:in_stock_cache_key))
637
- variant.touch
638
- end
639
- end
640
-
641
- describe "#should_track_inventory?" do
642
- it 'should not track inventory when global setting is off' do
643
- stub_spree_preferences(track_inventory_levels: false)
644
-
645
- expect(build(:variant).should_track_inventory?).to eq(false)
646
- end
647
-
648
- it 'should not track inventory when variant is turned off' do
649
- stub_spree_preferences(track_inventory_levels: true)
650
-
651
- expect(build(:on_demand_variant).should_track_inventory?).to eq(false)
652
- end
653
-
654
- it 'should track inventory when global and variant are on' do
655
- stub_spree_preferences(track_inventory_levels: true)
656
-
657
- expect(build(:variant).should_track_inventory?).to eq(true)
658
- end
659
- end
660
-
661
- describe "#discard" do
662
- it "discards related associations" do
663
- variant.images = [create(:image)]
664
-
665
- expect(variant.stock_items).not_to be_empty
666
- expect(variant.prices).not_to be_empty
667
- expect(variant.currently_valid_prices).not_to be_empty
668
-
669
- variant.discard
670
-
671
- expect(variant.images).to be_empty
672
- expect(variant.stock_items).to be_empty
673
- expect(variant.prices).to be_empty
674
- expect(variant.currently_valid_prices).to be_empty
675
- end
676
-
677
- describe 'default_price' do
678
- let!(:previous_variant_price) { variant.display_price }
679
-
680
- it "should discard default_price" do
681
- variant.discard
682
- variant.reload
683
- expect(variant.default_price).to be_discarded
684
- end
685
-
686
- it "should keep its price if deleted" do
687
- variant.discard
688
- variant.reload
689
- expect(variant.display_price).to eq(previous_variant_price)
690
- end
691
-
692
- context 'when loading with pre-fetching of default_price' do
693
- it 'also keeps the previous price' do
694
- variant.discard
695
- reloaded_variant = Spree::Variant.with_deleted.includes(:default_price).find_by(id: variant.id)
696
- expect(reloaded_variant.display_price).to eq(previous_variant_price)
697
- end
698
- end
699
- end
700
- end
701
-
702
- describe "stock movements" do
703
- let!(:movement) { create(:stock_movement, stock_item: variant.stock_items.first) }
704
-
705
- it "builds out collection just fine through stock items" do
706
- expect(variant.stock_movements.to_a).not_to be_empty
707
- end
708
- end
709
-
710
- describe "in_stock scope" do
711
- subject { Spree::Variant.in_stock }
712
- let!(:in_stock_variant) { create(:variant) }
713
- let!(:out_of_stock_variant) { create(:variant) }
714
- let!(:stock_location) { create(:stock_location) }
715
-
716
- context "a stock location is provided" do
717
- subject { Spree::Variant.in_stock([stock_location]) }
718
-
719
- context "there's stock in the location" do
720
- before do
721
- in_stock_variant.
722
- stock_items.find_by(stock_location: stock_location).
723
- update_column(:count_on_hand, 10)
724
- out_of_stock_variant.
725
- stock_items.where.not(stock_location: stock_location).first.
726
- update_column(:count_on_hand, 10)
727
- end
728
-
729
- it "returns all in stock variants in the provided stock location" do
730
- expect(subject).to eq [in_stock_variant]
731
- end
732
- end
733
-
734
- context "there's no stock in the location" do
735
- it "returns an empty list" do
736
- expect(subject).to eq []
737
- end
738
- end
739
- end
740
-
741
- context "a stock location is not provided" do
742
- before do
743
- in_stock_variant.stock_items.first.update_column(:count_on_hand, 10)
744
- end
745
-
746
- it "returns all in stock variants" do
747
- expect(subject).to eq [in_stock_variant]
748
- end
749
- end
750
-
751
- context "inventory levels globally not tracked" do
752
- before { stub_spree_preferences(track_inventory_levels: false) }
753
-
754
- it 'includes items without inventory' do
755
- expect( subject ).to include out_of_stock_variant
756
- end
757
- end
758
- end
759
-
760
- describe ".suppliable" do
761
- subject { Spree::Variant.suppliable }
762
- let!(:in_stock_variant) { create(:variant) }
763
- let!(:out_of_stock_variant) { create(:variant) }
764
- let!(:backordered_variant) { create(:variant) }
765
- let!(:stock_location) { create(:stock_location) }
766
-
767
- before do
768
- in_stock_variant.stock_items.update_all(count_on_hand: 10)
769
- backordered_variant.stock_items.update_all(count_on_hand: 0, backorderable: true)
770
- out_of_stock_variant.stock_items.update_all(count_on_hand: 0, backorderable: false)
771
- end
772
-
773
- it "includes the in stock variant" do
774
- expect( subject ).to include(in_stock_variant)
775
- end
776
-
777
- it "includes out of stock variant" do
778
- expect( subject ).to include(backordered_variant)
779
- end
780
-
781
- it "does not include out of stock variant" do
782
- expect( subject ).not_to include(out_of_stock_variant)
783
- end
784
-
785
- it "includes variants only once" do
786
- expect(subject.to_a.count(in_stock_variant)).to be 1
787
- end
788
-
789
- context "inventory levels globally not tracked" do
790
- before { stub_spree_preferences(track_inventory_levels: false) }
791
-
792
- it "includes all variants" do
793
- expect( subject ).to include(in_stock_variant, backordered_variant, out_of_stock_variant)
794
- end
795
- end
796
- end
797
-
798
- describe "#variant_properties" do
799
- let(:option_value_1) { create(:option_value) }
800
- let(:option_value_2) { create(:option_value) }
801
- let(:variant) { create(:variant, option_values: [option_value_1, option_value_2]) }
802
-
803
- subject { variant.variant_properties }
804
-
805
- context "variant has properties" do
806
- let!(:rule_1) { create(:variant_property_rule, product: variant.product, option_value: option_value_1) }
807
- let!(:rule_2) { create(:variant_property_rule, product: variant.product, option_value: option_value_2) }
808
-
809
- it "returns the variant property rule's values" do
810
- expect(subject).to match_array rule_1.values + rule_2.values
811
- end
812
- end
813
-
814
- context "variant doesn't have any properties" do
815
- it "returns an empty list" do
816
- expect(subject).to eq []
817
- end
818
- end
819
- end
820
-
821
- describe "#gallery" do
822
- let(:variant) { build_stubbed(:variant) }
823
- subject { variant.gallery }
824
-
825
- it "responds to #images" do
826
- expect(subject).to respond_to(:images)
827
- end
828
-
829
- context "when variant.images is empty" do
830
- let(:product) { create(:product) }
831
- let(:variant) { create(:variant, product: product) }
832
-
833
- it "fallbacks to variant.product.master.images" do
834
- product.master.images = [create(:image)]
835
-
836
- expect(product.master).not_to eq variant
837
-
838
- expect(variant.gallery.images).to eq product.master.images
839
- end
840
-
841
- context "and variant.product.master.images is also empty" do
842
- it "returns Spree::Image.none" do
843
- expect(product.master).not_to eq variant
844
- expect(product.master.images.presence).to be nil
845
-
846
- expect(variant.gallery.images).to eq Spree::Image.none
847
- end
848
- end
849
-
850
- context "and is master" do
851
- it "returns Spree::Image.none" do
852
- variant = product.master
853
-
854
- expect(variant.is_master?).to be true
855
- expect(variant.images.presence).to be nil
856
-
857
- expect(variant.gallery.images).to eq Spree::Image.none
858
- end
859
- end
860
- end
861
- end
862
- end