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,212 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order, type: :model do
4
+ let(:order) { Spree::Order.new }
5
+ before do
6
+ # Ensure state machine has been re-defined correctly
7
+ Spree::Order.define_state_machine!
8
+ # We don't care about this validation here
9
+ allow(order).to receive(:require_email)
10
+ end
11
+
12
+ context "#next!" do
13
+ context "when current state is confirm" do
14
+ before do
15
+ order.state = "confirm"
16
+ order.run_callbacks(:create)
17
+ allow(order).to receive_messages payment_required?: true
18
+ allow(order).to receive_messages process_payments!: true
19
+ end
20
+
21
+ context "when payment processing succeeds" do
22
+ before do
23
+ order.payments << FactoryGirl.create(:payment, state: 'checkout', order: order)
24
+ allow(order).to receive_messages process_payments: true
25
+ end
26
+
27
+ it "should finalize order when transitioning to complete state" do
28
+ expect(order).to receive(:finalize!)
29
+ order.next!
30
+ end
31
+
32
+ context "when credit card processing fails" do
33
+ before { allow(order).to receive_messages process_payments!: false }
34
+
35
+ it "should not complete the order" do
36
+ order.next
37
+ expect(order.state).to eq("confirm")
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when payment processing fails" do
43
+ before { allow(order).to receive_messages process_payments!: false }
44
+
45
+ it "cannot transition to complete" do
46
+ order.next
47
+ expect(order.state).to eq("confirm")
48
+ end
49
+ end
50
+ end
51
+
52
+ context "when current state is delivery" do
53
+ before do
54
+ allow(order).to receive_messages payment_required?: true
55
+ allow(order).to receive :apply_free_shipping_promotions
56
+ order.state = "delivery"
57
+ end
58
+
59
+ it "adjusts tax rates when transitioning to delivery" do
60
+ # Once for the line items
61
+ expect(Spree::TaxRate).to receive(:adjust).once
62
+ allow(order).to receive :set_shipments_cost
63
+ order.next!
64
+ end
65
+
66
+ it "adjusts tax rates twice if there are any shipments" do
67
+ # Once for the line items, once for the shipments
68
+ order.shipments.build stock_location: create(:stock_location)
69
+ expect(Spree::TaxRate).to receive(:adjust).twice
70
+ allow(order).to receive :set_shipments_cost
71
+ order.next!
72
+ end
73
+ end
74
+ end
75
+
76
+ context "#can_cancel?" do
77
+ %w(pending backorder ready).each do |shipment_state|
78
+ it "should be true if shipment_state is #{shipment_state}" do
79
+ allow(order).to receive_messages completed?: true
80
+ order.shipment_state = shipment_state
81
+ expect(order.can_cancel?).to be true
82
+ end
83
+ end
84
+
85
+ (Spree::Shipment.state_machine.states.keys - [:pending, :backorder, :ready]).each do |shipment_state|
86
+ it "should be false if shipment_state is #{shipment_state}" do
87
+ allow(order).to receive_messages completed?: true
88
+ order.shipment_state = shipment_state
89
+ expect(order.can_cancel?).to be false
90
+ end
91
+ end
92
+ end
93
+
94
+ context "#cancel" do
95
+ let!(:variant) { stub_model(Spree::Variant) }
96
+ let!(:inventory_units) { [stub_model(Spree::InventoryUnit, variant: variant),
97
+ stub_model(Spree::InventoryUnit, variant: variant)] }
98
+ let!(:shipment) do
99
+ shipment = stub_model(Spree::Shipment)
100
+ allow(shipment).to receive_messages inventory_units: inventory_units, order: order
101
+ allow(order).to receive_messages shipments: [shipment]
102
+ shipment
103
+ end
104
+
105
+ before do
106
+ 2.times do
107
+ create(:line_item, order: order, price: 10)
108
+ end
109
+
110
+ allow(order.line_items).to receive_messages find_by_variant_id: order.line_items.first
111
+
112
+ allow(order).to receive_messages completed?: true
113
+ allow(order).to receive_messages allow_cancel?: true
114
+
115
+ shipments = [shipment]
116
+ allow(order).to receive_messages shipments: shipments
117
+ allow(shipments).to receive_messages states: []
118
+ allow(shipments).to receive_messages ready: []
119
+ allow(shipments).to receive_messages pending: []
120
+ allow(shipments).to receive_messages shipped: []
121
+ allow(shipments).to receive(:sum).with(:cost).and_return(shipment.cost)
122
+
123
+ allow_any_instance_of(Spree::OrderUpdater).to receive(:update_adjustment_total) { 10 }
124
+ end
125
+
126
+ it "should send a cancel email" do
127
+ # Stub methods that cause side-effects in this test
128
+ allow(shipment).to receive(:cancel!)
129
+ allow(order).to receive :restock_items!
130
+ mail_message = double "Mail::Message"
131
+ order_id = nil
132
+ expect(Spree::OrderMailer).to receive(:cancel_email) { |*args|
133
+ order_id = args[0]
134
+ mail_message
135
+ }
136
+ expect(mail_message).to receive :deliver_later
137
+ order.cancel!
138
+ expect(order_id).to eq(order.id)
139
+ end
140
+
141
+ context "restocking inventory" do
142
+ before do
143
+ allow(shipment).to receive(:ensure_correct_adjustment)
144
+ allow(shipment).to receive(:update_order)
145
+ allow(Spree::OrderMailer).to receive(:cancel_email).and_return(mail_message = double)
146
+ allow(mail_message).to receive :deliver_later
147
+
148
+ end
149
+ end
150
+
151
+ context "resets payment state" do
152
+ let(:payment) { create(:payment, amount: order.total) }
153
+
154
+ before do
155
+ # TODO: This is ugly :(
156
+ # Stubs methods that cause unwanted side effects in this test
157
+ allow(Spree::OrderMailer).to receive(:cancel_email).and_return(mail_message = double)
158
+ allow(mail_message).to receive :deliver_later
159
+ allow(order).to receive :restock_items!
160
+ allow(shipment).to receive(:cancel!)
161
+ allow(payment).to receive(:cancel!)
162
+ allow(order).to receive_message_chain(:payments, :valid, :size).and_return(1)
163
+ allow(order).to receive_message_chain(:payments, :completed).and_return([payment])
164
+ allow(order).to receive_message_chain(:payments, :completed, :includes).and_return([payment])
165
+ allow(order).to receive_message_chain(:payments, :last).and_return(payment)
166
+ allow(order).to receive_message_chain(:payments, :store_credits, :pending).and_return([])
167
+ end
168
+
169
+ context "without shipped items" do
170
+ it "should set payment state to 'void'" do
171
+ expect { order.cancel! }.to change{ order.reload.payment_state }.to("void")
172
+ end
173
+ end
174
+
175
+ context "with shipped items" do
176
+ before do
177
+ allow(order).to receive_messages shipment_state: 'partial'
178
+ allow(order).to receive_messages outstanding_balance?: false
179
+ allow(order).to receive_messages payment_state: "paid"
180
+ end
181
+
182
+ it "should not alter the payment state" do
183
+ order.cancel!
184
+ expect(order.payment_state).to eql "paid"
185
+ end
186
+ end
187
+
188
+ context "with payments" do
189
+ let(:payment) { create(:payment) }
190
+
191
+ it "should automatically refund all payments" do
192
+ allow(order).to receive_message_chain(:payments, :valid, :size).and_return(1)
193
+ allow(order).to receive_message_chain(:payments, :completed).and_return([payment])
194
+ allow(order).to receive_message_chain(:payments, :completed, :includes).and_return([payment])
195
+ allow(order).to receive_message_chain(:payments, :last).and_return(payment)
196
+ expect(payment).to receive(:cancel!)
197
+ order.cancel!
198
+ end
199
+ end
200
+ end
201
+ end
202
+
203
+ # Another regression test for #729
204
+ context "#resume" do
205
+ before do
206
+ allow(order).to receive_messages email: "user@spreecommerce.org"
207
+ allow(order).to receive_messages state: "canceled"
208
+ allow(order).to receive_messages allow_resume?: true
209
+
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,426 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples "check total store credit from payments" do
4
+ context 'with valid payments' do
5
+ let(:order) { payment.order }
6
+ let!(:payment) { create(:store_credit_payment) }
7
+ let!(:second_payment) { create(:store_credit_payment, order: order) }
8
+
9
+ subject { order }
10
+
11
+ it 'returns the sum of the payment amounts' do
12
+ expect(subject.total_applicable_store_credit).to eq (payment.amount + second_payment.amount)
13
+ end
14
+ end
15
+
16
+ context 'without valid payments' do
17
+ let(:order) { create(:order) }
18
+
19
+ subject { order }
20
+
21
+ it 'returns 0' do
22
+ expect(subject.total_applicable_store_credit).to be_zero
23
+ end
24
+ end
25
+ end
26
+
27
+ describe 'Order' do
28
+ describe '#add_store_credit_payments' do
29
+ let(:order_total) { 500.00 }
30
+
31
+ before { create(:store_credit_payment_method) }
32
+
33
+ subject { order.add_store_credit_payments }
34
+
35
+ context 'there is no store credit' do
36
+ let(:order) { create(:store_credits_order_without_user, total: order_total) }
37
+
38
+ before do
39
+ # callbacks recalculate total based on line items
40
+ # this ensures the total is what we expect
41
+ order.update_column(:total, order_total)
42
+ subject
43
+ order.reload
44
+ end
45
+
46
+ it 'does not create a store credit payment' do
47
+ expect(order.payments.count).to eq 0
48
+ end
49
+ end
50
+
51
+ context 'there is enough store credit to pay for the entire order' do
52
+ let(:store_credit) { create(:store_credit, amount: order_total) }
53
+ let(:order) { create(:order, user: store_credit.user, total: order_total) }
54
+
55
+ before do
56
+ subject
57
+ order.reload
58
+ end
59
+
60
+ it 'creates a store credit payment for the full amount' do
61
+ expect(order.payments.count).to eq 1
62
+ expect(order.payments.first).to be_store_credit
63
+ expect(order.payments.first.amount).to eq order_total
64
+ end
65
+ end
66
+
67
+ context 'the available store credit is not enough to pay for the entire order' do
68
+ let(:expected_cc_total) { 100.0 }
69
+ let(:store_credit_total) { order_total - expected_cc_total }
70
+ let(:store_credit) { create(:store_credit, amount: store_credit_total) }
71
+ let(:order) { create(:order, user: store_credit.user, total: order_total) }
72
+
73
+ before do
74
+ # callbacks recalculate total based on line items
75
+ # this ensures the total is what we expect
76
+ order.update_column(:total, order_total)
77
+ subject
78
+ order.reload
79
+ end
80
+
81
+ it 'creates a store credit payment for the available amount' do
82
+ expect(order.payments.count).to eq 1
83
+ expect(order.payments.first).to be_store_credit
84
+ expect(order.payments.first.amount).to eq store_credit_total
85
+ end
86
+ end
87
+
88
+ context 'there are multiple store credits' do
89
+ context 'they have different credit type priorities' do
90
+ let(:amount_difference) { 100 }
91
+ let!(:primary_store_credit) { create(:store_credit, amount: (order_total - amount_difference)) }
92
+ let!(:secondary_store_credit) do
93
+ create(:store_credit, amount: order_total, user: primary_store_credit.user,
94
+ credit_type: create(:secondary_credit_type))
95
+ end
96
+ let(:order) { create(:order, user: primary_store_credit.user, total: order_total) }
97
+
98
+ before do
99
+ Timecop.scale(3600)
100
+ subject
101
+ order.reload
102
+ end
103
+
104
+ after { Timecop.return }
105
+
106
+ it 'uses the primary store credit type over the secondary' do
107
+ primary_payment = order.payments.first
108
+ secondary_payment = order.payments.last
109
+
110
+ expect(order.payments.size).to eq 2
111
+ expect(primary_payment.source).to eq primary_store_credit
112
+ expect(secondary_payment.source).to eq secondary_store_credit
113
+ expect(primary_payment.amount).to eq(order_total - amount_difference)
114
+ expect(secondary_payment.amount).to eq(amount_difference)
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ describe '#covered_by_store_credit' do
121
+ context "order doesn't have an associated user" do
122
+ subject { create(:store_credits_order_without_user) }
123
+
124
+ it 'returns false' do
125
+ expect(subject.covered_by_store_credit).to be false
126
+ end
127
+ end
128
+
129
+ context 'order has an associated user' do
130
+ let(:user) { create(:user) }
131
+
132
+ subject { create(:order, user: user) }
133
+
134
+ context 'user has enough store credit to pay for the order' do
135
+ before do
136
+ allow(user).to receive(:total_available_store_credit).and_return(10.0)
137
+ allow(subject).to receive(:total).and_return(5.0)
138
+ end
139
+
140
+ it 'returns true' do
141
+ expect(subject.covered_by_store_credit).to be true
142
+ end
143
+ end
144
+
145
+ context 'user does not have enough store credit to pay for the order' do
146
+ before do
147
+ allow(user).to receive(:total_available_store_credit).and_return(0.0)
148
+ allow(subject).to receive(:total).and_return(5.0)
149
+ end
150
+
151
+ it 'returns false' do
152
+ expect(subject.covered_by_store_credit).to be false
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ describe '#total_available_store_credit' do
159
+ context 'order does not have an associated user' do
160
+ subject { create(:store_credits_order_without_user) }
161
+
162
+ it 'returns 0' do
163
+ expect(subject.total_available_store_credit).to be_zero
164
+ end
165
+ end
166
+
167
+ context 'order has an associated user' do
168
+ let(:user) { create(:user) }
169
+ let(:available_store_credit) { 25.0 }
170
+
171
+ subject { create(:order, user: user) }
172
+
173
+ before do
174
+ allow(user).to receive(:total_available_store_credit).and_return(available_store_credit)
175
+ end
176
+
177
+ it "returns the user's available store credit" do
178
+ expect(subject.total_available_store_credit).to eq available_store_credit
179
+ end
180
+ end
181
+ end
182
+
183
+ describe '#could_use_store_credit?' do
184
+ context 'order does not have an associated user' do
185
+ subject { create(:store_credits_order_without_user) }
186
+
187
+ it { expect(subject.could_use_store_credit?).to be false }
188
+ end
189
+
190
+ context 'order has an associated user' do
191
+ let(:user) { create(:user) }
192
+
193
+ subject { create(:order, user: user) }
194
+
195
+ context 'without store credit' do
196
+ it { expect(subject.could_use_store_credit?).to be false }
197
+ end
198
+
199
+ context 'with store credit' do
200
+ let(:available_store_credit) { 25.0 }
201
+
202
+ before do
203
+ allow(user).to receive(:total_available_store_credit).and_return(available_store_credit)
204
+ end
205
+
206
+ it { expect(subject.could_use_store_credit?).to be true }
207
+ end
208
+ end
209
+ end
210
+
211
+ describe '#order_total_after_store_credit' do
212
+ let(:order_total) { 100.0 }
213
+
214
+ subject { create(:order, total: order_total) }
215
+
216
+ before do
217
+ allow(subject).to receive(:total_applicable_store_credit).and_return(applicable_store_credit)
218
+ end
219
+
220
+ context "order's user has store credits" do
221
+ let(:applicable_store_credit) { 10.0 }
222
+
223
+ it 'deducts the applicable store credit' do
224
+ expect(subject.order_total_after_store_credit).to eq (order_total - applicable_store_credit)
225
+ end
226
+ end
227
+
228
+ context "order's user does not have any store credits" do
229
+ let(:applicable_store_credit) { 0.0 }
230
+
231
+ it 'returns the order total' do
232
+ expect(subject.order_total_after_store_credit).to eq order_total
233
+ end
234
+ end
235
+ end
236
+
237
+ describe '#total_applicable_store_credit' do
238
+ context 'order is in the confirm state' do
239
+ before { order.update_attributes(state: 'confirm') }
240
+ include_examples 'check total store credit from payments'
241
+ end
242
+
243
+ context 'order is completed' do
244
+ before { order.update_attributes(state: 'complete') }
245
+ include_examples 'check total store credit from payments'
246
+ end
247
+
248
+ context 'order is in any state other than confirm or complete' do
249
+ context 'the associated user has store credits' do
250
+ let(:store_credit) { create(:store_credit) }
251
+ let(:order) { create(:order, user: store_credit.user) }
252
+
253
+ subject { order }
254
+
255
+ context 'the store credit is more than the order total' do
256
+ let(:order_total) { store_credit.amount - 1 }
257
+
258
+ before { order.update_attributes(total: order_total) }
259
+
260
+ it 'returns the order total' do
261
+ expect(subject.total_applicable_store_credit).to eq order_total
262
+ end
263
+ end
264
+
265
+ context 'the store credit is less than the order total' do
266
+ let(:order_total) { store_credit.amount * 10 }
267
+
268
+ before { order.update_attributes(total: order_total) }
269
+
270
+ it 'returns the store credit amount' do
271
+ expect(subject.total_applicable_store_credit).to eq store_credit.amount
272
+ end
273
+ end
274
+ end
275
+
276
+ context 'the associated user does not have store credits' do
277
+ let(:order) { create(:order) }
278
+
279
+ subject { order }
280
+
281
+ it 'returns 0' do
282
+ expect(subject.total_applicable_store_credit).to be_zero
283
+ end
284
+ end
285
+
286
+ context 'the order does not have an associated user' do
287
+ subject { create(:store_credits_order_without_user) }
288
+
289
+ it 'returns 0' do
290
+ expect(subject.total_applicable_store_credit).to be_zero
291
+ end
292
+ end
293
+ end
294
+ end
295
+
296
+ describe '#total_applied_store_credit' do
297
+ context 'with valid payments' do
298
+ let(:order) { payment.order }
299
+ let!(:payment) { create(:store_credit_payment) }
300
+ let!(:second_payment) { create(:store_credit_payment, order: order) }
301
+
302
+ subject { order }
303
+
304
+ it 'returns the sum of the payment amounts' do
305
+ expect(subject.total_applied_store_credit).to eq (payment.amount + second_payment.amount)
306
+ end
307
+ end
308
+
309
+ context 'without valid payments' do
310
+ let(:order) { create(:order) }
311
+
312
+ subject { order }
313
+
314
+ it 'returns 0' do
315
+ expect(subject.total_applied_store_credit).to be_zero
316
+ end
317
+ end
318
+ end
319
+
320
+ describe '#using_store_credit?' do
321
+ subject { create(:order) }
322
+
323
+ context 'order has store credit payment' do
324
+ before { allow(subject).to receive(:total_applied_store_credit).and_return(10.0) }
325
+ it { expect(subject.using_store_credit?).to be true }
326
+ end
327
+
328
+ context 'order has no store credit payments' do
329
+ before { allow(subject).to receive(:total_applied_store_credit).and_return(0.0) }
330
+ it { expect(subject.using_store_credit?).to be false }
331
+ end
332
+ end
333
+
334
+ describe '#display_total_applicable_store_credit' do
335
+ let(:total_applicable_store_credit) { 10.00 }
336
+
337
+ subject { create(:order) }
338
+
339
+ before do
340
+ allow(subject).to receive(:total_applicable_store_credit).and_return(total_applicable_store_credit)
341
+ end
342
+
343
+ it 'returns a money instance' do
344
+ expect(subject.display_total_applicable_store_credit).to be_a(Spree::Money)
345
+ end
346
+
347
+ it 'returns a negative amount' do
348
+ expect(subject.display_total_applicable_store_credit.money.cents).to eq (total_applicable_store_credit * -100.0)
349
+ end
350
+ end
351
+
352
+ describe '#display_total_applied_store_credit' do
353
+ let(:total_applied_store_credit) { 10.00 }
354
+
355
+ subject { create(:order) }
356
+
357
+ before do
358
+ allow(subject).to receive(:total_applied_store_credit).and_return(total_applied_store_credit)
359
+ end
360
+
361
+ it 'returns a money instance' do
362
+ expect(subject.display_total_applied_store_credit).to be_a(Spree::Money)
363
+ end
364
+
365
+ it 'returns a negative amount' do
366
+ expect(subject.display_total_applied_store_credit.money.cents).to eq (total_applied_store_credit * -100.0)
367
+ end
368
+ end
369
+
370
+ describe '#display_order_total_after_store_credit' do
371
+ let(:order_total_after_store_credit) { 10.00 }
372
+
373
+ subject { create(:order) }
374
+
375
+ before do
376
+ allow(subject).to receive(:order_total_after_store_credit).and_return(order_total_after_store_credit)
377
+ end
378
+
379
+ it 'returns a money instance' do
380
+ expect(subject.display_order_total_after_store_credit).to be_a(Spree::Money)
381
+ end
382
+
383
+ it 'returns the order_total_after_store_credit amount' do
384
+ expect(subject.display_order_total_after_store_credit.money.cents).to eq (order_total_after_store_credit * 100.0)
385
+ end
386
+ end
387
+
388
+ describe '#display_total_available_store_credit' do
389
+ let(:total_available_store_credit) { 10.00 }
390
+
391
+ subject { create(:order) }
392
+
393
+ before do
394
+ allow(subject).to receive(:total_available_store_credit).and_return(total_available_store_credit)
395
+ end
396
+
397
+ it 'returns a money instance' do
398
+ expect(subject.display_total_available_store_credit).to be_a(Spree::Money)
399
+ end
400
+
401
+ it 'returns the total_available_store_credit amount' do
402
+ expect(subject.display_total_available_store_credit.money.cents).to eq (total_available_store_credit * 100.0)
403
+ end
404
+ end
405
+
406
+ describe '#display_store_credit_remaining_after_capture' do
407
+ let(:total_available_store_credit) { 10.00 }
408
+ let(:total_applicable_store_credit) { 5.00 }
409
+
410
+ subject { create(:order) }
411
+
412
+ before do
413
+ allow(subject).to receive(:total_available_store_credit).and_return(total_available_store_credit)
414
+ allow(subject).to receive(:total_applicable_store_credit).and_return(total_applicable_store_credit)
415
+ end
416
+
417
+ it 'returns a money instance' do
418
+ expect(subject.display_store_credit_remaining_after_capture).to be_a(Spree::Money)
419
+ end
420
+
421
+ it "returns all of the user's available store credit minus what's applied to the order amount" do
422
+ amount_remaining = total_available_store_credit - total_applicable_store_credit
423
+ expect(subject.display_store_credit_remaining_after_capture.money.cents).to eq (amount_remaining * 100.0)
424
+ end
425
+ end
426
+ end