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,1046 @@
1
+ require 'spec_helper'
2
+
3
+ class FakeCalculator < Spree::Calculator
4
+ def compute(computable)
5
+ 5
6
+ end
7
+ end
8
+
9
+ describe Spree::Order, type: :model do
10
+ let(:user) { stub_model(Spree::LegacyUser, email: "spree@example.com") }
11
+ let(:order) { stub_model(Spree::Order, user: user) }
12
+
13
+ before do
14
+ create(:store)
15
+ allow(Spree::LegacyUser).to receive_messages(current: mock_model(Spree::LegacyUser, id: 123))
16
+ end
17
+
18
+ describe '.scopes' do
19
+ let!(:user) { FactoryGirl.create(:user) }
20
+ let!(:completed_order) { FactoryGirl.create(:order, user: user, completed_at: Time.current) }
21
+ let!(:incompleted_order) { FactoryGirl.create(:order, user: user, completed_at: nil) }
22
+
23
+ describe '.complete' do
24
+ it { expect(Spree::Order.complete).to include completed_order }
25
+ it { expect(Spree::Order.complete).not_to include incompleted_order }
26
+ end
27
+
28
+ describe '.incomplete' do
29
+ it { expect(Spree::Order.incomplete).to include incompleted_order }
30
+ it { expect(Spree::Order.incomplete).not_to include completed_order }
31
+ end
32
+ end
33
+
34
+ describe '#update_with_updater!' do
35
+ let(:updater) { Spree::OrderUpdater.new(order) }
36
+
37
+ before do
38
+ allow(order).to receive(:updater).and_return(updater)
39
+ allow(updater).to receive(:update).and_return(true)
40
+ end
41
+
42
+ after { order.update_with_updater! }
43
+
44
+ it 'expects to update order with order updater' do
45
+ expect(updater).to receive(:update).and_return(true)
46
+ end
47
+ end
48
+
49
+ context "#cancel" do
50
+ let(:order) { create(:completed_order_with_totals) }
51
+ let!(:payment) do
52
+ create(
53
+ :payment,
54
+ order: order,
55
+ amount: order.total,
56
+ state: "completed"
57
+ )
58
+ end
59
+ let(:payment_method) { double }
60
+
61
+ it "should mark the payments as void" do
62
+ allow_any_instance_of(Spree::Shipment).to receive(:refresh_rates).and_return(true)
63
+ order.cancel
64
+ order.reload
65
+
66
+ expect(order.payments.first).to be_void
67
+ end
68
+ end
69
+
70
+ context "#canceled_by" do
71
+ let(:admin_user) { create :admin_user }
72
+ let(:order) { create :order }
73
+
74
+ before do
75
+ allow(order).to receive(:cancel!)
76
+ end
77
+
78
+ subject { order.canceled_by(admin_user) }
79
+
80
+ it 'should cancel the order' do
81
+ expect(order).to receive(:cancel!)
82
+ subject
83
+ end
84
+
85
+ it 'should save canceler_id' do
86
+ subject
87
+ expect(order.reload.canceler_id).to eq(admin_user.id)
88
+ end
89
+
90
+ it 'should save canceled_at' do
91
+ subject
92
+ expect(order.reload.canceled_at).to_not be_nil
93
+ end
94
+
95
+ it 'should have canceler' do
96
+ subject
97
+ expect(order.reload.canceler).to eq(admin_user)
98
+ end
99
+ end
100
+
101
+ context '#create' do
102
+ let(:order) { Spree::Order.create }
103
+
104
+ it 'should assign an order number' do
105
+ expect(order.number).not_to be_nil
106
+ end
107
+
108
+ it 'should create a randomized 35 character token' do
109
+ expect(order.guest_token.size).to eq(35)
110
+ end
111
+ end
112
+
113
+ context "creates shipments cost" do
114
+ let(:shipment) { double }
115
+
116
+ before { allow(order).to receive_messages shipments: [shipment] }
117
+
118
+ it "update and persist totals" do
119
+ expect(shipment).to receive :update_amounts
120
+ expect(order.updater).to receive :update_shipment_total
121
+ expect(order.updater).to receive :persist_totals
122
+
123
+ order.set_shipments_cost
124
+ end
125
+ end
126
+
127
+ context "#finalize!" do
128
+ let(:order) { Spree::Order.create(email: 'test@example.com') }
129
+
130
+ before do
131
+ order.update_column :state, 'complete'
132
+ end
133
+
134
+ it "should set completed_at" do
135
+ expect(order).to receive(:touch).with(:completed_at)
136
+ order.finalize!
137
+ end
138
+
139
+ it "should sell inventory units" do
140
+ order.shipments.each do |shipment|
141
+ expect(shipment).to receive(:update!)
142
+ expect(shipment).to receive(:finalize!)
143
+ end
144
+ order.finalize!
145
+ end
146
+
147
+ it "should decrease the stock for each variant in the shipment" do
148
+ order.shipments.each do |shipment|
149
+ expect(shipment.stock_location).to receive(:decrease_stock_for_variant)
150
+ end
151
+ order.finalize!
152
+ end
153
+
154
+ it "should change the shipment state to ready if order is paid" do
155
+ Spree::Shipment.create(order: order, stock_location: create(:stock_location))
156
+ order.shipments.reload
157
+
158
+ allow(order).to receive_messages(paid?: true, complete?: true)
159
+ order.finalize!
160
+ order.reload # reload so we're sure the changes are persisted
161
+ expect(order.shipment_state).to eq('ready')
162
+ end
163
+
164
+ after { Spree::Config.set track_inventory_levels: true }
165
+ it "should not sell inventory units if track_inventory_levels is false" do
166
+ Spree::Config.set track_inventory_levels: false
167
+ expect(Spree::InventoryUnit).not_to receive(:sell_units)
168
+ order.finalize!
169
+ end
170
+
171
+ it "should send an order confirmation email" do
172
+ mail_message = double "Mail::Message"
173
+ expect(Spree::OrderMailer).to receive(:confirm_email).with(order.id).and_return mail_message
174
+ expect(mail_message).to receive :deliver_later
175
+ order.finalize!
176
+ end
177
+
178
+ it "sets confirmation delivered when finalizing" do
179
+ expect(order.confirmation_delivered?).to be false
180
+ order.finalize!
181
+ expect(order.confirmation_delivered?).to be true
182
+ end
183
+
184
+ it "should not send duplicate confirmation emails" do
185
+ allow(order).to receive_messages(confirmation_delivered?: true)
186
+ expect(Spree::OrderMailer).not_to receive(:confirm_email)
187
+ order.finalize!
188
+ end
189
+
190
+ it "should freeze all adjustments" do
191
+ allow(Spree::OrderMailer).to receive_message_chain :confirm_email, :deliver_later
192
+ adjustments = [double]
193
+ expect(order).to receive(:all_adjustments).and_return(adjustments)
194
+ adjustments.each do |adj|
195
+ expect(adj).to receive(:close)
196
+ end
197
+ order.finalize!
198
+ end
199
+
200
+ context "order is considered risky" do
201
+ before do
202
+ allow(order).to receive_messages is_risky?: true
203
+ end
204
+
205
+ it "should change state to risky" do
206
+ expect(order).to receive(:considered_risky!)
207
+ order.finalize!
208
+ end
209
+
210
+ context "and order is approved" do
211
+ before do
212
+ allow(order).to receive_messages approved?: true
213
+ end
214
+
215
+ it "should leave order in complete state" do
216
+ order.finalize!
217
+ expect(order.state).to eq 'complete'
218
+ end
219
+ end
220
+ end
221
+ end
222
+
223
+ context "insufficient_stock_lines" do
224
+ let(:line_item) { mock_model Spree::LineItem, insufficient_stock?: true }
225
+
226
+ before { allow(order).to receive_messages(line_items: [line_item]) }
227
+
228
+ it "should return line_item that has insufficient stock on hand" do
229
+ expect(order.insufficient_stock_lines.size).to eq(1)
230
+ expect(order.insufficient_stock_lines.include?(line_item)).to be true
231
+ end
232
+ end
233
+
234
+ describe "#ensure_line_item_variants_are_not_discontinued" do
235
+ subject { order.ensure_line_item_variants_are_not_discontinued }
236
+
237
+ let(:order) { create :order_with_line_items }
238
+
239
+ context 'when variant is destroyed' do
240
+ before do
241
+ order.line_items.first.variant.discontinue!
242
+ end
243
+
244
+ it 'should restart checkout flow' do
245
+ expect(order).to receive(:restart_checkout_flow).once
246
+ subject
247
+ end
248
+
249
+ it 'should have error message' do
250
+ subject
251
+ expect(order.errors[:base]).to include(Spree.t(:discontinued_variants_present))
252
+ end
253
+
254
+ it 'should be false' do
255
+ expect(subject).to be_falsey
256
+ end
257
+ end
258
+
259
+ context 'when no variants are destroyed' do
260
+ it 'should not restart checkout' do
261
+ expect(order).to receive(:restart_checkout_flow).never
262
+ subject
263
+ end
264
+
265
+ it 'should be true' do
266
+ expect(subject).to be_truthy
267
+ end
268
+ end
269
+ end
270
+
271
+ describe '#ensure_line_items_are_in_stock' do
272
+ subject { order.ensure_line_items_are_in_stock }
273
+
274
+ let(:line_item) { create(:line_item, order: order) }
275
+
276
+ before do
277
+ allow(order).to receive(:insufficient_stock_lines).and_return([true])
278
+ end
279
+
280
+ it 'should restart checkout flow' do
281
+ allow(order).to receive(:restart_checkout_flow)
282
+ expect(order).to receive(:restart_checkout_flow).once
283
+ subject
284
+ end
285
+
286
+ it 'should have error message' do
287
+ subject
288
+ expect(order.errors[:base]).to include(Spree.t(:insufficient_stock_lines_present))
289
+ end
290
+
291
+ it 'should be false' do
292
+ allow(order).to receive(:restart_checkout_flow)
293
+ expect(subject).to be_falsey
294
+ end
295
+ end
296
+
297
+ context "empty!" do
298
+ let(:order) { Spree::Order.create(email: 'test@example.com') }
299
+ let(:promotion) { create :promotion, code: '10off' }
300
+
301
+ before do
302
+ promotion.orders << order
303
+ end
304
+
305
+ context 'completed order' do
306
+ before do
307
+ order.update_columns(state: 'complete', completed_at: Time.current)
308
+ end
309
+
310
+ it "raises an exception" do
311
+ expect { order.empty! }.to raise_error(RuntimeError, Spree.t(:cannot_empty_completed_order))
312
+ end
313
+ end
314
+
315
+ context 'incomplete order' do
316
+ before do
317
+ order.empty!
318
+ end
319
+
320
+ it "clears out line items, adjustments and update totals" do
321
+ expect(order.line_items.count).to be_zero
322
+ expect(order.adjustments.count).to be_zero
323
+ expect(order.shipments.count).to be_zero
324
+ expect(order.order_promotions.count).to be_zero
325
+ expect(order.promo_total).to be_zero
326
+ expect(order.item_total).to be_zero
327
+ expect(order.empty!).to eq(order)
328
+ end
329
+ end
330
+ end
331
+
332
+ context "#display_outstanding_balance" do
333
+ it "returns the value as a spree money" do
334
+ allow(order).to receive(:outstanding_balance) { 10.55 }
335
+ expect(order.display_outstanding_balance).to eq(Spree::Money.new(10.55))
336
+ end
337
+ end
338
+
339
+ context "#display_item_total" do
340
+ it "returns the value as a spree money" do
341
+ allow(order).to receive(:item_total) { 10.55 }
342
+ expect(order.display_item_total).to eq(Spree::Money.new(10.55))
343
+ end
344
+ end
345
+
346
+ context "#display_adjustment_total" do
347
+ it "returns the value as a spree money" do
348
+ order.adjustment_total = 10.55
349
+ expect(order.display_adjustment_total).to eq(Spree::Money.new(10.55))
350
+ end
351
+ end
352
+
353
+ context "#display_promo_total" do
354
+ it "returns the value as a spree money" do
355
+ order.promo_total = 10.55
356
+ expect(order.display_promo_total).to eq(Spree::Money.new(10.55))
357
+ end
358
+ end
359
+
360
+ context "#display_total" do
361
+ it "returns the value as a spree money" do
362
+ order.total = 10.55
363
+ expect(order.display_total).to eq(Spree::Money.new(10.55))
364
+ end
365
+ end
366
+
367
+ context "#currency" do
368
+ context "when object currency is ABC" do
369
+ before { order.currency = "ABC" }
370
+
371
+ it "returns the currency from the object" do
372
+ expect(order.currency).to eq("ABC")
373
+ end
374
+ end
375
+
376
+ context "when object currency is nil" do
377
+ before { order.currency = nil }
378
+
379
+ it "returns the globally configured currency" do
380
+ expect(order.currency).to eq("USD")
381
+ end
382
+ end
383
+ end
384
+
385
+ context "#confirmation_required?" do
386
+
387
+ # Regression test for #4117
388
+ it "is required if the state is currently 'confirm'" do
389
+ order = Spree::Order.new
390
+ assert !order.confirmation_required?
391
+ order.state = 'confirm'
392
+ assert order.confirmation_required?
393
+ end
394
+
395
+ context 'Spree::Config[:always_include_confirm_step] == true' do
396
+
397
+ before do
398
+ Spree::Config[:always_include_confirm_step] = true
399
+ end
400
+
401
+ it "returns true if payments empty" do
402
+ order = Spree::Order.new
403
+ assert order.confirmation_required?
404
+ end
405
+ end
406
+
407
+ context 'Spree::Config[:always_include_confirm_step] == false' do
408
+
409
+ it "returns false if payments empty and Spree::Config[:always_include_confirm_step] == false" do
410
+ order = Spree::Order.new
411
+ assert !order.confirmation_required?
412
+ end
413
+
414
+ it "does not bomb out when an order has an unpersisted payment" do
415
+ order = Spree::Order.new
416
+ order.payments.build
417
+ assert !order.confirmation_required?
418
+ end
419
+ end
420
+ end
421
+
422
+
423
+ context "add_update_hook" do
424
+ before do
425
+ Spree::Order.class_eval do
426
+ register_update_hook :add_awesome_sauce
427
+ end
428
+ end
429
+
430
+ after do
431
+ Spree::Order.update_hooks = Set.new
432
+ end
433
+
434
+ it "calls hook during update" do
435
+ order = create(:order)
436
+ expect(order).to receive(:add_awesome_sauce)
437
+ order.update_with_updater!
438
+ end
439
+
440
+ it "calls hook during finalize" do
441
+ order = create(:order)
442
+ expect(order).to receive(:add_awesome_sauce)
443
+ order.finalize!
444
+ end
445
+ end
446
+
447
+ describe "#tax_address" do
448
+ before { Spree::Config[:tax_using_ship_address] = tax_using_ship_address }
449
+ subject { order.tax_address }
450
+
451
+ context "when tax_using_ship_address is true" do
452
+ let(:tax_using_ship_address) { true }
453
+
454
+ it 'returns ship_address' do
455
+ expect(subject).to eq(order.ship_address)
456
+ end
457
+ end
458
+
459
+ context "when tax_using_ship_address is not true" do
460
+ let(:tax_using_ship_address) { false }
461
+
462
+ it "returns bill_address" do
463
+ expect(subject).to eq(order.bill_address)
464
+ end
465
+ end
466
+ end
467
+
468
+ describe "#restart_checkout_flow" do
469
+ it "updates the state column to the first checkout_steps value" do
470
+ order = create(:order_with_totals, state: "delivery")
471
+ expect(order.checkout_steps).to eql ["address", "delivery", "complete"]
472
+ expect{ order.restart_checkout_flow }.to change{order.state}.from("delivery").to("address")
473
+ end
474
+
475
+ context "without line items" do
476
+ it "updates the state column to cart" do
477
+ order = create(:order, state: "delivery")
478
+ expect{ order.restart_checkout_flow }.to change{order.state}.from("delivery").to("cart")
479
+ end
480
+ end
481
+ end
482
+
483
+ # Regression tests for #4072
484
+ context "#state_changed" do
485
+ let(:order) { FactoryGirl.create(:order) }
486
+
487
+ it "logs state changes" do
488
+ order.update_column(:payment_state, 'balance_due')
489
+ order.payment_state = 'paid'
490
+ expect(order.state_changes).to be_empty
491
+ order.state_changed('payment')
492
+ state_change = order.state_changes.find_by(name: 'payment')
493
+ expect(state_change.previous_state).to eq('balance_due')
494
+ expect(state_change.next_state).to eq('paid')
495
+ end
496
+
497
+ it "does not do anything if state does not change" do
498
+ order.update_column(:payment_state, 'balance_due')
499
+ expect(order.state_changes).to be_empty
500
+ order.state_changed('payment')
501
+ expect(order.state_changes).to be_empty
502
+ end
503
+ end
504
+
505
+ # Regression test for #4199
506
+ context "#available_payment_methods" do
507
+ it "includes frontend payment methods" do
508
+ payment_method = Spree::PaymentMethod.create!({
509
+ name: "Fake",
510
+ active: true,
511
+ display_on: "front_end",
512
+ })
513
+ expect(order.available_payment_methods).to include(payment_method)
514
+ end
515
+
516
+ it "includes 'both' payment methods" do
517
+ payment_method = Spree::PaymentMethod.create!({
518
+ name: "Fake",
519
+ active: true,
520
+ display_on: "both",
521
+ })
522
+ expect(order.available_payment_methods).to include(payment_method)
523
+ end
524
+
525
+ it "does not include a payment method twice if display_on is blank" do
526
+ payment_method = Spree::PaymentMethod.create!({
527
+ name: "Fake",
528
+ active: true,
529
+ display_on: "both",
530
+ })
531
+ expect(order.available_payment_methods.count).to eq(1)
532
+ expect(order.available_payment_methods).to include(payment_method)
533
+ end
534
+
535
+ let(:ok_method) { double :payment_method, available_for_order?: true }
536
+ let(:no_method) { double :payment_method, available_for_order?: false }
537
+ let(:methods) { [ok_method, no_method] }
538
+
539
+ it "does not include a payment method that is not suitable for this order" do
540
+ allow(Spree::PaymentMethod).to receive(:available_on_front_end).and_return(methods)
541
+ expect(order.available_payment_methods).to match_array [ok_method]
542
+ end
543
+ end
544
+
545
+ context "#apply_free_shipping_promotions" do
546
+ it "calls out to the FreeShipping promotion handler" do
547
+ shipment = double('Shipment')
548
+ allow(order).to receive_messages shipments: [shipment]
549
+ expect(Spree::PromotionHandler::FreeShipping).to receive(:new).and_return(handler = double)
550
+ expect(handler).to receive(:activate)
551
+
552
+ expect(Spree::Adjustable::AdjustmentsUpdater).to receive(:update).with(shipment)
553
+
554
+ expect(order.updater).to receive(:update_shipment_total)
555
+ expect(order.updater).to receive(:persist_totals)
556
+ order.apply_free_shipping_promotions
557
+ end
558
+ end
559
+
560
+
561
+ context "#products" do
562
+ before :each do
563
+ @variant1 = mock_model(Spree::Variant, product: "product1")
564
+ @variant2 = mock_model(Spree::Variant, product: "product2")
565
+ @line_items = [mock_model(Spree::LineItem, product: "product1", variant: @variant1, variant_id: @variant1.id, quantity: 1),
566
+ mock_model(Spree::LineItem, product: "product2", variant: @variant2, variant_id: @variant2.id, quantity: 2)]
567
+ allow(order).to receive_messages(line_items: @line_items)
568
+ end
569
+
570
+ it "gets the quantity of a given variant" do
571
+ expect(order.quantity_of(@variant1)).to eq(1)
572
+
573
+ @variant3 = mock_model(Spree::Variant, product: "product3")
574
+ expect(order.quantity_of(@variant3)).to eq(0)
575
+ end
576
+
577
+ it "can find a line item matching a given variant" do
578
+ expect(order.find_line_item_by_variant(@variant1)).not_to be_nil
579
+ expect(order.find_line_item_by_variant(mock_model(Spree::Variant))).to be_nil
580
+ end
581
+
582
+ context "match line item with options" do
583
+ before do
584
+ Spree::Order.register_line_item_comparison_hook(:foos_match)
585
+ end
586
+
587
+ after do
588
+ # reset to avoid test pollution
589
+ Spree::Order.line_item_comparison_hooks = Set.new
590
+ end
591
+
592
+ it "matches line item when options match" do
593
+ allow(order).to receive(:foos_match).and_return(true)
594
+ expect(order.line_item_options_match(@line_items.first, {foos: {bar: :zoo}})).to be true
595
+ end
596
+
597
+ it "does not match line item without options" do
598
+ allow(order).to receive(:foos_match).and_return(false)
599
+ expect(order.line_item_options_match(@line_items.first, {})).to be false
600
+ end
601
+ end
602
+ end
603
+
604
+ describe "#associate_user!" do
605
+ let(:user) { FactoryGirl.create(:user_with_addreses) }
606
+ let(:email) { user.email }
607
+ let(:created_by) { user }
608
+ let(:bill_address) { user.bill_address }
609
+ let(:ship_address) { user.ship_address }
610
+ let(:override_email) { true }
611
+
612
+ let(:order) { FactoryGirl.build(:order, order_attributes) }
613
+
614
+ let(:order_attributes) do
615
+ {
616
+ user: nil,
617
+ email: nil,
618
+ created_by: nil,
619
+ bill_address: nil,
620
+ ship_address: nil
621
+ }
622
+ end
623
+
624
+ def assert_expected_order_state
625
+ expect(order.user).to eql(user)
626
+ expect(order.user_id).to eql(user.id)
627
+
628
+ expect(order.email).to eql(email)
629
+
630
+ expect(order.created_by).to eql(created_by)
631
+ expect(order.created_by_id).to eql(created_by.id)
632
+
633
+ expect(order.bill_address).to eql(bill_address)
634
+ expect(order.bill_address_id).to eql(bill_address.id)
635
+
636
+ expect(order.ship_address).to eql(ship_address)
637
+ expect(order.ship_address_id).to eql(ship_address.id)
638
+ end
639
+
640
+ shared_examples_for "#associate_user!" do |persisted = false|
641
+ it "associates a user to an order" do
642
+ order.associate_user!(user, override_email)
643
+ assert_expected_order_state
644
+ end
645
+
646
+ unless persisted
647
+ it "does not persist the order" do
648
+ expect { order.associate_user!(user) }
649
+ .to_not change(order, :persisted?)
650
+ .from(false)
651
+ end
652
+ end
653
+ end
654
+
655
+ context "when email is set" do
656
+ let(:order_attributes) { super().merge(email: 'test@example.com') }
657
+
658
+ context "when email should be overridden" do
659
+ it_should_behave_like "#associate_user!"
660
+ end
661
+
662
+ context "when email should not be overridden" do
663
+ let(:override_email) { false }
664
+ let(:email) { 'test@example.com' }
665
+
666
+ it_should_behave_like "#associate_user!"
667
+ end
668
+ end
669
+
670
+ context "when created_by is set" do
671
+ let(:order_attributes) { super().merge(created_by: created_by) }
672
+ let(:created_by) { create(:user_with_addreses) }
673
+
674
+ it_should_behave_like "#associate_user!"
675
+ end
676
+
677
+ context "when bill_address is set" do
678
+ let(:order_attributes) { super().merge(bill_address: bill_address) }
679
+ let(:bill_address) { FactoryGirl.build(:address) }
680
+
681
+ it_should_behave_like "#associate_user!"
682
+ end
683
+
684
+ context "when ship_address is set" do
685
+ let(:order_attributes) { super().merge(ship_address: ship_address) }
686
+ let(:ship_address) { FactoryGirl.build(:address) }
687
+
688
+ it_should_behave_like "#associate_user!"
689
+ end
690
+
691
+ context "when the user is not persisted" do
692
+ let(:user) { FactoryGirl.build(:user_with_addreses) }
693
+
694
+ it "does not persist the user" do
695
+ expect { order.associate_user!(user) }
696
+ .to_not change(user, :persisted?)
697
+ .from(false)
698
+ end
699
+
700
+ it_should_behave_like "#associate_user!"
701
+ end
702
+
703
+ context "when the order is persisted" do
704
+ let(:order) { FactoryGirl.create(:order, order_attributes) }
705
+
706
+ it "associates a user to a persisted order" do
707
+ order.associate_user!(user)
708
+ order.reload
709
+ assert_expected_order_state
710
+ end
711
+
712
+ it "does not persist other changes to the order" do
713
+ order.state = 'complete'
714
+ order.associate_user!(user)
715
+ order.reload
716
+ expect(order.state).to eql('cart')
717
+ end
718
+
719
+ it "does not change any other orders" do
720
+ other = FactoryGirl.create(:order)
721
+ order.associate_user!(user)
722
+ expect(other.reload.user).to_not eql(user)
723
+ end
724
+
725
+ it "is not affected by scoping" do
726
+ order.class.where.not(id: order).scoping do
727
+ order.associate_user!(user)
728
+ end
729
+ order.reload
730
+ assert_expected_order_state
731
+ end
732
+
733
+ it_should_behave_like "#associate_user!", true
734
+ end
735
+ end
736
+
737
+ context "#can_ship?" do
738
+ let(:order) { Spree::Order.create }
739
+
740
+ it "should be true for order in the 'complete' state" do
741
+ allow(order).to receive_messages(complete?: true)
742
+ expect(order.can_ship?).to be true
743
+ end
744
+
745
+ it "should be true for order in the 'resumed' state" do
746
+ allow(order).to receive_messages(resumed?: true)
747
+ expect(order.can_ship?).to be true
748
+ end
749
+
750
+ it "should be true for an order in the 'awaiting return' state" do
751
+ allow(order).to receive_messages(awaiting_return?: true)
752
+ expect(order.can_ship?).to be true
753
+ end
754
+
755
+ it "should be true for an order in the 'returned' state" do
756
+ allow(order).to receive_messages(returned?: true)
757
+ expect(order.can_ship?).to be true
758
+ end
759
+
760
+ it "should be false if the order is neither in the 'complete' nor 'resumed' state" do
761
+ allow(order).to receive_messages(resumed?: false, complete?: false)
762
+ expect(order.can_ship?).to be false
763
+ end
764
+ end
765
+
766
+ context "#completed?" do
767
+ it "should indicate if order is completed" do
768
+ order.completed_at = nil
769
+ expect(order.completed?).to be false
770
+
771
+ order.completed_at = Time.current
772
+ expect(order.completed?).to be true
773
+ end
774
+ end
775
+
776
+ context "#allow_checkout?" do
777
+ it "should be true if there are line_items in the order" do
778
+ allow(order).to receive_message_chain(:line_items, count: 1)
779
+ expect(order.checkout_allowed?).to be true
780
+ end
781
+ it "should be false if there are no line_items in the order" do
782
+ allow(order).to receive_message_chain(:line_items, count: 0)
783
+ expect(order.checkout_allowed?).to be false
784
+ end
785
+ end
786
+
787
+ context "#amount" do
788
+ before do
789
+ @order = create(:order, user: user)
790
+ @order.line_items = [create(:line_item, price: 1.0, quantity: 2),
791
+ create(:line_item, price: 1.0, quantity: 1)]
792
+ end
793
+ it "should return the correct lum sum of items" do
794
+ expect(@order.amount).to eq(3.0)
795
+ end
796
+ end
797
+
798
+ context "#backordered?" do
799
+ it 'is backordered if one of the shipments is backordered' do
800
+ allow(order).to receive_messages(shipments: [mock_model(Spree::Shipment, backordered?: false),
801
+ mock_model(Spree::Shipment, backordered?: true)])
802
+ expect(order).to be_backordered
803
+ end
804
+ end
805
+
806
+ context "#can_cancel?" do
807
+ it "should be false for completed order in the canceled state" do
808
+ order.state = 'canceled'
809
+ order.shipment_state = 'ready'
810
+ order.completed_at = Time.current
811
+ expect(order.can_cancel?).to be false
812
+ end
813
+
814
+ it "should be true for completed order with no shipment" do
815
+ order.state = 'complete'
816
+ order.shipment_state = nil
817
+ order.completed_at = Time.current
818
+ expect(order.can_cancel?).to be true
819
+ end
820
+ end
821
+
822
+ context "#tax_total" do
823
+ it "adds included tax and additional tax" do
824
+ allow(order).to receive_messages(additional_tax_total: 10, included_tax_total: 20)
825
+
826
+ expect(order.tax_total).to eq 30
827
+ end
828
+ end
829
+
830
+ # Regression test for #4923
831
+ context "locking" do
832
+ let(:order) { Spree::Order.create } # need a persisted in order to test locking
833
+
834
+ it 'can lock' do
835
+ expect { order.with_lock {} }.to_not raise_error
836
+ end
837
+ end
838
+
839
+ describe "#pre_tax_item_amount" do
840
+ it "sums all of the line items' pre tax amounts" do
841
+ subject.line_items = [
842
+ Spree::LineItem.new(price: 10, quantity: 2, pre_tax_amount: 5.0),
843
+ Spree::LineItem.new(price: 30, quantity: 1, pre_tax_amount: 14.0),
844
+ ]
845
+
846
+ expect(subject.pre_tax_item_amount).to eq 19.0
847
+ end
848
+ end
849
+
850
+ describe '#quantity' do
851
+ # Uses a persisted record, as the quantity is retrieved via a DB count
852
+ let(:order) { create :order_with_line_items, line_items_count: 3 }
853
+
854
+ it 'sums the quantity of all line items' do
855
+ expect(order.quantity).to eq 3
856
+ end
857
+ end
858
+
859
+ describe '#has_non_reimbursement_related_refunds?' do
860
+ subject do
861
+ order.has_non_reimbursement_related_refunds?
862
+ end
863
+
864
+ context 'no refunds exist' do
865
+ it { is_expected.to eq false }
866
+ end
867
+
868
+ context 'a non-reimbursement related refund exists' do
869
+ let(:order) { refund.payment.order }
870
+ let(:refund) { create(:refund, reimbursement_id: nil, amount: 5) }
871
+
872
+ it { is_expected.to eq true }
873
+ end
874
+
875
+ context 'an old-style refund exists' do
876
+ let(:order) { create(:order_ready_to_ship) }
877
+ let(:payment) { order.payments.first.tap { |p| allow(p).to receive_messages(profiles_supported: false) } }
878
+ let!(:refund_payment) {
879
+ build(:payment, amount: -1, order: order, state: 'completed', source: payment).tap do |p|
880
+ allow(p).to receive_messages(profiles_supported?: false)
881
+ p.save!
882
+ end
883
+ }
884
+
885
+ it { is_expected.to eq true }
886
+ end
887
+
888
+ context 'a reimbursement related refund exists' do
889
+ let(:order) { refund.payment.order }
890
+ let(:refund) { create(:refund, reimbursement_id: 123, amount: 5)}
891
+
892
+ it { is_expected.to eq false }
893
+ end
894
+ end
895
+
896
+ describe "#create_proposed_shipments" do
897
+ context 'has unassociated inventory units' do
898
+ let!(:inventory_unit) { create(:inventory_unit, order: subject) }
899
+
900
+ before(:each) do
901
+ inventory_unit.update_column(:shipment_id, nil)
902
+ end
903
+
904
+ context 'when shipped' do
905
+ before(:each) do
906
+ inventory_unit.update_column(:state, 'shipped')
907
+ end
908
+
909
+ it 'does not delete inventory_unit' do
910
+ subject.create_proposed_shipments
911
+ expect(inventory_unit.reload).to eq inventory_unit
912
+ end
913
+ end
914
+
915
+ context 'when returned' do
916
+ before(:each) do
917
+ inventory_unit.update_column(:state, 'returned')
918
+ end
919
+
920
+ it 'does not delete inventory_unit' do
921
+ subject.create_proposed_shipments
922
+ expect(inventory_unit.reload).to eq inventory_unit
923
+ end
924
+ end
925
+
926
+ context 'when on_hand' do
927
+ before(:each) do
928
+ inventory_unit.update_column(:state, 'on_hand')
929
+ end
930
+
931
+ it 'deletes inventory_unit' do
932
+ subject.create_proposed_shipments
933
+ expect { inventory_unit.reload }.to raise_error(ActiveRecord::RecordNotFound)
934
+ end
935
+ end
936
+
937
+ context 'when backordered' do
938
+ before(:each) do
939
+ inventory_unit.update_column(:state, 'backordered')
940
+ end
941
+
942
+ it 'deletes inventory_unit' do
943
+ subject.create_proposed_shipments
944
+ expect { inventory_unit.reload }.to raise_error(ActiveRecord::RecordNotFound)
945
+ end
946
+ end
947
+ end
948
+
949
+ it "assigns the coordinator returned shipments to its shipments" do
950
+ shipment = build(:shipment)
951
+ allow_any_instance_of(Spree::Stock::Coordinator).to receive(:shipments).and_return([shipment])
952
+ subject.create_proposed_shipments
953
+ expect(subject.shipments).to eq [shipment]
954
+ end
955
+ end
956
+
957
+ describe "#all_inventory_units_returned?" do
958
+ let(:order) { create(:order_with_line_items, line_items_count: 3) }
959
+
960
+ subject { order.all_inventory_units_returned? }
961
+
962
+ context "all inventory units are returned" do
963
+ before { order.inventory_units.update_all(state: 'returned') }
964
+
965
+ it "is true" do
966
+ expect(subject).to eq true
967
+ end
968
+ end
969
+
970
+ context "some inventory units are returned" do
971
+ before do
972
+ order.inventory_units.first.update_attribute(:state, 'returned')
973
+ end
974
+
975
+ it "is false" do
976
+ expect(subject).to eq false
977
+ end
978
+ end
979
+
980
+ context "no inventory units are returned" do
981
+ it "is false" do
982
+ expect(subject).to eq false
983
+ end
984
+ end
985
+ end
986
+
987
+ describe "#fully_discounted?" do
988
+ let(:line_item) { Spree::LineItem.new(price: 10, quantity: 1) }
989
+ let(:shipment) { Spree::Shipment.new(cost: 10) }
990
+ let(:payment) { Spree::Payment.new(amount: 10) }
991
+
992
+ before do
993
+ allow(order).to receive(:line_items) { [line_item] }
994
+ allow(order).to receive(:shipments) { [shipment] }
995
+ allow(order).to receive(:payments) { [payment] }
996
+ end
997
+
998
+ context "the order had no inventory-related cost" do
999
+ before do
1000
+ # discount the cost of the line items
1001
+ allow(order).to receive(:adjustment_total) { -5 }
1002
+ allow(line_item).to receive(:adjustment_total) { -5 }
1003
+
1004
+ # but leave some shipment payment amount
1005
+ allow(shipment).to receive(:adjustment_total) { 0 }
1006
+ end
1007
+
1008
+ it { expect(order.fully_discounted?).to eq true }
1009
+
1010
+ end
1011
+
1012
+ context "the order had inventory-related cost" do
1013
+ before do
1014
+ # partially discount the cost of the line item
1015
+ allow(order).to receive(:adjustment_total) { 0 }
1016
+ allow(line_item).to receive(:adjustment_total) { -5 }
1017
+
1018
+ # and partially discount the cost of the shipment so the total
1019
+ # discount matches the item total for test completeness
1020
+ allow(shipment).to receive(:adjustment_total) { -5 }
1021
+ end
1022
+
1023
+ it { expect(order.fully_discounted?).to eq false }
1024
+ end
1025
+ end
1026
+
1027
+ describe 'order transit to returned state from resumed state' do
1028
+ let!(:resumed_order) { create(:order_with_line_items, line_items_count: 3, state: :resumed) }
1029
+
1030
+ context 'when all inventory_units returned' do
1031
+ before do
1032
+ resumed_order.inventory_units.update_all(state: 'returned')
1033
+ resumed_order.return
1034
+ end
1035
+ it { expect(resumed_order).to be_returned }
1036
+ end
1037
+
1038
+ context 'when some inventory_units returned' do
1039
+ before do
1040
+ resumed_order.inventory_units.first.update_attribute(:state, 'returned')
1041
+ resumed_order.return
1042
+ end
1043
+ it { expect(resumed_order).to be_resumed }
1044
+ end
1045
+ end
1046
+ end