solidus_core 2.10.3 → 2.11.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

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