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,786 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'StoreCredit' do
4
+ let(:currency) { 'TEST' }
5
+ let(:store_credit) { build(:store_credit, store_credit_attrs) }
6
+ let(:store_credit_attrs) { {} }
7
+
8
+ describe 'callbacks' do
9
+ subject { store_credit.save }
10
+
11
+ context 'amount used is greater than zero' do
12
+ let(:store_credit) { create(:store_credit, amount: 100, amount_used: 1) }
13
+ let(:validation_message) { I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_used.greater_than_zero_restrict_delete') }
14
+ subject { store_credit.destroy }
15
+
16
+ it 'can not delete the store credit' do
17
+ subject
18
+ expect(store_credit.reload).to eq store_credit
19
+ expect(store_credit.errors[:amount_used]).to include(validation_message)
20
+ end
21
+ end
22
+
23
+ context 'category is a non-expiring type' do
24
+ let!(:secondary_credit_type) { create(:secondary_credit_type) }
25
+ let(:store_credit) { build(:store_credit, credit_type: nil) }
26
+ before { allow(store_credit.category).to receive_message_chain(:non_expiring?).and_return(true) }
27
+
28
+ it 'sets the credit type to non-expiring' do
29
+ subject
30
+ expect(store_credit.credit_type.name).to eq secondary_credit_type.name
31
+ end
32
+ end
33
+
34
+ context 'category is an expiring type' do
35
+ before { allow(store_credit.category).to receive_message_chain(:non_expiring?).and_return(false) }
36
+
37
+ it 'sets the credit type to non-expiring' do
38
+ subject
39
+ expect(store_credit.credit_type.name).to eq 'Expiring'
40
+ end
41
+ end
42
+
43
+ context 'the type is set' do
44
+ let!(:secondary_credit_type) { create(:secondary_credit_type) }
45
+ let(:store_credit) { build(:store_credit, credit_type: secondary_credit_type) }
46
+ before { allow(store_credit.category).to receive_message_chain(:non_expiring?).and_return(false) }
47
+
48
+ it "doesn't overwrite the type" do
49
+ expect { subject }.to_not change { store_credit.credit_type }
50
+ end
51
+ end
52
+ end
53
+
54
+ describe 'validations' do
55
+ describe 'used amount should not be greater than the credited amount' do
56
+ context 'the used amount is defined' do
57
+ let(:invalid_store_credit) { build(:store_credit, amount: 100, amount_used: 150) }
58
+
59
+ it 'should not be valid' do
60
+ expect(invalid_store_credit).to_not be_valid
61
+ end
62
+
63
+ it 'should set the correct error message' do
64
+ invalid_store_credit.valid?
65
+ attribute_name = I18n.t('activerecord.attributes.spree/store_credit.amount_used')
66
+ validation_message = I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_used.cannot_be_greater_than_amount')
67
+ expected_error_message = "#{attribute_name} #{validation_message}"
68
+ expect(invalid_store_credit.errors.full_messages).to include(expected_error_message)
69
+ end
70
+ end
71
+
72
+ context 'the used amount is not defined yet' do
73
+ let(:store_credit) { build(:store_credit, amount: 100) }
74
+
75
+ it 'should be valid' do
76
+ expect(store_credit).to be_valid
77
+ end
78
+ end
79
+ end
80
+
81
+ describe 'amount used less than or equal to amount' do
82
+ subject { build(:store_credit, amount_used: 101.0, amount: 100.0) }
83
+
84
+ it 'is not valid' do
85
+ expect(subject).to_not be_valid
86
+ end
87
+
88
+ it 'adds an error message about the invalid amount used' do
89
+ subject.valid?
90
+ text = I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_used.cannot_be_greater_than_amount')
91
+ expect(subject.errors[:amount_used]).to include(text)
92
+ end
93
+ end
94
+
95
+ describe 'amount authorized less than or equal to amount' do
96
+ subject { build(:store_credit, amount_authorized: 101.0, amount: 100.0) }
97
+
98
+ it 'is not valid' do
99
+ expect(subject).to_not be_valid
100
+ end
101
+
102
+ it 'adds an error message about the invalid authorized amount' do
103
+ subject.valid?
104
+ text = I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_authorized.exceeds_total_credits')
105
+ expect(subject.errors[:amount_authorized]).to include(text)
106
+ end
107
+ end
108
+ end
109
+
110
+ describe '#display_amount' do
111
+ it 'returns a Spree::Money instance' do
112
+ expect(store_credit.display_amount).to be_instance_of(Spree::Money)
113
+ end
114
+ end
115
+
116
+ describe '#display_amount_used' do
117
+ it 'returns a Spree::Money instance' do
118
+ expect(store_credit.display_amount_used).to be_instance_of(Spree::Money)
119
+ end
120
+ end
121
+
122
+ describe '#amount_remaining' do
123
+ context 'the amount_used is not defined' do
124
+ context 'the authorized amount is not defined' do
125
+ it 'returns the credited amount' do
126
+ expect(store_credit.amount_remaining).to eq store_credit.amount
127
+ end
128
+ end
129
+
130
+ context 'the authorized amount is defined' do
131
+ let(:authorized_amount) { 15.00 }
132
+
133
+ before { store_credit.update_attributes(amount_authorized: authorized_amount) }
134
+
135
+ it 'subtracts the authorized amount from the credited amount' do
136
+ expect(store_credit.amount_remaining).to eq (store_credit.amount - authorized_amount)
137
+ end
138
+ end
139
+ end
140
+
141
+ context 'the amount_used is defined' do
142
+ let(:amount_used) { 10.0 }
143
+
144
+ before { store_credit.update_attributes(amount_used: amount_used) }
145
+
146
+ context 'the authorized amount is not defined' do
147
+ it 'subtracts the amount used from the credited amount' do
148
+ expect(store_credit.amount_remaining).to eq (store_credit.amount - amount_used)
149
+ end
150
+ end
151
+
152
+ context 'the authorized amount is defined' do
153
+ let(:authorized_amount) { 15.00 }
154
+
155
+ before { store_credit.update_attributes(amount_authorized: authorized_amount) }
156
+
157
+ it 'subtracts the amount used and the authorized amount from the credited amount' do
158
+ expect(store_credit.amount_remaining).to eq (store_credit.amount - amount_used - authorized_amount)
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ describe '#authorize' do
165
+ context 'amount is valid' do
166
+ let(:authorization_amount) { 1.0 }
167
+ let(:added_authorization_amount) { 3.0 }
168
+ let(:originator) { nil }
169
+
170
+ context 'amount has not been authorized yet' do
171
+ before { store_credit.update_attributes(amount_authorized: authorization_amount) }
172
+
173
+ it 'returns true' do
174
+ expect(store_credit.authorize(store_credit.amount - authorization_amount, store_credit.currency)).to be_truthy
175
+ end
176
+
177
+ it 'adds the new amount to authorized amount' do
178
+ store_credit.authorize(added_authorization_amount, store_credit.currency)
179
+ expect(store_credit.reload.amount_authorized).to eq (authorization_amount + added_authorization_amount)
180
+ end
181
+
182
+ context 'originator is present' do
183
+ with_model 'OriginatorThing', scope: :all
184
+
185
+ let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
186
+
187
+ subject do
188
+ store_credit.authorize(added_authorization_amount, store_credit.currency,
189
+ action_originator: originator)
190
+ end
191
+
192
+ it 'records the originator' do
193
+ expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
194
+ expect(Spree::StoreCreditEvent.last.originator).to eq originator
195
+ end
196
+ end
197
+ end
198
+
199
+ context 'authorization has already happened' do
200
+ let!(:auth_event) { create(:store_credit_auth_event, store_credit: store_credit) }
201
+
202
+ before { store_credit.update_attributes(amount_authorized: store_credit.amount) }
203
+
204
+ it 'returns true' do
205
+ expect(store_credit.authorize(store_credit.amount, store_credit.currency,
206
+ action_authorization_code: auth_event.authorization_code)
207
+ ).to be true
208
+ end
209
+ end
210
+ end
211
+
212
+ context 'amount is invalid' do
213
+ it 'returns false' do
214
+ expect(store_credit.authorize(store_credit.amount * 2, store_credit.currency)).to be false
215
+ end
216
+ end
217
+ end
218
+
219
+ describe '#validate_authorization' do
220
+ context 'insufficient funds' do
221
+ subject { store_credit.validate_authorization(store_credit.amount * 2, store_credit.currency) }
222
+
223
+ it 'returns false' do
224
+ expect(subject).to be false
225
+ end
226
+
227
+ it 'adds an error to the model' do
228
+ subject
229
+ text = Spree.t('store_credit_payment_method.insufficient_funds')
230
+ expect(store_credit.errors.full_messages).to include(text)
231
+ end
232
+ end
233
+
234
+ context 'currency mismatch' do
235
+ subject { store_credit.validate_authorization(store_credit.amount, "EUR") }
236
+
237
+ it 'returns false' do
238
+ expect(subject).to be false
239
+ end
240
+
241
+ it 'adds an error to the model' do
242
+ subject
243
+ text = Spree.t('store_credit_payment_method.currency_mismatch')
244
+ expect(store_credit.errors.full_messages).to include(text)
245
+ end
246
+ end
247
+
248
+ context 'valid authorization' do
249
+ subject { store_credit.validate_authorization(store_credit.amount, store_credit.currency) }
250
+
251
+ it 'returns true' do
252
+ expect(subject).to be true
253
+ end
254
+ end
255
+
256
+ context 'troublesome floats' do
257
+ # 8.21.to_d < 8.21 => true
258
+ let(:store_credit_attrs) { { amount: 8.21 } }
259
+
260
+ subject { store_credit.validate_authorization(store_credit_attrs[:amount], store_credit.currency) }
261
+
262
+ it 'returns true' do
263
+ expect(subject).to be_truthy
264
+ end
265
+ end
266
+ end
267
+
268
+ describe '#capture' do
269
+ let(:authorized_amount) { 10.00 }
270
+ let(:auth_code) { '23-SC-20140602164814476128' }
271
+
272
+ before do
273
+ store_credit.update_attributes(amount_authorized: authorized_amount, amount_used: 0.0)
274
+ allow(store_credit).to receive_messages(authorize: true)
275
+ end
276
+
277
+ context 'insufficient funds' do
278
+ subject { store_credit.capture(authorized_amount * 2, auth_code, store_credit.currency) }
279
+
280
+ it 'returns false' do
281
+ expect(subject).to be false
282
+ end
283
+
284
+ it 'adds an error to the model' do
285
+ subject
286
+ text = Spree.t('store_credit_payment_method.insufficient_authorized_amount')
287
+ expect(store_credit.errors.full_messages).to include(text)
288
+ end
289
+
290
+ it 'does not update the store credit model' do
291
+ expect { subject }.to_not change { store_credit }
292
+ end
293
+ end
294
+
295
+ context 'currency mismatch' do
296
+ subject { store_credit.capture(authorized_amount, auth_code, "EUR") }
297
+
298
+ it 'returns false' do
299
+ expect(subject).to be false
300
+ end
301
+
302
+ it 'adds an error to the model' do
303
+ subject
304
+ text = Spree.t('store_credit_payment_method.currency_mismatch')
305
+ expect(store_credit.errors.full_messages).to include(text)
306
+ end
307
+
308
+ it 'does not update the store credit model' do
309
+ expect { subject }.to_not change { store_credit }
310
+ end
311
+ end
312
+
313
+ context 'valid capture' do
314
+ let(:remaining_authorized_amount) { 1 }
315
+ let(:originator) { nil }
316
+
317
+ subject do
318
+ amount = authorized_amount - remaining_authorized_amount
319
+ store_credit.capture(amount, auth_code, store_credit.currency,
320
+ action_originator: originator)
321
+ end
322
+
323
+ it 'returns true' do
324
+ expect(subject).to be_truthy
325
+ end
326
+
327
+ it 'updates the authorized amount to the difference between the captured amount and the authorized amount' do
328
+ subject
329
+ expect(store_credit.reload.amount_authorized).to eq remaining_authorized_amount
330
+ end
331
+
332
+ it 'updates the used amount to the current used amount plus the captured amount' do
333
+ subject
334
+ expect(store_credit.reload.amount_used).to eq authorized_amount - remaining_authorized_amount
335
+ end
336
+
337
+ context 'originator is present' do
338
+ with_model 'OriginatorThing', scope: :all
339
+
340
+ let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
341
+
342
+ it 'records the originator' do
343
+ expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
344
+ expect(Spree::StoreCreditEvent.last.originator).to eq originator
345
+ end
346
+ end
347
+ end
348
+ end
349
+
350
+ describe '#void' do
351
+ let(:auth_code) { '1-SC-20141111111111' }
352
+ let(:store_credit) { create(:store_credit, amount_used: 150.0) }
353
+ let(:originator) { nil }
354
+
355
+ subject do
356
+ store_credit.void(auth_code, action_originator: originator)
357
+ end
358
+
359
+ context 'no event found for auth_code' do
360
+ it 'returns false' do
361
+ expect(subject).to be false
362
+ end
363
+
364
+ it 'adds an error to the model' do
365
+ subject
366
+ text = Spree.t('store_credit_payment_method.unable_to_void', auth_code: auth_code)
367
+ expect(store_credit.errors.full_messages).to include(text)
368
+ end
369
+ end
370
+
371
+ context 'capture event found for auth_code' do
372
+ let(:captured_amount) { 10.0 }
373
+ let!(:capture_event) do
374
+ create(:store_credit_auth_event,
375
+ action: Spree::StoreCredit::CAPTURE_ACTION,
376
+ authorization_code: auth_code,
377
+ amount: captured_amount,
378
+ store_credit: store_credit)
379
+ end
380
+
381
+ it 'returns false' do
382
+ expect(subject).to be false
383
+ end
384
+
385
+ it 'does not change the amount used on the store credit' do
386
+ expect { subject }.to_not change { store_credit.amount_used.to_f }
387
+ end
388
+ end
389
+
390
+ context 'auth event found for auth_code' do
391
+ let(:auth_event) { create(:store_credit_auth_event) }
392
+
393
+ let(:authorized_amount) { 10.0 }
394
+ let!(:auth_event) do
395
+ create(:store_credit_auth_event,
396
+ authorization_code: auth_code,
397
+ amount: authorized_amount,
398
+ store_credit: store_credit)
399
+ end
400
+
401
+ it 'returns true' do
402
+ expect(subject).to be true
403
+ end
404
+
405
+ it 'returns the capture amount to the store credit' do
406
+ expect { subject }.to change { store_credit.amount_authorized.to_f }.by(-authorized_amount)
407
+ end
408
+
409
+ context 'originator is present' do
410
+ with_model 'OriginatorThing', scope: :all
411
+
412
+ let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
413
+
414
+ it 'records the originator' do
415
+ expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
416
+ expect(Spree::StoreCreditEvent.last.originator).to eq originator
417
+ end
418
+ end
419
+ end
420
+ end
421
+
422
+ describe '#credit' do
423
+ let(:event_auth_code) { '1-SC-20141111111111' }
424
+ let(:amount_used) { 10.0 }
425
+ let(:store_credit) { create(:store_credit, amount_used: amount_used) }
426
+ let!(:capture_event) do
427
+ create(:store_credit_auth_event,
428
+ action: Spree::StoreCredit::CAPTURE_ACTION,
429
+ authorization_code: event_auth_code,
430
+ amount: captured_amount,
431
+ store_credit: store_credit)
432
+ end
433
+ let(:originator) { nil }
434
+
435
+ subject do
436
+ store_credit.credit(credit_amount, auth_code, currency, action_originator: originator)
437
+ end
438
+
439
+ context 'currency does not match' do
440
+ let(:currency) { 'AUD' }
441
+ let(:credit_amount) { 5.0 }
442
+ let(:captured_amount) { 100.0 }
443
+ let(:auth_code) { event_auth_code }
444
+
445
+ it 'returns false' do
446
+ expect(subject).to be false
447
+ end
448
+
449
+ it 'adds an error message about the currency mismatch' do
450
+ subject
451
+ text = Spree.t('store_credit_payment_method.currency_mismatch')
452
+ expect(store_credit.errors.full_messages).to include(text)
453
+ end
454
+ end
455
+
456
+ context 'unable to find capture event' do
457
+ let(:currency) { 'USD' }
458
+ let(:credit_amount) { 5.0 }
459
+ let(:captured_amount) { 100.0 }
460
+ let(:auth_code) { 'UNKNOWN_CODE' }
461
+
462
+ it 'returns false' do
463
+ expect(subject).to be false
464
+ end
465
+
466
+ it 'adds an error message about the currency mismatch' do
467
+ subject
468
+ text = Spree.t('store_credit_payment_method.unable_to_credit', auth_code: auth_code)
469
+ expect(store_credit.errors.full_messages).to include(text)
470
+ end
471
+ end
472
+
473
+ context 'amount is more than what is captured' do
474
+ let(:currency) { 'USD' }
475
+ let(:credit_amount) { 100.0 }
476
+ let(:captured_amount) { 5.0 }
477
+ let(:auth_code) { event_auth_code }
478
+
479
+ it 'returns false' do
480
+ expect(subject).to be false
481
+ end
482
+
483
+ it 'adds an error message about the currency mismatch' do
484
+ subject
485
+ text = Spree.t('store_credit_payment_method.unable_to_credit', auth_code: auth_code)
486
+ expect(store_credit.errors.full_messages).to include(text)
487
+ end
488
+ end
489
+
490
+ context 'amount is successfully credited' do
491
+ let(:currency) { 'USD' }
492
+ let(:credit_amount) { 5.0 }
493
+ let(:captured_amount) { 100.0 }
494
+ let(:auth_code) { event_auth_code }
495
+
496
+ context 'credit_to_new_allocation is set' do
497
+ before { Spree::Config[:credit_to_new_allocation] = true }
498
+
499
+ it 'returns true' do
500
+ expect(subject).to be true
501
+ end
502
+
503
+ it 'creates a new store credit record' do
504
+ expect { subject }.to change { Spree::StoreCredit.count }.by(1)
505
+ end
506
+
507
+ it 'does not create a new store credit event on the parent store credit' do
508
+ expect { subject }.to_not change { store_credit.store_credit_events.count }
509
+ end
510
+
511
+ context 'credits the passed amount to a new store credit record' do
512
+ before do
513
+ subject
514
+ @new_store_credit = Spree::StoreCredit.last
515
+ end
516
+
517
+ it 'does not set the amount used on hte originating store credit' do
518
+ expect(store_credit.reload.amount_used).to eq amount_used
519
+ end
520
+
521
+ it 'sets the correct amount on the new store credit' do
522
+ expect(@new_store_credit.amount).to eq credit_amount
523
+ end
524
+
525
+ [:user_id, :category_id, :created_by_id, :currency, :type_id].each do |attr|
526
+ it "sets attribute #{attr} inherited from the originating store credit" do
527
+ expect(@new_store_credit.send(attr)).to eq store_credit.send(attr)
528
+ end
529
+ end
530
+
531
+ it 'sets a memo' do
532
+ expect(@new_store_credit.memo).to eq "This is a credit from store credit ID #{store_credit.id}"
533
+ end
534
+ end
535
+
536
+ context 'originator is present' do
537
+ with_model 'OriginatorThing', scope: :all
538
+
539
+ let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
540
+
541
+ it 'records the originator' do
542
+ expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
543
+ expect(Spree::StoreCreditEvent.last.originator).to eq originator
544
+ end
545
+ end
546
+ end
547
+
548
+ context 'credit_to_new_allocation is not set' do
549
+ it 'returns true' do
550
+ expect(subject).to be true
551
+ end
552
+
553
+ it 'credits the passed amount to the store credit amount used' do
554
+ subject
555
+ expect(store_credit.reload.amount_used).to eq (amount_used - credit_amount)
556
+ end
557
+
558
+ it 'creates a new store credit event' do
559
+ expect { subject }.to change { store_credit.store_credit_events.count }.by(1)
560
+ end
561
+ end
562
+ end
563
+ end
564
+
565
+ describe '#amount_used' do
566
+ context 'amount used is not defined' do
567
+ subject { Spree::StoreCredit.new }
568
+
569
+ it 'returns zero' do
570
+ expect(subject.amount_used).to be_zero
571
+ end
572
+ end
573
+
574
+ context 'amount used is defined' do
575
+ let(:amount_used) { 100.0 }
576
+
577
+ subject { create(:store_credit, amount_used: amount_used) }
578
+
579
+ it 'returns the attribute value' do
580
+ expect(subject.amount_used).to eq amount_used
581
+ end
582
+ end
583
+ end
584
+
585
+ describe '#amount_authorized' do
586
+ context 'amount authorized is not defined' do
587
+ subject { Spree::StoreCredit.new }
588
+
589
+ it 'returns zero' do
590
+ expect(subject.amount_authorized).to be_zero
591
+ end
592
+ end
593
+
594
+ context 'amount authorized is defined' do
595
+ let(:amount_authorized) { 100.0 }
596
+
597
+ subject { create(:store_credit, amount_authorized: amount_authorized) }
598
+
599
+ it 'returns the attribute value' do
600
+ expect(subject.amount_authorized).to eq amount_authorized
601
+ end
602
+ end
603
+ end
604
+
605
+ describe '#can_capture?' do
606
+ let(:store_credit) { create(:store_credit) }
607
+ let(:payment) { create(:payment, state: payment_state) }
608
+
609
+ subject { store_credit.can_capture?(payment) }
610
+
611
+ context 'pending payment' do
612
+ let(:payment_state) { 'pending' }
613
+
614
+ it 'returns true' do
615
+ expect(subject).to be true
616
+ end
617
+ end
618
+
619
+ context 'checkout payment' do
620
+ let(:payment_state) { 'checkout' }
621
+
622
+ it 'returns true' do
623
+ expect(subject).to be true
624
+ end
625
+ end
626
+
627
+ context 'void payment' do
628
+ let(:payment_state) { Spree::StoreCredit::VOID_ACTION }
629
+
630
+ it 'returns false' do
631
+ expect(subject).to be false
632
+ end
633
+ end
634
+
635
+ context 'invalid payment' do
636
+ let(:payment_state) { 'invalid' }
637
+
638
+ it 'returns false' do
639
+ expect(subject).to be false
640
+ end
641
+ end
642
+
643
+ context 'complete payment' do
644
+ let(:payment_state) { 'completed' }
645
+
646
+ it 'returns false' do
647
+ expect(subject).to be false
648
+ end
649
+ end
650
+ end
651
+
652
+ describe '#can_void?' do
653
+ let(:store_credit) { create(:store_credit) }
654
+ let(:payment) { create(:payment, state: payment_state) }
655
+
656
+ subject { store_credit.can_void?(payment) }
657
+
658
+ context 'pending payment' do
659
+ let(:payment_state) { 'pending' }
660
+
661
+ it 'returns true' do
662
+ expect(subject).to be true
663
+ end
664
+ end
665
+
666
+ context 'checkout payment' do
667
+ let(:payment_state) { 'checkout' }
668
+
669
+ it 'returns false' do
670
+ expect(subject).to be false
671
+ end
672
+ end
673
+
674
+ context 'void payment' do
675
+ let(:payment_state) { Spree::StoreCredit::VOID_ACTION }
676
+
677
+ it 'returns false' do
678
+ expect(subject).to be false
679
+ end
680
+ end
681
+
682
+ context 'invalid payment' do
683
+ let(:payment_state) { 'invalid' }
684
+
685
+ it 'returns false' do
686
+ expect(subject).to be false
687
+ end
688
+ end
689
+
690
+ context 'complete payment' do
691
+ let(:payment_state) { 'completed' }
692
+
693
+ it 'returns false' do
694
+ expect(subject).to be false
695
+ end
696
+ end
697
+ end
698
+
699
+ describe '#can_credit?' do
700
+ let(:store_credit) { create(:store_credit) }
701
+ let(:payment) { create(:payment, state: payment_state) }
702
+
703
+ subject { store_credit.can_credit?(payment) }
704
+
705
+ context 'payment is not completed' do
706
+ let(:payment_state) { 'pending' }
707
+
708
+ it 'returns false' do
709
+ expect(subject).to be false
710
+ end
711
+ end
712
+
713
+ context 'payment is completed' do
714
+ let(:payment_state) { 'completed' }
715
+
716
+ context 'credit is owed on the order' do
717
+ before { allow(payment.order).to receive_messages(payment_state: 'credit_owed') }
718
+
719
+ context "payment doesn't have allowed credit" do
720
+ before { allow(payment).to receive_messages(credit_allowed: 0.0) }
721
+
722
+ it 'returns false' do
723
+ expect(subject).to be false
724
+ end
725
+ end
726
+
727
+ context 'payment has allowed credit' do
728
+ before { allow(payment).to receive_messages(credit_allowed: 5.0) }
729
+
730
+ it 'returns true' do
731
+ expect(subject).to be true
732
+ end
733
+ end
734
+ end
735
+ end
736
+
737
+ describe '#store_events' do
738
+ context 'create' do
739
+ context 'user has one store credit' do
740
+ let(:store_credit_amount) { 100.0 }
741
+
742
+ subject { create(:store_credit, amount: store_credit_amount) }
743
+
744
+ it 'creates a store credit event' do
745
+ expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
746
+ end
747
+
748
+ it 'makes the store credit event an allocation event' do
749
+ expect(subject.store_credit_events.first.action).to eq Spree::StoreCredit::ALLOCATION_ACTION
750
+ end
751
+
752
+ it "saves the user's total store credit in the event" do
753
+ expect(subject.store_credit_events.first.user_total_amount).to eq store_credit_amount
754
+ end
755
+ end
756
+
757
+ context 'user has multiple store credits' do
758
+ let(:store_credit_amount) { 100.0 }
759
+ let(:additional_store_credit_amount) { 200.0 }
760
+
761
+ let(:user) { create(:user) }
762
+ let!(:store_credit) { create(:store_credit, user: user, amount: store_credit_amount) }
763
+
764
+ subject { create(:store_credit, user: user, amount: additional_store_credit_amount) }
765
+
766
+ it "saves the user's total store credit in the event" do
767
+ amount = store_credit_amount + additional_store_credit_amount
768
+ expect(subject.store_credit_events.first.user_total_amount).to eq amount
769
+ end
770
+ end
771
+
772
+ context 'an action is specified' do
773
+ it 'creates an event with the set action' do
774
+ store_credit = build(:store_credit)
775
+ store_credit.action = Spree::StoreCredit::VOID_ACTION
776
+ store_credit.action_authorization_code = '1-SC-TEST'
777
+
778
+ expect { store_credit.save! }.to change {
779
+ Spree::StoreCreditEvent.where(action: Spree::StoreCredit::VOID_ACTION).count
780
+ }.by(1)
781
+ end
782
+ end
783
+ end
784
+ end
785
+ end
786
+ end