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,148 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ class Promotion
5
+ module Actions
6
+ describe CreateItemAdjustments, type: :model do
7
+ let(:order) { create(:order) }
8
+ let(:promotion) { create(:promotion) }
9
+ let(:action) { CreateItemAdjustments.new }
10
+ let!(:line_item) { create(:line_item, order: order) }
11
+ let(:payload) { { order: order, promotion: promotion } }
12
+
13
+ before do
14
+ allow(action).to receive(:promotion).and_return(promotion)
15
+ promotion.promotion_actions = [action]
16
+ end
17
+
18
+ it_behaves_like 'an adjustment source'
19
+
20
+ context "#perform" do
21
+ # Regression test for #3966
22
+ context "when calculator computes 0" do
23
+ before do
24
+ allow(action).to receive_messages compute_amount: 0
25
+ end
26
+
27
+ it "does not create an adjustment when calculator returns 0" do
28
+ action.perform(payload)
29
+ expect(action.adjustments).to be_empty
30
+ end
31
+ end
32
+
33
+ context "when calculator returns a non-zero value" do
34
+ before do
35
+ promotion.promotion_actions = [action]
36
+ allow(action).to receive_messages compute_amount: 10
37
+ end
38
+
39
+ it "creates adjustment with item as adjustable" do
40
+ action.perform(payload)
41
+ expect(action.adjustments.count).to eq(1)
42
+ expect(line_item.reload.adjustments).to eq(action.adjustments)
43
+ end
44
+
45
+ it "creates adjustment with self as source" do
46
+ action.perform(payload)
47
+ expect(line_item.reload.adjustments.first.source).to eq action
48
+ end
49
+
50
+ it "does not perform twice on the same item" do
51
+ 2.times { action.perform(payload) }
52
+ expect(action.adjustments.count).to eq(1)
53
+ end
54
+
55
+ context "with products rules" do
56
+ let!(:second_line_item) { create(:line_item, order: order) }
57
+ let(:rule) { double Spree::Promotion::Rules::Product }
58
+
59
+ before do
60
+ allow(promotion).to receive(:eligible_rules) { [rule] }
61
+ allow(rule).to receive(:actionable?).and_return(true, false)
62
+ end
63
+
64
+ it "does not create adjustments for line_items not in product rule" do
65
+ action.perform(payload)
66
+ expect(action.adjustments.count).to eql 1
67
+ expect(line_item.reload.adjustments).to match_array action.adjustments
68
+ expect(second_line_item.reload.adjustments).to be_empty
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ context "#compute_amount" do
75
+ before { promotion.promotion_actions = [action] }
76
+
77
+ context "when the adjustable is actionable" do
78
+ it "calls compute on the calculator" do
79
+ allow(action.calculator).to receive(:compute).and_return(10)
80
+ expect(action.calculator).to receive(:compute).with(line_item)
81
+ action.compute_amount(line_item)
82
+ end
83
+
84
+ context "calculator returns amount greater than item total" do
85
+ before do
86
+ expect(action.calculator).to receive(:compute).with(line_item).and_return(300)
87
+ allow(line_item).to receive_messages(amount: 100)
88
+ end
89
+
90
+ it "does not exceed it" do
91
+ expect(action.compute_amount(line_item)).to eql(-100)
92
+ end
93
+ end
94
+ end
95
+
96
+ context "when the adjustable is not actionable" do
97
+ before { allow(promotion).to receive(:line_item_actionable?) { false } }
98
+
99
+ it 'returns 0' do
100
+ expect(action.compute_amount(line_item)).to eql(0)
101
+ end
102
+ end
103
+ end
104
+
105
+ context "#destroy" do
106
+ let!(:action) { CreateItemAdjustments.create! }
107
+ let(:other_action) { CreateItemAdjustments.create! }
108
+ before { promotion.promotion_actions = [other_action] }
109
+
110
+ it "destroys adjustments for incompleted orders" do
111
+ order = Order.create
112
+ action.adjustments.create!(label: "Check",
113
+ amount: 0,
114
+ order: order,
115
+ adjustable: line_item)
116
+
117
+ expect {
118
+ action.destroy
119
+ }.to change { Adjustment.count }.by(-1)
120
+ end
121
+
122
+ it "nullifies adjustments for completed orders" do
123
+ order = Order.create(completed_at: Time.current)
124
+ adjustment = action.adjustments.create!(label: "Check",
125
+ amount: 0,
126
+ order: order,
127
+ adjustable: line_item)
128
+
129
+ expect {
130
+ action.destroy
131
+ }.to change { adjustment.reload.source_id }.from(action.id).to nil
132
+ end
133
+
134
+ it "doesnt mess with unrelated adjustments" do
135
+ other_action.adjustments.create!(label: "Check",
136
+ amount: 0,
137
+ order: order,
138
+ adjustable: line_item)
139
+
140
+ expect {
141
+ action.destroy
142
+ }.not_to change { other_action.adjustments.count }
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Promotion::Actions::CreateLineItems, type: :model do
4
+ let(:order) { create(:order) }
5
+ let(:action) { Spree::Promotion::Actions::CreateLineItems.create }
6
+ let(:promotion) { stub_model(Spree::Promotion) }
7
+ let(:shirt) { create(:variant) }
8
+ let(:mug) { create(:variant) }
9
+ let(:payload) { { order: order } }
10
+
11
+ def empty_stock(variant)
12
+ variant.stock_items.update_all(backorderable: false)
13
+ variant.stock_items.each(&:reduce_count_on_hand_to_zero)
14
+ end
15
+
16
+ context "#perform" do
17
+ before do
18
+ allow(action).to receive_messages promotion: promotion
19
+ action.promotion_action_line_items.create!(
20
+ variant: mug,
21
+ quantity: 1
22
+ )
23
+ action.promotion_action_line_items.create!(
24
+ variant: shirt,
25
+ quantity: 2
26
+ )
27
+ end
28
+
29
+ context "order is eligible" do
30
+ before do
31
+ allow(promotion).to receive_messages eligible: true
32
+ end
33
+
34
+ it "adds line items to order with correct variant and quantity" do
35
+ action.perform(payload)
36
+ expect(order.line_items.count).to eq(2)
37
+ line_item = order.line_items.find_by_variant_id(mug.id)
38
+ expect(line_item).not_to be_nil
39
+ expect(line_item.quantity).to eq(1)
40
+ end
41
+
42
+ it "only adds the delta of quantity to an order" do
43
+ order.contents.add(shirt, 1)
44
+ action.perform(payload)
45
+ line_item = order.line_items.find_by_variant_id(shirt.id)
46
+ expect(line_item).not_to be_nil
47
+ expect(line_item.quantity).to eq(2)
48
+ end
49
+
50
+ it "doesn't add if the quantity is greater" do
51
+ order.contents.add(shirt, 3)
52
+ action.perform(payload)
53
+ line_item = order.line_items.find_by_variant_id(shirt.id)
54
+ expect(line_item).not_to be_nil
55
+ expect(line_item.quantity).to eq(3)
56
+ end
57
+
58
+ it "doesn't try to add an item if it's out of stock" do
59
+ empty_stock(mug)
60
+ empty_stock(shirt)
61
+
62
+ expect(order.contents).to_not receive(:add)
63
+ action.perform(order: order)
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "#item_available?" do
69
+ let(:item_out_of_stock) do
70
+ action.promotion_action_line_items.create!(variant: mug, quantity: 1)
71
+ end
72
+
73
+ let(:item_in_stock) do
74
+ action.promotion_action_line_items.create!(variant: shirt, quantity: 1)
75
+ end
76
+
77
+ it "returns false if the item is out of stock" do
78
+ empty_stock(mug)
79
+ expect(action.item_available? item_out_of_stock).to be false
80
+ end
81
+
82
+ it "returns true if the item is in stock" do
83
+ expect(action.item_available? item_in_stock).to be true
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Promotion::Actions::FreeShipping, type: :model do
4
+ let(:order) { create(:completed_order_with_totals) }
5
+ let(:promotion) { create(:promotion) }
6
+ let(:action) { Spree::Promotion::Actions::FreeShipping.create }
7
+ let(:payload) { { order: order } }
8
+
9
+ it_behaves_like 'an adjustment source'
10
+
11
+ # From promotion spec:
12
+ context "#perform" do
13
+ before do
14
+ order.shipments << create(:shipment)
15
+ promotion.promotion_actions << action
16
+ end
17
+
18
+ it "should create a discount with correct negative amount" do
19
+ expect(order.shipments.count).to eq(2)
20
+ expect(order.shipments.first.cost).to eq(100)
21
+ expect(order.shipments.last.cost).to eq(100)
22
+ expect(action.perform(payload)).to be true
23
+ expect(promotion.credits_count).to eq(2)
24
+ expect(order.shipment_adjustments.count).to eq(2)
25
+ expect(order.shipment_adjustments.first.amount.to_i).to eq(-100)
26
+ expect(order.shipment_adjustments.last.amount.to_i).to eq(-100)
27
+ end
28
+
29
+ it "should not create a discount when order already has one from this promotion" do
30
+ expect(action.perform(payload)).to be true
31
+ expect(action.perform(payload)).to be false
32
+ expect(promotion.credits_count).to eq(2)
33
+ expect(order.shipment_adjustments.count).to eq(2)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Promotion::Rules::Country, type: :model do
4
+ let(:rule) { Spree::Promotion::Rules::Country.new }
5
+ let(:order) { create(:order) }
6
+ let(:country) { create(:country) }
7
+ let(:other_country) { create(:country) }
8
+
9
+ before { allow(Spree::Country).to receive(:default) { other_country.id } }
10
+
11
+ context 'preferred country is set' do
12
+ before { rule.preferred_country_id = country.id }
13
+
14
+ it 'should be eligible for correct country' do
15
+ allow(order).to receive_message_chain(:ship_address, :country_id) { country.id }
16
+ expect(rule).to be_eligible(order)
17
+ end
18
+
19
+ it 'should not be eligible for incorrect country' do
20
+ allow(order).to receive_message_chain(:ship_address, :country_id) { other_country.id }
21
+ expect(rule).not_to be_eligible(order)
22
+ end
23
+ end
24
+
25
+ context 'preferred country is not set' do
26
+ it 'should be eligible for default country' do
27
+ allow(order).to receive_message_chain(:ship_address, :country_id) { other_country.id }
28
+ expect(rule).to be_eligible(order)
29
+ end
30
+
31
+ it 'should not be eligible for incorrect country' do
32
+ allow(order).to receive_message_chain(:ship_address, :country_id) { country.id }
33
+ expect(rule).not_to be_eligible(order)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Promotion::Rules::FirstOrder, type: :model do
4
+ let(:rule) { Spree::Promotion::Rules::FirstOrder.new }
5
+ let(:order) { mock_model(Spree::Order, user: nil, email: nil) }
6
+ let(:user) { mock_model(Spree::LegacyUser) }
7
+
8
+ context "without a user or email" do
9
+ it { expect(rule).not_to be_eligible(order) }
10
+ it "sets an error message" do
11
+ rule.eligible?(order)
12
+ expect(rule.eligibility_errors.full_messages.first).
13
+ to eq "You need to login or provide your email before applying this coupon code."
14
+ end
15
+ end
16
+
17
+ context "first order" do
18
+ context "for a signed user" do
19
+ context "with no completed orders" do
20
+ before(:each) do
21
+ allow(user).to receive_message_chain(:orders, complete: [])
22
+ end
23
+
24
+ specify do
25
+ allow(order).to receive_messages(user: user)
26
+ expect(rule).to be_eligible(order)
27
+ end
28
+
29
+ it "should be eligible when user passed in payload data" do
30
+ expect(rule).to be_eligible(order, user: user)
31
+ end
32
+ end
33
+
34
+ context "with completed orders" do
35
+ before(:each) do
36
+ allow(order).to receive_messages(user: user)
37
+ end
38
+
39
+ it "should be eligible when checked against first completed order" do
40
+ allow(user).to receive_message_chain(:orders, complete: [order])
41
+ expect(rule).to be_eligible(order)
42
+ end
43
+
44
+ context "with another order" do
45
+ before { allow(user).to receive_message_chain(:orders, complete: [mock_model(Spree::Order)]) }
46
+ it { expect(rule).not_to be_eligible(order) }
47
+ it "sets an error message" do
48
+ rule.eligible?(order)
49
+ expect(rule.eligibility_errors.full_messages.first).
50
+ to eq "This coupon code can only be applied to your first order."
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ context "for a guest user" do
57
+ let(:email) { 'user@spreecommerce.org' }
58
+ before { allow(order).to receive_messages email: 'user@spreecommerce.org' }
59
+
60
+ context "with no other orders" do
61
+ it { expect(rule).to be_eligible(order) }
62
+ end
63
+
64
+ context "with another order" do
65
+ before { allow(rule).to receive_messages(orders_by_email: [mock_model(Spree::Order)]) }
66
+ it { expect(rule).not_to be_eligible(order) }
67
+ it "sets an error message" do
68
+ rule.eligible?(order)
69
+ expect(rule.eligibility_errors.full_messages.first).
70
+ to eq "This coupon code can only be applied to your first order."
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,282 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Promotion::Rules::ItemTotal, type: :model do
4
+ let(:rule) { Spree::Promotion::Rules::ItemTotal.new }
5
+ let(:order) { double(:order) }
6
+
7
+ before { rule.preferred_amount_min = 50 }
8
+ before { rule.preferred_amount_max = 60 }
9
+
10
+ context "preferred operator_min set to gt and preferred operator_max set to lt" do
11
+ before do
12
+ rule.preferred_operator_min = 'gt'
13
+ rule.preferred_operator_max = 'lt'
14
+ end
15
+
16
+ context "and item total is lower than prefered maximum amount" do
17
+
18
+ context "and item total is higher than prefered minimum amount" do
19
+ it "should be eligible" do
20
+ allow(order).to receive_messages item_total: 51
21
+ expect(rule).to be_eligible(order)
22
+ end
23
+ end
24
+
25
+ context "and item total is equal to the prefered minimum amount" do
26
+
27
+ before { allow(order).to receive_messages item_total: 50 }
28
+
29
+ it "should not be eligible" do
30
+ expect(rule).to_not be_eligible(order)
31
+ end
32
+
33
+ it "set an error message" do
34
+ rule.eligible?(order)
35
+ expect(rule.eligibility_errors.full_messages.first).
36
+ to eq "This coupon code can't be applied to orders less than or equal to $50.00."
37
+ end
38
+ end
39
+
40
+ context "and item total is lower to the prefered minimum amount" do
41
+ before { allow(order).to receive_messages item_total: 49 }
42
+
43
+ it "should not be eligible" do
44
+ expect(rule).to_not be_eligible(order)
45
+ end
46
+
47
+ it "set an error message" do
48
+ rule.eligible?(order)
49
+ expect(rule.eligibility_errors.full_messages.first).
50
+ to eq "This coupon code can't be applied to orders less than or equal to $50.00."
51
+ end
52
+ end
53
+ end
54
+
55
+ context "and item total is equal to the prefered maximum amount" do
56
+ before { allow(order).to receive_messages item_total: 60 }
57
+
58
+ it "should not be eligible" do
59
+ expect(rule).to_not be_eligible(order)
60
+ end
61
+
62
+ it "set an error message" do
63
+ rule.eligible?(order)
64
+ expect(rule.eligibility_errors.full_messages.first).
65
+ to eq "This coupon code can't be applied to orders higher than $60.00."
66
+ end
67
+ end
68
+
69
+ context "and item total is higher than the prefered maximum amount" do
70
+ before { allow(order).to receive_messages item_total: 61 }
71
+
72
+ it "should not be eligible" do
73
+ expect(rule).to_not be_eligible(order)
74
+ end
75
+
76
+ it "set an error message" do
77
+ rule.eligible?(order)
78
+ expect(rule.eligibility_errors.full_messages.first).
79
+ to eq "This coupon code can't be applied to orders higher than $60.00."
80
+ end
81
+ end
82
+
83
+ end
84
+
85
+ context "preferred operator set to gt and preferred operator_max set to lte" do
86
+ before do
87
+ rule.preferred_operator_min = 'gt'
88
+ rule.preferred_operator_max = 'lte'
89
+ end
90
+
91
+ context "and item total is lower than prefered maximum amount" do
92
+
93
+ context "and item total is higher than prefered minimum amount" do
94
+ it "should be eligible" do
95
+ allow(order).to receive_messages item_total: 51
96
+ expect(rule).to be_eligible(order)
97
+ end
98
+ end
99
+
100
+ context "and item total is equal to the prefered minimum amount" do
101
+
102
+ before { allow(order).to receive_messages item_total: 50 }
103
+
104
+ it "should not be eligible" do
105
+ expect(rule).to_not be_eligible(order)
106
+ end
107
+
108
+ it "set an error message" do
109
+ rule.eligible?(order)
110
+ expect(rule.eligibility_errors.full_messages.first).
111
+ to eq "This coupon code can't be applied to orders less than or equal to $50.00."
112
+ end
113
+ end
114
+
115
+ context "and item total is lower to the prefered minimum amount" do
116
+ before { allow(order).to receive_messages item_total: 49 }
117
+
118
+ it "should not be eligible" do
119
+ expect(rule).to_not be_eligible(order)
120
+ end
121
+
122
+ it "set an error message" do
123
+ rule.eligible?(order)
124
+ expect(rule.eligibility_errors.full_messages.first).
125
+ to eq "This coupon code can't be applied to orders less than or equal to $50.00."
126
+ end
127
+ end
128
+ end
129
+
130
+ context "and item total is equal to the prefered maximum amount" do
131
+ before { allow(order).to receive_messages item_total: 60 }
132
+
133
+ it "should not be eligible" do
134
+ expect(rule).to be_eligible(order)
135
+ end
136
+ end
137
+
138
+ context "and item total is higher than the prefered maximum amount" do
139
+ before { allow(order).to receive_messages item_total: 61 }
140
+
141
+ it "should not be eligible" do
142
+ expect(rule).to_not be_eligible(order)
143
+ end
144
+
145
+ it "set an error message" do
146
+ rule.eligible?(order)
147
+ expect(rule.eligibility_errors.full_messages.first).
148
+ to eq "This coupon code can't be applied to orders higher than $60.00."
149
+ end
150
+ end
151
+ end
152
+
153
+ context "preferred operator set to gte and preferred operator_max set to lt" do
154
+ before do
155
+ rule.preferred_operator_min = 'gte'
156
+ rule.preferred_operator_max = 'lt'
157
+ end
158
+
159
+ context "and item total is lower than prefered maximum amount" do
160
+
161
+ context "and item total is higher than prefered minimum amount" do
162
+ it "should be eligible" do
163
+ allow(order).to receive_messages item_total: 51
164
+ expect(rule).to be_eligible(order)
165
+ end
166
+ end
167
+
168
+ context "and item total is equal to the prefered minimum amount" do
169
+
170
+ before { allow(order).to receive_messages item_total: 50 }
171
+
172
+ it "should not be eligible" do
173
+ expect(rule).to be_eligible(order)
174
+ end
175
+ end
176
+
177
+ context "and item total is lower to the prefered minimum amount" do
178
+ before { allow(order).to receive_messages item_total: 49 }
179
+
180
+ it "should not be eligible" do
181
+ expect(rule).to_not be_eligible(order)
182
+ end
183
+
184
+ it "set an error message" do
185
+ rule.eligible?(order)
186
+ expect(rule.eligibility_errors.full_messages.first).
187
+ to eq "This coupon code can't be applied to orders less than $50.00."
188
+ end
189
+ end
190
+ end
191
+
192
+ context "and item total is equal to the prefered maximum amount" do
193
+ before { allow(order).to receive_messages item_total: 60 }
194
+
195
+ it "should not be eligible" do
196
+ expect(rule).to_not be_eligible(order)
197
+ end
198
+
199
+ it "set an error message" do
200
+ rule.eligible?(order)
201
+ expect(rule.eligibility_errors.full_messages.first).
202
+ to eq "This coupon code can't be applied to orders higher than $60.00."
203
+ end
204
+ end
205
+
206
+ context "and item total is higher than the prefered maximum amount" do
207
+ before { allow(order).to receive_messages item_total: 61 }
208
+
209
+ it "should not be eligible" do
210
+ expect(rule).to_not be_eligible(order)
211
+ end
212
+
213
+ it "set an error message" do
214
+ rule.eligible?(order)
215
+ expect(rule.eligibility_errors.full_messages.first).
216
+ to eq "This coupon code can't be applied to orders higher than $60.00."
217
+ end
218
+ end
219
+
220
+ end
221
+
222
+ context "preferred operator set to gte and preferred operator_max set to lte" do
223
+ before do
224
+ rule.preferred_operator_min = 'gte'
225
+ rule.preferred_operator_max = 'lte'
226
+ end
227
+
228
+ context "and item total is lower than prefered maximum amount" do
229
+ context "and item total is higher than prefered minimum amount" do
230
+ it "should be eligible" do
231
+ allow(order).to receive_messages item_total: 51
232
+ expect(rule).to be_eligible(order)
233
+ end
234
+ end
235
+
236
+ context "and item total is equal to the prefered minimum amount" do
237
+
238
+ before { allow(order).to receive_messages item_total: 50 }
239
+
240
+ it "should not be eligible" do
241
+ expect(rule).to be_eligible(order)
242
+ end
243
+ end
244
+
245
+ context "and item total is lower to the prefered minimum amount" do
246
+ before { allow(order).to receive_messages item_total: 49 }
247
+
248
+ it "should not be eligible" do
249
+ expect(rule).to_not be_eligible(order)
250
+ end
251
+
252
+ it "set an error message" do
253
+ rule.eligible?(order)
254
+ expect(rule.eligibility_errors.full_messages.first).
255
+ to eq "This coupon code can't be applied to orders less than $50.00."
256
+ end
257
+ end
258
+ end
259
+
260
+ context "and item total is equal to the prefered maximum amount" do
261
+ before { allow(order).to receive_messages item_total: 60 }
262
+
263
+ it "should not be eligible" do
264
+ expect(rule).to be_eligible(order)
265
+ end
266
+ end
267
+
268
+ context "and item total is higher than the prefered maximum amount" do
269
+ before { allow(order).to receive_messages item_total: 61 }
270
+
271
+ it "should not be eligible" do
272
+ expect(rule).to_not be_eligible(order)
273
+ end
274
+
275
+ it "set an error message" do
276
+ rule.eligible?(order)
277
+ expect(rule.eligibility_errors.full_messages.first).
278
+ to eq "This coupon code can't be applied to orders higher than $60.00."
279
+ end
280
+ end
281
+ end
282
+ end