solidus_core 1.2.3 → 1.3.0.beta1

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 (573) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Rakefile +1 -1
  4. data/app/assets/javascripts/spree.js.coffee.erb +1 -1
  5. data/app/helpers/spree/base_helper.rb +21 -43
  6. data/app/helpers/spree/orders_helper.rb +0 -1
  7. data/app/helpers/spree/products_helper.rb +10 -12
  8. data/app/helpers/spree/taxons_helper.rb +4 -4
  9. data/app/mailers/spree/base_mailer.rb +1 -3
  10. data/app/mailers/spree/carton_mailer.rb +2 -2
  11. data/app/mailers/spree/order_mailer.rb +2 -2
  12. data/app/models/concerns/spree/adjustment_source.rb +12 -16
  13. data/app/models/concerns/spree/calculated_adjustments.rb +17 -14
  14. data/app/models/concerns/spree/default_price.rb +10 -26
  15. data/app/models/concerns/spree/display_money.rb +1 -1
  16. data/app/models/concerns/spree/ordered_property_value_list.rb +10 -12
  17. data/app/models/concerns/spree/ransackable_attributes.rb +6 -5
  18. data/app/models/concerns/spree/user_address_book.rb +87 -81
  19. data/app/models/concerns/spree/user_methods.rb +2 -2
  20. data/app/models/concerns/spree/user_payment_source.rb +12 -8
  21. data/app/models/spree/ability.rb +2 -2
  22. data/app/models/spree/address.rb +37 -38
  23. data/app/models/spree/adjustment.rb +2 -6
  24. data/app/models/spree/app_configuration.rb +60 -5
  25. data/app/models/spree/base.rb +1 -1
  26. data/app/models/spree/calculator/default_tax.rb +28 -24
  27. data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
  28. data/app/models/spree/calculator/flat_rate.rb +2 -2
  29. data/app/models/spree/calculator/flexi_rate.rb +4 -4
  30. data/app/models/spree/calculator/percent_per_item.rb +8 -9
  31. data/app/models/spree/calculator/price_sack.rb +3 -3
  32. data/app/models/spree/calculator/returns/default_refund_amount.rb +11 -12
  33. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
  34. data/app/models/spree/calculator/shipping/flat_rate.rb +2 -2
  35. data/app/models/spree/calculator/shipping/flexi_rate.rb +3 -3
  36. data/app/models/spree/calculator/shipping/per_item.rb +1 -1
  37. data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
  38. data/app/models/spree/calculator/tiered_flat_rate.rb +2 -1
  39. data/app/models/spree/calculator/tiered_percent.rb +2 -1
  40. data/app/models/spree/calculator.rb +3 -3
  41. data/app/models/spree/carton.rb +2 -2
  42. data/app/models/spree/country.rb +7 -4
  43. data/app/models/spree/credit_card.rb +26 -22
  44. data/app/models/spree/customer_return.rb +8 -7
  45. data/app/models/spree/exchange.rb +1 -9
  46. data/app/models/spree/gateway/bogus.rb +31 -31
  47. data/app/models/spree/gateway/bogus_simple.rb +6 -8
  48. data/app/models/spree/gateway.rb +9 -15
  49. data/app/models/spree/image.rb +3 -3
  50. data/app/models/spree/inventory_unit.rb +23 -23
  51. data/app/models/spree/item_adjustments.rb +3 -2
  52. data/app/models/spree/legacy_user.rb +1 -5
  53. data/app/models/spree/line_item.rb +95 -84
  54. data/app/models/spree/option_type.rb +1 -1
  55. data/app/models/spree/option_value.rb +3 -1
  56. data/app/models/spree/order/checkout.rb +45 -44
  57. data/app/models/spree/order/payments.rb +42 -45
  58. data/app/models/spree/order.rb +70 -75
  59. data/app/models/spree/order_cancellations.rb +4 -4
  60. data/app/models/spree/order_capturing.rb +3 -2
  61. data/app/models/spree/order_contents.rb +61 -59
  62. data/app/models/spree/order_inventory.rb +59 -54
  63. data/app/models/spree/order_mutex.rb +0 -1
  64. data/app/models/spree/order_shipping.rb +8 -9
  65. data/app/models/spree/order_stock_location.rb +3 -3
  66. data/app/models/spree/order_update_attributes.rb +0 -2
  67. data/app/models/spree/order_updater.rb +11 -24
  68. data/app/models/spree/payment/processing.rb +26 -37
  69. data/app/models/spree/payment.rb +68 -71
  70. data/app/models/spree/payment_method/check.rb +2 -2
  71. data/app/models/spree/payment_method/store_credit.rb +6 -7
  72. data/app/models/spree/payment_method.rb +11 -8
  73. data/app/models/spree/preferences/configuration.rb +2 -2
  74. data/app/models/spree/preferences/preferable.rb +1 -1
  75. data/app/models/spree/preferences/preferable_class_methods.rb +1 -1
  76. data/app/models/spree/preferences/scoped_store.rb +6 -5
  77. data/app/models/spree/preferences/static_model_preferences.rb +1 -1
  78. data/app/models/spree/preferences/statically_configurable.rb +2 -2
  79. data/app/models/spree/preferences/store.rb +2 -6
  80. data/app/models/spree/price.rb +17 -19
  81. data/app/models/spree/product/scopes.rb +18 -17
  82. data/app/models/spree/product.rb +28 -11
  83. data/app/models/spree/product_property.rb +2 -0
  84. data/app/models/spree/product_scope/scopes.rb +22 -22
  85. data/app/models/spree/promotion/actions/create_adjustment.rb +3 -4
  86. data/app/models/spree/promotion/actions/create_item_adjustments.rb +8 -8
  87. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +3 -3
  88. data/app/models/spree/promotion/actions/free_shipping.rb +4 -4
  89. data/app/models/spree/promotion/rules/first_order.rb +7 -6
  90. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +2 -3
  91. data/app/models/spree/promotion/rules/item_total.rb +5 -2
  92. data/app/models/spree/promotion/rules/nth_order.rb +3 -4
  93. data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
  94. data/app/models/spree/promotion/rules/option_value.rb +1 -2
  95. data/app/models/spree/promotion/rules/product.rb +4 -4
  96. data/app/models/spree/promotion/rules/taxon.rb +5 -5
  97. data/app/models/spree/promotion/rules/user.rb +1 -1
  98. data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
  99. data/app/models/spree/promotion.rb +8 -8
  100. data/app/models/spree/promotion_action.rb +1 -1
  101. data/app/models/spree/promotion_builder.rb +2 -2
  102. data/app/models/spree/promotion_chooser.rb +1 -0
  103. data/app/models/spree/promotion_code/code_builder.rb +3 -3
  104. data/app/models/spree/promotion_handler/cart.rb +17 -16
  105. data/app/models/spree/promotion_handler/coupon.rb +10 -14
  106. data/app/models/spree/promotion_handler/page.rb +4 -4
  107. data/app/models/spree/promotion_rule.rb +4 -3
  108. data/app/models/spree/prototype.rb +0 -1
  109. data/app/models/spree/refund.rb +3 -3
  110. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
  111. data/app/models/spree/reimbursement.rb +3 -5
  112. data/app/models/spree/reimbursement_performer.rb +0 -5
  113. data/app/models/spree/reimbursement_tax_calculator.rb +2 -7
  114. data/app/models/spree/reimbursement_type/credit.rb +1 -1
  115. data/app/models/spree/reimbursement_type/original_payment.rb +1 -1
  116. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +3 -3
  117. data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
  118. data/app/models/spree/reimbursement_type.rb +1 -1
  119. data/app/models/spree/return_authorization.rb +38 -37
  120. data/app/models/spree/return_item/eligibility_validator/default.rb +4 -4
  121. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +0 -1
  122. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +0 -1
  123. data/app/models/spree/return_item.rb +24 -23
  124. data/app/models/spree/returns_calculator.rb +1 -2
  125. data/app/models/spree/shipment.rb +80 -74
  126. data/app/models/spree/shipping_calculator.rb +4 -5
  127. data/app/models/spree/shipping_manifest.rb +3 -4
  128. data/app/models/spree/shipping_method.rb +54 -23
  129. data/app/models/spree/shipping_method_stock_location.rb +4 -0
  130. data/app/models/spree/shipping_rate.rb +24 -29
  131. data/app/models/spree/shipping_rate_tax.rb +41 -0
  132. data/app/models/spree/state.rb +1 -1
  133. data/app/models/spree/state_change.rb +1 -1
  134. data/app/models/spree/stock/availability_validator.rb +2 -2
  135. data/app/models/spree/stock/coordinator.rb +12 -13
  136. data/app/models/spree/stock/differentiator.rb +1 -0
  137. data/app/models/spree/stock/estimator.rb +18 -25
  138. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  139. data/app/models/spree/stock/package.rb +19 -9
  140. data/app/models/spree/stock/packer.rb +2 -3
  141. data/app/models/spree/stock/prioritizer.rb +3 -2
  142. data/app/models/spree/stock/quantifier.rb +2 -3
  143. data/app/models/spree/stock/shipping_rate_selector.rb +0 -1
  144. data/app/models/spree/stock/shipping_rate_sorter.rb +0 -1
  145. data/app/models/spree/stock/splitter/backordered.rb +0 -2
  146. data/app/models/spree/stock/splitter/base.rb +3 -2
  147. data/app/models/spree/stock/splitter/shipping_category.rb +2 -1
  148. data/app/models/spree/stock/splitter/weight.rb +2 -2
  149. data/app/models/spree/stock_item.rb +36 -37
  150. data/app/models/spree/stock_location.rb +17 -13
  151. data/app/models/spree/stock_movement.rb +1 -3
  152. data/app/models/spree/stock_transfer.rb +8 -8
  153. data/app/models/spree/store.rb +6 -0
  154. data/app/models/spree/store_credit.rb +24 -24
  155. data/app/models/spree/store_credit_category.rb +1 -2
  156. data/app/models/spree/tax/item_adjuster.rb +37 -0
  157. data/app/models/spree/tax/order_adjuster.rb +38 -0
  158. data/app/models/spree/tax/shipping_rate_taxer.rb +31 -0
  159. data/app/models/spree/tax/tax_helpers.rb +49 -0
  160. data/app/models/spree/tax/tax_location.rb +33 -0
  161. data/app/models/spree/tax_category.rb +1 -1
  162. data/app/models/spree/tax_rate.rb +46 -111
  163. data/app/models/spree/taxon.rb +36 -12
  164. data/app/models/spree/taxonomy.rb +10 -10
  165. data/app/models/spree/validations/db_maximum_length_validator.rb +0 -1
  166. data/app/models/spree/variant/pricer.rb +19 -0
  167. data/app/models/spree/variant/pricing_options.rb +31 -0
  168. data/app/models/spree/variant/scopes.rb +9 -9
  169. data/app/models/spree/variant.rb +95 -89
  170. data/app/models/spree/variant_property_rule.rb +1 -1
  171. data/app/models/spree/variant_property_rule_value.rb +2 -0
  172. data/app/models/spree/zone.rb +60 -24
  173. data/config/initializers/friendly_id.rb +1 -1
  174. data/config/locales/en.yml +337 -51
  175. data/config/routes.rb +1 -1
  176. data/db/default/spree/countries.rb +9 -15
  177. data/db/default/spree/roles.rb +1 -2
  178. data/db/default/spree/states.rb +7 -11
  179. data/db/default/spree/store_credit.rb +2 -2
  180. data/db/default/spree/stores.rb +2 -1
  181. data/db/migrate/20120831092320_spree_one_two.rb +100 -101
  182. data/db/migrate/20120831092359_spree_promo_one_two.rb +12 -12
  183. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +1 -1
  184. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +1 -1
  185. data/db/migrate/20121010142909_add_states_required_to_countries.rb +1 -1
  186. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +2 -2
  187. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +4 -4
  188. data/db/migrate/20121031162139_split_prices_from_variants.rb +8 -8
  189. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +2 -2
  190. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +1 -1
  191. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +1 -1
  192. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +1 -2
  193. data/db/migrate/20130211190146_create_spree_stock_items.rb +1 -1
  194. data/db/migrate/20130213191427_create_default_stock.rb +12 -21
  195. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +1 -1
  196. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +2 -2
  197. data/db/migrate/20130228210442_create_shipping_method_zone.rb +1 -1
  198. data/db/migrate/20130301162924_create_shipping_method_categories.rb +2 -2
  199. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +4 -4
  200. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +2 -3
  201. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +1 -1
  202. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +1 -1
  203. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +1 -1
  204. data/db/migrate/20130319062004_change_orders_total_precision.rb +4 -4
  205. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +1 -3
  206. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -4
  207. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +1 -3
  208. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +2 -2
  209. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +2 -2
  210. data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
  211. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +3 -3
  212. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +1 -1
  213. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +3 -3
  214. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +1 -1
  215. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +2 -2
  216. data/db/migrate/20130807024301_upgrade_adjustments.rb +3 -3
  217. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +1 -1
  218. data/db/migrate/20130813140619_expand_order_number_size.rb +2 -2
  219. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +1 -1
  220. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +1 -1
  221. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
  222. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +1 -1
  223. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
  224. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +1 -0
  225. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +1 -1
  226. data/db/migrate/20131118043959_add_included_to_adjustments.rb +1 -1
  227. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +0 -1
  228. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +1 -1
  229. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +1 -1
  230. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -0
  231. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +1 -1
  232. data/db/migrate/20140309023735_migrate_old_preferences.rb +4 -3
  233. data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
  234. data/db/migrate/20140410141842_add_many_missing_indexes.rb +13 -15
  235. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +38 -40
  236. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +4 -4
  237. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
  238. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +0 -1
  239. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +4 -4
  240. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +4 -6
  241. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -0
  242. data/db/migrate/20141217215630_update_product_slug_index.rb +2 -4
  243. data/db/migrate/20150112194216_add_position_to_stock_location.rb +2 -2
  244. data/db/migrate/20150225205344_move_promotion_code_to_promotion_code_value.rb +0 -1
  245. data/db/migrate/20150313201503_copy_shipped_shipments_to_cartons.rb +0 -1
  246. data/db/migrate/20150506181611_create_spree_store_credit_payment_method.rb +3 -3
  247. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +0 -1
  248. data/db/migrate/20150612205731_remove_spree_configurations.rb +2 -2
  249. data/db/migrate/20150619160613_create_adjustment_reason.rb +1 -1
  250. data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +10 -2
  251. data/db/migrate/20150731201146_add_spree_user_addresses.rb +0 -1
  252. data/db/migrate/20150811211025_add_finalized_to_spree_adjustments.rb +1 -1
  253. data/db/migrate/20151001121454_create_spree_shipping_method_stock_locations.rb +13 -0
  254. data/db/migrate/20151002023248_add_foreign_key_to_shipping_method_stock_location.rb +6 -0
  255. data/db/migrate/20151026093607_change_return_item_pre_tax_amount_to_amount.rb +29 -0
  256. data/db/migrate/20160111091912_add_column_available_to_all_on_spree_shipping_method.rb +5 -0
  257. data/db/migrate/20160116133604_add_position_to_spree_payment_methods.rb +5 -0
  258. data/db/migrate/20160122182105_add_carrier_and_service_level_to_spree_shipping_methods.rb +6 -0
  259. data/db/migrate/20160224201413_create_spree_shipping_rate_taxes.rb +11 -0
  260. data/db/migrate/20160229133259_add_cart_tax_country_iso_to_spree_store.rb +5 -0
  261. data/db/migrate/20160301103333_remove_pre_tax_amount_on_line_item_and_shipment.rb +6 -0
  262. data/db/migrate/20160308000300_disallow_adjustment_finalized_nulls.rb +19 -0
  263. data/db/migrate/20160318145302_add_timestamps_to_prices.rb +5 -0
  264. data/db/migrate/20160330204846_add_missing_timestamp_columns.rb +20 -0
  265. data/lib/generators/spree/custom_user/custom_user_generator.rb +3 -8
  266. data/lib/generators/spree/dummy/dummy_generator.rb +17 -19
  267. data/lib/generators/spree/install/install_generator.rb +15 -15
  268. data/lib/generators/spree/install/templates/config/initializers/spree.rb +1 -0
  269. data/lib/spree/core/controller_helpers/auth.rb +2 -4
  270. data/lib/spree/core/controller_helpers/common.rb +42 -43
  271. data/lib/spree/core/controller_helpers/order.rb +5 -9
  272. data/lib/spree/core/controller_helpers/payment_parameters.rb +4 -5
  273. data/lib/spree/core/controller_helpers/pricing.rb +27 -0
  274. data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
  275. data/lib/spree/core/controller_helpers/search.rb +2 -2
  276. data/lib/spree/core/controller_helpers/store.rb +3 -3
  277. data/lib/spree/core/controller_helpers/strong_parameters.rb +4 -4
  278. data/lib/spree/core/current_store.rb +1 -1
  279. data/lib/spree/core/delegate_belongs_to.rb +19 -21
  280. data/lib/spree/core/engine.rb +12 -8
  281. data/lib/spree/core/environment/calculators.rb +0 -1
  282. data/lib/spree/core/environment_extension.rb +4 -4
  283. data/lib/spree/core/importer/order.rb +17 -22
  284. data/lib/spree/core/importer/product.rb +10 -9
  285. data/lib/spree/core/permalinks.rb +16 -16
  286. data/lib/spree/core/product_duplicator.rb +2 -3
  287. data/lib/spree/core/product_filters.rb +15 -16
  288. data/lib/spree/core/role_configuration.rb +2 -2
  289. data/lib/spree/core/search/base.rb +71 -57
  290. data/lib/spree/core/search/variant.rb +2 -4
  291. data/lib/spree/core/unreturned_item_charger.rb +1 -2
  292. data/lib/spree/core/validators/email.rb +2 -2
  293. data/lib/spree/core/version.rb +1 -1
  294. data/lib/spree/core.rb +2 -4
  295. data/lib/spree/i18n.rb +1 -1
  296. data/lib/spree/localized_number.rb +3 -1
  297. data/lib/spree/migrations.rb +27 -26
  298. data/lib/spree/money.rb +19 -4
  299. data/lib/spree/permission_sets/base.rb +1 -1
  300. data/lib/spree/permitted_attributes.rb +7 -7
  301. data/lib/spree/responder.rb +4 -5
  302. data/lib/spree/testing_support/authorization_helpers.rb +1 -1
  303. data/lib/spree/testing_support/caching.rb +8 -8
  304. data/lib/spree/testing_support/capybara_ext.rb +11 -13
  305. data/lib/spree/testing_support/common_rake.rb +4 -4
  306. data/lib/spree/testing_support/controller_requests.rb +1 -1
  307. data/lib/spree/testing_support/extension_rake.rb +1 -2
  308. data/lib/spree/testing_support/factories/address_factory.rb +14 -3
  309. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
  310. data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
  311. data/lib/spree/testing_support/factories/credit_card_factory.rb +4 -0
  312. data/lib/spree/testing_support/factories/customer_return_factory.rb +4 -6
  313. data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
  314. data/lib/spree/testing_support/factories/order_factory.rb +10 -11
  315. data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
  316. data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -1
  317. data/lib/spree/testing_support/factories/promotion_factory.rb +0 -1
  318. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  319. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  320. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  321. data/lib/spree/testing_support/factories/shipping_method_factory.rb +5 -2
  322. data/lib/spree/testing_support/factories/state_factory.rb +17 -7
  323. data/lib/spree/testing_support/factories/stock_location_factory.rb +4 -4
  324. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +1 -1
  325. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -1
  326. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -2
  327. data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
  328. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  329. data/lib/spree/testing_support/factories/variant_factory.rb +1 -2
  330. data/lib/spree/testing_support/factories/zone_factory.rb +2 -1
  331. data/lib/spree/testing_support/i18n.rb +4 -5
  332. data/lib/spree/testing_support/order_walkthrough.rb +8 -9
  333. data/lib/spree/testing_support/preferences.rb +1 -1
  334. data/lib/spree/testing_support/sequences.rb +5 -4
  335. data/lib/tasks/core.rake +15 -19
  336. data/lib/tasks/email.rake +3 -3
  337. data/lib/tasks/exchanges.rake +12 -14
  338. data/lib/tasks/migrations/assure_store_on_orders.rake +38 -0
  339. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +2 -2
  340. data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +1 -11
  341. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +17 -0
  342. data/lib/tasks/migrations/migrate_user_addresses.rake +1 -1
  343. data/lib/tasks/order_capturing.rake +1 -1
  344. data/lib/tasks/upgrade.rake +11 -0
  345. data/script/rails +0 -1
  346. data/solidus_core.gemspec +6 -8
  347. data/spec/helpers/base_helper_spec.rb +15 -18
  348. data/spec/helpers/order_helper_spec.rb +2 -2
  349. data/spec/helpers/products_helper_spec.rb +43 -51
  350. data/spec/helpers/taxons_helper_spec.rb +1 -1
  351. data/spec/lib/i18n_spec.rb +11 -11
  352. data/spec/lib/search/base_spec.rb +12 -14
  353. data/spec/lib/search/variant_spec.rb +1 -0
  354. data/spec/lib/spree/core/controller_helpers/order_spec.rb +1 -7
  355. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +26 -28
  356. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +63 -0
  357. data/spec/lib/spree/core/controller_helpers/search_spec.rb +4 -2
  358. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +1 -1
  359. data/spec/lib/spree/core/importer/order_spec.rb +95 -90
  360. data/spec/lib/spree/core/role_configuration_spec.rb +16 -16
  361. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +35 -0
  362. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +10 -1
  363. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -1
  364. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +6 -1
  365. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +37 -1
  366. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +2 -2
  367. data/spec/lib/spree/core/testing_support/factories/stock_packer_factory_spec.rb +1 -1
  368. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +1 -2
  369. data/spec/lib/spree/core/testing_support/preferences_spec.rb +26 -0
  370. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +7 -9
  371. data/spec/lib/spree/core/validators/email_spec.rb +8 -6
  372. data/spec/lib/spree/localized_number_spec.rb +1 -3
  373. data/spec/lib/spree/migrations_spec.rb +2 -2
  374. data/spec/lib/spree/money_spec.rb +75 -6
  375. data/spec/lib/tasks/exchanges_spec.rb +2 -12
  376. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +0 -1
  377. data/spec/lib/tasks/order_capturing_spec.rb +1 -1
  378. data/spec/mailers/carton_mailer_spec.rb +3 -3
  379. data/spec/mailers/order_mailer_spec.rb +9 -11
  380. data/spec/mailers/reimbursement_mailer_spec.rb +2 -2
  381. data/spec/mailers/test_mailer_spec.rb +1 -1
  382. data/spec/models/spree/ability_spec.rb +4 -7
  383. data/spec/models/spree/address_spec.rb +32 -35
  384. data/spec/models/spree/adjustment_reason_spec.rb +0 -2
  385. data/spec/models/spree/adjustment_spec.rb +2 -2
  386. data/spec/models/spree/app_configuration_spec.rb +33 -3
  387. data/spec/models/spree/asset_spec.rb +1 -2
  388. data/spec/models/spree/calculator/default_tax_spec.rb +141 -52
  389. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +1 -1
  390. data/spec/models/spree/calculator/flexi_rate_spec.rb +6 -6
  391. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +1 -1
  392. data/spec/models/spree/calculator/price_sack_spec.rb +2 -2
  393. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +9 -11
  394. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +4 -4
  395. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +2 -2
  396. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +6 -7
  397. data/spec/models/spree/calculator/shipping/per_item_spec.rb +2 -2
  398. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +2 -2
  399. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +1 -2
  400. data/spec/models/spree/calculator/tiered_percent_spec.rb +1 -1
  401. data/spec/models/spree/calculator_spec.rb +3 -8
  402. data/spec/models/spree/carton_spec.rb +1 -1
  403. data/spec/models/spree/classification_spec.rb +1 -1
  404. data/spec/models/spree/concerns/display_money_spec.rb +0 -1
  405. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +26 -1
  406. data/spec/models/spree/concerns/user_address_book_spec.rb +19 -12
  407. data/spec/models/spree/concerns/user_methods_spec.rb +1 -1
  408. data/spec/models/spree/country_spec.rb +52 -0
  409. data/spec/models/spree/credit_card_spec.rb +17 -12
  410. data/spec/models/spree/customer_return_spec.rb +27 -23
  411. data/spec/models/spree/exchange_spec.rb +2 -7
  412. data/spec/models/spree/gateway/bogus_simple.rb +2 -4
  413. data/spec/models/spree/gateway/bogus_spec.rb +4 -2
  414. data/spec/models/spree/gateway_spec.rb +8 -3
  415. data/spec/models/spree/inventory_unit_spec.rb +13 -14
  416. data/spec/models/spree/item_adjustments_spec.rb +36 -40
  417. data/spec/models/spree/line_item_spec.rb +92 -48
  418. data/spec/models/spree/option_type_spec.rb +1 -1
  419. data/spec/models/spree/option_value_spec.rb +1 -1
  420. data/spec/models/spree/order/address_spec.rb +1 -1
  421. data/spec/models/spree/order/callbacks_spec.rb +3 -3
  422. data/spec/models/spree/order/checkout_spec.rb +55 -48
  423. data/spec/models/spree/order/finalizing_spec.rb +8 -9
  424. data/spec/models/spree/order/payment_spec.rb +20 -20
  425. data/spec/models/spree/order/risk_assessment_spec.rb +1 -1
  426. data/spec/models/spree/order/state_machine_spec.rb +40 -131
  427. data/spec/models/spree/order/tax_spec.rb +11 -12
  428. data/spec/models/spree/order/totals_spec.rb +3 -3
  429. data/spec/models/spree/order/updating_spec.rb +2 -2
  430. data/spec/models/spree/order/validations_spec.rb +2 -2
  431. data/spec/models/spree/order_cancellations_spec.rb +1 -1
  432. data/spec/models/spree/order_capturing_spec.rb +1 -1
  433. data/spec/models/spree/order_contents_spec.rb +10 -11
  434. data/spec/models/spree/order_inventory_spec.rb +11 -11
  435. data/spec/models/spree/order_merger_spec.rb +1 -0
  436. data/spec/models/spree/order_shipping_spec.rb +8 -10
  437. data/spec/models/spree/order_spec.rb +137 -124
  438. data/spec/models/spree/order_stock_location_spec.rb +2 -2
  439. data/spec/models/spree/order_update_attributes_spec.rb +6 -10
  440. data/spec/models/spree/order_updater_spec.rb +4 -8
  441. data/spec/models/spree/payment_create_spec.rb +11 -12
  442. data/spec/models/spree/payment_method/store_credit_spec.rb +10 -6
  443. data/spec/models/spree/payment_method_spec.rb +4 -5
  444. data/spec/models/spree/payment_spec.rb +61 -69
  445. data/spec/models/spree/permission_sets/base_spec.rb +1 -1
  446. data/spec/models/spree/permission_sets/configuration_display.rb +0 -1
  447. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -1
  448. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -1
  449. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -1
  450. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -1
  451. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -1
  452. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -1
  453. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -1
  454. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -1
  455. data/spec/models/spree/permission_sets/report_display_spec.rb +0 -1
  456. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -1
  457. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -1
  458. data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +0 -1
  459. data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +6 -6
  460. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -1
  461. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -1
  462. data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +0 -1
  463. data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +0 -2
  464. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -1
  465. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -1
  466. data/spec/models/spree/preference_spec.rb +1 -4
  467. data/spec/models/spree/preferences/configuration_spec.rb +2 -7
  468. data/spec/models/spree/preferences/preferable_spec.rb +13 -24
  469. data/spec/models/spree/preferences/scoped_store_spec.rb +1 -1
  470. data/spec/models/spree/preferences/static_model_preferences_spec.rb +5 -6
  471. data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -6
  472. data/spec/models/spree/preferences/store_spec.rb +2 -3
  473. data/spec/models/spree/price_spec.rb +6 -6
  474. data/spec/models/spree/product/scopes_spec.rb +20 -20
  475. data/spec/models/spree/product_duplicator_spec.rb +16 -29
  476. data/spec/models/spree/product_filter_spec.rb +2 -2
  477. data/spec/models/spree/product_spec.rb +53 -20
  478. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +10 -12
  479. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +4 -4
  480. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +9 -9
  481. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +1 -1
  482. data/spec/models/spree/promotion/rules/first_order_spec.rb +10 -10
  483. data/spec/models/spree/promotion/rules/item_total_spec.rb +63 -19
  484. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +1 -1
  485. data/spec/models/spree/promotion/rules/product_spec.rb +8 -8
  486. data/spec/models/spree/promotion/rules/taxon_spec.rb +4 -4
  487. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +3 -4
  488. data/spec/models/spree/promotion/rules/user_spec.rb +7 -7
  489. data/spec/models/spree/promotion_builder_spec.rb +10 -8
  490. data/spec/models/spree/promotion_category_spec.rb +1 -1
  491. data/spec/models/spree/promotion_code/code_builder_spec.rb +1 -3
  492. data/spec/models/spree/promotion_code_spec.rb +8 -7
  493. data/spec/models/spree/promotion_handler/cart_spec.rb +1 -1
  494. data/spec/models/spree/promotion_handler/coupon_spec.rb +28 -28
  495. data/spec/models/spree/promotion_handler/page_spec.rb +6 -7
  496. data/spec/models/spree/promotion_rule_spec.rb +1 -2
  497. data/spec/models/spree/promotion_spec.rb +25 -21
  498. data/spec/models/spree/refund_spec.rb +8 -11
  499. data/spec/models/spree/reimbursement/credit_spec.rb +2 -2
  500. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +6 -4
  501. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +1 -1
  502. data/spec/models/spree/reimbursement_performer_spec.rb +2 -2
  503. data/spec/models/spree/reimbursement_spec.rb +9 -11
  504. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +4 -5
  505. data/spec/models/spree/reimbursement_type/credit_spec.rb +2 -2
  506. data/spec/models/spree/reimbursement_type/exchange_spec.rb +2 -3
  507. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +4 -4
  508. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +1 -1
  509. data/spec/models/spree/return_authorization_spec.rb +18 -21
  510. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +7 -7
  511. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -1
  512. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -1
  513. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +1 -1
  514. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +1 -1
  515. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +1 -2
  516. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +3 -5
  517. data/spec/models/spree/return_item_spec.rb +29 -31
  518. data/spec/models/spree/returns_calculator_spec.rb +1 -1
  519. data/spec/models/spree/shipment_spec.rb +59 -43
  520. data/spec/models/spree/shipping_calculator_spec.rb +3 -3
  521. data/spec/models/spree/shipping_manifest_spec.rb +8 -7
  522. data/spec/models/spree/shipping_method_spec.rb +149 -24
  523. data/spec/models/spree/shipping_rate_spec.rb +116 -76
  524. data/spec/models/spree/shipping_rate_tax_spec.rb +83 -0
  525. data/spec/models/spree/state_spec.rb +2 -2
  526. data/spec/models/spree/stock/availability_validator_spec.rb +4 -4
  527. data/spec/models/spree/stock/coordinator_spec.rb +33 -49
  528. data/spec/models/spree/stock/differentiator_spec.rb +1 -1
  529. data/spec/models/spree/stock/estimator_spec.rb +83 -54
  530. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +1 -3
  531. data/spec/models/spree/stock/package_spec.rb +27 -10
  532. data/spec/models/spree/stock/packer_spec.rb +4 -4
  533. data/spec/models/spree/stock/prioritizer_spec.rb +1 -1
  534. data/spec/models/spree/stock/quantifier_spec.rb +2 -6
  535. data/spec/models/spree/stock/splitter/backordered_spec.rb +1 -1
  536. data/spec/models/spree/stock/splitter/base_spec.rb +1 -2
  537. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +1 -3
  538. data/spec/models/spree/stock/splitter/weight_spec.rb +3 -3
  539. data/spec/models/spree/stock_item_spec.rb +16 -16
  540. data/spec/models/spree/stock_location_spec.rb +6 -8
  541. data/spec/models/spree/stock_movement_spec.rb +1 -1
  542. data/spec/models/spree/stock_transfer_spec.rb +1 -3
  543. data/spec/models/spree/store_credit_category_spec.rb +1 -1
  544. data/spec/models/spree/store_credit_event_spec.rb +3 -5
  545. data/spec/models/spree/store_credit_spec.rb +24 -23
  546. data/spec/models/spree/store_spec.rb +21 -2
  547. data/spec/models/spree/tax/item_adjuster_spec.rb +74 -0
  548. data/spec/models/spree/tax/order_adjuster_spec.rb +49 -0
  549. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +50 -0
  550. data/spec/models/spree/tax/tax_location_spec.rb +68 -0
  551. data/spec/models/spree/tax/taxation_integration_spec.rb +787 -0
  552. data/spec/models/spree/tax_category_spec.rb +2 -2
  553. data/spec/models/spree/tax_rate_spec.rb +185 -536
  554. data/spec/models/spree/taxon_spec.rb +69 -5
  555. data/spec/models/spree/taxonomy_spec.rb +2 -3
  556. data/spec/models/spree/tracker_spec.rb +1 -1
  557. data/spec/models/spree/transfer_item_spec.rb +1 -1
  558. data/spec/models/spree/unit_cancel_spec.rb +9 -14
  559. data/spec/models/spree/user_spec.rb +19 -24
  560. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +1 -1
  561. data/spec/models/spree/variant/pricer_spec.rb +48 -0
  562. data/spec/models/spree/variant/pricing_options_spec.rb +106 -0
  563. data/spec/models/spree/variant/scopes_spec.rb +31 -8
  564. data/spec/models/spree/variant_property_rule_spec.rb +1 -1
  565. data/spec/models/spree/variant_spec.rb +166 -52
  566. data/spec/models/spree/zone_spec.rb +135 -10
  567. data/spec/support/big_decimal.rb +1 -1
  568. data/spec/support/concerns/working_factories.rb +2 -2
  569. data/spec/support/dummy_ability.rb +0 -1
  570. metadata +55 -44
  571. data/lib/generators/spree/dummy/templates/initializers/devise.rb +0 -3
  572. data/lib/spree/migration_helpers.rb +0 -19
  573. data/vendor/assets/stylesheets/skeleton.css +0 -242
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Spree::Variant, :type => :model do
5
+ describe Spree::Variant, type: :model do
6
6
  let!(:variant) { create(:variant) }
7
7
 
8
8
  it_behaves_like 'default_price'
@@ -57,7 +57,7 @@ describe Spree::Variant, :type => :model do
57
57
  context "product has other variants" do
58
58
  describe "option value accessors" do
59
59
  before {
60
- @multi_variant = FactoryGirl.create :variant, :product => variant.product
60
+ @multi_variant = FactoryGirl.create :variant, product: variant.product
61
61
  variant.product.reload
62
62
  }
63
63
 
@@ -84,37 +84,25 @@ describe Spree::Variant, :type => :model do
84
84
  multi_variant.set_option_value('coolness_type', 'awesome')
85
85
  }.to change(multi_variant.option_values, :count).by(1)
86
86
  end
87
- end
88
-
89
- context "product has other variants" do
90
- describe "option value accessors" do
91
- before {
92
- @multi_variant = create(:variant, :product => variant.product)
93
- variant.product.reload
94
- }
95
-
96
- let(:multi_variant) { @multi_variant }
97
87
 
98
- it "should set option value" do
99
- expect(multi_variant.option_value('media_type')).to be_nil
88
+ context "and a variant is soft-deleted" do
89
+ let!(:old_options_text) { variant.options_text }
100
90
 
101
- multi_variant.set_option_value('media_type', 'DVD')
102
- expect(multi_variant.option_value('media_type')).to eql 'DVD'
91
+ before { variant.destroy }
103
92
 
104
- multi_variant.set_option_value('media_type', 'CD')
105
- expect(multi_variant.option_value('media_type')).to eql 'CD'
93
+ it "still keeps the option values for that variant" do
94
+ expect(variant.reload.options_text).to eq(old_options_text)
106
95
  end
96
+ end
107
97
 
108
- it "should not duplicate associated option values when set multiple times" do
109
- multi_variant.set_option_value('media_type', 'CD')
98
+ context "and a variant is really deleted" do
99
+ let!(:old_option_values_variant_ids) { variant.option_values_variants.pluck(:id) }
110
100
 
111
- expect {
112
- multi_variant.set_option_value('media_type', 'DVD')
113
- }.to_not change(multi_variant.option_values, :count)
101
+ before { variant.really_destroy! }
114
102
 
115
- expect {
116
- multi_variant.set_option_value('coolness_type', 'awesome')
117
- }.to change(multi_variant.option_values, :count).by(1)
103
+ it "leaves no stale records behind" do
104
+ expect(old_option_values_variant_ids).to be_present
105
+ expect(Spree::OptionValuesVariant.where(id: old_option_values_variant_ids)).to be_empty
118
106
  end
119
107
  end
120
108
  end
@@ -143,7 +131,9 @@ describe Spree::Variant, :type => :model do
143
131
 
144
132
  context "#currency" do
145
133
  it "returns the globally configured currency" do
146
- expect(variant.currency).to eql "USD"
134
+ Spree::Deprecation.silence do
135
+ expect(variant.currency).to eql "USD"
136
+ end
147
137
  end
148
138
  end
149
139
 
@@ -167,9 +157,9 @@ describe Spree::Variant, :type => :model do
167
157
  context "#default_price" do
168
158
  context "when multiple prices are present in addition to a default price" do
169
159
  before do
170
- variant.prices << create(:price, :variant => variant, :currency => "USD", :amount => 12.12, :is_default => false)
171
- variant.prices << create(:price, :variant => variant, :currency => "EUR", :amount => 29.99)
172
- variant.prices << create(:price, :variant => variant, :currency => "EUR", :amount => 10.00, :is_default => false)
160
+ variant.prices << create(:price, variant: variant, currency: "USD", amount: 12.12, is_default: false)
161
+ variant.prices << create(:price, variant: variant, currency: "EUR", amount: 29.99)
162
+ variant.prices << create(:price, variant: variant, currency: "EUR", amount: 10.00, is_default: false)
173
163
  variant.reload
174
164
  end
175
165
 
@@ -186,23 +176,135 @@ describe Spree::Variant, :type => :model do
186
176
  context "when adding multiple prices" do
187
177
  it "it can reassign a default price" do
188
178
  expect(variant.default_price.amount).to eq(19.99)
189
- variant.prices << create(:price, :variant => variant, :currency => "USD", :amount => 12.12)
179
+ variant.prices << create(:price, variant: variant, currency: "USD", amount: 12.12)
190
180
  expect(variant.reload.default_price.amount).to eq(12.12)
191
181
  end
192
182
  end
193
183
  end
194
184
 
185
+ context "#pricer" do
186
+ subject { variant.pricer }
187
+
188
+ it "returns an instance of a pricer" do
189
+ expect(variant.pricer).to be_a(Spree::Config.variant_pricer_class)
190
+ end
191
+
192
+ it "is instacached" do
193
+ expect(variant.pricer.object_id).to eq(variant.pricer.object_id)
194
+ end
195
+ end
196
+
197
+ context "#price_for(price_options)" do
198
+ let(:price_options) { Spree::Config.variant_pricer_class.pricing_options_class.new }
199
+
200
+ it "calls the pricer with the given options object" do
201
+ expect(variant.pricer).to receive(:price_for).with(price_options)
202
+ variant.price_for(price_options)
203
+ end
204
+ end
205
+
206
+ context "#price_difference_from_master" do
207
+ let(:pricing_options) { Spree::Config.default_pricing_options }
208
+
209
+ subject { variant.price_difference_from_master(pricing_options) }
210
+
211
+ it "can be called without pricing options" do
212
+ expect(variant.price_difference_from_master).to eq(Spree::Money.new(0))
213
+ end
214
+
215
+ context "for the master variant" do
216
+ let(:variant) { create(:product).master }
217
+
218
+ it { is_expected.to eq(Spree::Money.new(0, currency: Spree::Config.currency)) }
219
+ end
220
+
221
+ context "when both variants have a price" do
222
+ let(:product) { create(:product, price: 25) }
223
+ let(:variant) { create(:variant, product: product, price: 35) }
224
+
225
+ it { is_expected.to eq(Spree::Money.new(10, currency: Spree::Config.currency)) }
226
+ end
227
+
228
+ context "when the master variant does not have a price" do
229
+ let(:product) { create(:product, price: 25) }
230
+ let(:variant) { create(:variant, product: product, price: 35) }
231
+
232
+ before do
233
+ allow(product.master).to receive(:price_for).and_return(nil)
234
+ end
235
+
236
+ it { is_expected.to be_nil }
237
+ end
238
+
239
+ context "when the variant does not have a price" do
240
+ let(:product) { create(:product, price: 25) }
241
+ let(:variant) { create(:variant, product: product, price: 35) }
242
+
243
+ before do
244
+ allow(variant).to receive(:price_for).and_return(nil)
245
+ end
246
+
247
+ it { is_expected.to be_nil }
248
+ end
249
+ end
250
+
251
+ context "#price_same_as_master?" do
252
+ context "when the price is the same as the master price" do
253
+ let(:master) { create(:product, price: 10).master }
254
+ let(:variant) { create(:variant, price: 10, product: master.product) }
255
+
256
+ subject { variant.price_same_as_master? }
257
+
258
+ it { is_expected.to be true }
259
+ end
260
+
261
+ context "when the price is different from the master price" do
262
+ let(:master) { create(:product, price: 11).master }
263
+ let(:variant) { create(:variant, price: 10, product: master.product) }
264
+
265
+ subject { variant.price_same_as_master? }
266
+
267
+ it { is_expected.to be false }
268
+ end
269
+
270
+ context "when the master variant does not have a price" do
271
+ let(:master) { create(:product).master }
272
+ let(:variant) { create(:variant, price: 10, product: master.product) }
273
+
274
+ before do
275
+ allow(master).to receive(:price_for).and_return(nil)
276
+ end
277
+
278
+ subject { variant.price_same_as_master? }
279
+
280
+ it { is_expected.to be_falsey }
281
+ end
282
+
283
+ context "when the variant itself does not have a price" do
284
+ let(:master) { create(:product).master }
285
+ let(:variant) { create(:variant, price: 10, product: master.product) }
286
+
287
+ before do
288
+ allow(variant).to receive(:price_for).and_return(nil)
289
+ end
290
+
291
+ subject { variant.price_same_as_master? }
292
+
293
+ it { is_expected.to be_falsey }
294
+ end
295
+ end
296
+
195
297
  describe '.price_in' do
196
298
  before do
197
- variant.prices << create(:price, :variant => variant, :currency => "EUR", :amount => 33.33)
299
+ variant.prices << create(:price, variant: variant, currency: "EUR", amount: 33.33)
198
300
  end
199
- subject { variant.price_in(currency).display_amount }
301
+ subject { variant.price_in(currency) }
200
302
 
201
303
  context "when currency is not specified" do
202
304
  let(:currency) { nil }
203
305
 
204
- it "returns 0" do
205
- expect(subject.to_s).to eql "$0.00"
306
+ it "returns nil" do
307
+ expect(subject).to be_nil
206
308
  end
207
309
  end
208
310
 
@@ -210,7 +312,7 @@ describe Spree::Variant, :type => :model do
210
312
  let(:currency) { 'EUR' }
211
313
 
212
314
  it "returns the value in the EUR" do
213
- expect(subject.to_s).to eql "€33.33"
315
+ expect(subject.display_price.to_s).to eql "€33.33"
214
316
  end
215
317
  end
216
318
 
@@ -218,14 +320,14 @@ describe Spree::Variant, :type => :model do
218
320
  let(:currency) { 'USD' }
219
321
 
220
322
  it "returns the value in the USD" do
221
- expect(subject.to_s).to eql "$19.99"
323
+ expect(subject.display_price.to_s).to eql "$19.99"
222
324
  end
223
325
  end
224
326
  end
225
327
 
226
328
  describe '.amount_in' do
227
329
  before do
228
- variant.prices << create(:price, :variant => variant, :currency => "EUR", :amount => 33.33)
330
+ variant.prices << create(:price, variant: variant, currency: "EUR", amount: 33.33)
229
331
  end
230
332
 
231
333
  subject { variant.amount_in(currency) }
@@ -233,7 +335,7 @@ describe Spree::Variant, :type => :model do
233
335
  context "when currency is not specified" do
234
336
  let(:currency) { nil }
235
337
 
236
- it "returns nil" do
338
+ it "returns the amount in the default currency" do
237
339
  expect(subject).to be_nil
238
340
  end
239
341
  end
@@ -262,14 +364,13 @@ describe Spree::Variant, :type => :model do
262
364
 
263
365
  before do
264
366
  # Order bar than foo
265
- variant.option_values << create(:option_value, {name: 'Foo', presentation: 'Foo', option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')})
266
- variant.option_values << create(:option_value, {name: 'Bar', presentation: 'Bar', option_type: create(:option_type, position: 1, name: 'Bar Type', presentation: 'Bar Type')})
367
+ variant.option_values << create(:option_value, { name: 'Foo', presentation: 'Foo', option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type') })
368
+ variant.option_values << create(:option_value, { name: 'Bar', presentation: 'Bar', option_type: create(:option_type, position: 1, name: 'Bar Type', presentation: 'Bar Type') })
267
369
  end
268
370
 
269
371
  it 'should order by bar than foo' do
270
372
  expect(variant.options_text).to eql 'Bar Type: Bar, Foo Type: Foo'
271
373
  end
272
-
273
374
  end
274
375
 
275
376
  describe 'exchange_name' do
@@ -295,7 +396,6 @@ describe Spree::Variant, :type => :model do
295
396
  expect(variant.exchange_name).to eql 'Foo Type: Foo'
296
397
  end
297
398
  end
298
-
299
399
  end
300
400
 
301
401
  describe 'exchange_name' do
@@ -321,7 +421,6 @@ describe Spree::Variant, :type => :model do
321
421
  expect(variant.exchange_name).to eql 'Foo Type: Foo'
322
422
  end
323
423
  end
324
-
325
424
  end
326
425
 
327
426
  describe 'descriptive_name' do
@@ -347,7 +446,6 @@ describe Spree::Variant, :type => :model do
347
446
  expect(variant.descriptive_name).to eql variant.name + ' - Foo Type: Foo'
348
447
  end
349
448
  end
350
-
351
449
  end
352
450
 
353
451
  # Regression test for https://github.com/spree/spree/issues/2744
@@ -473,7 +571,6 @@ describe Spree::Variant, :type => :model do
473
571
  end
474
572
 
475
573
  describe "#should_track_inventory?" do
476
-
477
574
  it 'should not track inventory when global setting is off' do
478
575
  Spree::Config[:track_inventory_levels] = false
479
576
 
@@ -494,10 +591,19 @@ describe Spree::Variant, :type => :model do
494
591
  end
495
592
 
496
593
  describe "deleted_at scope" do
497
- before { variant.destroy && variant.reload }
498
- it "should have a price if deleted" do
499
- variant.price = 10
500
- expect(variant.price).to eq(10)
594
+ let!(:previous_variant_price) { variant.display_price }
595
+
596
+ before { variant.destroy }
597
+
598
+ it "should keep its price if deleted" do
599
+ expect(variant.display_price).to eq(previous_variant_price)
600
+ end
601
+
602
+ context 'when loading with pre-fetching of default_price' do
603
+ it 'also keeps the previous price' do
604
+ reloaded_variant = Spree::Variant.with_deleted.includes(:default_price).find_by(id: variant.id)
605
+ expect(reloaded_variant.display_price).to eq(previous_variant_price)
606
+ end
501
607
  end
502
608
  end
503
609
 
@@ -510,6 +616,7 @@ describe Spree::Variant, :type => :model do
510
616
  end
511
617
 
512
618
  describe "in_stock scope" do
619
+ subject { Spree::Variant.in_stock }
513
620
  let!(:in_stock_variant) { create(:variant) }
514
621
  let!(:out_of_stock_variant) { create(:variant) }
515
622
  let!(:stock_location) { create(:stock_location) }
@@ -540,8 +647,6 @@ describe Spree::Variant, :type => :model do
540
647
  end
541
648
 
542
649
  context "a stock location is not provided" do
543
- subject { Spree::Variant.in_stock }
544
-
545
650
  before do
546
651
  in_stock_variant.stock_items.first.update_column(:count_on_hand, 10)
547
652
  end
@@ -550,6 +655,15 @@ describe Spree::Variant, :type => :model do
550
655
  expect(subject).to eq [in_stock_variant]
551
656
  end
552
657
  end
658
+
659
+ context "inventory levels globally not tracked" do
660
+ before { Spree::Config.track_inventory_levels = false }
661
+ after { Spree::Config.track_inventory_levels = true }
662
+
663
+ it 'includes items without inventory' do
664
+ expect( subject ).to include out_of_stock_variant
665
+ end
666
+ end
553
667
  end
554
668
 
555
669
  describe "#display_image" do
@@ -1,12 +1,56 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Spree::Zone, :type => :model do
3
+ describe Spree::Zone, type: :model do
4
+ describe 'for_address' do
5
+ let(:new_york_address) { create(:address, state_code: "NY") }
6
+ let(:alabama_address) { create(:address) }
7
+ let(:canada_address) { create(:address, country_iso_code: "CA") }
8
+
9
+ let!(:new_york_zone) { create(:zone, states: [new_york_address.state]) }
10
+ let!(:alabama_zone) { create(:zone, states: [alabama_address.state]) }
11
+ let!(:united_states_zone) { create(:zone, countries: [new_york_address.country]) }
12
+ let!(:canada_zone) { create(:zone, countries: [canada_address.country]) }
13
+ let!(:north_america_zone) { create(:zone, countries: [canada_address.country, new_york_address.country]) }
14
+ subject { Spree::Zone.for_address(address) }
15
+
16
+ context 'when there is no address' do
17
+ let(:address) { nil }
18
+ it 'returns an empty relation' do
19
+ expect(subject).to eq([])
20
+ end
21
+ end
22
+
23
+ context 'for an address in New York' do
24
+ let(:address) { new_york_address }
25
+
26
+ it 'matches the New York zone' do
27
+ expect(subject).to include(new_york_zone)
28
+ end
29
+
30
+ it 'matches the United States zone' do
31
+ expect(subject).to include(united_states_zone)
32
+ end
33
+
34
+ it 'does not match the Alabama zone' do
35
+ expect(subject).not_to include(alabama_zone)
36
+ end
37
+
38
+ it 'does not match the Canadian zone' do
39
+ expect(subject).not_to include(canada_zone)
40
+ end
41
+
42
+ it 'matches the North America zone' do
43
+ expect(subject).to include(north_america_zone)
44
+ end
45
+ end
46
+ end
47
+
4
48
  context "#match" do
5
49
  let(:country_zone) { create(:zone, name: 'CountryZone') }
6
50
  let(:country) do
7
51
  country = create(:country)
8
52
  # Create at least one state for this country
9
- state = create(:state, country: country)
53
+ create(:state, country: country)
10
54
  country
11
55
  end
12
56
 
@@ -115,7 +159,7 @@ describe Spree::Zone, :type => :model do
115
159
  before { @foo_zone = create(:zone, name: 'whatever', default_tax: true) }
116
160
 
117
161
  it "should be the correct zone" do
118
- foo_zone = create(:zone, name: 'foo')
162
+ create(:zone, name: 'foo')
119
163
  expect(Spree::Zone.default_tax).to eq(@foo_zone)
120
164
  end
121
165
  end
@@ -229,7 +273,6 @@ describe Spree::Zone, :type => :model do
229
273
  before { @source.members.create(zoneable: country1) }
230
274
 
231
275
  context "when all states contained in one of the countries we check against" do
232
-
233
276
  before do
234
277
  state1 = create(:state, country: country1)
235
278
  @target.members.create(zoneable: state1)
@@ -241,7 +284,6 @@ describe Spree::Zone, :type => :model do
241
284
  end
242
285
 
243
286
  context "when some states contained in one of the countries we check against" do
244
-
245
287
  before do
246
288
  state1 = create(:state, country: country1)
247
289
  @target.members.create(zoneable: state1)
@@ -254,7 +296,6 @@ describe Spree::Zone, :type => :model do
254
296
  end
255
297
 
256
298
  context "when none of the states contained in any of the countries we check against" do
257
-
258
299
  before do
259
300
  @target.members.create(zoneable: create(:state, country: country2))
260
301
  @target.members.create(zoneable: create(:state, country: country2))
@@ -265,14 +306,13 @@ describe Spree::Zone, :type => :model do
265
306
  end
266
307
  end
267
308
  end
268
-
269
309
  end
270
310
 
271
311
  context "#save" do
272
312
  context "when default_tax is true" do
273
313
  it "should clear previous default tax zone" do
274
314
  zone1 = create(:zone, name: 'foo', default_tax: true)
275
- zone = create(:zone, name: 'bar', default_tax: true)
315
+ create(:zone, name: 'bar', default_tax: true)
276
316
  expect(zone1.reload.default_tax).to be false
277
317
  end
278
318
  end
@@ -313,7 +353,7 @@ describe Spree::Zone, :type => :model do
313
353
  end
314
354
 
315
355
  context "state and country associations" do
316
- let!(:country) { create(:country) }
356
+ let!(:country) { create(:country) }
317
357
 
318
358
  context "has countries associated" do
319
359
  let!(:zone) do
@@ -326,7 +366,7 @@ describe Spree::Zone, :type => :model do
326
366
  end
327
367
 
328
368
  context "has states associated" do
329
- let!(:state) { create(:state, country: country) }
369
+ let!(:state) { create(:state, country: country) }
330
370
  let!(:zone) do
331
371
  create(:zone, states: [state])
332
372
  end
@@ -336,4 +376,89 @@ describe Spree::Zone, :type => :model do
336
376
  end
337
377
  end
338
378
  end
379
+
380
+ context ".with_shared_members" do
381
+ let!(:country) { create(:country) }
382
+ let!(:country2) { create(:country, name: 'OtherCountry') }
383
+ let!(:country3) { create(:country, name: 'TaxCountry') }
384
+
385
+ subject(:zones_with_shared_members) { Spree::Zone.with_shared_members(zone) }
386
+
387
+ context 'when passing a zone with no members' do
388
+ let!(:zone) { create :zone }
389
+
390
+ it 'will return an empty set' do
391
+ expect(subject).to eq([])
392
+ end
393
+ end
394
+
395
+ context 'when passing nil' do
396
+ let!(:zone) { nil }
397
+
398
+ it 'will return an empty set' do
399
+ expect(subject).to eq([])
400
+ end
401
+ end
402
+
403
+ context "finding potential matches for a country zone" do
404
+ let!(:zone) do
405
+ create(:zone).tap do |z|
406
+ z.members.create(zoneable: country)
407
+ z.members.create(zoneable: country2)
408
+ z.save!
409
+ end
410
+ end
411
+
412
+ let!(:zone2) do
413
+ create(:zone).tap { |z| z.members.create(zoneable: country) && z.save! }
414
+ end
415
+
416
+ let!(:zone3) do
417
+ create(:zone).tap { |z| z.members.create(zoneable: country3) && z.save! }
418
+ end
419
+
420
+ it "will find all zones with countries covered by the passed in zone" do
421
+ expect(zones_with_shared_members).to include(zone, zone2)
422
+ end
423
+
424
+ it "will not return zones with countries not covered in the passed in zone" do
425
+ expect(zones_with_shared_members).not_to include(zone3)
426
+ end
427
+
428
+ it "only returns each zone once" do
429
+ expect(zones_with_shared_members.select { |z| z == zone }.size).to be 1
430
+ end
431
+ end
432
+
433
+ context "finding potential matches for a state zone" do
434
+ let!(:state) { create(:state, country: country) }
435
+ let!(:state2) { create(:state, country: country2, name: 'OtherState') }
436
+ let!(:state3) { create(:state, country: country2, name: 'State') }
437
+ let!(:zone) do
438
+ create(:zone).tap do |z|
439
+ z.members.create(zoneable: state)
440
+ z.members.create(zoneable: state2)
441
+ z.save!
442
+ end
443
+ end
444
+ let!(:zone2) do
445
+ create(:zone).tap { |z| z.members.create(zoneable: state) && z.save! }
446
+ end
447
+ let!(:zone3) do
448
+ create(:zone).tap { |z| z.members.create(zoneable: state2) && z.save! }
449
+ end
450
+
451
+ it "will find all zones which share states covered by passed in zone" do
452
+ expect(zones_with_shared_members).to include(zone, zone2)
453
+ end
454
+
455
+ it "will find zones that share countries with any states of the passed in zone" do
456
+ expect(zones_with_shared_members).to include(zone3)
457
+ end
458
+
459
+ it "only returns each zone once" do
460
+ expect(zones_with_shared_members.select { |z| z == zone }.size).to be 1
461
+ end
462
+ end
463
+ end
339
464
  end
@@ -1,5 +1,5 @@
1
1
  class BigDecimal
2
2
  def inspect
3
- "#<BigDecimal: #{to_s}>"
3
+ "#<BigDecimal: #{self}>"
4
4
  end
5
5
  end
@@ -1,9 +1,9 @@
1
1
  RSpec.shared_examples_for 'a working factory' do
2
2
  it "builds successfully" do
3
- expect(build factory).to be_a(factory_class)
3
+ expect(build(factory)).to be_a(factory_class)
4
4
  end
5
5
 
6
6
  it "creates successfully" do
7
- expect(create factory).to be_a(factory_class)
7
+ expect(create(factory)).to be_a(factory_class)
8
8
  end
9
9
  end
@@ -1,4 +1,3 @@
1
1
  class DummyAbility
2
2
  include CanCan::Ability
3
3
  end
4
-