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,742 @@
1
+ require 'spec_helper'
2
+ require 'benchmark'
3
+
4
+ describe Spree::Shipment, type: :model do
5
+ let(:order) { mock_model Spree::Order, backordered?: false,
6
+ canceled?: false,
7
+ can_ship?: true,
8
+ currency: 'USD',
9
+ number: 'S12345',
10
+ paid?: false,
11
+ touch_later: false }
12
+ let(:shipping_method) { create(:shipping_method, name: "UPS") }
13
+ let(:shipment) do
14
+ shipment = Spree::Shipment.new(cost: 1, state: 'pending', stock_location: create(:stock_location))
15
+ allow(shipment).to receive_messages order: order
16
+ allow(shipment).to receive_messages shipping_method: shipping_method
17
+ shipment.save
18
+ shipment
19
+ end
20
+
21
+ let(:variant) { mock_model(Spree::Variant) }
22
+ let(:line_item) { mock_model(Spree::LineItem, variant: variant) }
23
+
24
+ def create_shipment(order, stock_location)
25
+ order.shipments.create({ stock_location_id: stock_location.id }).inventory_units.create(
26
+ order_id: order.id,
27
+ variant_id: order.line_items.first.variant_id,
28
+ line_item_id: order.line_items.first.id
29
+ )
30
+
31
+ end
32
+
33
+ describe "precision of pre_tax_amount" do
34
+ let(:line_item) { create :line_item, pre_tax_amount: 4.2051 }
35
+
36
+ it "keeps four digits of precision even when reloading" do
37
+ # prevent it from updating pre_tax_amount
38
+ allow_any_instance_of(Spree::LineItem).to receive(:update_tax_charge)
39
+ expect(line_item.reload.pre_tax_amount).to eq(4.2051)
40
+ end
41
+ end
42
+
43
+ # Regression test for #4063
44
+ context "number generation" do
45
+ before do
46
+ allow(order).to receive :update_with_updater!
47
+ end
48
+
49
+ it "generates a number containing a letter + 11 numbers" do
50
+ expect(shipment.number[0]).to eq("H")
51
+ expect(/\d{11}/.match(shipment.number)).not_to be_nil
52
+ expect(shipment.number.length).to eq(12)
53
+ end
54
+ end
55
+
56
+ it 'is backordered if one if its inventory_units is backordered' do
57
+ allow(shipment).to receive_messages(inventory_units: [
58
+ mock_model(Spree::InventoryUnit, backordered?: false),
59
+ mock_model(Spree::InventoryUnit, backordered?: true)
60
+ ])
61
+ expect(shipment).to be_backordered
62
+ end
63
+
64
+ context '#determine_state' do
65
+ it 'returns canceled if order is canceled?' do
66
+ allow(order).to receive_messages canceled?: true
67
+ expect(shipment.determine_state(order)).to eq 'canceled'
68
+ end
69
+
70
+ it 'returns pending unless order.can_ship?' do
71
+ allow(order).to receive_messages can_ship?: false
72
+ expect(shipment.determine_state(order)).to eq 'pending'
73
+ end
74
+
75
+ it 'returns pending if backordered' do
76
+ allow(shipment).to receive_messages inventory_units: [mock_model(Spree::InventoryUnit, backordered?: true)]
77
+ expect(shipment.determine_state(order)).to eq 'pending'
78
+ end
79
+
80
+ it 'returns shipped when already shipped' do
81
+ allow(shipment).to receive_messages state: 'shipped'
82
+ expect(shipment.determine_state(order)).to eq 'shipped'
83
+ end
84
+
85
+ it 'returns pending when unpaid' do
86
+ expect(shipment.determine_state(order)).to eq 'pending'
87
+ end
88
+
89
+ it 'returns ready when paid' do
90
+ allow(order).to receive_messages paid?: true
91
+ expect(shipment.determine_state(order)).to eq 'ready'
92
+ end
93
+
94
+ it 'returns ready when Config.auto_capture_on_dispatch' do
95
+ Spree::Config.auto_capture_on_dispatch = true
96
+ expect(shipment.determine_state(order)).to eq 'ready'
97
+ end
98
+ end
99
+
100
+ context "display_amount" do
101
+ it "retuns a Spree::Money" do
102
+ allow(shipment).to receive(:cost) { 21.22 }
103
+ expect(shipment.display_amount).to eq(Spree::Money.new(21.22))
104
+ end
105
+ end
106
+
107
+ context "display_final_price" do
108
+ it "retuns a Spree::Money" do
109
+ allow(shipment).to receive(:final_price) { 21.22 }
110
+ expect(shipment.display_final_price).to eq(Spree::Money.new(21.22))
111
+ end
112
+ end
113
+
114
+ context "display_item_cost" do
115
+ it "retuns a Spree::Money" do
116
+ allow(shipment).to receive(:item_cost) { 21.22 }
117
+ expect(shipment.display_item_cost).to eq(Spree::Money.new(21.22))
118
+ end
119
+ end
120
+
121
+ context "#item_cost" do
122
+ it 'should equal shipment line items amount with tax' do
123
+ order = create(:order_with_line_item_quantity, line_items_quantity: 2)
124
+
125
+ stock_location = create(:stock_location)
126
+
127
+ create_shipment(order, stock_location)
128
+ create_shipment(order, stock_location)
129
+
130
+ create :tax_adjustment, adjustable: order.line_items.first, order: order
131
+
132
+ expect(order.shipments.first.item_cost).to eql(11.0)
133
+ expect(order.shipments.last.item_cost).to eql(11.0)
134
+ end
135
+
136
+ it 'should equal line items final amount with tax' do
137
+ shipment = create(:shipment, order: create(:order_with_line_item_quantity, line_items_quantity: 2))
138
+ create :tax_adjustment, adjustable: shipment.order.line_items.first, order: shipment.order
139
+ expect(shipment.item_cost).to eql(22.0)
140
+ end
141
+ end
142
+
143
+ it "#discounted_cost" do
144
+ shipment = create(:shipment)
145
+ shipment.cost = 10
146
+ shipment.promo_total = -1
147
+ expect(shipment.discounted_cost).to eq(9)
148
+ end
149
+
150
+ it "#tax_total with included taxes" do
151
+ shipment = Spree::Shipment.new
152
+ expect(shipment.tax_total).to eq(0)
153
+ shipment.included_tax_total = 10
154
+ expect(shipment.tax_total).to eq(10)
155
+ end
156
+
157
+ it "#tax_total with additional taxes" do
158
+ shipment = Spree::Shipment.new
159
+ expect(shipment.tax_total).to eq(0)
160
+ shipment.additional_tax_total = 10
161
+ expect(shipment.tax_total).to eq(10)
162
+ end
163
+
164
+ it "#final_price" do
165
+ shipment = Spree::Shipment.new
166
+ shipment.cost = 10
167
+ shipment.adjustment_total = -2
168
+ shipment.included_tax_total = 1
169
+ expect(shipment.final_price).to eq(8)
170
+ end
171
+
172
+ context "manifest" do
173
+ let(:order) { Spree::Order.create }
174
+ let(:variant) { create(:variant) }
175
+ let!(:line_item) { order.contents.add variant }
176
+ let!(:shipment) { order.create_proposed_shipments.first }
177
+
178
+ it "returns variant expected" do
179
+ expect(shipment.manifest.first.variant).to eq variant
180
+ end
181
+
182
+ context "variant was removed" do
183
+ before { variant.destroy }
184
+
185
+ it "still returns variant expected" do
186
+ expect(shipment.manifest.first.variant).to eq variant
187
+ end
188
+ end
189
+ end
190
+
191
+ context 'shipping_rates' do
192
+ let(:shipment) { create(:shipment) }
193
+ let(:shipping_method1) { create(:shipping_method) }
194
+ let(:shipping_method2) { create(:shipping_method) }
195
+ let(:shipping_rates) { [
196
+ Spree::ShippingRate.new(shipping_method: shipping_method1, cost: 10.00, selected: true),
197
+ Spree::ShippingRate.new(shipping_method: shipping_method2, cost: 20.00)
198
+ ] }
199
+
200
+ it 'returns shipping_method from selected shipping_rate' do
201
+ shipment.shipping_rates.delete_all
202
+ shipment.shipping_rates.create shipping_method: shipping_method1, cost: 10.00, selected: true
203
+ expect(shipment.shipping_method).to eq shipping_method1
204
+ end
205
+
206
+ context 'refresh_rates' do
207
+ let(:mock_estimator) { double('estimator', shipping_rates: shipping_rates) }
208
+ before { allow(shipment).to receive(:can_get_rates?){ true } }
209
+
210
+ it 'should request new rates, and maintain shipping_method selection' do
211
+ expect(Spree::Stock::Estimator).to receive(:new).with(shipment.order).and_return(mock_estimator)
212
+ allow(shipment).to receive_messages(shipping_method: shipping_method2)
213
+
214
+ expect(shipment.refresh_rates).to eq(shipping_rates)
215
+ expect(shipment.reload.selected_shipping_rate.shipping_method_id).to eq(shipping_method2.id)
216
+ end
217
+
218
+ it 'should handle no shipping_method selection' do
219
+ expect(Spree::Stock::Estimator).to receive(:new).with(shipment.order).and_return(mock_estimator)
220
+ allow(shipment).to receive_messages(shipping_method: nil)
221
+ expect(shipment.refresh_rates).to eq(shipping_rates)
222
+ expect(shipment.reload.selected_shipping_rate).not_to be_nil
223
+ end
224
+
225
+ it 'should not refresh if shipment is shipped' do
226
+ expect(Spree::Stock::Estimator).not_to receive(:new)
227
+ shipment.shipping_rates.delete_all
228
+ allow(shipment).to receive_messages(shipped?: true)
229
+ expect(shipment.refresh_rates).to eq([])
230
+ end
231
+
232
+ it "can't get rates without a shipping address" do
233
+ shipment.order.ship_address = nil
234
+ expect(shipment.refresh_rates).to eq([])
235
+ end
236
+
237
+ context 'to_package' do
238
+ let(:inventory_units) do
239
+ [build(:inventory_unit, line_item: line_item, variant: variant, state: 'on_hand'),
240
+ build(:inventory_unit, line_item: line_item, variant: variant, state: 'backordered')]
241
+ end
242
+
243
+ before do
244
+ allow(shipment).to receive(:inventory_units) { inventory_units }
245
+ allow(inventory_units).to receive_message_chain(:includes, :joins).and_return inventory_units
246
+ end
247
+
248
+ it 'should use symbols for states when adding contents to package' do
249
+ package = shipment.to_package
250
+ expect(package.on_hand.count).to eq 1
251
+ expect(package.backordered.count).to eq 1
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+ context "#update!" do
258
+ shared_examples_for "immutable once shipped" do
259
+ it "should remain in shipped state once shipped" do
260
+ shipment.state = 'shipped'
261
+ expect(shipment).to receive(:update_columns).with(state: 'shipped', updated_at: kind_of(Time))
262
+ shipment.update!(order)
263
+ end
264
+ end
265
+
266
+ shared_examples_for "pending if backordered" do
267
+ it "should have a state of pending if backordered" do
268
+ allow(shipment).to receive_messages(inventory_units: [mock_model(Spree::InventoryUnit, backordered?: true)])
269
+ expect(shipment).to receive(:update_columns).with(state: 'pending', updated_at: kind_of(Time))
270
+ shipment.update!(order)
271
+ end
272
+ end
273
+
274
+ context "when order cannot ship" do
275
+ before { allow(order).to receive_messages can_ship?: false }
276
+ it "should result in a 'pending' state" do
277
+ expect(shipment).to receive(:update_columns).with(state: 'pending', updated_at: kind_of(Time))
278
+ shipment.update!(order)
279
+ end
280
+ end
281
+
282
+ context "when order is paid" do
283
+ before { allow(order).to receive_messages paid?: true }
284
+ it "should result in a 'ready' state" do
285
+ expect(shipment).to receive(:update_columns).with(state: 'ready', updated_at: kind_of(Time))
286
+ shipment.update!(order)
287
+ end
288
+ it_should_behave_like 'immutable once shipped'
289
+ it_should_behave_like 'pending if backordered'
290
+ end
291
+
292
+ context "when order has balance due" do
293
+ before { allow(order).to receive_messages paid?: false }
294
+ it "should result in a 'pending' state" do
295
+ shipment.state = 'ready'
296
+ expect(shipment).to receive(:update_columns).with(state: 'pending', updated_at: kind_of(Time))
297
+ shipment.update!(order)
298
+ end
299
+ it_should_behave_like 'immutable once shipped'
300
+ it_should_behave_like 'pending if backordered'
301
+ end
302
+
303
+ context "when order has a credit owed" do
304
+ before { allow(order).to receive_messages payment_state: 'credit_owed', paid?: true }
305
+ it "should result in a 'ready' state" do
306
+ shipment.state = 'pending'
307
+ expect(shipment).to receive(:update_columns).with(state: 'ready', updated_at: kind_of(Time))
308
+ shipment.update!(order)
309
+ end
310
+ it_should_behave_like 'immutable once shipped'
311
+ it_should_behave_like 'pending if backordered'
312
+ end
313
+
314
+ context "when shipment state changes to shipped" do
315
+ before do
316
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:send_shipped_email)
317
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:update_order_shipment_state)
318
+ end
319
+
320
+ it "should call after_ship" do
321
+ shipment.state = 'pending'
322
+ expect(shipment).to receive :after_ship
323
+ allow(shipment).to receive_messages determine_state: 'shipped'
324
+ expect(shipment).to receive(:update_columns).with(state: 'shipped', updated_at: kind_of(Time))
325
+ shipment.update!(order)
326
+ end
327
+
328
+ context "when using the default shipment handler" do
329
+ it "should call the 'perform' method" do
330
+ shipment.state = 'pending'
331
+ allow(shipment).to receive_messages determine_state: 'shipped'
332
+ expect_any_instance_of(Spree::ShipmentHandler).to receive(:perform)
333
+ shipment.update!(order)
334
+ end
335
+ end
336
+
337
+ context "when using a custom shipment handler" do
338
+ before do
339
+ Spree::ShipmentHandler::UPS = Class.new {
340
+ def initialize(shipment) true end
341
+ def perform() true end
342
+ }
343
+ end
344
+
345
+ it "should call the custom handler's 'perform' method" do
346
+ shipment.state = 'pending'
347
+ allow(shipment).to receive_messages determine_state: 'shipped'
348
+ expect_any_instance_of(Spree::ShipmentHandler::UPS).to receive(:perform)
349
+ shipment.update!(order)
350
+ end
351
+
352
+ after do
353
+ Spree::ShipmentHandler.send(:remove_const, :UPS)
354
+ end
355
+ end
356
+
357
+ # Regression test for #4347
358
+ context "with adjustments" do
359
+ before do
360
+ shipment.adjustments << Spree::Adjustment.create(order: order, label: "Label", amount: 5)
361
+ end
362
+
363
+ it "transitions to shipped" do
364
+ shipment.update_column(:state, "ready")
365
+ expect { shipment.ship! }.not_to raise_error
366
+ end
367
+ end
368
+ end
369
+ end
370
+
371
+ context "when order is completed" do
372
+ after { Spree::Config.set track_inventory_levels: true }
373
+
374
+ before do
375
+ allow(order).to receive_messages completed?: true
376
+ allow(order).to receive_messages canceled?: false
377
+ end
378
+
379
+ context "with inventory tracking" do
380
+ before { Spree::Config.set track_inventory_levels: true }
381
+
382
+ it "should validate with inventory" do
383
+ shipment.inventory_units = [create(:inventory_unit)]
384
+ expect(shipment.valid?).to be true
385
+ end
386
+ end
387
+
388
+ context "without inventory tracking" do
389
+ before { Spree::Config.set track_inventory_levels: false }
390
+
391
+ it "should validate with no inventory" do
392
+ expect(shipment.valid?).to be true
393
+ end
394
+ end
395
+ end
396
+
397
+ context "#cancel" do
398
+ it 'cancels the shipment' do
399
+ allow(shipment.order).to receive(:update_with_updater!)
400
+
401
+ shipment.state = 'pending'
402
+ expect(shipment).to receive(:after_cancel)
403
+ shipment.cancel!
404
+ expect(shipment.state).to eq 'canceled'
405
+ end
406
+
407
+ it 'restocks the items' do
408
+ allow(shipment).to receive_message_chain(inventory_units: [mock_model(Spree::InventoryUnit, state: "on_hand", line_item: line_item, variant: variant)])
409
+ shipment.stock_location = mock_model(Spree::StockLocation)
410
+ expect(shipment.stock_location).to receive(:restock).with(variant, 1, shipment)
411
+ shipment.after_cancel
412
+ end
413
+
414
+ context "with backordered inventory units" do
415
+ let(:order) { create(:order) }
416
+ let(:variant) { create(:variant) }
417
+ let(:other_order) { create(:order) }
418
+
419
+ before do
420
+ order.contents.add variant
421
+ order.create_proposed_shipments
422
+
423
+ other_order.contents.add variant
424
+ other_order.create_proposed_shipments
425
+ end
426
+
427
+ it "doesn't fill backorders when restocking inventory units" do
428
+ shipment = order.shipments.first
429
+ expect(shipment.inventory_units.count).to eq 1
430
+ expect(shipment.inventory_units.first).to be_backordered
431
+
432
+ other_shipment = other_order.shipments.first
433
+ expect(other_shipment.inventory_units.count).to eq 1
434
+ expect(other_shipment.inventory_units.first).to be_backordered
435
+
436
+ expect {
437
+ shipment.cancel!
438
+ }.not_to change { other_shipment.inventory_units.first.state }
439
+ end
440
+ end
441
+ end
442
+
443
+ context "#resume" do
444
+ it 'transitions state to ready if the order is ready' do
445
+ allow(shipment.order).to receive(:update_with_updater!)
446
+
447
+ shipment.state = 'canceled'
448
+ expect(shipment).to receive(:determine_state).and_return('ready')
449
+ expect(shipment).to receive(:after_resume)
450
+ shipment.resume!
451
+ expect(shipment.state).to eq 'ready'
452
+ end
453
+
454
+ it 'transitions state to pending if the order is not ready' do
455
+ allow(shipment.order).to receive(:update_with_updater!)
456
+
457
+ shipment.state = 'canceled'
458
+ expect(shipment).to receive(:determine_state).and_return('pending')
459
+ expect(shipment).to receive(:after_resume)
460
+ shipment.resume!
461
+ # Shipment is pending because order is already paid
462
+ expect(shipment.state).to eq 'pending'
463
+ end
464
+
465
+ it 'unstocks them items' do
466
+ allow(shipment).to receive_message_chain(inventory_units: [mock_model(Spree::InventoryUnit, line_item: line_item, variant: variant)])
467
+ shipment.stock_location = mock_model(Spree::StockLocation)
468
+ expect(shipment.stock_location).to receive(:unstock).with(variant, 1, shipment)
469
+ shipment.after_resume
470
+ end
471
+ end
472
+
473
+ context "#ship" do
474
+ context "when the shipment is canceled" do
475
+ let(:shipment_with_inventory_units) { create(:shipment, order: create(:order_with_line_items), state: 'canceled') }
476
+ let(:subject) { shipment_with_inventory_units.ship! }
477
+ before do
478
+ allow(order).to receive(:update_with_updater!)
479
+ allow(shipment_with_inventory_units).to receive_messages(require_inventory: false, update_order: true)
480
+ end
481
+
482
+ it 'unstocks them items' do
483
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:update_order_shipment_state)
484
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:send_shipped_email)
485
+
486
+ expect(shipment_with_inventory_units.stock_location).to receive(:unstock)
487
+ subject
488
+ end
489
+ end
490
+
491
+ ['ready', 'canceled'].each do |state|
492
+ context "from #{state}" do
493
+ before do
494
+ allow(order).to receive(:update_with_updater!)
495
+ allow(shipment).to receive_messages(require_inventory: false, update_order: true, state: state)
496
+ end
497
+
498
+ it "should update shipped_at timestamp" do
499
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:update_order_shipment_state)
500
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:send_shipped_email)
501
+
502
+ shipment.ship!
503
+ expect(shipment.shipped_at).not_to be_nil
504
+ # Ensure value is persisted
505
+ shipment.reload
506
+ expect(shipment.shipped_at).not_to be_nil
507
+ end
508
+
509
+ it "should send a shipment email" do
510
+ mail_message = double 'Mail::Message'
511
+ shipment_id = nil
512
+ expect(Spree::ShipmentMailer).to receive(:shipped_email) { |*args|
513
+ shipment_id = args[0]
514
+ mail_message
515
+ }
516
+ expect(mail_message).to receive :deliver_later
517
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:update_order_shipment_state)
518
+
519
+ shipment.ship!
520
+ expect(shipment_id).to eq(shipment.id)
521
+ end
522
+
523
+ it "finalizes adjustments" do
524
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:update_order_shipment_state)
525
+ allow_any_instance_of(Spree::ShipmentHandler).to receive(:send_shipped_email)
526
+
527
+ shipment.adjustments.each do |adjustment|
528
+ expect(adjustment).to receive(:finalize!)
529
+ end
530
+ shipment.ship!
531
+ end
532
+ end
533
+ end
534
+ end
535
+
536
+ context "#ready" do
537
+ context 'with Config.auto_capture_on_dispatch == false' do
538
+ # Regression test for #2040
539
+ it "cannot ready a shipment for an order if the order is unpaid" do
540
+ allow(order).to receive_messages(paid?: false)
541
+ assert !shipment.can_ready?
542
+ end
543
+ end
544
+
545
+ context 'with Config.auto_capture_on_dispatch == true' do
546
+ before do
547
+ Spree::Config[:auto_capture_on_dispatch] = true
548
+ @order = create :completed_order_with_pending_payment
549
+ @shipment = @order.shipments.first
550
+ @shipment.cost = @order.ship_total
551
+ end
552
+
553
+ it "shipments ready for an order if the order is unpaid" do
554
+ expect(@shipment.ready?).to be true
555
+ end
556
+
557
+ it "tells the order to process payment in #after_ship" do
558
+ expect(@shipment).to receive(:process_order_payments)
559
+ @shipment.ship!
560
+ end
561
+
562
+ context "order has pending payments" do
563
+ let(:payment) do
564
+ payment = @order.payments.first
565
+ payment.update_attribute :state, 'pending'
566
+ payment
567
+ end
568
+
569
+ it "can fully capture an authorized payment" do
570
+ payment.update_attribute(:amount, @order.total)
571
+
572
+ expect(payment.amount).to eq payment.uncaptured_amount
573
+ @shipment.ship!
574
+ expect(payment.reload.uncaptured_amount.to_f).to eq 0
575
+ end
576
+
577
+ it "can partially capture an authorized payment" do
578
+ payment.update_attribute(:amount, @order.total + 50)
579
+
580
+ expect(payment.amount).to eq payment.uncaptured_amount
581
+ @shipment.ship!
582
+ expect(payment.captured_amount).to eq @order.total
583
+ expect(payment.captured_amount).to eq payment.amount
584
+ expect(payment.order.payments.pending.first.amount).to eq 50
585
+ end
586
+ end
587
+ end
588
+ end
589
+
590
+ context "updates cost when selected shipping rate is present" do
591
+ let(:shipment) { create(:shipment) }
592
+
593
+ before { allow(shipment).to receive_message_chain :selected_shipping_rate, cost: 5 }
594
+
595
+ it "updates shipment totals" do
596
+ shipment.update_amounts
597
+ expect(shipment.reload.cost).to eq(5)
598
+ end
599
+
600
+ it "factors in additional adjustments to adjustment total" do
601
+ shipment.adjustments.create!(
602
+ order: order,
603
+ label: "Additional",
604
+ amount: 5,
605
+ included: false,
606
+ state: "closed"
607
+ )
608
+ shipment.update_amounts
609
+ expect(shipment.reload.adjustment_total).to eq(5)
610
+ end
611
+
612
+ it "does not factor in included adjustments to adjustment total" do
613
+ shipment.adjustments.create!(
614
+ order: order,
615
+ label: "Included",
616
+ amount: 5,
617
+ included: true,
618
+ state: "closed"
619
+ )
620
+ shipment.update_amounts
621
+ expect(shipment.reload.adjustment_total).to eq(0)
622
+ end
623
+ end
624
+
625
+ context "changes shipping rate via general update" do
626
+ let(:order) do
627
+ Spree::Order.create(
628
+ payment_total: 100, payment_state: 'paid', total: 100, item_total: 100
629
+ )
630
+ end
631
+
632
+ let(:shipment) { Spree::Shipment.create order_id: order.id, stock_location: create(:stock_location) }
633
+
634
+ let(:shipping_rate) do
635
+ Spree::ShippingRate.create shipment_id: shipment.id, cost: 10
636
+ end
637
+
638
+ before do
639
+ shipment.update_attributes_and_order selected_shipping_rate_id: shipping_rate.id
640
+ end
641
+
642
+ it "updates everything around order shipment total and state" do
643
+ expect(shipment.cost.to_f).to eq 10
644
+ expect(shipment.state).to eq 'pending'
645
+ expect(shipment.order.total.to_f).to eq 110
646
+ expect(shipment.order.payment_state).to eq 'balance_due'
647
+ end
648
+ end
649
+
650
+ context "after_save" do
651
+ context "line item changes" do
652
+ before do
653
+ shipment.cost = shipment.cost + 10
654
+ end
655
+
656
+ it "triggers adjustment total recalculation" do
657
+ expect(shipment).to receive(:recalculate_adjustments)
658
+ shipment.save
659
+ end
660
+
661
+ it "does not trigger adjustment recalculation if shipment has shipped" do
662
+ shipment.state = 'shipped'
663
+ expect(shipment).not_to receive(:recalculate_adjustments)
664
+ shipment.save
665
+ end
666
+ end
667
+
668
+ context "line item does not change" do
669
+ it "does not trigger adjustment total recalculation" do
670
+ expect(shipment).not_to receive(:recalculate_adjustments)
671
+ shipment.save
672
+ end
673
+ end
674
+ end
675
+
676
+ context "currency" do
677
+ it "returns the order currency" do
678
+ expect(shipment.currency).to eq(order.currency)
679
+ end
680
+ end
681
+
682
+ context "nil costs" do
683
+ it "sets cost to 0" do
684
+ shipment = Spree::Shipment.new
685
+ shipment.valid?
686
+ expect(shipment.cost).to eq 0
687
+ end
688
+ end
689
+
690
+ context "#tracking_url" do
691
+ it "uses shipping method to determine url" do
692
+ expect(shipping_method).to receive(:build_tracking_url).with('1Z12345').and_return(:some_url)
693
+ shipment.tracking = '1Z12345'
694
+
695
+ expect(shipment.tracking_url).to eq(:some_url)
696
+ end
697
+ end
698
+
699
+ context "set up new inventory units" do
700
+ # let(:line_item) { double(
701
+ let(:variant) { double("Variant", id: 9) }
702
+
703
+ let(:inventory_units) { double }
704
+
705
+ let(:params) do
706
+ { variant_id: variant.id, state: 'on_hand', order_id: order.id, line_item_id: line_item.id }
707
+ end
708
+
709
+ before { allow(shipment).to receive_messages inventory_units: inventory_units }
710
+
711
+ it "associates variant and order" do
712
+ expect(inventory_units).to receive(:create).with(params)
713
+ unit = shipment.set_up_inventory('on_hand', variant, order, line_item)
714
+ end
715
+ end
716
+
717
+ # Regression test for #3349
718
+ context "#destroy" do
719
+ it "destroys linked shipping_rates" do
720
+ reflection = Spree::Shipment.reflect_on_association(:shipping_rates)
721
+ expect(reflection.options[:dependent]).to be(:delete_all)
722
+ end
723
+ end
724
+
725
+ # Regression test for #4072 (kinda)
726
+ # The need for this was discovered in the research for #4702
727
+ context "state changes" do
728
+ before do
729
+ # Must be stubbed so transition can succeed
730
+ allow(order).to receive_messages paid?: true
731
+ end
732
+
733
+ it "are logged to the database" do
734
+ expect(shipment.state_changes).to be_empty
735
+ expect(shipment.ready!).to be true
736
+ expect(shipment.state_changes.count).to eq(1)
737
+ state_change = shipment.state_changes.first
738
+ expect(state_change.previous_state).to eq('pending')
739
+ expect(state_change.next_state).to eq('ready')
740
+ end
741
+ end
742
+ end