spree_core 3.1.14 → 3.2.0.rc1

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 (529) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/{spree.js.coffee.erb → spree.js.coffee} +2 -2
  3. data/app/helpers/spree/base_helper.rb +1 -1
  4. data/app/helpers/spree/products_helper.rb +0 -6
  5. data/app/mailers/spree/reimbursement_mailer.rb +6 -6
  6. data/app/models/concerns/spree/acts_as_taggable.rb +11 -0
  7. data/app/models/concerns/spree/adjustment_source.rb +1 -1
  8. data/app/models/concerns/spree/ransackable_attributes.rb +0 -5
  9. data/app/models/spree/address.rb +67 -38
  10. data/app/models/spree/app_configuration.rb +9 -6
  11. data/app/models/spree/base.rb +1 -1
  12. data/app/models/spree/calculator.rb +1 -1
  13. data/app/models/spree/country.rb +5 -4
  14. data/app/models/spree/credit_card.rb +3 -3
  15. data/app/models/spree/gateway/bogus.rb +11 -11
  16. data/app/models/spree/gateway/bogus_simple.rb +4 -4
  17. data/app/models/spree/gateway.rb +1 -1
  18. data/app/models/spree/image.rb +2 -2
  19. data/app/models/spree/inventory_unit.rb +6 -10
  20. data/app/models/spree/line_item.rb +17 -6
  21. data/app/models/spree/order/checkout.rb +2 -2
  22. data/app/models/spree/order.rb +12 -25
  23. data/app/models/spree/order_contents.rb +7 -6
  24. data/app/models/spree/order_inventory.rb +12 -1
  25. data/app/models/spree/order_updater.rb +1 -2
  26. data/app/models/spree/payment/processing.rb +3 -3
  27. data/app/models/spree/payment_method.rb +7 -1
  28. data/app/models/spree/preferences/store.rb +3 -3
  29. data/app/models/spree/product/scopes.rb +16 -20
  30. data/app/models/spree/product.rb +11 -3
  31. data/app/models/spree/promotion/actions/create_line_items.rb +21 -3
  32. data/app/models/spree/promotion/rules/country.rb +23 -0
  33. data/app/models/spree/promotion/rules/option_value.rb +13 -10
  34. data/app/models/spree/promotion/rules/taxon.rb +1 -1
  35. data/app/models/spree/promotion.rb +35 -1
  36. data/app/models/spree/promotion_handler/cart.rb +3 -17
  37. data/app/models/spree/promotion_handler/coupon.rb +22 -22
  38. data/app/models/spree/promotion_handler/page.rb +2 -2
  39. data/app/models/spree/refund.rb +1 -1
  40. data/app/models/spree/refund_reason.rb +1 -1
  41. data/app/models/spree/reimbursement_type.rb +5 -1
  42. data/app/models/spree/return_item.rb +1 -1
  43. data/app/models/spree/shipment.rb +4 -6
  44. data/app/models/spree/shipment_handler.rb +1 -1
  45. data/app/models/spree/stock/adjuster.rb +9 -2
  46. data/app/models/spree/stock/coordinator.rb +11 -4
  47. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  48. data/app/models/spree/stock/package.rb +11 -3
  49. data/app/models/spree/stock/packer.rb +15 -5
  50. data/app/models/spree/stock/prioritizer.rb +25 -15
  51. data/app/models/spree/stock/splitter/shipping_category.rb +6 -1
  52. data/app/models/spree/stock_item.rb +2 -1
  53. data/app/models/spree/stock_movement.rb +11 -6
  54. data/app/models/spree/store.rb +1 -0
  55. data/app/models/spree/store_credit.rb +1 -1
  56. data/app/models/spree/tag.rb +4 -0
  57. data/app/models/spree/tax_rate.rb +6 -0
  58. data/app/models/spree/taxon.rb +3 -3
  59. data/app/models/spree/variant.rb +6 -3
  60. data/app/models/spree/zone.rb +2 -2
  61. data/app/views/spree/shared/_paths.html.erb +8 -0
  62. data/config/initializers/acts_as_taggable_on.rb +9 -0
  63. data/config/initializers/friendly_id.rb +0 -81
  64. data/config/locales/en.yml +11 -0
  65. data/db/default/spree/countries.rb +5 -1
  66. data/db/default/spree/roles.rb +2 -2
  67. data/db/default/spree/states.rb +1 -1
  68. data/db/migrate/20120831092320_spree_one_two.rb +101 -101
  69. data/db/migrate/20120831092359_spree_promo_one_two.rb +14 -14
  70. data/db/migrate/20120905145253_add_tax_rate_label.rb +1 -1
  71. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +2 -2
  72. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +4 -4
  73. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +2 -2
  74. data/db/migrate/20121010142909_add_states_required_to_countries.rb +2 -2
  75. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +3 -3
  76. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +5 -5
  77. data/db/migrate/20121031162139_split_prices_from_variants.rb +10 -10
  78. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +3 -3
  79. data/db/migrate/20121107184631_add_currency_to_line_items.rb +1 -1
  80. data/db/migrate/20121107194006_add_currency_to_orders.rb +1 -1
  81. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +2 -2
  82. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +1 -1
  83. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +2 -2
  84. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +1 -1
  85. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +1 -1
  86. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +1 -1
  87. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +2 -2
  88. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +1 -1
  89. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +1 -1
  90. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +1 -1
  91. data/db/migrate/20130211190146_create_spree_stock_items.rb +2 -2
  92. data/db/migrate/20130211191120_create_spree_stock_locations.rb +1 -1
  93. data/db/migrate/20130213191427_create_default_stock.rb +1 -2
  94. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +1 -1
  95. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +2 -2
  96. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +1 -1
  97. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +3 -3
  98. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +1 -1
  99. data/db/migrate/20130228210442_create_shipping_method_zone.rb +3 -3
  100. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +1 -1
  101. data/db/migrate/20130301162924_create_shipping_method_categories.rb +3 -3
  102. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +1 -1
  103. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +5 -5
  104. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +1 -1
  105. data/db/migrate/20130305143310_create_stock_movements.rb +1 -1
  106. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +3 -3
  107. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +2 -2
  108. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +2 -2
  109. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +2 -2
  110. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +1 -1
  111. data/db/migrate/20130319062004_change_orders_total_precision.rb +5 -5
  112. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +2 -2
  113. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -2
  114. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +2 -2
  115. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +1 -1
  116. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +3 -3
  117. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +3 -3
  118. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  119. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +1 -1
  120. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +1 -1
  121. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +1 -1
  122. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +1 -1
  123. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +2 -2
  124. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +1 -1
  125. data/db/migrate/20130417120035_update_adjustment_states.rb +3 -3
  126. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +4 -4
  127. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +1 -1
  128. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +1 -1
  129. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +1 -1
  130. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
  131. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +1 -1
  132. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +1 -1
  133. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +1 -1
  134. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +1 -1
  135. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +1 -1
  136. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +1 -1
  137. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +1 -1
  138. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +1 -1
  139. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +2 -2
  140. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +4 -4
  141. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +1 -1
  142. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +1 -1
  143. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +2 -2
  144. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +3 -3
  145. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +1 -1
  146. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +1 -1
  147. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +1 -1
  148. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +1 -1
  149. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +1 -1
  150. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +1 -1
  151. data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -4
  152. data/db/migrate/20130807024302_rename_adjustment_fields.rb +1 -1
  153. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +1 -1
  154. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +1 -1
  155. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +2 -2
  156. data/db/migrate/20130813140619_expand_order_number_size.rb +3 -3
  157. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +1 -1
  158. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +2 -2
  159. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +2 -2
  160. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
  161. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +2 -2
  162. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +2 -2
  163. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
  164. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +1 -1
  165. data/db/migrate/20130909115621_change_states_required_for_countries.rb +1 -1
  166. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +1 -1
  167. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +1 -1
  168. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +1 -1
  169. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +2 -2
  170. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +2 -2
  171. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +1 -1
  172. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +1 -1
  173. data/db/migrate/20131118043959_add_included_to_adjustments.rb +2 -2
  174. data/db/migrate/20131118050234_rename_tax_total_fields.rb +1 -1
  175. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +1 -1
  176. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +1 -1
  177. data/db/migrate/20131127001002_add_position_to_classifications.rb +1 -1
  178. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +2 -2
  179. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +1 -1
  180. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +2 -2
  181. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -1
  182. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +1 -1
  183. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +1 -1
  184. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +1 -1
  185. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +1 -1
  186. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +1 -1
  187. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +1 -1
  188. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +1 -1
  189. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +1 -1
  190. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +1 -1
  191. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +1 -1
  192. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +1 -1
  193. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +1 -1
  194. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +1 -1
  195. data/db/migrate/20140213184916_add_more_indexes.rb +1 -1
  196. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +2 -2
  197. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +1 -1
  198. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +1 -1
  199. data/db/migrate/20140309023735_migrate_old_preferences.rb +1 -1
  200. data/db/migrate/20140309024355_create_spree_stores.rb +2 -2
  201. data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
  202. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +1 -1
  203. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +1 -1
  204. data/db/migrate/20140331100557_add_additional_store_fields.rb +1 -1
  205. data/db/migrate/20140410141842_add_many_missing_indexes.rb +1 -1
  206. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +1 -1
  207. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +1 -1
  208. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +5 -5
  209. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +1 -1
  210. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +2 -2
  211. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +1 -1
  212. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +1 -1
  213. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +1 -1
  214. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +1 -1
  215. data/db/migrate/20140625214618_create_spree_refunds.rb +1 -1
  216. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +1 -1
  217. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +1 -1
  218. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +1 -1
  219. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +2 -2
  220. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +1 -1
  221. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +1 -1
  222. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +1 -1
  223. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +1 -1
  224. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +1 -1
  225. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +1 -1
  226. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +1 -1
  227. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +1 -1
  228. data/db/migrate/20140717155155_create_default_refund_reason.rb +1 -1
  229. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +1 -1
  230. data/db/migrate/20140718133010_create_spree_customer_returns.rb +1 -1
  231. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +1 -1
  232. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +5 -5
  233. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +1 -1
  234. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +1 -1
  235. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +2 -2
  236. data/db/migrate/20140725131539_create_spree_reimbursements.rb +1 -1
  237. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +1 -1
  238. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +1 -1
  239. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +1 -1
  240. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +1 -1
  241. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +1 -1
  242. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +1 -1
  243. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -1
  244. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +1 -1
  245. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +1 -1
  246. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +1 -1
  247. data/db/migrate/20140911173301_add_kind_to_zone.rb +1 -1
  248. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +1 -1
  249. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +1 -1
  250. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +1 -1
  251. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +1 -1
  252. data/db/migrate/20141009204607_add_store_id_to_orders.rb +1 -1
  253. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +1 -1
  254. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +1 -1
  255. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +2 -7
  256. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +1 -1
  257. data/db/migrate/20141105213646_update_classifications_positions.rb +1 -1
  258. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +1 -1
  259. data/db/migrate/20141215232040_remove_token_permissions_table.rb +1 -1
  260. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +1 -1
  261. data/db/migrate/20141217215630_update_product_slug_index.rb +1 -1
  262. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +1 -1
  263. data/db/migrate/20150118210639_create_spree_store_credits.rb +1 -1
  264. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +1 -1
  265. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +1 -1
  266. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +1 -1
  267. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +1 -1
  268. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +1 -1
  269. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +1 -1
  270. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +1 -1
  271. data/db/migrate/20150128060325_remove_spree_configurations.rb +1 -1
  272. data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +1 -1
  273. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +1 -1
  274. data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +1 -1
  275. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +1 -1
  276. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +1 -1
  277. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +1 -1
  278. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +1 -1
  279. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +1 -1
  280. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +1 -1
  281. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +1 -1
  282. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +1 -1
  283. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +1 -1
  284. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +1 -1
  285. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +1 -1
  286. data/db/migrate/20150727191614_spree_store_credit_types.rb +1 -1
  287. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +1 -1
  288. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +1 -1
  289. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +1 -1
  290. data/db/migrate/20160219165458_add_indexes.rb +1 -1
  291. data/db/migrate/20160509064646_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +10 -0
  292. data/db/migrate/20160511071954_acts_as_taggable_on_spree_migration.rb +40 -0
  293. data/db/migrate/20160511072249_change_collation_for_spree_tag_names.rb +9 -0
  294. data/db/migrate/20160511072335_add_missing_indexes_to_spree_taggings.rb +14 -0
  295. data/db/migrate/20160608090604_add_zipcode_required_to_spree_countries.rb +7 -0
  296. data/db/migrate/20161014145148_add_created_at_to_variant.rb +8 -0
  297. data/db/migrate/20161014152814_add_null_false_to_spree_variants_timestamps.rb +6 -0
  298. data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
  299. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +3 -3
  300. data/lib/generators/spree/custom_user/templates/migration.rb.tt +2 -2
  301. data/lib/generators/spree/dummy/dummy_generator.rb +11 -11
  302. data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
  303. data/lib/generators/spree/dummy/templates/rails/database.yml +9 -6
  304. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -2
  305. data/lib/generators/spree/install/install_generator.rb +37 -13
  306. data/lib/spree/core/controller_helpers/common.rb +3 -3
  307. data/lib/spree/core/controller_helpers/order.rb +2 -5
  308. data/lib/spree/core/controller_helpers/respond_with.rb +1 -1
  309. data/lib/spree/core/delegate_belongs_to.rb +2 -2
  310. data/lib/spree/core/engine.rb +5 -4
  311. data/lib/spree/core/importer/product.rb +2 -2
  312. data/lib/spree/core/product_duplicator.rb +1 -1
  313. data/lib/spree/core/product_filters.rb +1 -1
  314. data/lib/spree/core/search/base.rb +1 -1
  315. data/lib/spree/core/version.rb +1 -1
  316. data/lib/spree/i18n/initializer.rb +1 -1
  317. data/lib/spree/money.rb +1 -15
  318. data/lib/spree/permitted_attributes.rb +1 -1
  319. data/lib/spree/testing_support/caching.rb +3 -3
  320. data/lib/spree/testing_support/common_rake.rb +0 -2
  321. data/lib/spree/testing_support/controller_requests.rb +4 -4
  322. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
  323. data/lib/spree/testing_support/factories/order_factory.rb +1 -0
  324. data/lib/spree/testing_support/factories/tag_factory.rb +5 -0
  325. data/lib/spree/testing_support/kernel.rb +18 -0
  326. data/lib/spree/testing_support/order_walkthrough.rb +4 -4
  327. data/lib/tasks/core.rake +2 -2
  328. data/spec/helpers/base_helper_spec.rb +200 -0
  329. data/spec/helpers/products_helper_spec.rb +289 -0
  330. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  331. data/spec/lib/i18n_spec.rb +123 -0
  332. data/spec/lib/search/base_spec.rb +86 -0
  333. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +103 -0
  334. data/spec/lib/spree/core/controller_helpers/order_spec.rb +110 -0
  335. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  336. data/spec/lib/spree/core/controller_helpers/store_spec.rb +72 -0
  337. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  338. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  339. data/spec/lib/spree/core/importer/order_spec.rb +605 -0
  340. data/spec/lib/spree/core/number_generator_spec.rb +175 -0
  341. data/spec/lib/spree/core/token_generator_spec.rb +24 -0
  342. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  343. data/spec/lib/spree/core_spec.rb +23 -0
  344. data/spec/lib/spree/localized_number_spec.rb +48 -0
  345. data/spec/lib/spree/migrations_spec.rb +36 -0
  346. data/spec/lib/spree/money_spec.rb +122 -0
  347. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  348. data/spec/mailers/order_mailer_spec.rb +122 -0
  349. data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
  350. data/spec/mailers/shipment_mailer_spec.rb +81 -0
  351. data/spec/mailers/test_mailer_spec.rb +38 -0
  352. data/spec/models/option_type_prototype_spec.rb +9 -0
  353. data/spec/models/spree/ability_spec.rb +251 -0
  354. data/spec/models/spree/address_spec.rb +402 -0
  355. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  356. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  357. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  358. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +26 -0
  359. data/spec/models/spree/adjustment_spec.rb +189 -0
  360. data/spec/models/spree/app_configuration_spec.rb +26 -0
  361. data/spec/models/spree/asset_spec.rb +28 -0
  362. data/spec/models/spree/calculator/default_tax_spec.rb +152 -0
  363. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  364. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  365. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  366. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  367. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  368. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +47 -0
  369. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  370. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  371. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  372. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  373. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  374. data/spec/models/spree/calculator/shipping.rb +8 -0
  375. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  376. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  377. data/spec/models/spree/calculator_spec.rb +69 -0
  378. data/spec/models/spree/classification_spec.rb +93 -0
  379. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  380. data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
  381. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  382. data/spec/models/spree/country_spec.rb +55 -0
  383. data/spec/models/spree/credit_card_spec.rb +328 -0
  384. data/spec/models/spree/customer_return_spec.rb +240 -0
  385. data/spec/models/spree/exchange_spec.rb +75 -0
  386. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  387. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  388. data/spec/models/spree/gateway_spec.rb +61 -0
  389. data/spec/models/spree/image_spec.rb +8 -0
  390. data/spec/models/spree/inventory_unit_spec.rb +256 -0
  391. data/spec/models/spree/line_item_spec.rb +346 -0
  392. data/spec/models/spree/option_type_spec.rb +14 -0
  393. data/spec/models/spree/option_value_spec.rb +18 -0
  394. data/spec/models/spree/order/address_spec.rb +50 -0
  395. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  396. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  397. data/spec/models/spree/order/checkout_spec.rb +770 -0
  398. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  399. data/spec/models/spree/order/finalizing_spec.rb +114 -0
  400. data/spec/models/spree/order/helpers_spec.rb +5 -0
  401. data/spec/models/spree/order/payment_spec.rb +214 -0
  402. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  403. data/spec/models/spree/order/shipments_spec.rb +43 -0
  404. data/spec/models/spree/order/state_machine_spec.rb +212 -0
  405. data/spec/models/spree/order/store_credit_spec.rb +426 -0
  406. data/spec/models/spree/order/tax_spec.rb +84 -0
  407. data/spec/models/spree/order/totals_spec.rb +24 -0
  408. data/spec/models/spree/order/updating_spec.rb +18 -0
  409. data/spec/models/spree/order/validations_spec.rb +15 -0
  410. data/spec/models/spree/order_contents_spec.rb +297 -0
  411. data/spec/models/spree/order_inventory_spec.rb +239 -0
  412. data/spec/models/spree/order_merger_spec.rb +135 -0
  413. data/spec/models/spree/order_spec.rb +1046 -0
  414. data/spec/models/spree/order_updater_spec.rb +294 -0
  415. data/spec/models/spree/payment/gateway_options_spec.rb +127 -0
  416. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  417. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  418. data/spec/models/spree/payment_method_spec.rb +103 -0
  419. data/spec/models/spree/payment_spec.rb +919 -0
  420. data/spec/models/spree/preference_spec.rb +80 -0
  421. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  422. data/spec/models/spree/preferences/preferable_spec.rb +344 -0
  423. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  424. data/spec/models/spree/preferences/store_spec.rb +46 -0
  425. data/spec/models/spree/price_spec.rb +128 -0
  426. data/spec/models/spree/product/scopes_spec.rb +183 -0
  427. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  428. data/spec/models/spree/product_filter_spec.rb +26 -0
  429. data/spec/models/spree/product_option_type_spec.rb +9 -0
  430. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  431. data/spec/models/spree/product_property_spec.rb +22 -0
  432. data/spec/models/spree/product_spec.rb +619 -0
  433. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
  434. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  435. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  436. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  437. data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
  438. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  439. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  440. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  441. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  442. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  443. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  444. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  445. data/spec/models/spree/promotion/rules/user_spec.rb +45 -0
  446. data/spec/models/spree/promotion_action_spec.rb +10 -0
  447. data/spec/models/spree/promotion_category_spec.rb +17 -0
  448. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  449. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  450. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  451. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  452. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  453. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  454. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  455. data/spec/models/spree/promotion_spec.rb +679 -0
  456. data/spec/models/spree/property_prototype_spec.rb +9 -0
  457. data/spec/models/spree/property_spec.rb +5 -0
  458. data/spec/models/spree/prototype_spec.rb +5 -0
  459. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  460. data/spec/models/spree/refund_reason_spec.rb +20 -0
  461. data/spec/models/spree/refund_spec.rb +195 -0
  462. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  463. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  464. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  465. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  466. data/spec/models/spree/reimbursement_spec.rb +188 -0
  467. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +63 -0
  468. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  469. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  470. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  471. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  472. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  473. data/spec/models/spree/return_authorization_spec.rb +230 -0
  474. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  475. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  476. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  477. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  478. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  479. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  480. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  481. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  482. data/spec/models/spree/return_item_spec.rb +731 -0
  483. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  484. data/spec/models/spree/role_spec.rb +7 -0
  485. data/spec/models/spree/shipment_spec.rb +742 -0
  486. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  487. data/spec/models/spree/shipping_category_spec.rb +19 -0
  488. data/spec/models/spree/shipping_method_spec.rb +95 -0
  489. data/spec/models/spree/shipping_rate_spec.rb +140 -0
  490. data/spec/models/spree/state_spec.rb +29 -0
  491. data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
  492. data/spec/models/spree/stock/content_item_spec.rb +31 -0
  493. data/spec/models/spree/stock/coordinator_spec.rb +61 -0
  494. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  495. data/spec/models/spree/stock/estimator_spec.rb +202 -0
  496. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  497. data/spec/models/spree/stock/package_spec.rb +182 -0
  498. data/spec/models/spree/stock/packer_spec.rb +70 -0
  499. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  500. data/spec/models/spree/stock/quantifier_spec.rb +126 -0
  501. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  502. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  503. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  504. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  505. data/spec/models/spree/stock_item_spec.rb +432 -0
  506. data/spec/models/spree/stock_location_spec.rb +243 -0
  507. data/spec/models/spree/stock_movement_spec.rb +120 -0
  508. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  509. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  510. data/spec/models/spree/store_credit_spec.rb +786 -0
  511. data/spec/models/spree/store_spec.rb +78 -0
  512. data/spec/models/spree/tax_category_spec.rb +32 -0
  513. data/spec/models/spree/tax_rate_spec.rb +561 -0
  514. data/spec/models/spree/taxon_spec.rb +85 -0
  515. data/spec/models/spree/taxonomy_spec.rb +18 -0
  516. data/spec/models/spree/tracker_spec.rb +21 -0
  517. data/spec/models/spree/user_spec.rb +203 -0
  518. data/spec/models/spree/variant_spec.rb +809 -0
  519. data/spec/models/spree/zone_member_spec.rb +38 -0
  520. data/spec/models/spree/zone_spec.rb +472 -0
  521. data/spec/spec_helper.rb +79 -0
  522. data/spec/support/big_decimal.rb +5 -0
  523. data/spec/support/concerns/adjustment_source.rb +23 -0
  524. data/spec/support/concerns/default_price.rb +37 -0
  525. data/spec/support/rake.rb +13 -0
  526. data/spec/support/test_gateway.rb +2 -0
  527. data/spree_core.gemspec +12 -12
  528. metadata +249 -43
  529. data/config/initializers/premailer_rails.rb +0 -3
@@ -0,0 +1,809 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Spree::Variant, type: :model do
6
+ let!(:variant) { create(:variant) }
7
+ let(:master_variant) { create(:master_variant) }
8
+
9
+ it_behaves_like 'default_price'
10
+
11
+ describe 'validations' do
12
+ it { expect(master_variant).to_not validate_presence_of(:option_values) }
13
+ it { expect(variant).to validate_presence_of(:option_values) }
14
+ end
15
+
16
+ context 'sorting' do
17
+ it 'responds to set_list_position' do
18
+ expect(variant.respond_to?(:set_list_position)).to eq(true)
19
+ end
20
+ end
21
+
22
+ context "validations" do
23
+ it "should validate price is greater than 0" do
24
+ variant.price = -1
25
+ expect(variant).to be_invalid
26
+ end
27
+
28
+ it "should validate price is 0" do
29
+ variant.price = 0
30
+ expect(variant).to be_valid
31
+ end
32
+ end
33
+
34
+ context "after create" do
35
+ let!(:product) { create(:product) }
36
+
37
+ it "propagate to stock items" do
38
+ expect_any_instance_of(Spree::StockLocation).to receive(:propagate_variant)
39
+ create(:variant, product: product)
40
+ end
41
+
42
+ context "stock location has disable propagate all variants" do
43
+ before { Spree::StockLocation.update_all propagate_all_variants: false }
44
+
45
+ it "propagate to stock items" do
46
+ expect_any_instance_of(Spree::StockLocation).not_to receive(:propagate_variant)
47
+ product.variants.create(name: "Foobar")
48
+ end
49
+ end
50
+
51
+ describe 'mark_master_out_of_stock' do
52
+ before do
53
+ product.master.stock_items.first.set_count_on_hand(5)
54
+ end
55
+ context 'when product is created without variants but with stock' do
56
+ it { expect(product.master).to be_in_stock }
57
+ end
58
+
59
+ context 'when a variant is created' do
60
+ let!(:new_variant) { create(:variant, product: product) }
61
+
62
+ it { expect(product.master).to_not be_in_stock }
63
+ end
64
+ end
65
+ end
66
+
67
+ describe 'scope' do
68
+ describe '.not_discontinued' do
69
+ context 'when discontinued' do
70
+ let!(:discontinued_variant) { create(:variant, discontinue_on: Time.current - 1.day) }
71
+
72
+ it { expect(Spree::Variant.not_discontinued).not_to include(discontinued_variant) }
73
+ end
74
+
75
+ context 'when not discontinued' do
76
+ let!(:variant_2) { create(:variant, discontinue_on: Time.current + 1.day) }
77
+
78
+ it { expect(Spree::Variant.not_discontinued).to include(variant_2) }
79
+ end
80
+
81
+ context 'when discontinue_on not present' do
82
+ let!(:variant_2) { create(:variant, discontinue_on: nil) }
83
+
84
+ it { expect(Spree::Variant.not_discontinued).to include(variant_2) }
85
+ end
86
+ end
87
+
88
+ describe '.not_deleted' do
89
+ context 'when deleted' do
90
+ let!(:deleted_variant) { create(:variant, deleted_at: Time.current) }
91
+
92
+ it { expect(Spree::Variant.not_deleted).not_to include(deleted_variant) }
93
+ end
94
+
95
+ context 'when not deleted' do
96
+ let!(:variant_2) { create(:variant, deleted_at: nil) }
97
+
98
+ it { expect(Spree::Variant.not_deleted).to include(variant_2) }
99
+ end
100
+ end
101
+
102
+ describe '.for_currency_and_available_price_amount' do
103
+ let(:currency) { 'EUR' }
104
+
105
+ context 'when price with currency present' do
106
+ context 'when price has amount' do
107
+ let!(:price_1) { create(:price, currency: currency, variant: variant, amount: 10) }
108
+
109
+ it { expect(Spree::Variant.for_currency_and_available_price_amount(currency)).to include(variant) }
110
+ end
111
+
112
+ context 'when price do not have amount' do
113
+ let!(:price_1) { create(:price, currency: currency, variant: variant, amount: nil) }
114
+
115
+ it { expect(Spree::Variant.for_currency_and_available_price_amount(currency)).not_to include(variant) }
116
+ end
117
+ end
118
+
119
+ context 'when price with currency not present' do
120
+ let!(:unavailable_currency) { 'INR' }
121
+ context 'when price has amount' do
122
+ let!(:price_1) { create(:price, currency: unavailable_currency, variant: variant, amount: 10) }
123
+
124
+ it { expect(Spree::Variant.for_currency_and_available_price_amount(currency)).not_to include(variant) }
125
+ end
126
+
127
+ context 'when price do not have amount' do
128
+ let!(:price_1) { create(:price, currency: unavailable_currency, variant: variant, amount: nil) }
129
+
130
+ it { expect(Spree::Variant.for_currency_and_available_price_amount(currency)).not_to include(variant) }
131
+ end
132
+ end
133
+
134
+ context 'when multiple prices for same currency present' do
135
+ let!(:price_1) { create(:price, currency: currency, variant: variant) }
136
+ let!(:price_2) { create(:price, currency: currency, variant: variant) }
137
+
138
+ it 'should not duplicate variant' do
139
+ expect(Spree::Variant.for_currency_and_available_price_amount(currency)).to eq([variant])
140
+ end
141
+ end
142
+ end
143
+
144
+ describe '.active' do
145
+ let!(:variants) { [variant] }
146
+ let!(:currency) { 'EUR' }
147
+
148
+ before(:each) do
149
+ allow(Spree::Variant).to receive(:not_discontinued).and_return(variants)
150
+ allow(variants).to receive(:not_deleted).and_return(variants)
151
+ allow(variants).to receive(:for_currency_and_available_price_amount).with(currency).and_return(variants)
152
+ end
153
+
154
+ it 'should find not_discontinued variants' do
155
+ expect(Spree::Variant).to receive(:not_discontinued).and_return(variants)
156
+ Spree::Variant.active(currency)
157
+ end
158
+
159
+ it 'should find not_deleted variants' do
160
+ expect(variants).to receive(:not_deleted).and_return(variants)
161
+ Spree::Variant.active(currency)
162
+ end
163
+
164
+ it 'should find variants for_currency_and_available_price_amount' do
165
+ expect(variants).to receive(:for_currency_and_available_price_amount).with(currency).and_return(variants)
166
+ Spree::Variant.active(currency)
167
+ end
168
+
169
+ it { expect(Spree::Variant.active(currency)).to eq(variants) }
170
+ end
171
+ end
172
+
173
+ context "product has other variants" do
174
+ describe "option value accessors" do
175
+ before {
176
+ @multi_variant = FactoryGirl.create :variant, product: variant.product
177
+ variant.product.reload
178
+ }
179
+
180
+ let(:multi_variant) { @multi_variant }
181
+
182
+ it "should set option value" do
183
+ expect(multi_variant.option_value('media_type')).to be_nil
184
+
185
+ multi_variant.set_option_value('media_type', 'DVD')
186
+ expect(multi_variant.option_value('media_type')).to eql 'DVD'
187
+
188
+ multi_variant.set_option_value('media_type', 'CD')
189
+ expect(multi_variant.option_value('media_type')).to eql 'CD'
190
+ end
191
+
192
+ it "should not duplicate associated option values when set multiple times" do
193
+ multi_variant.set_option_value('media_type', 'CD')
194
+
195
+ expect {
196
+ multi_variant.set_option_value('media_type', 'DVD')
197
+ }.to_not change(multi_variant.option_values, :count)
198
+
199
+ expect {
200
+ multi_variant.set_option_value('coolness_type', 'awesome')
201
+ }.to change(multi_variant.option_values, :count).by(1)
202
+ end
203
+ end
204
+
205
+ context "product has other variants" do
206
+ describe "option value accessors" do
207
+ before {
208
+ @multi_variant = create(:variant, product: variant.product)
209
+ variant.product.reload
210
+ }
211
+
212
+ let(:multi_variant) { @multi_variant }
213
+
214
+ it "should set option value" do
215
+ expect(multi_variant.option_value('media_type')).to be_nil
216
+
217
+ multi_variant.set_option_value('media_type', 'DVD')
218
+ expect(multi_variant.option_value('media_type')).to eql 'DVD'
219
+
220
+ multi_variant.set_option_value('media_type', 'CD')
221
+ expect(multi_variant.option_value('media_type')).to eql 'CD'
222
+ end
223
+
224
+ it "should not duplicate associated option values when set multiple times" do
225
+ multi_variant.set_option_value('media_type', 'CD')
226
+
227
+ expect {
228
+ multi_variant.set_option_value('media_type', 'DVD')
229
+ }.to_not change(multi_variant.option_values, :count)
230
+
231
+ expect {
232
+ multi_variant.set_option_value('coolness_type', 'awesome')
233
+ }.to change(multi_variant.option_values, :count).by(1)
234
+ end
235
+ end
236
+ end
237
+ end
238
+
239
+ context "#cost_price=" do
240
+ it "should use LocalizedNumber.parse" do
241
+ expect(Spree::LocalizedNumber).to receive(:parse).with('1,599.99')
242
+ subject.cost_price = '1,599.99'
243
+ end
244
+ end
245
+
246
+ context "#price=" do
247
+ it "should use LocalizedNumber.parse" do
248
+ expect(Spree::LocalizedNumber).to receive(:parse).with('1,599.99')
249
+ subject.price = '1,599.99'
250
+ end
251
+ end
252
+
253
+ context "#weight=" do
254
+ it "should use LocalizedNumber.parse" do
255
+ expect(Spree::LocalizedNumber).to receive(:parse).with('1,599.99')
256
+ subject.weight = '1,599.99'
257
+ end
258
+ end
259
+
260
+ context "#currency" do
261
+ it "returns the globally configured currency" do
262
+ expect(variant.currency).to eql "USD"
263
+ end
264
+ end
265
+
266
+ context "#display_amount" do
267
+ it "returns a Spree::Money" do
268
+ variant.price = 21.22
269
+ expect(variant.display_amount.to_s).to eql "$21.22"
270
+ end
271
+ end
272
+
273
+ context "#cost_currency" do
274
+ context "when cost currency is nil" do
275
+ before { variant.cost_currency = nil }
276
+ it "populates cost currency with the default value on save" do
277
+ variant.save!
278
+ expect(variant.cost_currency).to eql "USD"
279
+ end
280
+ end
281
+ end
282
+
283
+ describe '.price_in' do
284
+ before do
285
+ variant.prices << create(:price, variant: variant, currency: "EUR", amount: 33.33)
286
+ end
287
+ subject { variant.price_in(currency).display_amount }
288
+
289
+ context "when currency is not specified" do
290
+ let(:currency) { nil }
291
+
292
+ it "returns 0" do
293
+ expect(subject.to_s).to eql "$0.00"
294
+ end
295
+ end
296
+
297
+ context "when currency is EUR" do
298
+ let(:currency) { 'EUR' }
299
+
300
+ it "returns the value in the EUR" do
301
+ expect(subject.to_s).to eql "€33.33"
302
+ end
303
+ end
304
+
305
+ context "when currency is USD" do
306
+ let(:currency) { 'USD' }
307
+
308
+ it "returns the value in the USD" do
309
+ expect(subject.to_s).to eql "$19.99"
310
+ end
311
+ end
312
+ end
313
+
314
+ describe '.amount_in' do
315
+ before do
316
+ variant.prices << create(:price, variant: variant, currency: "EUR", amount: 33.33)
317
+ end
318
+
319
+ subject { variant.amount_in(currency) }
320
+
321
+ context "when currency is not specified" do
322
+ let(:currency) { nil }
323
+
324
+ it "returns nil" do
325
+ expect(subject).to be_nil
326
+ end
327
+ end
328
+
329
+ context "when currency is EUR" do
330
+ let(:currency) { 'EUR' }
331
+
332
+ it "returns the value in the EUR" do
333
+ expect(subject).to eql 33.33
334
+ end
335
+ end
336
+
337
+ context "when currency is USD" do
338
+ let(:currency) { 'USD' }
339
+
340
+ it "returns the value in the USD" do
341
+ expect(subject).to eql 19.99
342
+ end
343
+ end
344
+ end
345
+
346
+ # Regression test for #2432
347
+ describe 'options_text' do
348
+ let!(:variant) { build(:variant, option_values: []) }
349
+ let!(:master) { create(:master_variant) }
350
+
351
+ before do
352
+ # Order bar than foo
353
+ variant.option_values << create(:option_value, {name: 'Foo', presentation: 'Foo', option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')})
354
+ variant.option_values << create(:option_value, {name: 'Bar', presentation: 'Bar', option_type: create(:option_type, position: 1, name: 'Bar Type', presentation: 'Bar Type')})
355
+ variant.save
356
+ end
357
+
358
+ it 'should order by bar than foo' do
359
+ expect(variant.options_text).to eql 'Bar Type: Bar, Foo Type: Foo'
360
+ end
361
+
362
+ end
363
+
364
+ describe 'exchange_name' do
365
+ let!(:variant) { build(:variant, option_values: []) }
366
+ let!(:master) { create(:master_variant) }
367
+
368
+ before do
369
+ variant.option_values << create(:option_value, {
370
+ name: 'Foo',
371
+ presentation: 'Foo',
372
+ option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')
373
+ })
374
+ variant.save
375
+ end
376
+
377
+ context 'master variant' do
378
+ it 'should return name' do
379
+ expect(master.exchange_name).to eql master.name
380
+ end
381
+ end
382
+
383
+ context 'variant' do
384
+ it 'should return options text' do
385
+ expect(variant.exchange_name).to eql 'Foo Type: Foo'
386
+ end
387
+ end
388
+
389
+ end
390
+
391
+ describe 'exchange_name' do
392
+ let!(:variant) { build(:variant, option_values: []) }
393
+ let!(:master) { create(:master_variant) }
394
+
395
+ before do
396
+ variant.option_values << create(:option_value, {
397
+ name: 'Foo',
398
+ presentation: 'Foo',
399
+ option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')
400
+ })
401
+ variant.save
402
+ end
403
+
404
+ context 'master variant' do
405
+ it 'should return name' do
406
+ expect(master.exchange_name).to eql master.name
407
+ end
408
+ end
409
+
410
+ context 'variant' do
411
+ it 'should return options text' do
412
+ expect(variant.exchange_name).to eql 'Foo Type: Foo'
413
+ end
414
+ end
415
+
416
+ end
417
+
418
+ describe 'descriptive_name' do
419
+ let!(:variant) { build(:variant, option_values: []) }
420
+ let!(:master) { create(:master_variant) }
421
+
422
+ before do
423
+ variant.option_values << create(:option_value, {
424
+ name: 'Foo',
425
+ presentation: 'Foo',
426
+ option_type: create(:option_type, position: 2, name: 'Foo Type', presentation: 'Foo Type')
427
+ })
428
+ variant.save
429
+ end
430
+
431
+ context 'master variant' do
432
+ it 'should return name with Master identifier' do
433
+ expect(master.descriptive_name).to eql master.name + ' - Master'
434
+ end
435
+ end
436
+
437
+ context 'variant' do
438
+ it 'should return options text with name' do
439
+ expect(variant.descriptive_name).to eql variant.name + ' - Foo Type: Foo'
440
+ end
441
+ end
442
+
443
+ end
444
+
445
+ # Regression test for #2744
446
+ describe "set_position" do
447
+ it "sets variant position after creation" do
448
+ variant = create(:variant)
449
+ expect(variant.position).to_not be_nil
450
+ end
451
+ end
452
+
453
+ describe '#in_stock?' do
454
+ before do
455
+ Spree::Config.track_inventory_levels = true
456
+ end
457
+
458
+ context 'when stock_items are not backorderable' do
459
+ before do
460
+ allow_any_instance_of(Spree::StockItem).to receive_messages(backorderable: false)
461
+ end
462
+
463
+ context 'when stock_items in stock' do
464
+ before do
465
+ variant.stock_items.first.update_column(:count_on_hand, 10)
466
+ end
467
+
468
+ it 'returns true if stock_items in stock' do
469
+ expect(variant.in_stock?).to be true
470
+ end
471
+ end
472
+
473
+ context 'when stock_items out of stock' do
474
+ before do
475
+ allow_any_instance_of(Spree::StockItem).to receive_messages(backorderable: false)
476
+ allow_any_instance_of(Spree::StockItem).to receive_messages(count_on_hand: 0)
477
+ end
478
+
479
+ it 'return false if stock_items out of stock' do
480
+ expect(variant.in_stock?).to be false
481
+ end
482
+ end
483
+ end
484
+
485
+ describe "#can_supply?" do
486
+ it "calls out to quantifier" do
487
+ expect(Spree::Stock::Quantifier).to receive(:new).and_return(quantifier = double)
488
+ expect(quantifier).to receive(:can_supply?).with(10)
489
+ variant.can_supply?(10)
490
+ end
491
+ end
492
+
493
+ context 'when stock_items are backorderable' do
494
+ before do
495
+ allow_any_instance_of(Spree::StockItem).to receive_messages(backorderable: true)
496
+ end
497
+
498
+ context 'when stock_items out of stock' do
499
+ before do
500
+ allow_any_instance_of(Spree::StockItem).to receive_messages(count_on_hand: 0)
501
+ end
502
+
503
+ it 'in_stock? returns false' do
504
+ expect(variant.in_stock?).to be false
505
+ end
506
+
507
+ it 'can_supply? return true' do
508
+ expect(variant.can_supply?).to be true
509
+ end
510
+ end
511
+ end
512
+ end
513
+
514
+ describe '#is_backorderable' do
515
+ let(:variant) { build(:variant) }
516
+ subject { variant.is_backorderable? }
517
+
518
+ it 'should invoke Spree::Stock::Quantifier' do
519
+ expect_any_instance_of(Spree::Stock::Quantifier).to receive(:backorderable?) { true }
520
+ subject
521
+ end
522
+ end
523
+
524
+ describe '#total_on_hand' do
525
+ it 'should be infinite if track_inventory_levels is false' do
526
+ Spree::Config[:track_inventory_levels] = false
527
+ expect(build(:variant).total_on_hand).to eql(Float::INFINITY)
528
+ end
529
+
530
+ it 'should match quantifier total_on_hand' do
531
+ variant = build(:variant)
532
+ expect(variant.total_on_hand).to eq(Spree::Stock::Quantifier.new(variant).total_on_hand)
533
+ end
534
+ end
535
+
536
+ describe '#tax_category' do
537
+ context 'when tax_category is nil' do
538
+ let(:product) { build(:product) }
539
+ let(:variant) { build(:variant, product: product, tax_category_id: nil) }
540
+ it 'returns the parent products tax_category' do
541
+ expect(variant.tax_category).to eq(product.tax_category)
542
+ end
543
+ end
544
+
545
+ context 'when tax_category is set' do
546
+ let(:tax_category) { create(:tax_category) }
547
+ let(:variant) { build(:variant, tax_category: tax_category) }
548
+ it 'returns the tax_category set on itself' do
549
+ expect(variant.tax_category).to eq(tax_category)
550
+ end
551
+ end
552
+ end
553
+
554
+ describe "touching" do
555
+ it "updates a product" do
556
+ variant.product.update_column(:updated_at, 1.day.ago)
557
+ variant.touch
558
+ expect(variant.product.reload.updated_at).to be_within(3.seconds).of(Time.current)
559
+ end
560
+
561
+ it "clears the in_stock cache key" do
562
+ expect(Rails.cache).to receive(:delete).with(variant.send(:in_stock_cache_key))
563
+ variant.touch
564
+ end
565
+ end
566
+
567
+ describe "#should_track_inventory?" do
568
+
569
+ it 'should not track inventory when global setting is off' do
570
+ Spree::Config[:track_inventory_levels] = false
571
+
572
+ expect(build(:variant).should_track_inventory?).to eq(false)
573
+ end
574
+
575
+ it 'should not track inventory when variant is turned off' do
576
+ Spree::Config[:track_inventory_levels] = true
577
+
578
+ expect(build(:on_demand_variant).should_track_inventory?).to eq(false)
579
+ end
580
+
581
+ it 'should track inventory when global and variant are on' do
582
+ Spree::Config[:track_inventory_levels] = true
583
+
584
+ expect(build(:variant).should_track_inventory?).to eq(true)
585
+ end
586
+ end
587
+
588
+ describe "deleted_at scope" do
589
+ before { variant.destroy && variant.reload }
590
+ it "should have a price if deleted" do
591
+ variant.price = 10
592
+ expect(variant.price).to eq(10)
593
+ end
594
+ end
595
+
596
+ describe "stock movements" do
597
+ let!(:movement) { create(:stock_movement, stock_item: variant.stock_items.first) }
598
+
599
+ it "builds out collection just fine through stock items" do
600
+ expect(variant.stock_movements.to_a).not_to be_empty
601
+ end
602
+ end
603
+
604
+ describe "in_stock scope" do
605
+ it "returns all in stock variants" do
606
+ in_stock_variant = create(:variant)
607
+ out_of_stock_variant = create(:variant)
608
+
609
+ in_stock_variant.stock_items.first.update_column(:count_on_hand, 10)
610
+
611
+ expect(Spree::Variant.in_stock).to eq [in_stock_variant]
612
+ end
613
+ end
614
+
615
+ context "#volume" do
616
+ let(:variant_zero_width) { create(:variant, width: 0) }
617
+ let(:variant) { create(:variant) }
618
+
619
+ it "it is zero if any dimension parameter is zero" do
620
+ expect(variant_zero_width.volume).to eq 0
621
+ end
622
+
623
+ it "return the volume if the dimension parameters are different of zero" do
624
+ volume_expected = variant.width * variant.depth * variant.height
625
+ expect(variant.volume).to eq (volume_expected)
626
+ end
627
+ end
628
+
629
+ context "#dimension" do
630
+ let(:variant) { create(:variant) }
631
+
632
+ it "return the dimension if the dimension parameters are different of zero" do
633
+ dimension_expected = variant.width + variant.depth + variant.height
634
+ expect(variant.dimension).to eq (dimension_expected)
635
+ end
636
+ end
637
+
638
+ context "#discontinue!" do
639
+ let(:variant) { create(:variant) }
640
+
641
+ it "sets the discontinued" do
642
+ variant.discontinue!
643
+ variant.reload
644
+ expect(variant.discontinued?).to be(true)
645
+ end
646
+
647
+ it "changes updated_at" do
648
+ Timecop.scale(1000) do
649
+ expect { variant.discontinue! }.to change { variant.updated_at }
650
+ end
651
+ end
652
+ end
653
+
654
+ context "#discontinued?" do
655
+ let(:variant_live) { build(:variant) }
656
+ it "should be false" do
657
+ expect(variant_live.discontinued?).to be(false)
658
+ end
659
+
660
+ let(:variant_discontinued) { build(:variant, discontinue_on: Time.now - 1.day) }
661
+ it "should be true" do
662
+ expect(variant_discontinued.discontinued?).to be(true)
663
+ end
664
+ end
665
+
666
+ describe "#available?" do
667
+ let(:variant) { create(:variant) }
668
+ context 'when discontinued' do
669
+ before(:each) do
670
+ variant.discontinue_on = Time.current - 1.day
671
+ end
672
+
673
+ context 'when product is available' do
674
+ before(:each) do
675
+ allow(variant.product).to receive(:available?) { true }
676
+ end
677
+
678
+ it { expect(variant.available?).to be(false) }
679
+ end
680
+
681
+ context 'when product is not available' do
682
+ before(:each) do
683
+ allow(variant.product).to receive(:available?) { false }
684
+ end
685
+
686
+ it { expect(variant.available?).to be(false) }
687
+ end
688
+ end
689
+
690
+ context 'when not discontinued' do
691
+ before(:each) do
692
+ variant.discontinue_on = Time.current + 1.day
693
+ end
694
+
695
+ context 'when product is available' do
696
+ before(:each) do
697
+ allow(variant.product).to receive(:available?) { true }
698
+ end
699
+
700
+ it { expect(variant.available?).to be(true) }
701
+ end
702
+
703
+ context 'when product is not available' do
704
+ before(:each) do
705
+ allow(variant.product).to receive(:available?) { false }
706
+ end
707
+
708
+ it { expect(variant.available?).to be(false) }
709
+ end
710
+ end
711
+ end
712
+
713
+ describe "#check_price" do
714
+ let(:variant) { create(:variant) }
715
+ let(:variant2) { create(:variant) }
716
+
717
+ context 'require_master_price set false' do
718
+ before { Spree::Config.set(require_master_price: false) }
719
+
720
+ context 'price present and currency present' do
721
+ it { expect(variant.send(:check_price)).to be(nil) }
722
+ end
723
+
724
+ context 'price present and currency nil' do
725
+ before { variant.currency = nil }
726
+
727
+ it { expect(variant.send(:check_price)).to be(Spree::Config[:currency]) }
728
+ end
729
+
730
+ context 'price nil and currency present' do
731
+ before { variant.price = nil }
732
+
733
+ it { expect(variant.send(:check_price)).to be(nil) }
734
+ end
735
+
736
+ context 'price nil and currency nil' do
737
+ before { variant.price = nil }
738
+
739
+ it { expect(variant.send(:check_price)).to be(nil) }
740
+ end
741
+ end
742
+
743
+ context 'require_master_price set true' do
744
+ before { Spree::Config.set(require_master_price: true) }
745
+
746
+ context 'price present and currency present' do
747
+ it { expect(variant.send(:check_price)).to be(nil) }
748
+ end
749
+
750
+ context 'price present and currency nil' do
751
+ before { variant.currency = nil }
752
+
753
+ it { expect(variant.send(:check_price)).to be(Spree::Config[:currency]) }
754
+ end
755
+
756
+ context 'product and master_variant present and equal' do
757
+ context 'price nil and currency present' do
758
+ before { variant.price = nil }
759
+ it { expect(variant.send(:check_price)).to be(nil) }
760
+
761
+ context 'check variant price' do
762
+ before { variant.send(:check_price) }
763
+ it { expect(variant.price).to eq(variant.product.master.price) }
764
+ end
765
+ end
766
+
767
+ context 'price nil and currency nil' do
768
+ before do
769
+ variant.price = nil
770
+ variant.send(:check_price)
771
+ end
772
+
773
+ it { expect(variant.price).to eq(variant.product.master.price) }
774
+ it { expect(variant.currency).to eq(Spree::Config[:currency]) }
775
+ end
776
+ end
777
+
778
+ context 'product not present' do
779
+ context 'product not present' do
780
+ before { variant.product = nil }
781
+
782
+ context 'price nil and currency present' do
783
+ before { variant.price = nil }
784
+
785
+ it { expect { variant.send(:check_price) }.to raise_error(RuntimeError, 'No master variant found to infer price') }
786
+ end
787
+
788
+ context 'price nil and currency nil' do
789
+ before { variant.price = nil }
790
+
791
+ it { expect { variant.send(:check_price) }.to raise_error(RuntimeError, 'No master variant found to infer price') }
792
+ end
793
+ end
794
+ end
795
+ end
796
+ end
797
+
798
+ describe '#created_at' do
799
+ it 'creates variant with created_at timestamp' do
800
+ expect(variant.created_at).to_not be_nil
801
+ end
802
+ end
803
+
804
+ describe '#updated_at' do
805
+ it 'creates variant with updated_at timestamp' do
806
+ expect(variant.updated_at).to_not be_nil
807
+ end
808
+ end
809
+ end