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,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ZoneMember, type: :model do
4
+ let(:country) { create(:country) }
5
+ let(:state) { create(:state) }
6
+ let(:zone) { create(:zone, kind: 'country') }
7
+ let(:zone_member) { create(:zone_member, zone: zone, zoneable: country) }
8
+
9
+ describe 'associations' do
10
+ it { is_expected.to belong_to(:zoneable) }
11
+ it { is_expected.to belong_to(:zone).counter_cache(true).inverse_of(:zone_members) }
12
+ end
13
+
14
+ describe 'validations' do
15
+ it { is_expected.to validate_presence_of(:zone) }
16
+ it { is_expected.to validate_presence_of(:zoneable) }
17
+ end
18
+
19
+ describe 'scopes' do
20
+ describe '.defunct_without_kind' do
21
+ let(:defunct_without_kind) { Spree::ZoneMember.defunct_without_kind('country') }
22
+
23
+ context 'zoneable is present and is of defunct kind' do
24
+ it { expect(defunct_without_kind).to_not include(zone_member) }
25
+ end
26
+
27
+ context 'zoneable is not of defunct kind' do
28
+ before { zone_member.update(zoneable: state) }
29
+ it { expect(defunct_without_kind).to include(zone_member) }
30
+ end
31
+
32
+ context 'zoneable is absent' do
33
+ before { zone_member.update_column(:zoneable_id, nil) }
34
+ it { expect(defunct_without_kind).to include(zone_member) }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,472 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Zone, type: :model do
4
+ context "#match" do
5
+ let(:country_zone) { create(:zone, kind: 'country') }
6
+
7
+ let(:country) do
8
+ create(:country)
9
+ end
10
+
11
+ let(:state) do
12
+ create(:state, country: country)
13
+ end
14
+
15
+ it { is_expected.to have_many(:shipping_methods).through(:shipping_method_zones).class_name('Spree::ShippingMethod') }
16
+
17
+ before { country_zone.members.create(zoneable: country) }
18
+
19
+ describe 'scopes' do
20
+ describe '.remove_previous_default' do
21
+ let(:zone_with_default_tax) { create(:zone, kind: 'country', default_tax: true) }
22
+ let(:zone_not_with_default_tax) { create(:zone, kind: 'country', default_tax: false) }
23
+
24
+ subject { Spree::Zone.with_default_tax }
25
+
26
+ it 'is expected to include zone with default tax' do
27
+ is_expected.to include(zone_with_default_tax)
28
+ end
29
+
30
+ it 'is expected to not include zone with default tax' do
31
+ is_expected.to_not include(zone_not_with_default_tax)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe 'callbacks' do
37
+ it { is_expected.to callback(:remove_previous_default).after(:save).if(:default_tax?).if(:default_tax_changed?) }
38
+
39
+ describe '#remove_previous_default' do
40
+ let!(:zone_with_default_tax) { create(:zone, kind: 'country', default_tax: true) }
41
+ let!(:zone_not_with_default_tax) { create(:zone, kind: 'country', default_tax: false) }
42
+
43
+ it 'is expected to make previous default tax zones to non default tax zones' do
44
+ expect(zone_with_default_tax).to be_default_tax
45
+ zone_not_with_default_tax.update(default_tax: true)
46
+ expect(zone_with_default_tax.reload).to_not be_default_tax
47
+ end
48
+ end
49
+ end
50
+
51
+ context "when there is only one qualifying zone" do
52
+ let(:address) { create(:address, country: country, state: state) }
53
+
54
+ it "should return the qualifying zone" do
55
+ expect(Spree::Zone.match(address)).to eq(country_zone)
56
+ end
57
+ end
58
+
59
+ context "when there are two qualified zones with same member type" do
60
+ let(:address) { create(:address, country: country, state: state) }
61
+ let(:second_zone) { create(:zone, name: 'SecondZone') }
62
+
63
+ before { second_zone.members.create(zoneable: country) }
64
+
65
+ context "when both zones have the same number of members" do
66
+ it "should return the zone that was created first" do
67
+ Timecop.scale(100) do
68
+ expect(Spree::Zone.match(address)).to eq(country_zone)
69
+ end
70
+ end
71
+ end
72
+
73
+ context "when one of the zones has fewer members" do
74
+ let(:country2) { create(:country) }
75
+
76
+ before { country_zone.members.create(zoneable: country2) }
77
+
78
+ it "should return the zone with fewer members" do
79
+ expect(Spree::Zone.match(address)).to eq(second_zone)
80
+ end
81
+ end
82
+ end
83
+
84
+ context "when there are two qualified zones with different member types" do
85
+ let(:state_zone) { create(:zone, kind: 'state') }
86
+ let(:address) { create(:address, country: country, state: state) }
87
+
88
+ before { state_zone.members.create!(zoneable: state) }
89
+
90
+ it "should return the zone with the more specific member type" do
91
+ expect(Spree::Zone.match(address)).to eq(state_zone)
92
+ end
93
+ end
94
+
95
+ context "when there are no qualifying zones" do
96
+ it "should return nil" do
97
+ expect(Spree::Zone.match(Spree::Address.new)).to be_nil
98
+ end
99
+ end
100
+ end
101
+
102
+ context "#country_list" do
103
+ let(:state) { create(:state) }
104
+ let(:country) { state.country }
105
+
106
+ context "when zone consists of countries" do
107
+ let(:country_zone) { create(:zone, kind: 'country') }
108
+
109
+ before { country_zone.members.create(zoneable: country) }
110
+
111
+ it 'should return a list of countries' do
112
+ expect(country_zone.country_list).to eq([country])
113
+ end
114
+ end
115
+
116
+ context "when zone consists of states" do
117
+ let(:state_zone) { create(:zone, kind: 'state') }
118
+
119
+ before { state_zone.members.create(zoneable: state) }
120
+
121
+ it 'should return a list of countries' do
122
+ expect(state_zone.country_list).to eq([state.country])
123
+ end
124
+ end
125
+ end
126
+
127
+ context "#include?" do
128
+ let(:state) { create(:state) }
129
+ let(:country) { state.country }
130
+ let(:address) { create(:address, state: state) }
131
+
132
+ context "when zone is country type" do
133
+ let(:country_zone) { create(:zone, kind: 'country') }
134
+ before { country_zone.members.create(zoneable: country) }
135
+
136
+ it "should be true" do
137
+ expect(country_zone.include?(address)).to be true
138
+ end
139
+ end
140
+
141
+ context "when zone is state type" do
142
+ let(:state_zone) { create(:zone, kind: 'state') }
143
+ before { state_zone.members.create(zoneable: state) }
144
+
145
+ it "should be true" do
146
+ expect(state_zone.include?(address)).to be true
147
+ end
148
+ end
149
+ end
150
+
151
+ context ".default_tax" do
152
+ context "when there is a default tax zone specified" do
153
+ before { @foo_zone = create(:zone, name: 'whatever', default_tax: true) }
154
+
155
+ it "should be the correct zone" do
156
+ foo_zone = create(:zone, name: 'foo')
157
+ expect(Spree::Zone.default_tax).to eq(@foo_zone)
158
+ end
159
+ end
160
+
161
+ context "when there is no default tax zone specified" do
162
+ it "should be nil" do
163
+ expect(Spree::Zone.default_tax).to be_nil
164
+ end
165
+ end
166
+ end
167
+
168
+ context "#contains?" do
169
+ let(:country1) { create(:country) }
170
+ let(:country2) { create(:country) }
171
+ let(:country3) { create(:country) }
172
+
173
+ let(:state1) { create(:state) }
174
+ let(:state2) { create(:state) }
175
+ let(:state3) { create(:state) }
176
+
177
+ before do
178
+ @source = create(:zone, name: 'source', zone_members: [])
179
+ @target = create(:zone, name: 'target', zone_members: [])
180
+ end
181
+
182
+ context "when the target has no members" do
183
+ before { @source.members.create(zoneable: country1) }
184
+
185
+ it "should be false" do
186
+ expect(@source.contains?(@target)).to be false
187
+ end
188
+ end
189
+
190
+ context "when the source has no members" do
191
+ before { @target.members.create(zoneable: country1) }
192
+
193
+ it "should be false" do
194
+ expect(@source.contains?(@target)).to be false
195
+ end
196
+ end
197
+
198
+ context "when both zones are the same zone" do
199
+ before do
200
+ @source.members.create(zoneable: country1)
201
+ @target = @source
202
+ end
203
+
204
+ it "should be true" do
205
+ expect(@source.contains?(@target)).to be true
206
+ end
207
+ end
208
+
209
+ context "when checking countries against countries" do
210
+ before do
211
+ @source.members.create(zoneable: country1)
212
+ @source.members.create(zoneable: country2)
213
+ end
214
+
215
+ context "when all members are included in the zone we check against" do
216
+ before do
217
+ @target.members.create(zoneable: country1)
218
+ @target.members.create(zoneable: country2)
219
+ end
220
+
221
+ it "should be true" do
222
+ expect(@source.contains?(@target)).to be true
223
+ end
224
+ end
225
+
226
+ context "when some members are included in the zone we check against" do
227
+ before do
228
+ @target.members.create(zoneable: country1)
229
+ @target.members.create(zoneable: country2)
230
+ @target.members.create(zoneable: create(:country))
231
+ end
232
+
233
+ it "should be false" do
234
+ expect(@source.contains?(@target)).to be false
235
+ end
236
+ end
237
+
238
+ context "when none of the members are included in the zone we check against" do
239
+ before do
240
+ @target.members.create(zoneable: create(:country))
241
+ @target.members.create(zoneable: create(:country))
242
+ end
243
+
244
+ it "should be false" do
245
+ expect(@source.contains?(@target)).to be false
246
+ end
247
+ end
248
+ end
249
+
250
+
251
+ context "when checking states against states" do
252
+ before do
253
+ @source.members.create(zoneable: state1)
254
+ @source.members.create(zoneable: state2)
255
+ end
256
+
257
+ context "when all members are included in the zone we check against" do
258
+ before do
259
+ @target.members.create(zoneable: state1)
260
+ @target.members.create(zoneable: state2)
261
+ end
262
+
263
+ it "should be true" do
264
+ expect(@source.contains?(@target)).to be true
265
+ end
266
+ end
267
+
268
+ context "when some members are included in the zone we check against" do
269
+ before do
270
+ @target.members.create(zoneable: state1)
271
+ @target.members.create(zoneable: state2)
272
+ @target.members.create(zoneable: create(:state))
273
+ end
274
+
275
+ it "should be false" do
276
+ expect(@source.contains?(@target)).to be false
277
+ end
278
+ end
279
+
280
+ context "when none of the members are included in the zone we check against" do
281
+ before do
282
+ @target.members.create(zoneable: create(:state))
283
+ @target.members.create(zoneable: create(:state))
284
+ end
285
+
286
+ it "should be false" do
287
+ expect(@source.contains?(@target)).to be false
288
+ end
289
+ end
290
+ end
291
+
292
+ context "when checking country against state" do
293
+ before do
294
+ @source.members.create(zoneable: create(:state))
295
+ @target.members.create(zoneable: country1)
296
+ end
297
+
298
+ it "should be false" do
299
+ expect(@source.contains?(@target)).to be false
300
+ end
301
+ end
302
+
303
+ context "when checking state against country" do
304
+ before { @source.members.create(zoneable: country1) }
305
+
306
+ context "when all states contained in one of the countries we check against" do
307
+
308
+ before do
309
+ state1 = create(:state, country: country1)
310
+ @target.members.create(zoneable: state1)
311
+ end
312
+
313
+ it "should be true" do
314
+ expect(@source.contains?(@target)).to be true
315
+ end
316
+ end
317
+
318
+ context "when some states contained in one of the countries we check against" do
319
+ before do
320
+ state1 = create(:state, country: country1)
321
+ @target.members.create(zoneable: state1)
322
+ @target.members.create(zoneable: create(:state, country: country2))
323
+ end
324
+
325
+ it "should be false" do
326
+ expect(@source.contains?(@target)).to be false
327
+ end
328
+ end
329
+
330
+ context "when none of the states contained in any of the countries we check against" do
331
+ before do
332
+ @target.members.create(zoneable: create(:state, country: country2))
333
+ @target.members.create(zoneable: create(:state, country: country2))
334
+ end
335
+
336
+ it "should be false" do
337
+ expect(@source.contains?(@target)).to be false
338
+ end
339
+ end
340
+ end
341
+ end
342
+
343
+ context "#save" do
344
+ context "when default_tax is true" do
345
+ it "should clear previous default tax zone" do
346
+ zone1 = create(:zone, name: 'foo', default_tax: true)
347
+ zone = create(:zone, name: 'bar', default_tax: true)
348
+ expect(zone1.reload.default_tax).to be false
349
+ end
350
+ end
351
+
352
+ context "when a zone member country is added to an existing zone consisting of state members" do
353
+ it "should remove existing state members" do
354
+ zone = create(:zone, name: 'foo', zone_members: [])
355
+ state = create(:state)
356
+ country = create(:country)
357
+ zone.members.create(zoneable: state)
358
+ country_member = zone.members.create(zoneable: country)
359
+ zone.save
360
+ expect(zone.reload.members).to eq([country_member])
361
+ end
362
+ end
363
+ end
364
+
365
+ context "#kind" do
366
+ it "returns whatever value you set" do
367
+ zone = Spree::Zone.new kind: 'city'
368
+ expect(zone.kind).to eq 'city'
369
+ end
370
+
371
+ context "when the zone consists of country zone members" do
372
+ before do
373
+ @zone = create(:zone, name: 'country', zone_members: [])
374
+ @zone.members.create(zoneable: create(:country))
375
+ end
376
+
377
+ it "should return the kind of zone member" do
378
+ expect(@zone.kind).to eq("country")
379
+ end
380
+ end
381
+ end
382
+
383
+ context "#potential_matching_zones" do
384
+ let!(:country) { create(:country) }
385
+ let!(:country2) { create(:country, name: 'OtherCountry') }
386
+ let!(:country3) { create(:country, name: 'TaxCountry') }
387
+ let!(:default_tax_zone) do
388
+ create(:zone, default_tax: true).tap { |z| z.members.create(zoneable: country3) }
389
+ end
390
+
391
+ context "finding potential matches for a country zone" do
392
+ let!(:zone) do
393
+ create(:zone).tap do |z|
394
+ z.members.create(zoneable: country)
395
+ z.members.create(zoneable: country2)
396
+ z.save!
397
+ end
398
+ end
399
+ let!(:zone2) do
400
+ create(:zone).tap { |z| z.members.create(zoneable: country) && z.save! }
401
+ end
402
+
403
+ before { @result = Spree::Zone.potential_matching_zones(zone) }
404
+
405
+ it "will find all zones with countries covered by the passed in zone" do
406
+ expect(@result).to include(zone, zone2)
407
+ end
408
+
409
+ it "only returns each zone once" do
410
+ expect(@result.select { |z| z == zone }.size).to be 1
411
+ end
412
+ end
413
+
414
+ context "finding potential matches for a state zone" do
415
+ let!(:state) { create(:state, country: country) }
416
+ let!(:state2) { create(:state, country: country2, name: 'OtherState') }
417
+ let!(:state3) { create(:state, country: country2, name: 'State') }
418
+ let!(:zone) do
419
+ create(:zone).tap do |z|
420
+ z.members.create(zoneable: state)
421
+ z.members.create(zoneable: state2)
422
+ z.save!
423
+ end
424
+ end
425
+ let!(:zone2) do
426
+ create(:zone).tap { |z| z.members.create(zoneable: state) && z.save! }
427
+ end
428
+ let!(:zone3) do
429
+ create(:zone).tap { |z| z.members.create(zoneable: state2) && z.save! }
430
+ end
431
+
432
+ before { @result = Spree::Zone.potential_matching_zones(zone) }
433
+
434
+ it "will find all zones which share states covered by passed in zone" do
435
+ expect(@result).to include(zone, zone2)
436
+ end
437
+
438
+ it "will find zones that share countries with any states of the passed in zone" do
439
+ expect(@result).to include(zone3)
440
+ end
441
+
442
+ it "only returns each zone once" do
443
+ expect(@result.select { |z| z == zone }.size).to be 1
444
+ end
445
+ end
446
+ end
447
+
448
+ context "state and country associations" do
449
+ let!(:country) { create(:country) }
450
+
451
+ context "has countries associated" do
452
+ let!(:zone) do
453
+ create(:zone, countries: [country])
454
+ end
455
+
456
+ it "can access associated countries" do
457
+ expect(zone.countries).to include(country)
458
+ end
459
+ end
460
+
461
+ context "has states associated" do
462
+ let!(:state) { create(:state, country: country) }
463
+ let!(:zone) do
464
+ create(:zone, states: [state])
465
+ end
466
+
467
+ it "can access associated states" do
468
+ expect(zone.states).to include(state)
469
+ end
470
+ end
471
+ end
472
+ end
@@ -0,0 +1,79 @@
1
+ if ENV["COVERAGE"]
2
+ # Run Coverage report
3
+ require 'simplecov'
4
+ SimpleCov.start do
5
+ add_group 'Controllers', 'app/controllers'
6
+ add_group 'Helpers', 'app/helpers'
7
+ add_group 'Mailers', 'app/mailers'
8
+ add_group 'Models', 'app/models'
9
+ add_group 'Views', 'app/views'
10
+ add_group 'Jobs', 'app/jobs'
11
+ add_group 'Libraries', 'lib'
12
+ end
13
+ end
14
+
15
+ # This file is copied to ~/spec when you run 'ruby script/generate rspec'
16
+ # from the project root directory.
17
+ ENV["RAILS_ENV"] ||= 'test'
18
+
19
+ begin
20
+ require File.expand_path("../dummy/config/environment", __FILE__)
21
+ rescue LoadError
22
+ puts "Could not load dummy application. Please ensure you have run `bundle exec rake test_app`"
23
+ end
24
+
25
+ require 'rspec/rails'
26
+ require 'database_cleaner'
27
+ require 'ffaker'
28
+
29
+ Dir["./spec/support/**/*.rb"].sort.each { |f| require f }
30
+
31
+ if ENV["CHECK_TRANSLATIONS"]
32
+ require "spree/testing_support/i18n"
33
+ end
34
+
35
+ require 'spree/testing_support/factories'
36
+ require 'spree/testing_support/preferences'
37
+ require 'spree/testing_support/shoulda_matcher_configuration'
38
+ require 'spree/testing_support/url_helpers'
39
+ require 'spree/testing_support/kernel'
40
+
41
+ RSpec.configure do |config|
42
+ config.color = true
43
+ config.fail_fast = ENV['FAIL_FAST'] || false
44
+ config.fixture_path = File.join(File.expand_path(File.dirname(__FILE__)), "fixtures")
45
+ config.infer_spec_type_from_file_location!
46
+ config.mock_with :rspec
47
+ config.raise_errors_for_deprecations!
48
+
49
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
50
+ # examples within a transaction, comment the following line or assign false
51
+ # instead of true.
52
+ config.use_transactional_fixtures = true
53
+
54
+ config.before :each do
55
+ Rails.cache.clear
56
+ reset_spree_preferences
57
+ end
58
+
59
+ config.extend WithModel
60
+
61
+ config.include FactoryGirl::Syntax::Methods
62
+ config.include Spree::TestingSupport::Preferences
63
+ config.include Spree::TestingSupport::Kernel
64
+
65
+ # Clean out the database state before the tests run
66
+ config.before(:suite) do
67
+ DatabaseCleaner.clean_with(:truncation)
68
+ DatabaseCleaner.strategy = :transaction
69
+ end
70
+
71
+ # Wrap all db isolated tests in a transaction
72
+ config.around(db: :isolate) do |example|
73
+ DatabaseCleaner.cleaning(&example)
74
+ end
75
+
76
+ config.around do |example|
77
+ Timeout.timeout(30, &example)
78
+ end
79
+ end
@@ -0,0 +1,5 @@
1
+ class BigDecimal
2
+ def inspect
3
+ "#<BigDecimal: #{to_s}>"
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ shared_examples_for "an adjustment source" do
2
+ subject(:source) { described_class.create }
3
+
4
+ before do
5
+ allow(Spree::Adjustable::AdjustmentsUpdater).to receive(:update)
6
+ order.adjustments.create(order: order, amount: 10, label: 'Adjustment', source: source)
7
+ end
8
+
9
+ describe '#destroy' do
10
+ before { source.destroy }
11
+
12
+ context 'when order incomplete' do
13
+ let(:order) { create(:order_with_line_items) }
14
+ it { expect(order.adjustments.count).to eq(0) }
15
+ end
16
+
17
+ context 'when order is complete' do
18
+ let(:order) { create(:completed_order_with_totals) }
19
+ it { expect(order.adjustments.count).to eq(1) }
20
+ it { expect(order.adjustments.reload.first.source).to be_nil }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ shared_examples_for "default_price" do
2
+ let(:model) { described_class }
3
+ subject(:instance) { FactoryGirl.build(model.name.demodulize.downcase.to_sym) }
4
+
5
+ describe '.has_one :default_price' do
6
+ let(:default_price_association) { model.reflect_on_association(:default_price) }
7
+
8
+ it 'should be a has one association' do
9
+ expect(default_price_association.macro).to eql :has_one
10
+ end
11
+
12
+ it 'should have a dependent destroy' do
13
+ expect(default_price_association.options[:dependent]).to eql :destroy
14
+ end
15
+
16
+ it 'should have the class name of Spree::Price' do
17
+ expect(default_price_association.options[:class_name]).to eql 'Spree::Price'
18
+ end
19
+ end
20
+
21
+ describe '#default_price' do
22
+ subject { instance.default_price }
23
+
24
+ its(:class) { should eql Spree::Price }
25
+ it 'delegates price' do
26
+ expect(instance.default_price). to receive(:price)
27
+ instance.price
28
+ end
29
+
30
+ it 'delegates price_including_vat_for' do
31
+ expect(instance.default_price). to receive(:price_including_vat_for)
32
+ instance.price_including_vat_for
33
+ end
34
+ end
35
+
36
+ its(:has_default_price?) { should be_truthy }
37
+ end
@@ -0,0 +1,13 @@
1
+ require "rake"
2
+
3
+ shared_context "rake" do
4
+ let(:task_name) { self.class.top_level_description }
5
+ let(:task_path) { "lib/tasks/#{task_name.split(":").first}" }
6
+ subject { Rake::Task[task_name] }
7
+
8
+ before do
9
+ Rake::Task.define_task(:environment)
10
+ load File.expand_path(Rails.root + "../../#{task_path}.rake")
11
+ subject.reenable
12
+ end
13
+ end
@@ -0,0 +1,2 @@
1
+ class Spree::Gateway::Test < Spree::Gateway
2
+ end