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,402 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Address, type: :model do
4
+
5
+ describe 'Callbacks' do
6
+ it { is_expected.to callback(:clear_invalid_state_entities).before(:validation).on(:update) }
7
+ end
8
+
9
+ describe "clone" do
10
+ it "creates a copy of the address with the exception of the id, updated_at and created_at attributes" do
11
+ state = create(:state)
12
+ original = create(:address,
13
+ address1: 'address1',
14
+ address2: 'address2',
15
+ alternative_phone: 'alternative_phone',
16
+ city: 'city',
17
+ country: Spree::Country.first,
18
+ firstname: 'firstname',
19
+ lastname: 'lastname',
20
+ company: 'company',
21
+ phone: 'phone',
22
+ state_id: state.id,
23
+ state_name: state.name,
24
+ zipcode: '10001')
25
+
26
+ cloned = original.clone
27
+
28
+ expect(cloned.address1).to eq(original.address1)
29
+ expect(cloned.address2).to eq(original.address2)
30
+ expect(cloned.alternative_phone).to eq(original.alternative_phone)
31
+ expect(cloned.city).to eq(original.city)
32
+ expect(cloned.country_id).to eq(original.country_id)
33
+ expect(cloned.firstname).to eq(original.firstname)
34
+ expect(cloned.lastname).to eq(original.lastname)
35
+ expect(cloned.company).to eq(original.company)
36
+ expect(cloned.phone).to eq(original.phone)
37
+ expect(cloned.state_id).to eq(original.state_id)
38
+ expect(cloned.state_name).to eq(original.state_name)
39
+ expect(cloned.zipcode).to eq(original.zipcode)
40
+
41
+ expect(cloned.id).not_to eq(original.id)
42
+ expect(cloned.created_at).not_to eq(original.created_at)
43
+ expect(cloned.updated_at).not_to eq(original.updated_at)
44
+ end
45
+ end
46
+
47
+ context "aliased attributes" do
48
+ let(:address) { Spree::Address.new }
49
+
50
+ it "first_name" do
51
+ address.firstname = "Ryan"
52
+ expect(address.first_name).to eq("Ryan")
53
+ end
54
+
55
+ it "last_name" do
56
+ address.lastname = "Bigg"
57
+ expect(address.last_name).to eq("Bigg")
58
+ end
59
+ end
60
+
61
+ context "validation" do
62
+ before do
63
+ configure_spree_preferences do |config|
64
+ config.address_requires_state = true
65
+ end
66
+ end
67
+
68
+ let(:country) { stub_model(Spree::Country, states: [state], states_required: true) }
69
+ let(:state) { stub_model(Spree::State, name: 'maryland', abbr: 'md') }
70
+ let(:address) { build(:address, country: country) }
71
+
72
+ before do
73
+ allow(country.states).to receive_messages find_all_by_name_or_abbr: [state]
74
+ end
75
+
76
+ it "state_name is not nil and country does not have any states" do
77
+ address.state = nil
78
+ address.state_name = 'alabama'
79
+ expect(address).to be_valid
80
+ end
81
+
82
+ it "errors when state_name is nil" do
83
+ address.state_name = nil
84
+ address.state = nil
85
+ expect(address).not_to be_valid
86
+ end
87
+
88
+ it "full state name is in state_name and country does contain that state" do
89
+ address.state_name = 'alabama'
90
+ # called by state_validate to set up state_id.
91
+ # Perhaps this should be a before_validation instead?
92
+ expect(address).to be_valid
93
+ expect(address.state).not_to be_nil
94
+ expect(address.state_name).to be_nil
95
+ end
96
+
97
+ it "state abbr is in state_name and country does contain that state" do
98
+ address.state_name = state.abbr
99
+ expect(address).to be_valid
100
+ expect(address.state_id).not_to be_nil
101
+ expect(address.state_name).to be_nil
102
+ end
103
+
104
+ it "state is entered but country does not contain that state" do
105
+ address.state = state
106
+ address.country = stub_model(Spree::Country, states_required: true)
107
+ address.valid?
108
+ expect(address.errors["state"]).to eq(['is invalid'])
109
+ end
110
+
111
+ it "both state and state_name are entered but country does not contain the state" do
112
+ address.state = state
113
+ address.state_name = 'maryland'
114
+ address.country = stub_model(Spree::Country, states_required: true)
115
+ expect(address).to be_valid
116
+ expect(address.state_id).to be_nil
117
+ end
118
+
119
+ it "both state and state_name are entered and country does contain the state" do
120
+ address.state = state
121
+ address.state_name = 'maryland'
122
+ expect(address).to be_valid
123
+ expect(address.state_name).to be_nil
124
+ end
125
+
126
+ it "address_requires_state preference is false" do
127
+ Spree::Config.set address_requires_state: false
128
+ address.state = nil
129
+ address.state_name = nil
130
+ expect(address).to be_valid
131
+ end
132
+
133
+ it "requires phone" do
134
+ address.phone = ""
135
+ address.valid?
136
+ expect(address.errors["phone"]).to eq(["can't be blank"])
137
+ end
138
+
139
+ it "requires zipcode" do
140
+ address.zipcode = ""
141
+ address.valid?
142
+ expect(address.errors['zipcode']).to include("can't be blank")
143
+ end
144
+
145
+ context "zipcode validation" do
146
+ it "validates the zipcode" do
147
+ allow(address.country).to receive(:iso).and_return('US')
148
+ address.zipcode = 'abc'
149
+ address.valid?
150
+ expect(address.errors['zipcode']).to include('is invalid')
151
+ end
152
+
153
+ it "accepts a zip code with surrounding white space" do
154
+ allow(address.country).to receive(:iso).and_return('US')
155
+ address.zipcode = ' 12345 '
156
+ address.valid?
157
+ expect(address.errors['zipcode']).not_to include('is invalid')
158
+ end
159
+
160
+ context 'does not validate' do
161
+ it 'does not have a country' do
162
+ address.country = nil
163
+ address.valid?
164
+ expect(address.errors['zipcode']).not_to include('is invalid')
165
+ end
166
+
167
+ it 'country does not requires zipcode' do
168
+ allow(address.country).to receive(:zipcode_required?).and_return(false)
169
+ address.valid?
170
+ expect(address.errors['zipcode']).not_to include('is invalid')
171
+ end
172
+
173
+ it 'does not have an iso' do
174
+ allow(address.country).to receive(:iso).and_return(nil)
175
+ address.valid?
176
+ expect(address.errors['zipcode']).not_to include('is invalid')
177
+ end
178
+
179
+ it 'does not have a zipcode' do
180
+ address.zipcode = ""
181
+ address.valid?
182
+ expect(address.errors['zipcode']).not_to include('is invalid')
183
+ end
184
+
185
+ it 'does not have a supported country iso' do
186
+ allow(address.country).to receive(:iso).and_return('BO')
187
+ address.valid?
188
+ expect(address.errors['zipcode']).not_to include('is invalid')
189
+ end
190
+ end
191
+ end
192
+
193
+ context "phone not required" do
194
+ before { allow(address).to receive_messages require_phone?: false }
195
+
196
+ it "shows no errors when phone is blank" do
197
+ address.phone = ""
198
+ address.valid?
199
+ expect(address.errors[:phone].size).to eq 0
200
+ end
201
+ end
202
+
203
+ context "zipcode not required" do
204
+ before { allow(address).to receive_messages require_zipcode?: false }
205
+
206
+ it "shows no errors when phone is blank" do
207
+ address.zipcode = ""
208
+ address.valid?
209
+ expect(address.errors[:zipcode].size).to eq 0
210
+ end
211
+ end
212
+ end
213
+
214
+ context ".default" do
215
+ context "no user given" do
216
+ before do
217
+ @default_country_id = Spree::Config[:default_country_id]
218
+ new_country = create(:country)
219
+ Spree::Config[:default_country_id] = new_country.id
220
+ end
221
+
222
+ after do
223
+ Spree::Config[:default_country_id] = @default_country_id
224
+ end
225
+
226
+ it "sets up a new record with Spree::Config[:default_country_id]" do
227
+ expect(Spree::Address.default.country).to eq(Spree::Country.find(Spree::Config[:default_country_id]))
228
+ end
229
+
230
+ # Regression test for #1142
231
+ it "uses the first available country if :default_country_id is set to an invalid value" do
232
+ Spree::Config[:default_country_id] = "0"
233
+ expect(Spree::Address.default.country).to eq(Spree::Country.first)
234
+ end
235
+ end
236
+
237
+ context "user given" do
238
+ let(:bill_address) { Spree::Address.new(phone: Time.current.to_i) }
239
+ let(:ship_address) { double("ShipAddress") }
240
+ let(:user) { double("User", bill_address: bill_address, ship_address: ship_address) }
241
+
242
+ it "returns a copy of that user bill address" do
243
+ expect(Spree::Address.default(user).phone).to eq bill_address.phone
244
+ end
245
+
246
+ it "falls back to build default when user has no address" do
247
+ allow(user).to receive_messages(bill_address: nil)
248
+ expect(Spree::Address.default(user)).to eq Spree::Address.build_default
249
+ end
250
+ end
251
+ end
252
+
253
+ context '#full_name' do
254
+ context 'both first and last names are present' do
255
+ let(:address) { stub_model(Spree::Address, firstname: 'Michael', lastname: 'Jackson') }
256
+ specify { expect(address.full_name).to eq('Michael Jackson') }
257
+ end
258
+
259
+ context 'first name is blank' do
260
+ let(:address) { stub_model(Spree::Address, firstname: nil, lastname: 'Jackson') }
261
+ specify { expect(address.full_name).to eq('Jackson') }
262
+ end
263
+
264
+ context 'last name is blank' do
265
+ let(:address) { stub_model(Spree::Address, firstname: 'Michael', lastname: nil) }
266
+ specify { expect(address.full_name).to eq('Michael') }
267
+ end
268
+
269
+ context 'both first and last names are blank' do
270
+ let(:address) { stub_model(Spree::Address, firstname: nil, lastname: nil) }
271
+ specify { expect(address.full_name).to eq('') }
272
+ end
273
+
274
+ end
275
+
276
+ context '#state_text' do
277
+ context 'state is blank' do
278
+ let(:address) { stub_model(Spree::Address, state: nil, state_name: 'virginia') }
279
+ specify { expect(address.state_text).to eq('virginia') }
280
+ end
281
+
282
+ context 'both name and abbr is present' do
283
+ let(:state) { stub_model(Spree::State, name: 'virginia', abbr: 'va') }
284
+ let(:address) { stub_model(Spree::Address, state: state) }
285
+ specify { expect(address.state_text).to eq('va') }
286
+ end
287
+
288
+ context 'only name is present' do
289
+ let(:state) { stub_model(Spree::State, name: 'virginia', abbr: nil) }
290
+ let(:address) { stub_model(Spree::Address, state: state) }
291
+ specify { expect(address.state_text).to eq('virginia') }
292
+ end
293
+ end
294
+
295
+ context "defines require_phone? helper method" do
296
+ let(:address) { stub_model(Spree::Address) }
297
+ specify { expect(address.instance_eval{ require_phone? }).to be true}
298
+ end
299
+
300
+ context '#clear_state_entities' do
301
+ let (:address) { create(:address) }
302
+ before { address.state_name = 'maryland' }
303
+
304
+ it { expect { address.send(:clear_state_entities) }.to change { address.state }.to(nil).from(address.state) }
305
+ it { expect { address.send(:clear_state_entities) }.to change { address.state_name }.to(nil).from('maryland') }
306
+ end
307
+
308
+ context '#clear_state' do
309
+ let (:address) { create(:address) }
310
+ before { address.state_name = 'maryland' }
311
+
312
+ it { expect { address.send(:clear_state) }.to change { address.state }.to(nil).from(address.state) }
313
+ it { expect { address.send(:clear_state) }.to_not change(address, :state_name) }
314
+ end
315
+
316
+ context '#clear_state_name' do
317
+ let (:address) { create(:address) }
318
+ before { address.state_name = 'maryland' }
319
+
320
+ it { expect { address.send(:clear_state_name) }.to_not change(address, :state_id) }
321
+ it { expect { address.send(:clear_state_name) }.to change { address.state_name }.to(nil).from('maryland') }
322
+ end
323
+
324
+ context '#clear_invalid_state_entities' do
325
+ let(:country) { create(:country) }
326
+ let(:state) { create(:state, country: country) }
327
+ let (:address) { create(:address, country: country, state: state) }
328
+
329
+ def clear_state_entities
330
+ address.send(:clear_invalid_state_entities)
331
+ end
332
+
333
+ context 'state not present and state_name both not present' do
334
+ before do
335
+ address.state = nil
336
+ address.state_name = nil
337
+ clear_state_entities
338
+ end
339
+
340
+ it { expect(address.state).to be_nil }
341
+ it { expect(address.state_name).to be_nil }
342
+ end
343
+
344
+ context 'state_name not present and state present ' do
345
+ before { address.state_name = nil }
346
+
347
+ context 'state belongs to a different country than to which address is associated' do
348
+ before do
349
+ address.country = create(:country)
350
+ clear_state_entities
351
+ end
352
+
353
+ it { expect(address.state).to be_nil }
354
+ it { expect(address.state_name).to be_nil }
355
+ end
356
+
357
+ context 'state belongs to the same country associated with address' do
358
+ before { clear_state_entities }
359
+ it { expect(address.state).to eq(state) }
360
+ it { expect(address.state_name).to be_nil }
361
+ end
362
+ end
363
+
364
+ context 'state not present and state_name present' do
365
+ before do
366
+ address.state = nil
367
+ address.state_name = state.name
368
+ end
369
+
370
+ context 'when country has no states and state is required' do
371
+ before do
372
+ address.country = create(:country, states_required: true)
373
+ clear_state_entities
374
+ end
375
+
376
+ it { expect(address.state).to be_nil }
377
+ it { expect(address.state_name).to eq(state.name) }
378
+ end
379
+
380
+ context 'when country has states' do
381
+ before do
382
+ address.state_name = state.name
383
+ clear_state_entities
384
+ end
385
+
386
+ it { expect(address.state).to be_nil }
387
+ it { expect(address.state_name).to eq(state.name) }
388
+ end
389
+
390
+ context 'when country has no states and state is not required' do
391
+ before do
392
+ address.country = create(:country, states_required: false)
393
+ address.state_name = state.name
394
+ clear_state_entities
395
+ end
396
+
397
+ it { expect(address.state).to be_nil }
398
+ it { expect(address.state_name).to be_nil }
399
+ end
400
+ end
401
+ end
402
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Adjustable::Adjuster::Base, type: :model do
4
+ let(:line_item) { create(:line_item) }
5
+ let(:subject) { Spree::Adjustable::Adjuster::Base }
6
+
7
+ it "raises missing update method" do
8
+ expect { subject.adjust(line_item, {}) }.to raise_error(NotImplementedError)
9
+ end
10
+ end
@@ -0,0 +1,211 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Adjustable::Adjuster::Promotion, type: :model do
4
+ let(:order) { create :order_with_line_items, line_items_count: 1 }
5
+ let(:line_item) { order.line_items.first }
6
+ let(:subject) { Spree::Adjustable::AdjustmentsUpdater.new(line_item) }
7
+ let(:order_subject) { Spree::Adjustable::AdjustmentsUpdater.new(order) }
8
+
9
+ context "best promotion is always applied" do
10
+ let(:calculator) { Spree::Calculator::FlatRate.new(preferred_amount: 10) }
11
+ let(:source) { Spree::Promotion::Actions::CreateItemAdjustments.create calculator: calculator }
12
+
13
+ def create_adjustment(label, amount)
14
+ create(:adjustment,
15
+ order: order,
16
+ adjustable: line_item,
17
+ source: source,
18
+ amount: amount,
19
+ state: "closed",
20
+ label: label,
21
+ mandatory: false)
22
+ end
23
+
24
+ describe "competing promos" do
25
+ before { Spree::Adjustment.competing_promos_source_types = ['Spree::PromotionAction', 'Custom'] }
26
+
27
+ it "do not update promo_total" do
28
+ create(:adjustment,
29
+ order: order,
30
+ adjustable: line_item,
31
+ source_type: 'Custom',
32
+ source_id: nil,
33
+ amount: -3.50,
34
+ label: "Other",
35
+ mandatory: false)
36
+ create_adjustment("Promotion A", -2.50)
37
+
38
+ subject.update
39
+ expect(line_item.promo_total).to eql 0.0
40
+ end
41
+ end
42
+
43
+ it "should use only the most valuable promotion" do
44
+ create_adjustment("Promotion A", -100)
45
+ create_adjustment("Promotion B", -200)
46
+ create_adjustment("Promotion C", -300)
47
+ create(:adjustment,
48
+ order: order,
49
+ adjustable: line_item,
50
+ source: nil,
51
+ amount: -500,
52
+ state: "closed",
53
+ label: "Some other credit")
54
+ line_item.adjustments.each { |a| a.update_column(:eligible, true) }
55
+
56
+ subject.update
57
+
58
+ expect(line_item.adjustments.promotion.eligible.count).to eq(1)
59
+ expect(line_item.adjustments.promotion.eligible.first.label).to eq('Promotion C')
60
+ end
61
+
62
+ it "should choose the most recent promotion adjustment when amounts are equal" do
63
+ # Using Timecop is a regression test
64
+ Timecop.freeze do
65
+ create_adjustment("Promotion A", -200)
66
+ create_adjustment("Promotion B", -200)
67
+ end
68
+ line_item.adjustments.each { |a| a.update_column(:eligible, true) }
69
+
70
+ subject.update
71
+
72
+ expect(line_item.adjustments.promotion.eligible.count).to eq(1)
73
+ expect(line_item.adjustments.promotion.eligible.first.label).to eq('Promotion B')
74
+ end
75
+
76
+ context "when previously ineligible promotions become available" do
77
+ let(:order_promo1) do
78
+ create(:promotion,
79
+ :with_order_adjustment,
80
+ :with_item_total_rule,
81
+ weighted_order_adjustment_amount: 5,
82
+ item_total_threshold_amount: 10)
83
+ end
84
+
85
+ let(:order_promo2) do
86
+ create(:promotion,
87
+ :with_order_adjustment,
88
+ :with_item_total_rule,
89
+ weighted_order_adjustment_amount: 10,
90
+ item_total_threshold_amount: 20)
91
+ end
92
+
93
+ let(:order_promos) { [order_promo1, order_promo2] }
94
+
95
+ let(:line_item_promo1) do
96
+ create(:promotion,
97
+ :with_line_item_adjustment,
98
+ :with_item_total_rule,
99
+ adjustment_rate: 2.5,
100
+ item_total_threshold_amount: 10)
101
+ end
102
+
103
+ let(:line_item_promo2) do
104
+ create(:promotion,
105
+ :with_line_item_adjustment,
106
+ :with_item_total_rule,
107
+ adjustment_rate: 5,
108
+ item_total_threshold_amount: 20)
109
+ end
110
+
111
+ let(:line_item_promos) { [line_item_promo1, line_item_promo2] }
112
+ let(:order) { create(:order_with_line_items, line_items_count: 1) }
113
+
114
+ # Apply promotions in different sequences. Results should be the same.
115
+ promo_sequences = [[0, 1], [1, 0]]
116
+
117
+ promo_sequences.each do |promo_sequence|
118
+ it "should pick the best order-level promo according to current eligibility" do
119
+ # apply both promos to the order, even though only promo1 is eligible
120
+ order_promos[promo_sequence[0]].activate order: order
121
+ order_promos[promo_sequence[1]].activate order: order
122
+
123
+ order.reload
124
+ msg = "Expected two adjustments (using sequence #{promo_sequence})"
125
+ expect(order.all_adjustments.count).to eq(2), msg
126
+
127
+ msg = "Expected one elegible adjustment (using sequence #{promo_sequence})"
128
+ expect(order.all_adjustments.eligible.count).to eq(1), msg
129
+
130
+ msg = "Expected promo1 to be used (using sequence #{promo_sequence})"
131
+ expect(order.all_adjustments.eligible.first.source.promotion).to eq(order_promo1), msg
132
+
133
+ order.contents.add create(:variant, price: 10), 1
134
+ order.save
135
+
136
+ order.reload
137
+ msg = "Expected two adjustments (using sequence #{promo_sequence})"
138
+ expect(order.all_adjustments.count).to eq(2), msg
139
+
140
+ msg = "Expected one elegible adjustment (using sequence #{promo_sequence})"
141
+ expect(order.all_adjustments.eligible.count).to eq(1), msg
142
+
143
+ msg = "Expected promo2 to be used (using sequence #{promo_sequence})"
144
+ expect(order.all_adjustments.eligible.first.source.promotion).to eq(order_promo2), msg
145
+ end
146
+ end
147
+
148
+ promo_sequences.each do |promo_sequence|
149
+ it "should pick the best line-item-level promo according to current eligibility" do
150
+ # apply both promos to the order, even though only promo1 is eligible
151
+ line_item_promos[promo_sequence[0]].activate order: order
152
+ line_item_promos[promo_sequence[1]].activate order: order
153
+
154
+ order.reload
155
+ msg = "Expected one adjustment (using sequence #{promo_sequence})"
156
+ expect(order.all_adjustments.count).to eq(1), msg
157
+
158
+ msg = "Expected one elegible adjustment (using sequence #{promo_sequence})"
159
+ expect(order.all_adjustments.eligible.count).to eq(1), msg
160
+
161
+ # line_item_promo1 is the only one that has thus far met the order total threshold,
162
+ # it is the only promo which should be applied.
163
+ msg = "Expected line_item_promo1 to be used (using sequence #{promo_sequence})"
164
+ expect(order.all_adjustments.first.source.promotion).to eq(line_item_promo1), msg
165
+
166
+ order.contents.add create(:variant, price: 10), 1
167
+ order.save
168
+
169
+ order.reload
170
+ msg = "Expected four adjustments (using sequence #{promo_sequence})"
171
+ expect(order.all_adjustments.count).to eq(4), msg
172
+
173
+ msg = "Expected two elegible adjustments (using sequence #{promo_sequence})"
174
+ expect(order.all_adjustments.eligible.count).to eq(2), msg
175
+
176
+ order.all_adjustments.eligible.each do |adjustment|
177
+ msg = "Expected line_item_promo2 to be used (using sequence #{promo_sequence})"
178
+ expect(adjustment.source.promotion).to eq(line_item_promo2), msg
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ context "multiple adjustments and the best one is not eligible" do
185
+ let!(:promo_a) { create_adjustment("Promotion A", -100) }
186
+ let!(:promo_c) { create_adjustment("Promotion C", -300) }
187
+
188
+ before do
189
+ promo_a.update_column(:eligible, true)
190
+ promo_c.update_column(:eligible, false)
191
+ end
192
+
193
+ # regression for #3274
194
+ it "still makes the previous best eligible adjustment valid" do
195
+ subject.update
196
+ expect(line_item.adjustments.promotion.eligible.first.label).to eq('Promotion A')
197
+ end
198
+ end
199
+
200
+ it "should only leave one adjustment even if 2 have the same amount" do
201
+ create_adjustment("Promotion A", -100)
202
+ create_adjustment("Promotion B", -200)
203
+ create_adjustment("Promotion C", -200)
204
+
205
+ subject.update
206
+
207
+ expect(line_item.adjustments.promotion.eligible.count).to eq(1)
208
+ expect(line_item.adjustments.promotion.eligible.first.amount.to_i).to eq(-200)
209
+ end
210
+ end
211
+ end