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,770 @@
1
+ require 'spec_helper'
2
+ require 'spree/testing_support/order_walkthrough'
3
+
4
+ describe Spree::Order, type: :model do
5
+ let(:order) { Spree::Order.new }
6
+
7
+ before { create(:store) }
8
+
9
+ def assert_state_changed(order, from, to)
10
+ state_change_exists = order.state_changes.where(previous_state: from, next_state: to).exists?
11
+ assert state_change_exists, "Expected order to transition from #{from} to #{to}, but didn't."
12
+ end
13
+
14
+ context "with default state machine" do
15
+ let(:transitions) do
16
+ [
17
+ { address: :delivery },
18
+ { delivery: :payment },
19
+ { payment: :confirm },
20
+ { confirm: :complete },
21
+ { payment: :complete },
22
+ { delivery: :complete }
23
+ ]
24
+ end
25
+
26
+ it "has the following transitions" do
27
+ transitions.each do |transition|
28
+ transition = Spree::Order.find_transition(from: transition.keys.first, to: transition.values.first)
29
+ expect(transition).not_to be_nil
30
+ end
31
+ end
32
+
33
+ it "does not have a transition from delivery to confirm" do
34
+ transition = Spree::Order.find_transition(from: :delivery, to: :confirm)
35
+ expect(transition).to be_nil
36
+ end
37
+
38
+ it '.find_transition when contract was broken' do
39
+ expect(Spree::Order.find_transition({foo: :bar, baz: :dog})).to be_falsey
40
+ end
41
+
42
+ it '.remove_transition' do
43
+ options = {from: transitions.first.keys.first, to: transitions.first.values.first}
44
+ expect(Spree::Order).to receive_messages(
45
+ removed_transitions: [],
46
+ next_event_transitions: transitions.dup
47
+ )
48
+ expect(Spree::Order.remove_transition(options)).to be_truthy
49
+ expect(Spree::Order.removed_transitions).to eql([options])
50
+ expect(Spree::Order.next_event_transitions).to_not include(transitions.first)
51
+ end
52
+
53
+ it '.remove_transition when contract was broken' do
54
+ expect(Spree::Order.remove_transition(nil)).to be_falsey
55
+ end
56
+
57
+ it "always return integer on checkout_step_index" do
58
+ expect(order.checkout_step_index("imnotthere")).to be_a Integer
59
+ expect(order.checkout_step_index("delivery")).to be > 0
60
+ end
61
+
62
+ it "passes delivery state when transitioning from address over delivery to payment" do
63
+ allow(order).to receive_messages payment_required?: true
64
+ order.state = "address"
65
+ expect(order.passed_checkout_step?("delivery")).to be false
66
+ order.state = "delivery"
67
+ expect(order.passed_checkout_step?("delivery")).to be false
68
+ order.state = "payment"
69
+ expect(order.passed_checkout_step?("delivery")).to be true
70
+ end
71
+
72
+ context "#checkout_steps" do
73
+ context "when confirmation not required" do
74
+ before do
75
+ allow(order).to receive_messages confirmation_required?: false
76
+ allow(order).to receive_messages payment_required?: true
77
+ end
78
+
79
+ specify do
80
+ expect(order.checkout_steps).to eq(%w(address delivery payment complete))
81
+ end
82
+ end
83
+
84
+ context "when confirmation required" do
85
+ before do
86
+ allow(order).to receive_messages confirmation_required?: true
87
+ allow(order).to receive_messages payment_required?: true
88
+ end
89
+
90
+ specify do
91
+ expect(order.checkout_steps).to eq(%w(address delivery payment confirm complete))
92
+ end
93
+ end
94
+
95
+ context "when payment not required" do
96
+ before { allow(order).to receive_messages payment_required?: false }
97
+ specify do
98
+ expect(order.checkout_steps).to eq(%w(address delivery complete))
99
+ end
100
+ end
101
+
102
+ context "when payment required" do
103
+ before { allow(order).to receive_messages payment_required?: true }
104
+ specify do
105
+ expect(order.checkout_steps).to eq(%w(address delivery payment complete))
106
+ end
107
+ end
108
+ end
109
+
110
+ it "starts out at cart" do
111
+ expect(order.state).to eq("cart")
112
+ end
113
+
114
+ context "to address" do
115
+ before do
116
+ order.email = "user@example.com"
117
+ order.save!
118
+ end
119
+
120
+ context "with a line item" do
121
+ before do
122
+ order.line_items << FactoryGirl.create(:line_item)
123
+ end
124
+
125
+ it "transitions to address" do
126
+ order.next!
127
+ assert_state_changed(order, 'cart', 'address')
128
+ expect(order.state).to eq("address")
129
+ end
130
+
131
+ it "doesn't raise an error if the default address is invalid" do
132
+ order.user = mock_model(Spree::LegacyUser, ship_address: Spree::Address.new, bill_address: Spree::Address.new)
133
+ expect { order.next! }.to_not raise_error
134
+ end
135
+
136
+ context "with default addresses" do
137
+ let(:default_address) { FactoryGirl.create(:address) }
138
+
139
+ before do
140
+ order.user = FactoryGirl.create(:user, "#{address_kind}_address" => default_address)
141
+ order.next!
142
+ order.reload
143
+ end
144
+
145
+ shared_examples "it cloned the default address" do
146
+ it do
147
+ default_attributes = default_address.attributes
148
+ order_attributes = order.send("#{address_kind}_address".to_sym).try(:attributes) || {}
149
+
150
+ expect(order_attributes.except('id', 'created_at', 'updated_at')).to eql(default_attributes.except('id', 'created_at', 'updated_at'))
151
+ end
152
+ end
153
+
154
+ it_behaves_like "it cloned the default address" do
155
+ let(:address_kind) { 'ship' }
156
+ end
157
+
158
+ it_behaves_like "it cloned the default address" do
159
+ let(:address_kind) { 'bill' }
160
+ end
161
+ end
162
+ end
163
+
164
+ it "cannot transition to address without any line items" do
165
+ expect(order.line_items).to be_blank
166
+ expect { order.next! }.to raise_error(StateMachines::InvalidTransition, /#{Spree.t(:there_are_no_items_for_this_order)}/)
167
+ end
168
+ end
169
+
170
+ context "from address" do
171
+ before do
172
+ order.state = 'address'
173
+ allow(order).to receive(:has_available_payment)
174
+ shipment = FactoryGirl.create(:shipment, order: order)
175
+ order.email = "user@example.com"
176
+ order.save!
177
+ end
178
+
179
+ it "updates totals" do
180
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
181
+ line_item = FactoryGirl.create(:line_item, price: 10, adjustment_total: 10)
182
+ line_item.variant.update_attributes!(price: 10)
183
+ order.line_items << line_item
184
+ tax_rate = create(:tax_rate, tax_category: line_item.tax_category, amount: 0.05)
185
+ allow(Spree::TaxRate).to receive_messages match: [tax_rate]
186
+ FactoryGirl.create(:tax_adjustment, adjustable: line_item, source: tax_rate, order: order)
187
+ order.email = "user@example.com"
188
+ order.next!
189
+ expect(order.adjustment_total).to eq(0.5)
190
+ expect(order.additional_tax_total).to eq(0.5)
191
+ expect(order.included_tax_total).to eq(0)
192
+ expect(order.total).to eq(10.5)
193
+ end
194
+
195
+ it 'updates prices' do
196
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
197
+ line_item = FactoryGirl.create(:line_item, price: 10, adjustment_total: 10)
198
+ line_item.variant.update_attributes!(price: 20)
199
+ order.line_items << line_item
200
+ tax_rate = create :tax_rate,
201
+ included_in_price: true,
202
+ tax_category: line_item.tax_category,
203
+ amount: 0.05
204
+ allow(Spree::TaxRate).to receive_messages(match: [tax_rate])
205
+ FactoryGirl.create :tax_adjustment,
206
+ adjustable: line_item,
207
+ source: tax_rate,
208
+ order: order
209
+ order.email = "user@example.com"
210
+ order.next!
211
+ expect(order.adjustment_total).to eq(0)
212
+ expect(order.additional_tax_total).to eq(0)
213
+ expect(order.included_tax_total).to eq(0.95)
214
+ expect(order.total).to eq(20)
215
+ end
216
+
217
+ it "transitions to delivery" do
218
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
219
+ order.next!
220
+ assert_state_changed(order, 'address', 'delivery')
221
+ expect(order.state).to eq("delivery")
222
+ end
223
+
224
+ it "does not call persist_order_address if there is no address on the order" do
225
+ # otherwise, it will crash
226
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
227
+
228
+ order.user = FactoryGirl.create(:user)
229
+ order.save!
230
+
231
+ expect(order.user).to_not receive(:persist_order_address).with(order)
232
+ order.next!
233
+ end
234
+
235
+ it "calls persist_order_address on the order's user" do
236
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
237
+
238
+ order.user = FactoryGirl.create(:user)
239
+ order.ship_address = FactoryGirl.create(:address)
240
+ order.bill_address = FactoryGirl.create(:address)
241
+ order.save!
242
+
243
+ expect(order.user).to receive(:persist_order_address).with(order)
244
+ order.next!
245
+ end
246
+
247
+ it "does not call persist_order_address on the order's user for a temporary address" do
248
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
249
+
250
+ order.user = FactoryGirl.create(:user)
251
+ order.temporary_address = true
252
+ order.save!
253
+
254
+ expect(order.user).to_not receive(:persist_order_address)
255
+ order.next!
256
+ end
257
+
258
+ context "cannot transition to delivery" do
259
+ context "with an existing shipment" do
260
+ before do
261
+ line_item = FactoryGirl.create(:line_item, price: 10)
262
+ order.line_items << line_item
263
+ end
264
+
265
+ context "if there are no shipping rates for any shipment" do
266
+ it "raises an InvalidTransitionError" do
267
+ transition = lambda { order.next! }
268
+ expect(transition).to raise_error(StateMachines::InvalidTransition, /#{Spree.t(:items_cannot_be_shipped)}/)
269
+ end
270
+
271
+ it "deletes all the shipments" do
272
+ order.next
273
+ expect(order.shipments).to be_empty
274
+ end
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ context "to delivery" do
281
+ context 'when order has default selected_shipping_rate_id' do
282
+ let(:shipment) { create(:shipment, order: order) }
283
+ let(:shipping_method) { create(:shipping_method) }
284
+ let(:shipping_rate) { [
285
+ Spree::ShippingRate.create!(shipping_method: shipping_method, cost: 10.00, shipment: shipment)
286
+ ] }
287
+
288
+ before do
289
+ order.state = 'address'
290
+ shipment.selected_shipping_rate_id = shipping_rate.first.id
291
+ order.email = "user@example.com"
292
+ order.save!
293
+
294
+ allow(order).to receive(:has_available_payment)
295
+ allow(order).to receive(:create_proposed_shipments)
296
+ allow(order).to receive(:ensure_available_shipping_rates) { true }
297
+ end
298
+
299
+ it 'should invoke set_shipment_cost' do
300
+ expect(order).to receive(:set_shipments_cost)
301
+ order.next!
302
+ end
303
+
304
+ it 'should update shipment_total' do
305
+ expect { order.next! }.to change{ order.shipment_total }.by(10.00)
306
+ end
307
+ end
308
+ end
309
+
310
+ context "from delivery" do
311
+ before do
312
+ order.state = 'delivery'
313
+ allow(order).to receive(:apply_free_shipping_promotions)
314
+ end
315
+
316
+ it "attempts to apply free shipping promotions" do
317
+ expect(order).to receive(:apply_free_shipping_promotions)
318
+ order.next!
319
+ end
320
+
321
+ context "with payment required" do
322
+ before do
323
+ allow(order).to receive_messages payment_required?: true
324
+ end
325
+
326
+ it "transitions to payment" do
327
+ expect(order).to receive(:set_shipments_cost)
328
+ order.next!
329
+ assert_state_changed(order, 'delivery', 'payment')
330
+ expect(order.state).to eq('payment')
331
+ end
332
+ end
333
+
334
+ context "without payment required" do
335
+ before do
336
+ allow(order).to receive_messages payment_required?: false
337
+ end
338
+
339
+ it "transitions to complete" do
340
+ order.next!
341
+ expect(order.state).to eq("complete")
342
+ end
343
+ end
344
+
345
+ context "correctly determining payment required based on shipping information" do
346
+ let(:shipment) do
347
+ FactoryGirl.create(:shipment)
348
+ end
349
+
350
+ before do
351
+ # Needs to be set here because we're working with a persisted order object
352
+ order.email = "test@example.com"
353
+ order.save!
354
+ order.shipments << shipment
355
+ end
356
+
357
+ context "with a shipment that has a price" do
358
+ before do
359
+ shipment.shipping_rates.first.update_column(:cost, 10)
360
+ order.set_shipments_cost
361
+ end
362
+
363
+ it "transitions to payment" do
364
+ order.next!
365
+ expect(order.state).to eq("payment")
366
+ end
367
+ end
368
+
369
+ context "with a shipment that is free" do
370
+ before do
371
+ shipment.shipping_rates.first.update_column(:cost, 0)
372
+ order.set_shipments_cost
373
+ end
374
+
375
+ it "skips payment, transitions to complete" do
376
+ order.next!
377
+ expect(order.state).to eq("complete")
378
+ end
379
+ end
380
+ end
381
+ end
382
+
383
+ context "from payment" do
384
+ before do
385
+ order.state = 'payment'
386
+ end
387
+
388
+ context "with confirmation required" do
389
+ before do
390
+ allow(order).to receive_messages confirmation_required?: true
391
+ end
392
+
393
+ it "transitions to confirm" do
394
+ order.next!
395
+ assert_state_changed(order, 'payment', 'confirm')
396
+ expect(order.state).to eq("confirm")
397
+ end
398
+ end
399
+
400
+ context "without confirmation required" do
401
+ before do
402
+ order.email = "spree@example.com"
403
+ allow(order).to receive_messages confirmation_required?: false
404
+ allow(order).to receive_messages payment_required?: true
405
+ order.payments << FactoryGirl.create(:payment, state: payment_state, order: order)
406
+ end
407
+
408
+ context 'when there is at least one valid payment' do
409
+ let(:payment_state) { 'checkout' }
410
+
411
+ context 'line_items are in stock' do
412
+ before do
413
+ expect(order).to receive(:process_payments!).once { true }
414
+ end
415
+
416
+ it "transitions to complete" do
417
+ order.next!
418
+ assert_state_changed(order, 'payment', 'complete')
419
+ expect(order.state).to eq('complete')
420
+ end
421
+ end
422
+
423
+ context 'line_items are not in stock' do
424
+ before do
425
+ expect(order).to receive(:ensure_line_items_are_in_stock).once { false }
426
+ end
427
+
428
+ it 'should not receive process_payments!' do
429
+ expect(order).not_to receive(:process_payments!)
430
+ order.next
431
+ end
432
+
433
+ it 'does not transition to complete' do
434
+ order.next
435
+ expect(order.state).to eq('payment')
436
+ end
437
+ end
438
+ end
439
+
440
+ context 'when there is only an invalid payment' do
441
+ let(:payment_state) { 'failed' }
442
+
443
+ it "raises a StateMachine::InvalidTransition" do
444
+ expect {
445
+ order.next!
446
+ }.to raise_error(StateMachines::InvalidTransition, /#{Spree.t(:no_payment_found)}/)
447
+
448
+ expect(order.errors[:base]).to include(Spree.t(:no_payment_found))
449
+ end
450
+ end
451
+ end
452
+
453
+ # Regression test for #2028
454
+ context "when payment is not required" do
455
+ before do
456
+ allow(order).to receive_messages payment_required?: false
457
+ end
458
+
459
+ it "does not call process payments" do
460
+ expect(order).not_to receive(:process_payments!)
461
+ order.next!
462
+ assert_state_changed(order, 'payment', 'complete')
463
+ expect(order.state).to eq("complete")
464
+ end
465
+ end
466
+ end
467
+ end
468
+
469
+ context "to complete" do
470
+ before do
471
+ order.state = 'confirm'
472
+ order.save!
473
+ end
474
+
475
+ context "default credit card" do
476
+ before do
477
+ order.user = FactoryGirl.create(:user)
478
+ order.email = 'spree@example.org'
479
+ order.payments << FactoryGirl.create(:payment)
480
+
481
+ # make sure we will actually capture a payment
482
+ allow(order).to receive_messages(payment_required?: true)
483
+ order.line_items << FactoryGirl.create(:line_item)
484
+ Spree::OrderUpdater.new(order).update
485
+
486
+ order.save!
487
+ end
488
+
489
+ it "makes the current credit card a user's default credit card" do
490
+ order.next!
491
+ expect(order.state).to eq 'complete'
492
+ expect(order.user.reload.default_credit_card.try(:id)).to eq(order.credit_cards.first.id)
493
+ end
494
+
495
+ it "does not assign a default credit card if temporary_credit_card is set" do
496
+ order.temporary_credit_card = true
497
+ order.next!
498
+ expect(order.user.reload.default_credit_card).to be_nil
499
+ end
500
+ end
501
+ end
502
+
503
+ context "subclassed order" do
504
+ # This causes another test above to fail, but fixing this test should make
505
+ # the other test pass
506
+ class SubclassedOrder < Spree::Order
507
+ checkout_flow do
508
+ go_to_state :payment
509
+ go_to_state :complete
510
+ end
511
+ end
512
+
513
+ skip "should only call default transitions once when checkout_flow is redefined" do
514
+ order = SubclassedOrder.new
515
+ allow(order).to receive_messages payment_required?: true
516
+ expect(order).to receive(:process_payments!).once
517
+ order.state = "payment"
518
+ order.next!
519
+ assert_state_changed(order, 'payment', 'complete')
520
+ expect(order.state).to eq("complete")
521
+ end
522
+ end
523
+
524
+ context "re-define checkout flow" do
525
+ before do
526
+ @old_checkout_flow = Spree::Order.checkout_flow
527
+ Spree::Order.class_eval do
528
+ checkout_flow do
529
+ go_to_state :payment
530
+ go_to_state :complete
531
+ end
532
+ end
533
+ end
534
+
535
+ after do
536
+ Spree::Order.checkout_flow(&@old_checkout_flow)
537
+ end
538
+
539
+ it "should not keep old event transitions when checkout_flow is redefined" do
540
+ expect(Spree::Order.next_event_transitions).to eq([{cart: :payment}, {payment: :complete}])
541
+ end
542
+
543
+ it "should not keep old events when checkout_flow is redefined" do
544
+ state_machine = Spree::Order.state_machine
545
+ expect(state_machine.states.any? { |s| s.name == :address }).to be false
546
+ known_states = state_machine.events[:next].branches.map(&:known_states).flatten
547
+ expect(known_states).not_to include(:address)
548
+ expect(known_states).not_to include(:delivery)
549
+ expect(known_states).not_to include(:confirm)
550
+ end
551
+ end
552
+
553
+ # Regression test for #3665
554
+ context "with only a complete step" do
555
+ before do
556
+ @old_checkout_flow = Spree::Order.checkout_flow
557
+ Spree::Order.class_eval do
558
+ checkout_flow do
559
+ go_to_state :complete
560
+ end
561
+ end
562
+ end
563
+
564
+ after do
565
+ Spree::Order.checkout_flow(&@old_checkout_flow)
566
+ end
567
+
568
+ it "does not attempt to process payments" do
569
+ allow(order).to receive_message_chain(:line_items, :present?) { true }
570
+ allow(order).to receive(:ensure_line_items_are_in_stock) { true }
571
+ allow(order).to receive(:ensure_line_item_variants_are_not_discontinued) { true }
572
+ expect(order).not_to receive(:payment_required?)
573
+ expect(order).not_to receive(:process_payments!)
574
+ order.next!
575
+ assert_state_changed(order, 'cart', 'complete')
576
+ end
577
+
578
+ end
579
+
580
+ context "insert checkout step" do
581
+ before do
582
+ @old_checkout_flow = Spree::Order.checkout_flow
583
+ Spree::Order.class_eval do
584
+ insert_checkout_step :new_step, before: :address
585
+ end
586
+ end
587
+
588
+ after do
589
+ Spree::Order.checkout_flow(&@old_checkout_flow)
590
+ end
591
+
592
+ it "should maintain removed transitions" do
593
+ transition = Spree::Order.find_transition(from: :delivery, to: :confirm)
594
+ expect(transition).to be_nil
595
+ end
596
+
597
+ context "before" do
598
+ before do
599
+ Spree::Order.class_eval do
600
+ insert_checkout_step :before_address, before: :address
601
+ end
602
+ end
603
+
604
+ specify do
605
+ order = Spree::Order.new
606
+ expect(order.checkout_steps).to eq(%w(new_step before_address address delivery complete))
607
+ end
608
+
609
+ it 'goes through checkout without raising error' do
610
+ expect{ OrderWalkthrough.up_to(:complete) }.to_not raise_error
611
+ end
612
+ end
613
+
614
+ context "after" do
615
+ before do
616
+ Spree::Order.class_eval do
617
+ insert_checkout_step :after_address, after: :address
618
+ end
619
+ end
620
+
621
+ specify do
622
+ order = Spree::Order.new
623
+ expect(order.checkout_steps).to eq(%w(new_step address after_address delivery complete))
624
+ end
625
+
626
+ it 'goes through checkout without raising error' do
627
+ expect{ OrderWalkthrough.up_to(:complete) }.to_not raise_error
628
+ end
629
+ end
630
+ end
631
+
632
+ context "remove checkout step" do
633
+ before do
634
+ @old_checkout_flow = Spree::Order.checkout_flow
635
+ Spree::Order.class_eval do
636
+ remove_checkout_step :address
637
+ end
638
+ end
639
+
640
+ after do
641
+ Spree::Order.checkout_flow(&@old_checkout_flow)
642
+ end
643
+
644
+ it "should maintain removed transitions" do
645
+ transition = Spree::Order.find_transition(from: :delivery, to: :confirm)
646
+ expect(transition).to be_nil
647
+ end
648
+
649
+ specify do
650
+ order = Spree::Order.new
651
+ expect(order.checkout_steps).to eq(%w(delivery complete))
652
+ end
653
+ end
654
+
655
+ describe 'update_from_params' do
656
+ let(:permitted_params) { {} }
657
+ let(:params) { {} }
658
+
659
+ it 'calls update_atributes without order params' do
660
+ expect(order).to receive(:update_attributes).with({})
661
+ order.update_from_params( params, permitted_params)
662
+ end
663
+
664
+ it 'runs the callbacks' do
665
+ expect(order).to receive(:run_callbacks).with(:updating_from_params)
666
+ order.update_from_params( params, permitted_params)
667
+ end
668
+
669
+ context "passing a credit card" do
670
+ let(:permitted_params) do
671
+ Spree::PermittedAttributes.checkout_attributes +
672
+ [payments_attributes: Spree::PermittedAttributes.payment_attributes]
673
+ end
674
+
675
+ let(:credit_card) { create(:credit_card, user_id: order.user_id) }
676
+
677
+ let(:params) do
678
+ ActionController::Parameters.new(
679
+ order: { payments_attributes: [{payment_method_id: 1}], existing_card: credit_card.id },
680
+ cvc_confirm: "737",
681
+ payment_source: {
682
+ "1" => { name: "Luis Braga",
683
+ number: "4111 1111 1111 1111",
684
+ expiry: "06 / 2016",
685
+ verification_value: "737",
686
+ cc_type: "" }
687
+ }
688
+ )
689
+ end
690
+
691
+ before { order.user_id = 3 }
692
+
693
+ it "sets confirmation value when its available via :cvc_confirm" do
694
+ allow(Spree::CreditCard).to receive_messages find: credit_card
695
+ expect(credit_card).to receive(:verification_value=)
696
+ order.update_from_params(params, permitted_params)
697
+ end
698
+
699
+ it "sets existing card as source for new payment" do
700
+ expect {
701
+ order.update_from_params(params, permitted_params)
702
+ }.to change { Spree::Payment.count }.by(1)
703
+
704
+ expect(Spree::Payment.last.source).to eq credit_card
705
+ end
706
+
707
+ it "sets request_env on payment" do
708
+ request_env = { "USER_AGENT" => "Firefox" }
709
+
710
+ order.update_from_params(params, permitted_params, request_env)
711
+ expect(order.payments[0].request_env).to eq request_env
712
+ end
713
+
714
+ it "dont let users mess with others users cards" do
715
+ credit_card.update_column :user_id, 5
716
+
717
+ expect {
718
+ order.update_from_params(params, permitted_params)
719
+ }.to raise_error(Spree.t(:invalid_credit_card))
720
+ end
721
+ end
722
+
723
+ context 'has params' do
724
+ let(:permitted_params) { [ :good_param ] }
725
+ let(:params) { ActionController::Parameters.new(order: { bad_param: 'okay' } ) }
726
+
727
+ it 'does not let through unpermitted attributes' do
728
+ expect(order).to receive(:update_attributes).with(ActionController::Parameters.new.permit!)
729
+ order.update_from_params(params, permitted_params)
730
+ end
731
+
732
+ context 'has existing_card param' do
733
+ let(:permitted_params) do
734
+ Spree::PermittedAttributes.checkout_attributes +
735
+ [payments_attributes: Spree::PermittedAttributes.payment_attributes]
736
+ end
737
+ let(:credit_card) { create(:credit_card, user_id: order.user_id) }
738
+ let(:params) do
739
+ ActionController::Parameters.new(
740
+ order: { payments_attributes: [{payment_method_id: 1}], existing_card: credit_card.id }
741
+ )
742
+ end
743
+
744
+ before do
745
+ Dummy::Application.config.action_controller.action_on_unpermitted_parameters = :raise
746
+ order.user_id = 3
747
+ end
748
+
749
+ after do
750
+ Dummy::Application.config.action_controller.action_on_unpermitted_parameters = :log
751
+ end
752
+
753
+ it 'does not attempt to permit existing_card' do
754
+ expect {
755
+ order.update_from_params(params, permitted_params)
756
+ }.not_to raise_error
757
+ end
758
+ end
759
+
760
+ context 'has allowed params' do
761
+ let(:params) { ActionController::Parameters.new(order: { good_param: 'okay' } ) }
762
+
763
+ it 'accepts permitted attributes' do
764
+ expect(order).to receive(:assign_attributes).with(ActionController::Parameters.new("good_param" => 'okay').permit!)
765
+ order.update_from_params(params, permitted_params)
766
+ end
767
+ end
768
+ end
769
+ end
770
+ end