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,619 @@
1
+ # coding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module ThirdParty
6
+ class Extension < Spree::Base
7
+ # nasty hack so we don't have to create a table to back this fake model
8
+ self.table_name = 'spree_products'
9
+ end
10
+ end
11
+
12
+ describe Spree::Product, type: :model do
13
+
14
+ describe 'Associations' do
15
+ it 'should have many promotions' do
16
+ is_expected.to have_many(:promotions).
17
+ class_name('Spree::Promotion').through(:promotion_rules)
18
+ end
19
+
20
+ it 'should have many possible_promotions' do
21
+ is_expected.to have_many(:possible_promotions).
22
+ class_name('Spree::Promotion').through(:promotion_rules).source(:promotion)
23
+ end
24
+
25
+ it do
26
+ is_expected.to have_many(:variants).
27
+ class_name('Spree::Variant').
28
+ inverse_of(:product).
29
+ conditions(is_master: false).
30
+ order(:position)
31
+ end
32
+
33
+ it do
34
+ is_expected.to have_many(:variants_including_master).
35
+ class_name('Spree::Variant').
36
+ inverse_of(:product).
37
+ order(:position)
38
+ end
39
+ end
40
+
41
+ context 'product instance' do
42
+ let(:product) { create(:product) }
43
+ let(:variant) { create(:variant, product: product) }
44
+
45
+ context '#duplicate' do
46
+ before do
47
+ allow(product).to receive_messages taxons: [create(:taxon)]
48
+ end
49
+
50
+ it 'duplicates product' do
51
+ clone = product.duplicate
52
+ expect(clone.name).to eq('COPY OF ' + product.name)
53
+ expect(clone.master.sku).to eq('COPY OF ' + product.master.sku)
54
+ expect(clone.taxons).to eq(product.taxons)
55
+ expect(clone.images.size).to eq(product.images.size)
56
+ end
57
+
58
+ it 'calls #duplicate_extra' do
59
+ expect_any_instance_of(Spree::Product).to receive(:duplicate_extra)
60
+ .with(product)
61
+ expect(product).to_not receive(:duplicate_extra)
62
+ product.duplicate
63
+ end
64
+ end
65
+
66
+ context "master variant" do
67
+
68
+ context "when master variant changed" do
69
+ before do
70
+ product.master.sku = "Something changed"
71
+ end
72
+
73
+ it "saves the master" do
74
+ expect(product.master).to receive(:save!)
75
+ product.save
76
+ end
77
+ end
78
+
79
+ context "when master default price changed" do
80
+ before do
81
+ master = product.master
82
+ master.default_price.price = 11
83
+ master.save!
84
+ product.master.default_price.price = 12
85
+ end
86
+
87
+ it "saves the master" do
88
+ expect(product.master).to receive(:save!)
89
+ product.save
90
+ end
91
+
92
+ it "saves the default price" do
93
+ expect(product.master.default_price).to receive(:save)
94
+ product.save
95
+ end
96
+ end
97
+
98
+ context "when master variant and price haven't changed" do
99
+ it "does not save the master" do
100
+ expect(product.master).not_to receive(:save!)
101
+ product.save
102
+ end
103
+ end
104
+ end
105
+
106
+ context "product has no variants" do
107
+ context "#destroy" do
108
+ it "should set deleted_at value" do
109
+ product.destroy
110
+ expect(product.deleted_at).not_to be_nil
111
+ expect(product.master.reload.deleted_at).not_to be_nil
112
+ end
113
+ end
114
+ end
115
+
116
+ context "product has variants" do
117
+ before do
118
+ create(:variant, product: product)
119
+ end
120
+
121
+ context "#destroy" do
122
+ it "should set deleted_at value" do
123
+ product.destroy
124
+ expect(product.deleted_at).not_to be_nil
125
+ expect(product.variants_including_master.all? { |v| !v.deleted_at.nil? }).to be true
126
+ end
127
+ end
128
+ end
129
+
130
+ context "#price" do
131
+ # Regression test for #1173
132
+ it 'strips non-price characters' do
133
+ product.price = "$10"
134
+ expect(product.price).to eq(10.0)
135
+ end
136
+ end
137
+
138
+ context "#display_price" do
139
+ before { product.price = 10.55 }
140
+
141
+ it "shows the amount" do
142
+ expect(product.display_price.to_s).to eq("$10.55")
143
+ end
144
+
145
+ context "with currency set to JPY" do
146
+ before do
147
+ product.master.default_price.currency = 'JPY'
148
+ product.master.default_price.save!
149
+ Spree::Config[:currency] = 'JPY'
150
+ end
151
+
152
+ it "displays the currency in yen" do
153
+ expect(product.display_price.to_s).to eq("¥11")
154
+ end
155
+ end
156
+ end
157
+
158
+ context "#available?" do
159
+ it "should be available if date is in the past" do
160
+ product.available_on = 1.day.ago
161
+ expect(product).to be_available
162
+ end
163
+
164
+ it "should not be available if date is nil or in the future" do
165
+ product.available_on = nil
166
+ expect(product).not_to be_available
167
+
168
+ product.available_on = 1.day.from_now
169
+ expect(product).not_to be_available
170
+ end
171
+
172
+ it "should not be available if destroyed" do
173
+ product.destroy
174
+ expect(product).not_to be_available
175
+ end
176
+ end
177
+
178
+ context "#can_supply?" do
179
+ it "should be true" do
180
+ expect(product.can_supply?).to be(true)
181
+ end
182
+
183
+ it "should be false" do
184
+ product.variants_including_master.each { |v| v.stock_items.update_all count_on_hand: 0, backorderable: false }
185
+ expect(product.can_supply?).to be(false)
186
+ end
187
+ end
188
+
189
+ context "variants_and_option_values" do
190
+ let!(:high) { create(:variant, product: product) }
191
+ let!(:low) { create(:variant, product: product) }
192
+
193
+ before { high.option_values.destroy_all }
194
+
195
+ it "returns only variants with option values" do
196
+ expect(product.variants_and_option_values).to eq([low])
197
+ end
198
+ end
199
+
200
+ context "has stock movements" do
201
+ let(:variant) { product.master }
202
+ let(:stock_item) { variant.stock_items.first }
203
+
204
+ it "doesnt raise ReadOnlyRecord error" do
205
+ Spree::StockMovement.create!(stock_item: stock_item, quantity: 1)
206
+ expect { product.destroy }.not_to raise_error
207
+ end
208
+ end
209
+
210
+ # Regression test for #3737
211
+ context "has stock items" do
212
+ it "can retrieve stock items" do
213
+ expect(product.master.stock_items.first).not_to be_nil
214
+ expect(product.stock_items.first).not_to be_nil
215
+ end
216
+ end
217
+
218
+ context "slugs" do
219
+
220
+ it "normalizes slug on update validation" do
221
+ product.slug = "hey//joe"
222
+ product.valid?
223
+ expect(product.slug).not_to match "/"
224
+ end
225
+
226
+ it "stores old slugs in FriendlyIds history" do
227
+ # create_slug is a private method, included by FriendlyId::History
228
+ # it's effect is rather complex and dependent on state and config.
229
+ # However, when a new slug is set, it should call slugs.create!
230
+ expect(product.slugs).to receive(:create!)
231
+ # Set it, otherwise the create_slug method avoids writing a new one
232
+ product.slug = "custom-slug"
233
+ product.run_callbacks :save
234
+ end
235
+
236
+ context "when product destroyed" do
237
+
238
+ it "renames slug" do
239
+ expect { product.destroy }.to change { product.slug }
240
+ end
241
+
242
+ context "when slug is already at or near max length" do
243
+
244
+ before do
245
+ product.slug = "x" * 255
246
+ product.save!
247
+ end
248
+
249
+ it "truncates renamed slug to ensure it remains within length limit" do
250
+ product.destroy
251
+ expect(product.slug.length).to eq 255
252
+ end
253
+
254
+ end
255
+
256
+ end
257
+
258
+ it "validates slug uniqueness" do
259
+ existing_product = product
260
+ new_product = create(:product)
261
+ new_product.slug = existing_product.slug
262
+
263
+ expect(new_product.valid?).to eq false
264
+ end
265
+
266
+ it "falls back to 'name-sku' for slug if regular name-based slug already in use" do
267
+ product1 = build(:product)
268
+ product1.name = "test"
269
+ product1.sku = "123"
270
+ product1.save!
271
+
272
+ product2 = build(:product)
273
+ product2.name = "test"
274
+ product2.sku = "456"
275
+ product2.save!
276
+
277
+ expect(product2.slug).to eq 'test-456'
278
+ end
279
+ end
280
+
281
+ describe "#discontinue_on_must_be_later_than_available_on" do
282
+ before { product.available_on = Date.today }
283
+
284
+ context "available_on is a date earlier than discontinue_on" do
285
+ before { product.discontinue_on = 5.days.from_now }
286
+
287
+ it "is valid" do
288
+ expect(product).to be_valid
289
+ end
290
+ end
291
+
292
+ context "available_on is a date earlier than discontinue_on" do
293
+ before { product.discontinue_on = 5.days.ago }
294
+
295
+ context "is not valid" do
296
+ before { product.valid? }
297
+
298
+ it { expect(product).not_to be_valid }
299
+ it { expect(product.errors[:discontinue_on]).to include(I18n.t(:invalid_date_range, scope: 'activerecord.errors.models.spree/product.attributes.discontinue_on')) }
300
+ end
301
+ end
302
+
303
+ context "available_on and discontinue_on are nil" do
304
+ before do
305
+ product.discontinue_on = nil
306
+ product.available_on = nil
307
+ end
308
+
309
+ it "is valid" do
310
+ expect(product).to be_valid
311
+ end
312
+ end
313
+ end
314
+
315
+ context "hard deletion" do
316
+ it "doesnt raise ActiveRecordError error" do
317
+ expect { product.really_destroy! }.to_not raise_error
318
+ end
319
+ end
320
+
321
+ context 'history' do
322
+ before(:each) do
323
+ @product = create(:product)
324
+ end
325
+
326
+ it 'should keep the history when the product is destroyed' do
327
+ @product.destroy
328
+
329
+ expect(@product.slugs.with_deleted).to_not be_empty
330
+ end
331
+
332
+ it 'should update the history when the product is restored' do
333
+ @product.destroy
334
+
335
+ @product.restore(recursive: true)
336
+
337
+ latest_slug = @product.slugs.find_by slug: @product.slug
338
+ expect(latest_slug).to_not be_nil
339
+ end
340
+ end
341
+ end
342
+
343
+ context "properties" do
344
+ let(:product) { create(:product) }
345
+
346
+ it "should properly assign properties" do
347
+ product.set_property('the_prop', 'value1')
348
+ expect(product.property('the_prop')).to eq('value1')
349
+
350
+ product.set_property('the_prop', 'value2')
351
+ expect(product.property('the_prop')).to eq('value2')
352
+ end
353
+
354
+ it "should not create duplicate properties when set_property is called" do
355
+ expect {
356
+ product.set_property('the_prop', 'value2')
357
+ product.save
358
+ product.reload
359
+ }.not_to change(product.properties, :length)
360
+
361
+ expect {
362
+ product.set_property('the_prop_new', 'value')
363
+ product.save
364
+ product.reload
365
+ expect(product.property('the_prop_new')).to eq('value')
366
+ }.to change { product.properties.length }.by(1)
367
+ end
368
+
369
+ context 'optional property_presentation' do
370
+ subject { Spree::Property.where(name: 'foo').first.presentation }
371
+ let(:name) { 'foo' }
372
+ let(:presentation) { 'baz' }
373
+
374
+ describe 'is not used' do
375
+ before { product.set_property(name, 'bar') }
376
+ it { is_expected.to eq name }
377
+ end
378
+
379
+ describe 'is used' do
380
+ before { product.set_property(name, 'bar', presentation) }
381
+ it { is_expected.to eq presentation }
382
+ end
383
+ end
384
+
385
+ # Regression test for #2455
386
+ it "should not overwrite properties' presentation names" do
387
+ Spree::Property.where(name: 'foo').first_or_create!(presentation: "Foo's Presentation Name")
388
+ product.set_property('foo', 'value1')
389
+ product.set_property('bar', 'value2')
390
+ expect(Spree::Property.where(name: 'foo').first.presentation).to eq("Foo's Presentation Name")
391
+ expect(Spree::Property.where(name: 'bar').first.presentation).to eq("bar")
392
+ end
393
+
394
+ # Regression test for #4416
395
+ context "#possible_promotions" do
396
+ let!(:possible_promotion) { create(:promotion, advertise: true, starts_at: 1.day.ago) }
397
+ let!(:unadvertised_promotion) { create(:promotion, advertise: false, starts_at: 1.day.ago) }
398
+ let!(:inactive_promotion) { create(:promotion, advertise: true, starts_at: 1.day.since) }
399
+
400
+ before do
401
+ product.promotion_rules.create!(promotion: possible_promotion)
402
+ product.promotion_rules.create!(promotion: unadvertised_promotion)
403
+ product.promotion_rules.create!(promotion: inactive_promotion)
404
+ end
405
+
406
+ it "lists the promotion as a possible promotion" do
407
+ expect(product.possible_promotions).to include(possible_promotion)
408
+ expect(product.possible_promotions).to_not include(unadvertised_promotion)
409
+ expect(product.possible_promotions).to_not include(inactive_promotion)
410
+ end
411
+ end
412
+ end
413
+
414
+ context '#create' do
415
+ let!(:prototype) { create(:prototype) }
416
+ let!(:product) { Spree::Product.new(name: "Foo", price: 1.99, shipping_category_id: create(:shipping_category).id) }
417
+
418
+ before { product.prototype_id = prototype.id }
419
+
420
+ context "when prototype is supplied" do
421
+ it "should create properties based on the prototype" do
422
+ product.save
423
+ expect(product.properties.count).to eq(1)
424
+ end
425
+ end
426
+
427
+ context "when prototype with option types is supplied" do
428
+ def build_option_type_with_values(name, values)
429
+ values.each_with_object(create :option_type, name: name) do |val, ot|
430
+ ot.option_values.create(name: val.downcase, presentation: val)
431
+ end
432
+ end
433
+
434
+ let(:prototype) do
435
+ size = build_option_type_with_values("size", %w(Small Medium Large))
436
+ create(:prototype, name: "Size", option_types: [ size ])
437
+ end
438
+
439
+ let(:option_values_hash) do
440
+ hash = {}
441
+ prototype.option_types.each do |i|
442
+ hash[i.id.to_s] = i.option_value_ids
443
+ end
444
+ hash
445
+ end
446
+
447
+ it "should create option types based on the prototype" do
448
+ product.save
449
+ expect(product.option_type_ids.length).to eq(1)
450
+ expect(product.option_type_ids).to eq(prototype.option_type_ids)
451
+ end
452
+
453
+ it "should create product option types based on the prototype" do
454
+ product.save
455
+ expect(product.product_option_types.pluck(:option_type_id)).to eq(prototype.option_type_ids)
456
+ end
457
+
458
+ it "should create variants from an option values hash with one option type" do
459
+ product.option_values_hash = option_values_hash
460
+ product.save
461
+ expect(product.variants.length).to eq(3)
462
+ end
463
+
464
+ it "should still create variants when option_values_hash is given but prototype id is nil" do
465
+ product.option_values_hash = option_values_hash
466
+ product.prototype_id = nil
467
+ product.save
468
+ product.reload
469
+ expect(product.option_type_ids.length).to eq(1)
470
+ expect(product.option_type_ids).to eq(prototype.option_type_ids)
471
+ expect(product.variants.length).to eq(3)
472
+ end
473
+
474
+ it "should create variants from an option values hash with multiple option types" do
475
+ color = build_option_type_with_values("color", %w(Red Green Blue))
476
+ logo = build_option_type_with_values("logo", %w(Ruby Rails Nginx))
477
+ option_values_hash[color.id.to_s] = color.option_value_ids
478
+ option_values_hash[logo.id.to_s] = logo.option_value_ids
479
+ product.option_values_hash = option_values_hash
480
+ product.save
481
+ product.reload
482
+ expect(product.option_type_ids.length).to eq(3)
483
+ expect(product.variants.length).to eq(27)
484
+ end
485
+ end
486
+ end
487
+
488
+ context "#images" do
489
+ let(:product) { create(:product) }
490
+ let(:image) { File.open(File.expand_path('../../../fixtures/thinking-cat.jpg', __FILE__)) }
491
+ let(:params) { {viewable_id: product.master.id, viewable_type: 'Spree::Variant', attachment: image, alt: "position 2", position: 2} }
492
+
493
+ before do
494
+ Spree::Image.create(params)
495
+ Spree::Image.create(params.merge({alt: "position 1", position: 1}))
496
+ Spree::Image.create(params.merge({viewable_type: 'ThirdParty::Extension', alt: "position 1", position: 2}))
497
+ end
498
+
499
+ it "only looks for variant images" do
500
+ expect(product.images.size).to eq(2)
501
+ end
502
+
503
+ it "should be sorted by position" do
504
+ expect(product.images.pluck(:alt)).to eq(["position 1", "position 2"])
505
+ end
506
+ end
507
+
508
+ # Regression tests for #2352
509
+ context "classifications and taxons" do
510
+ it "is joined through classifications" do
511
+ reflection = Spree::Product.reflect_on_association(:taxons)
512
+ expect(reflection.options[:through]).to eq(:classifications)
513
+ end
514
+
515
+ it "will delete all classifications" do
516
+ reflection = Spree::Product.reflect_on_association(:classifications)
517
+ expect(reflection.options[:dependent]).to eq(:delete_all)
518
+ end
519
+ end
520
+
521
+ context '#total_on_hand' do
522
+ let(:product) { create(:product) }
523
+
524
+ it 'should be infinite if track_inventory_levels is false' do
525
+ Spree::Config[:track_inventory_levels] = false
526
+ expect(build(:product, variants_including_master: [build(:master_variant)]).total_on_hand).to eql(Float::INFINITY)
527
+ end
528
+
529
+ it 'should be infinite if variant is on demand' do
530
+ Spree::Config[:track_inventory_levels] = true
531
+ expect(build(:product, variants_including_master: [build(:on_demand_master_variant)]).total_on_hand).to eql(Float::INFINITY)
532
+ end
533
+
534
+ it 'should return sum of stock items count_on_hand' do
535
+ product.stock_items.first.set_count_on_hand 5
536
+ product.variants_including_master.reload # force load association
537
+ expect(product.total_on_hand).to eql(5)
538
+ end
539
+
540
+ it 'should return sum of stock items count_on_hand when variants_including_master is not loaded' do
541
+ product.stock_items.first.set_count_on_hand 5
542
+ expect(product.reload.total_on_hand).to eql(5)
543
+ end
544
+ end
545
+
546
+ # Regression spec for https://github.com/spree/spree/issues/5588
547
+ context '#validate_master when duplicate SKUs entered' do
548
+ let!(:first_product) { create(:product, sku: 'a-sku') }
549
+ let(:second_product) { build(:product, sku: 'a-sku') }
550
+
551
+ subject { second_product }
552
+ it { is_expected.to be_invalid }
553
+ end
554
+
555
+ it "initializes a master variant when building a product" do
556
+ product = Spree::Product.new
557
+ expect(product.master.is_master).to be true
558
+ end
559
+
560
+ context "#discontinue!" do
561
+ let(:product) { create(:product, sku: 'a-sku') }
562
+
563
+ it "sets the discontinued" do
564
+ product.discontinue!
565
+ product.reload
566
+ expect(product.discontinued?).to be(true)
567
+ end
568
+
569
+ it "changes updated_at" do
570
+ Timecop.scale(1000) do
571
+ expect { product.discontinue! }.to change { product.updated_at }
572
+ end
573
+ end
574
+ end
575
+
576
+ context "#discontinued?" do
577
+ let(:product_live) { build(:product, sku: "a-sku") }
578
+ it "should be false" do
579
+ expect(product_live.discontinued?).to be(false)
580
+ end
581
+
582
+ let(:product_discontinued) { build(:product, sku: "a-sku", discontinue_on: Time.now - 1.day) }
583
+ it "should be true" do
584
+ expect(product_discontinued.discontinued?).to be(true)
585
+ end
586
+ end
587
+
588
+ context "acts_as_taggable" do
589
+ let(:product) { create(:product) }
590
+
591
+ it "should add tags" do
592
+ product.tag_list.add("awesome")
593
+ expect(product.tag_list).to include("awesome")
594
+ end
595
+
596
+ it "should remove tags" do
597
+ product.tag_list.remove("awesome")
598
+ expect(product.tag_list).to_not include("awesome")
599
+ end
600
+ end
601
+
602
+ context "#brand" do
603
+ let(:taxonomy) { create(:taxonomy, name: I18n.t('spree.taxonomy_brands_name')) }
604
+ let(:product) { create(:product, taxons: [taxonomy.taxons.first]) }
605
+
606
+ it 'should fetch Brand Taxon' do
607
+ expect(product.brand).to eql(taxonomy.taxons.first)
608
+ end
609
+ end
610
+
611
+ context "#category" do
612
+ let(:taxonomy) { create(:taxonomy, name: I18n.t('spree.taxonomy_categories_name')) }
613
+ let(:product) { create(:product, taxons: [taxonomy.taxons.first]) }
614
+
615
+ it 'should fetch Category Taxon' do
616
+ expect(product.category).to eql(taxonomy.taxons.first)
617
+ end
618
+ end
619
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Promotion::Actions::CreateAdjustment, type: :model do
4
+ let(:order) { create(:order_with_line_items, line_items_count: 1) }
5
+ let(:promotion) { create(:promotion) }
6
+ let(:action) { Spree::Promotion::Actions::CreateAdjustment.new }
7
+ let(:payload) { { order: order } }
8
+
9
+ it_behaves_like 'an adjustment source'
10
+
11
+ # From promotion spec:
12
+ context "#perform" do
13
+ before do
14
+ action.calculator = Spree::Calculator::FlatRate.new(preferred_amount: 10)
15
+ promotion.promotion_actions = [action]
16
+ allow(action).to receive_messages(promotion: promotion)
17
+ end
18
+
19
+ # Regression test for #3966
20
+ it "does not apply an adjustment if the amount is 0" do
21
+ action.calculator.preferred_amount = 0
22
+ action.perform(payload)
23
+ expect(promotion.credits_count).to eq(0)
24
+ expect(order.adjustments.count).to eq(0)
25
+ end
26
+
27
+ it "should create a discount with correct negative amount" do
28
+ order.shipments.create!(cost: 10, stock_location: create(:stock_location))
29
+
30
+ action.perform(payload)
31
+ expect(promotion.credits_count).to eq(1)
32
+ expect(order.adjustments.count).to eq(1)
33
+ expect(order.adjustments.first.amount.to_i).to eq(-10)
34
+ end
35
+
36
+ it "should create a discount accessible through both order_id and adjustable_id" do
37
+ action.perform(payload)
38
+ expect(order.adjustments.count).to eq(1)
39
+ expect(order.all_adjustments.count).to eq(1)
40
+ end
41
+
42
+ it "should not create a discount when order already has one from this promotion" do
43
+ order.shipments.create!(cost: 10, stock_location: create(:stock_location))
44
+
45
+ action.perform(payload)
46
+ action.perform(payload)
47
+ expect(promotion.credits_count).to eq(1)
48
+ end
49
+ end
50
+ end