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,679 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Promotion, type: :model do
4
+ let(:promotion) { Spree::Promotion.new }
5
+
6
+ describe "validations" do
7
+ before :each do
8
+ @valid_promotion = Spree::Promotion.new name: "A promotion"
9
+ end
10
+
11
+ it "valid_promotion is valid" do
12
+ expect(@valid_promotion).to be_valid
13
+ end
14
+
15
+ it "validates usage limit" do
16
+ @valid_promotion.usage_limit = -1
17
+ expect(@valid_promotion).not_to be_valid
18
+
19
+ @valid_promotion.usage_limit = 100
20
+ expect(@valid_promotion).to be_valid
21
+ end
22
+
23
+ it "validates name" do
24
+ @valid_promotion.name = nil
25
+ expect(@valid_promotion).not_to be_valid
26
+ end
27
+
28
+ describe "expires_at_must_be_later_than_starts_at" do
29
+ before do
30
+ @valid_promotion.starts_at = Date.today
31
+ end
32
+
33
+ context "starts_at is a date earlier than expires_at" do
34
+ before { @valid_promotion.expires_at = 5.days.from_now }
35
+
36
+ it "is valid" do
37
+ expect(@valid_promotion).to be_valid
38
+ end
39
+ end
40
+
41
+ context "starts_at is a date earlier than expires_at" do
42
+ before { @valid_promotion.expires_at = 5.days.ago }
43
+
44
+ context "is not valid" do
45
+ before { @valid_promotion.valid? }
46
+ it { expect(@valid_promotion).not_to be_valid }
47
+ it { expect(@valid_promotion.errors[:expires_at]).to include(I18n.t(:invalid_date_range, scope: 'activerecord.errors.models.spree/promotion.attributes.expires_at')) }
48
+ end
49
+ end
50
+
51
+ context "starts_at and expires_at are nil" do
52
+ before do
53
+ @valid_promotion.expires_at = nil
54
+ @valid_promotion.starts_at = nil
55
+ end
56
+
57
+ it "is valid" do
58
+ expect(@valid_promotion).to be_valid
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ describe 'scopes' do
65
+ describe '.coupons' do
66
+ let!(:promotion_without_code) { Spree::Promotion.create! name: 'test', code: '' }
67
+ let!(:promotion_with_code) { Spree::Promotion.create! name: 'test1', code: 'code' }
68
+
69
+ subject { Spree::Promotion.coupons }
70
+
71
+ it 'is expected to not include promotion without code' do
72
+ is_expected.to_not include(promotion_without_code)
73
+ end
74
+
75
+ it 'is expected to include promotion with code' do
76
+ is_expected.to include(promotion_with_code)
77
+ end
78
+ end
79
+
80
+ describe '.applied' do
81
+ let!(:promotion_not_applied) { Spree::Promotion.create! name: 'test', code: '' }
82
+ let(:order) { create(:order) }
83
+ let!(:promotion_applied) do
84
+ promotion = Spree::Promotion.create!(name: 'test1', code: '')
85
+ promotion.orders << order
86
+ promotion
87
+ end
88
+
89
+ subject { Spree::Promotion.applied }
90
+
91
+ it 'is expected to not include promotion not applied' do
92
+ is_expected.to_not include(promotion_not_applied)
93
+ end
94
+
95
+ it 'is expected to include promotion applied' do
96
+ is_expected.to include(promotion_applied)
97
+ end
98
+ end
99
+
100
+ describe '.advertised' do
101
+ let!(:promotion_not_advertised) { Spree::Promotion.create! name: 'test', advertise: false }
102
+ let!(:promotion_advertised) { Spree::Promotion.create! name: 'test1', advertise: true }
103
+
104
+ subject { Spree::Promotion.advertised }
105
+
106
+ it 'is expected to not include promotion not advertised' do
107
+ is_expected.to_not include(promotion_not_advertised)
108
+ end
109
+
110
+ it 'is expected to include promotion advertised' do
111
+ is_expected.to include(promotion_advertised)
112
+ end
113
+ end
114
+ end
115
+
116
+ describe "#destroy" do
117
+ let(:promotion) { Spree::Promotion.create(name: "delete me") }
118
+
119
+ before(:each) do
120
+ promotion.actions << Spree::Promotion::Actions::CreateAdjustment.new
121
+ promotion.rules << Spree::Promotion::Rules::FirstOrder.new
122
+ promotion.save!
123
+ promotion.destroy
124
+ end
125
+
126
+ it "should delete actions" do
127
+ expect(Spree::PromotionAction.count).to eq(0)
128
+ end
129
+
130
+ it "should delete rules" do
131
+ expect(Spree::PromotionRule.count).to eq(0)
132
+ end
133
+ end
134
+
135
+ describe "#save" do
136
+ let(:promotion) { Spree::Promotion.create(name: "delete me") }
137
+
138
+ before(:each) do
139
+ promotion.actions << Spree::Promotion::Actions::CreateAdjustment.new
140
+ promotion.rules << Spree::Promotion::Rules::FirstOrder.new
141
+ promotion.save!
142
+ end
143
+
144
+ it "should deeply autosave records and preferences" do
145
+ promotion.actions[0].calculator.preferred_flat_percent = 10
146
+ promotion.save!
147
+ expect(Spree::Calculator.first.preferred_flat_percent).to eq(10)
148
+ end
149
+ end
150
+
151
+ describe "#activate" do
152
+ before do
153
+ @action1 = Spree::Promotion::Actions::CreateAdjustment.create!
154
+ @action2 = Spree::Promotion::Actions::CreateAdjustment.create!
155
+ allow(@action1).to receive_messages perform: true
156
+ allow(@action2).to receive_messages perform: true
157
+
158
+ promotion.promotion_actions = [@action1, @action2]
159
+ promotion.created_at = 2.days.ago
160
+
161
+ @user = stub_model(Spree::LegacyUser, email: "spree@example.com")
162
+ @order = Spree::Order.create user: @user
163
+ @payload = { order: @order, user: @user }
164
+ end
165
+
166
+ it "should check path if present" do
167
+ promotion.path = 'content/cvv'
168
+ @payload[:path] = 'content/cvv'
169
+ expect(@action1).to receive(:perform).with(@payload)
170
+ expect(@action2).to receive(:perform).with(@payload)
171
+ promotion.activate(@payload)
172
+ end
173
+
174
+ it "does not perform actions against an order in a finalized state" do
175
+ expect(@action1).not_to receive(:perform).with(@payload)
176
+
177
+ @order.state = 'complete'
178
+ promotion.activate(@payload)
179
+
180
+ @order.state = 'awaiting_return'
181
+ promotion.activate(@payload)
182
+
183
+ @order.state = 'returned'
184
+ promotion.activate(@payload)
185
+ end
186
+
187
+ it "does activate if newer then order" do
188
+ expect(@action1).to receive(:perform).with(@payload)
189
+ promotion.created_at = DateTime.current + 2
190
+ expect(promotion.activate(@payload)).to be true
191
+ end
192
+
193
+ context "keeps track of the orders" do
194
+ context "when activated" do
195
+ it "assigns the order" do
196
+ expect(promotion.orders).to be_empty
197
+ expect(promotion.activate(@payload)).to be true
198
+ expect(promotion.orders.first).to eql @order
199
+ end
200
+ end
201
+ context "when not activated" do
202
+ it "will not assign the order" do
203
+ @order.state = 'complete'
204
+ expect(promotion.orders).to be_empty
205
+ expect(promotion.activate(@payload)).to be_falsey
206
+ expect(promotion.orders).to be_empty
207
+ end
208
+ end
209
+
210
+ end
211
+
212
+ end
213
+
214
+ context "#usage_limit_exceeded" do
215
+ let(:promotable) { double('Promotable') }
216
+ it "should not have its usage limit exceeded with no usage limit" do
217
+ promotion.usage_limit = 0
218
+ expect(promotion.usage_limit_exceeded?(promotable)).to be false
219
+ end
220
+
221
+ it "should have its usage limit exceeded" do
222
+ promotion.usage_limit = 2
223
+ allow(promotion).to receive_messages(adjusted_credits_count: 2)
224
+ expect(promotion.usage_limit_exceeded?(promotable)).to be true
225
+
226
+ allow(promotion).to receive_messages(adjusted_credits_count: 3)
227
+ expect(promotion.usage_limit_exceeded?(promotable)).to be true
228
+ end
229
+ end
230
+
231
+ context "#expired" do
232
+ it "should not be exipired" do
233
+ expect(promotion).not_to be_expired
234
+ end
235
+
236
+ it "should be expired if it hasn't started yet" do
237
+ promotion.starts_at = Time.current + 1.day
238
+ expect(promotion).to be_expired
239
+ end
240
+
241
+ it "should be expired if it has already ended" do
242
+ promotion.expires_at = Time.current - 1.day
243
+ expect(promotion).to be_expired
244
+ end
245
+
246
+ it "should not be expired if it has started already" do
247
+ promotion.starts_at = Time.current - 1.day
248
+ expect(promotion).not_to be_expired
249
+ end
250
+
251
+ it "should not be expired if it has not ended yet" do
252
+ promotion.expires_at = Time.current + 1.day
253
+ expect(promotion).not_to be_expired
254
+ end
255
+
256
+ it "should not be expired if current time is within starts_at and expires_at range" do
257
+ promotion.starts_at = Time.current - 1.day
258
+ promotion.expires_at = Time.current + 1.day
259
+ expect(promotion).not_to be_expired
260
+ end
261
+
262
+ it "should not be expired if usage limit is not exceeded" do
263
+ promotion.usage_limit = 2
264
+ allow(promotion).to receive_messages(credits_count: 1)
265
+ expect(promotion).not_to be_expired
266
+ end
267
+ end
268
+
269
+ context "#credits_count" do
270
+ let!(:promotion) do
271
+ promotion = Spree::Promotion.new
272
+ promotion.name = "Foo"
273
+ promotion.code = "XXX"
274
+ calculator = Spree::Calculator::FlatRate.new
275
+ promotion.tap(&:save)
276
+ end
277
+
278
+ let!(:action) do
279
+ calculator = Spree::Calculator::FlatRate.new
280
+ action_params = { promotion: promotion, calculator: calculator }
281
+ action = Spree::Promotion::Actions::CreateAdjustment.create(action_params)
282
+ promotion.actions << action
283
+ action
284
+ end
285
+
286
+ let!(:adjustment) do
287
+ order = create(:order)
288
+ Spree::Adjustment.create!(
289
+ order: order,
290
+ adjustable: order,
291
+ source: action,
292
+ amount: 10,
293
+ label: 'Promotional adjustment'
294
+ )
295
+ end
296
+
297
+ it "counts eligible adjustments" do
298
+ adjustment.update_column(:eligible, true)
299
+ expect(promotion.credits_count).to eq(1)
300
+ end
301
+
302
+ # Regression test for #4112
303
+ it "does not count ineligible adjustments" do
304
+ adjustment.update_column(:eligible, false)
305
+ expect(promotion.credits_count).to eq(0)
306
+ end
307
+ end
308
+
309
+ context "#adjusted_credits_count" do
310
+ let(:order) { create :order }
311
+ let(:line_item) { create :line_item, order: order }
312
+ let(:promotion) { Spree::Promotion.create name: "promo", code: "10off" }
313
+ let(:order_action) {
314
+ action = Spree::Promotion::Actions::CreateAdjustment.create(calculator: Spree::Calculator::FlatPercentItemTotal.new)
315
+ promotion.actions << action
316
+ action
317
+ }
318
+ let(:item_action) {
319
+ action = Spree::Promotion::Actions::CreateItemAdjustments.create(calculator: Spree::Calculator::FlatPercentItemTotal.new)
320
+ promotion.actions << action
321
+ action
322
+ }
323
+ let(:order_adjustment) do
324
+ Spree::Adjustment.create!(
325
+ source: order_action,
326
+ amount: 10,
327
+ adjustable: order,
328
+ order: order,
329
+ label: "Promotional adjustment"
330
+ )
331
+ end
332
+ let(:item_adjustment) do
333
+ Spree::Adjustment.create!(
334
+ source: item_action,
335
+ amount: 10,
336
+ adjustable: line_item,
337
+ order: order,
338
+ label: "Promotional adjustment"
339
+ )
340
+ end
341
+
342
+ it "counts order level adjustments" do
343
+ expect(order_adjustment.adjustable).to eq(order)
344
+ expect(promotion.credits_count).to eq(1)
345
+ expect(promotion.adjusted_credits_count(order)).to eq(0)
346
+ end
347
+
348
+ it "counts item level adjustments" do
349
+ expect(item_adjustment.adjustable).to eq(line_item)
350
+ expect(promotion.credits_count).to eq(1)
351
+ expect(promotion.adjusted_credits_count(order)).to eq(0)
352
+ end
353
+ end
354
+
355
+ context "#products" do
356
+ let(:product) { create(:product) }
357
+ let(:promotion) { create(:promotion) }
358
+
359
+ context "when it has product rules with products associated" do
360
+ let(:promotion_rule) { create(:promotion_rule, promotion: promotion, type: 'Spree::Promotion::Rules::Product') }
361
+
362
+ before do
363
+ promotion.promotion_rules << promotion_rule
364
+ product.product_promotion_rules.create(promotion_rule_id: promotion_rule.id)
365
+ end
366
+
367
+ it "should have products" do
368
+ expect(promotion.reload.products.size).to eq(1)
369
+ end
370
+ end
371
+
372
+ context "when there's no product rule associated" do
373
+ it "should not have products but still return an empty array" do
374
+ expect(promotion.products).to be_blank
375
+ end
376
+ end
377
+ end
378
+
379
+ context "#eligible?" do
380
+ let(:promotable) { create :order }
381
+ subject { promotion.eligible?(promotable) }
382
+ context "when promotion is expired" do
383
+ before { promotion.expires_at = Time.current - 10.days }
384
+ it { is_expected.to be false }
385
+ end
386
+ context "when promotable is a Spree::LineItem" do
387
+ let(:promotable) { create :line_item }
388
+ let(:product) { promotable.product }
389
+ before do
390
+ product.promotionable = promotionable
391
+ end
392
+ context "and product is promotionable" do
393
+ let(:promotionable) { true }
394
+ it { is_expected.to be true }
395
+ end
396
+ context "and product is not promotionable" do
397
+ let(:promotionable) { false }
398
+ it { is_expected.to be false }
399
+ end
400
+ end
401
+ context "when promotable is a Spree::Order" do
402
+ let(:promotable) { create :order }
403
+ context "and it is empty" do
404
+ it { is_expected.to be true }
405
+ end
406
+ context "and it contains items" do
407
+ let!(:line_item) { create(:line_item, order: promotable) }
408
+ context "and the items are all non-promotionable" do
409
+ before do
410
+ line_item.product.update_column(:promotionable, false)
411
+ end
412
+ it { is_expected.to be false }
413
+ end
414
+ context "and at least one item is promotionable" do
415
+ it { is_expected.to be true }
416
+ end
417
+ end
418
+ end
419
+ end
420
+
421
+ context "#eligible_rules" do
422
+ let(:promotable) { double('Promotable') }
423
+ it "true if there are no rules" do
424
+ expect(promotion.eligible_rules(promotable)).to eq []
425
+ end
426
+
427
+ it "true if there are no applicable rules" do
428
+ promotion.promotion_rules = [stub_model(Spree::PromotionRule, eligible?: true, applicable?: false)]
429
+ allow(promotion.promotion_rules).to receive(:for).and_return([])
430
+ expect(promotion.eligible_rules(promotable)).to eq []
431
+ end
432
+
433
+ context "with 'all' match policy" do
434
+ let(:promo1) { Spree::PromotionRule.create! }
435
+ let(:promo2) { Spree::PromotionRule.create! }
436
+
437
+ before { promotion.match_policy = 'all' }
438
+
439
+ context "when all rules are eligible" do
440
+ before do
441
+ allow(promo1).to receive_messages(eligible?: true, applicable?: true)
442
+ allow(promo2).to receive_messages(eligible?: true, applicable?: true)
443
+
444
+ promotion.promotion_rules = [promo1, promo2]
445
+ allow(promotion.promotion_rules).to receive(:for).and_return(promotion.promotion_rules)
446
+ end
447
+ it "returns the eligible rules" do
448
+ expect(promotion.eligible_rules(promotable)).to eq [promo1, promo2]
449
+ end
450
+ it "does set anything to eligiblity errors" do
451
+ promotion.eligible_rules(promotable)
452
+ expect(promotion.eligibility_errors).to be_nil
453
+ end
454
+ end
455
+
456
+ context "when any of the rules is not eligible" do
457
+ let(:errors) { double ActiveModel::Errors, empty?: false }
458
+ before do
459
+ allow(promo1).to receive_messages(eligible?: true, applicable?: true, eligibility_errors: nil)
460
+ allow(promo2).to receive_messages(eligible?: false, applicable?: true, eligibility_errors: errors)
461
+
462
+ promotion.promotion_rules = [promo1, promo2]
463
+ allow(promotion.promotion_rules).to receive(:for).and_return(promotion.promotion_rules)
464
+ end
465
+ it "returns nil" do
466
+ expect(promotion.eligible_rules(promotable)).to be_nil
467
+ end
468
+ it "sets eligibility errors to the first non-nil one" do
469
+ promotion.eligible_rules(promotable)
470
+ expect(promotion.eligibility_errors).to eq errors
471
+ end
472
+ end
473
+ end
474
+
475
+ context "with 'any' match policy" do
476
+ let(:promotion) { Spree::Promotion.create(name: "Promo", match_policy: 'any') }
477
+ let(:promotable) { double('Promotable') }
478
+
479
+ it "should have eligible rules if any of the rules are eligible" do
480
+ allow_any_instance_of(Spree::PromotionRule).to receive_messages(applicable?: true)
481
+ true_rule = Spree::PromotionRule.create(promotion: promotion)
482
+ allow(true_rule).to receive_messages(eligible?: true)
483
+ allow(promotion).to receive_messages(rules: [true_rule])
484
+ allow(promotion).to receive_message_chain(:rules, :for).and_return([true_rule])
485
+ expect(promotion.eligible_rules(promotable)).to eq [true_rule]
486
+ end
487
+
488
+ context "when none of the rules are eligible" do
489
+ let(:promo) { Spree::PromotionRule.create! }
490
+ let(:errors) { double ActiveModel::Errors, empty?: false }
491
+ before do
492
+ allow(promo).to receive_messages(eligible?: false, applicable?: true, eligibility_errors: errors)
493
+
494
+ promotion.promotion_rules = [promo]
495
+ allow(promotion.promotion_rules).to receive(:for).and_return(promotion.promotion_rules)
496
+ end
497
+ it "returns nil" do
498
+ expect(promotion.eligible_rules(promotable)).to be_nil
499
+ end
500
+ it "sets eligibility errors to the first non-nil one" do
501
+ promotion.eligible_rules(promotable)
502
+ expect(promotion.eligibility_errors).to eq errors
503
+ end
504
+ end
505
+ end
506
+ end
507
+
508
+ describe '#line_item_actionable?' do
509
+ let(:order) { double Spree::Order }
510
+ let(:line_item) { double Spree::LineItem}
511
+ let(:true_rule) { double Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: true }
512
+ let(:false_rule) { double Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: false }
513
+ let(:rules) { [] }
514
+
515
+ before do
516
+ allow(promotion).to receive(:rules) { rules }
517
+ allow(rules).to receive(:for) { rules }
518
+ end
519
+
520
+ subject { promotion.line_item_actionable? order, line_item }
521
+
522
+ context 'when the order is eligible for promotion' do
523
+ context 'when there are no rules' do
524
+ it { is_expected.to be }
525
+ end
526
+
527
+ context 'when there are rules' do
528
+ context 'when the match policy is all' do
529
+ before { promotion.match_policy = 'all' }
530
+
531
+ context 'when all rules allow action on the line item' do
532
+ let(:rules) { [true_rule] }
533
+ it { is_expected.to be}
534
+ end
535
+
536
+ context 'when at least one rule does not allow action on the line item' do
537
+ let(:rules) { [true_rule, false_rule] }
538
+ it { is_expected.not_to be}
539
+ end
540
+ end
541
+
542
+ context 'when the match policy is any' do
543
+ before { promotion.match_policy = 'any' }
544
+
545
+ context 'when at least one rule allows action on the line item' do
546
+ let(:rules) { [true_rule, false_rule] }
547
+ it { is_expected.to be }
548
+ end
549
+
550
+ context 'when no rules allow action on the line item' do
551
+ let(:rules) { [false_rule] }
552
+ it { is_expected.not_to be}
553
+ end
554
+ end
555
+ end
556
+ end
557
+
558
+ context 'when the order is not eligible for the promotion' do
559
+ before { promotion.starts_at = Time.current + 2.days }
560
+ it { is_expected.not_to be }
561
+ end
562
+ end
563
+
564
+ # regression for #4059
565
+ # admin form posts the code and path as empty string
566
+ describe "normalize blank values for code & path" do
567
+ it "will save blank value as nil value instead" do
568
+ promotion = Spree::Promotion.create(name: "A promotion", code: "", path: "")
569
+ expect(promotion.code).to be_nil
570
+ expect(promotion.path).to be_nil
571
+ end
572
+ end
573
+
574
+ # Regression test for #4081
575
+ describe "#with_coupon_code" do
576
+ context "and code stored in uppercase" do
577
+ let!(:promotion) { create(:promotion, :with_order_adjustment, code: "MY-COUPON-123") }
578
+ it "finds the code with lowercase" do
579
+ expect(Spree::Promotion.with_coupon_code("my-coupon-123")).to eql promotion
580
+ end
581
+ end
582
+
583
+ context "and there are multiple coupons with the same code" do
584
+ context "and only one has any actions" do
585
+ let!(:promotion_without_actions) { create(:promotion, code: "MY-COUPON-123").actions.clear }
586
+ let!(:promotion) { create(:promotion, :with_order_adjustment, code: "MY-COUPON-123") }
587
+
588
+ it "then returns the one with an action" do
589
+ expect(Spree::Promotion.with_coupon_code("MY-COUPON-123").actions.exists?).to be
590
+ end
591
+ end
592
+
593
+ context "and all of them has actions" do
594
+ let!(:first_promotion) { create(:promotion, :with_order_adjustment, code: "MY-COUPON-123") }
595
+ let!(:second_promotion) { create(:promotion, :with_order_adjustment, code: "MY-COUPON-123") }
596
+
597
+ it "then returns the first one with an action" do
598
+ expect(Spree::Promotion.with_coupon_code("MY-COUPON-123").id).to eq(first_promotion.id)
599
+ end
600
+ end
601
+ end
602
+ end
603
+
604
+ describe '#used_by?' do
605
+ subject { promotion.used_by? user, [excluded_order] }
606
+
607
+ let(:promotion) { create :promotion, :with_order_adjustment }
608
+ let(:user) { create :user }
609
+ let(:order) { create :order_with_line_items, user: user }
610
+ let(:excluded_order) { create :order_with_line_items, user: user }
611
+
612
+ before do
613
+ order.user_id = user.id
614
+ order.save!
615
+ end
616
+
617
+ context 'when the user has used this promo' do
618
+ before do
619
+ promotion.activate(order: order)
620
+ order.update_with_updater!
621
+ order.completed_at = Time.current
622
+ order.save!
623
+ end
624
+
625
+ context 'when the order is complete' do
626
+ it { is_expected.to be true }
627
+
628
+ context 'when the promotion was not eligible' do
629
+ let(:adjustment) { order.adjustments.first }
630
+
631
+ before do
632
+ adjustment.eligible = false
633
+ adjustment.save!
634
+ end
635
+
636
+ it { is_expected.to be false }
637
+ end
638
+
639
+ context 'when the only matching order is the excluded order' do
640
+ let(:excluded_order) { order }
641
+ it { is_expected.to be false }
642
+ end
643
+ end
644
+
645
+ context 'when the order is not complete' do
646
+ let(:order) { create :order, user: user }
647
+ it { is_expected.to be false }
648
+ end
649
+ end
650
+
651
+ context 'when the user has not used this promo' do
652
+ it { is_expected.to be false }
653
+ end
654
+ end
655
+
656
+ describe "adding items to the cart" do
657
+ let(:order) { create :order }
658
+ let(:line_item) { create :line_item, order: order }
659
+ let(:promo) { create :promotion_with_item_adjustment, adjustment_rate: 5, code: 'promo' }
660
+ let(:variant) { create :variant }
661
+
662
+ it "updates the promotions for new line items" do
663
+ expect(line_item.adjustments).to be_empty
664
+ expect(order.adjustment_total).to eq 0
665
+
666
+ promo.activate order: order
667
+ order.update_with_updater!
668
+
669
+ expect(line_item.adjustments.size).to eq(1)
670
+ expect(order.adjustment_total).to eq -5
671
+
672
+ other_line_item = order.contents.add(variant, 1, currency: order.currency)
673
+
674
+ expect(other_line_item).not_to eq line_item
675
+ expect(other_line_item.adjustments.size).to eq(1)
676
+ expect(order.adjustment_total).to eq -10
677
+ end
678
+ end
679
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PropertyPrototype do
4
+ describe 'Validations' do
5
+ it { is_expected.to validate_presence_of(:prototype) }
6
+ it { is_expected.to validate_presence_of(:property) }
7
+ it { is_expected.to validate_uniqueness_of(:prototype_id).scoped_to(:property_id).allow_nil }
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Property, type: :model do
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Prototype, type: :model do
4
+
5
+ end