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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/{spree.js.coffee.erb → spree.js.coffee} +2 -2
- data/app/helpers/spree/base_helper.rb +1 -1
- data/app/helpers/spree/products_helper.rb +0 -6
- data/app/mailers/spree/reimbursement_mailer.rb +6 -6
- data/app/models/concerns/spree/acts_as_taggable.rb +11 -0
- data/app/models/concerns/spree/adjustment_source.rb +1 -1
- data/app/models/concerns/spree/ransackable_attributes.rb +0 -5
- data/app/models/spree/address.rb +67 -38
- data/app/models/spree/app_configuration.rb +9 -6
- data/app/models/spree/base.rb +1 -1
- data/app/models/spree/calculator.rb +1 -1
- data/app/models/spree/country.rb +5 -4
- data/app/models/spree/credit_card.rb +3 -3
- data/app/models/spree/gateway/bogus.rb +11 -11
- data/app/models/spree/gateway/bogus_simple.rb +4 -4
- data/app/models/spree/gateway.rb +1 -1
- data/app/models/spree/image.rb +2 -2
- data/app/models/spree/inventory_unit.rb +6 -10
- data/app/models/spree/line_item.rb +17 -6
- data/app/models/spree/order/checkout.rb +2 -2
- data/app/models/spree/order.rb +12 -25
- data/app/models/spree/order_contents.rb +7 -6
- data/app/models/spree/order_inventory.rb +12 -1
- data/app/models/spree/order_updater.rb +1 -2
- data/app/models/spree/payment/processing.rb +3 -3
- data/app/models/spree/payment_method.rb +7 -1
- data/app/models/spree/preferences/store.rb +3 -3
- data/app/models/spree/product/scopes.rb +16 -20
- data/app/models/spree/product.rb +11 -3
- data/app/models/spree/promotion/actions/create_line_items.rb +21 -3
- data/app/models/spree/promotion/rules/country.rb +23 -0
- data/app/models/spree/promotion/rules/option_value.rb +13 -10
- data/app/models/spree/promotion/rules/taxon.rb +1 -1
- data/app/models/spree/promotion.rb +35 -1
- data/app/models/spree/promotion_handler/cart.rb +3 -17
- data/app/models/spree/promotion_handler/coupon.rb +22 -22
- data/app/models/spree/promotion_handler/page.rb +2 -2
- data/app/models/spree/refund.rb +1 -1
- data/app/models/spree/refund_reason.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +5 -1
- data/app/models/spree/return_item.rb +1 -1
- data/app/models/spree/shipment.rb +4 -6
- data/app/models/spree/shipment_handler.rb +1 -1
- data/app/models/spree/stock/adjuster.rb +9 -2
- data/app/models/spree/stock/coordinator.rb +11 -4
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +11 -3
- data/app/models/spree/stock/packer.rb +15 -5
- data/app/models/spree/stock/prioritizer.rb +25 -15
- data/app/models/spree/stock/splitter/shipping_category.rb +6 -1
- data/app/models/spree/stock_item.rb +2 -1
- data/app/models/spree/stock_movement.rb +11 -6
- data/app/models/spree/store.rb +1 -0
- data/app/models/spree/store_credit.rb +1 -1
- data/app/models/spree/tag.rb +4 -0
- data/app/models/spree/tax_rate.rb +6 -0
- data/app/models/spree/taxon.rb +3 -3
- data/app/models/spree/variant.rb +6 -3
- data/app/models/spree/zone.rb +2 -2
- data/app/views/spree/shared/_paths.html.erb +8 -0
- data/config/initializers/acts_as_taggable_on.rb +9 -0
- data/config/initializers/friendly_id.rb +0 -81
- data/config/locales/en.yml +11 -0
- data/db/default/spree/countries.rb +5 -1
- data/db/default/spree/roles.rb +2 -2
- data/db/default/spree/states.rb +1 -1
- data/db/migrate/20120831092320_spree_one_two.rb +101 -101
- data/db/migrate/20120831092359_spree_promo_one_two.rb +14 -14
- data/db/migrate/20120905145253_add_tax_rate_label.rb +1 -1
- data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +2 -2
- data/db/migrate/20120929093553_remove_unused_preference_columns.rb +4 -4
- data/db/migrate/20121009142519_add_lock_version_to_variant.rb +2 -2
- data/db/migrate/20121010142909_add_states_required_to_countries.rb +2 -2
- data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +3 -3
- data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +5 -5
- data/db/migrate/20121031162139_split_prices_from_variants.rb +10 -10
- data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +3 -3
- data/db/migrate/20121107184631_add_currency_to_line_items.rb +1 -1
- data/db/migrate/20121107194006_add_currency_to_orders.rb +1 -1
- data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +2 -2
- data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +1 -1
- data/db/migrate/20121124203911_add_position_to_taxonomies.rb +2 -2
- data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +1 -1
- data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +1 -1
- data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +1 -1
- data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +2 -2
- data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +1 -1
- data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +1 -1
- data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +1 -1
- data/db/migrate/20130211190146_create_spree_stock_items.rb +2 -2
- data/db/migrate/20130211191120_create_spree_stock_locations.rb +1 -1
- data/db/migrate/20130213191427_create_default_stock.rb +1 -2
- data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +1 -1
- data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +2 -2
- data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +1 -1
- data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +3 -3
- data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +1 -1
- data/db/migrate/20130228210442_create_shipping_method_zone.rb +3 -3
- data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +1 -1
- data/db/migrate/20130301162924_create_shipping_method_categories.rb +3 -3
- data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +1 -1
- data/db/migrate/20130304162240_create_spree_shipping_rates.rb +5 -5
- data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +1 -1
- data/db/migrate/20130305143310_create_stock_movements.rb +1 -1
- data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +3 -3
- data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +2 -2
- data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +2 -2
- data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +2 -2
- data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +1 -1
- data/db/migrate/20130319062004_change_orders_total_precision.rb +5 -5
- data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +2 -2
- data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -2
- data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +2 -2
- data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +1 -1
- data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +3 -3
- data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +3 -3
- data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
- data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +1 -1
- data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +1 -1
- data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +1 -1
- data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +1 -1
- data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +2 -2
- data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +1 -1
- data/db/migrate/20130417120035_update_adjustment_states.rb +3 -3
- data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +4 -4
- data/db/migrate/20130418125341_create_spree_stock_transfers.rb +1 -1
- data/db/migrate/20130423110707_drop_products_count_on_hand.rb +1 -1
- data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +1 -1
- data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
- data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +1 -1
- data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +1 -1
- data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +1 -1
- data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +1 -1
- data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +1 -1
- data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +1 -1
- data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +1 -1
- data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +1 -1
- data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +2 -2
- data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +4 -4
- data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +1 -1
- data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +1 -1
- data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +2 -2
- data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +3 -3
- data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +1 -1
- data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +1 -1
- data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +1 -1
- data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +1 -1
- data/db/migrate/20130806022521_drop_spree_mail_methods.rb +1 -1
- data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +1 -1
- data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -4
- data/db/migrate/20130807024302_rename_adjustment_fields.rb +1 -1
- data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +1 -1
- data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +1 -1
- data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +2 -2
- data/db/migrate/20130813140619_expand_order_number_size.rb +3 -3
- data/db/migrate/20130813232134_rename_activators_to_promotions.rb +1 -1
- data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +2 -2
- data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +2 -2
- data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
- data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +2 -2
- data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +2 -2
- data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
- data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +1 -1
- data/db/migrate/20130909115621_change_states_required_for_countries.rb +1 -1
- data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +1 -1
- data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +1 -1
- data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +1 -1
- data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +2 -2
- data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +2 -2
- data/db/migrate/20131107132123_add_tax_category_to_variants.rb +1 -1
- data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +1 -1
- data/db/migrate/20131118043959_add_included_to_adjustments.rb +2 -2
- data/db/migrate/20131118050234_rename_tax_total_fields.rb +1 -1
- data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +1 -1
- data/db/migrate/20131120234456_add_updated_at_to_variants.rb +1 -1
- data/db/migrate/20131127001002_add_position_to_classifications.rb +1 -1
- data/db/migrate/20131211112807_create_spree_orders_promotions.rb +2 -2
- data/db/migrate/20131211192741_unique_shipping_method_categories.rb +1 -1
- data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +2 -2
- data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -1
- data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +1 -1
- data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +1 -1
- data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +1 -1
- data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +1 -1
- data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +1 -1
- data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +1 -1
- data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +1 -1
- data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +1 -1
- data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +1 -1
- data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +1 -1
- data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +1 -1
- data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +1 -1
- data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +1 -1
- data/db/migrate/20140213184916_add_more_indexes.rb +1 -1
- data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +2 -2
- data/db/migrate/20140227112348_add_preference_store_to_everything.rb +1 -1
- data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +1 -1
- data/db/migrate/20140309023735_migrate_old_preferences.rb +1 -1
- data/db/migrate/20140309024355_create_spree_stores.rb +2 -2
- data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
- data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +1 -1
- data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +1 -1
- data/db/migrate/20140331100557_add_additional_store_fields.rb +1 -1
- data/db/migrate/20140410141842_add_many_missing_indexes.rb +1 -1
- data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +1 -1
- data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +1 -1
- data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +5 -5
- data/db/migrate/20140518174634_add_token_to_spree_orders.rb +1 -1
- data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +2 -2
- data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +1 -1
- data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +1 -1
- data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +1 -1
- data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +1 -1
- data/db/migrate/20140625214618_create_spree_refunds.rb +1 -1
- data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +1 -1
- data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +1 -1
- data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +1 -1
- data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +2 -2
- data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +1 -1
- data/db/migrate/20140710190048_drop_return_authorization_amount.rb +1 -1
- data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +1 -1
- data/db/migrate/20140713140527_create_spree_refund_reasons.rb +1 -1
- data/db/migrate/20140713142214_rename_return_authorization_reason.rb +1 -1
- data/db/migrate/20140715182625_create_spree_promotion_categories.rb +1 -1
- data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +1 -1
- data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +1 -1
- data/db/migrate/20140717155155_create_default_refund_reason.rb +1 -1
- data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +1 -1
- data/db/migrate/20140718133010_create_spree_customer_returns.rb +1 -1
- data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +1 -1
- data/db/migrate/20140718195325_create_friendly_id_slugs.rb +5 -5
- data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +1 -1
- data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +1 -1
- data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +2 -2
- data/db/migrate/20140725131539_create_spree_reimbursements.rb +1 -1
- data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +1 -1
- data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +1 -1
- data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +1 -1
- data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +1 -1
- data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +1 -1
- data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +1 -1
- data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -1
- data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +1 -1
- data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +1 -1
- data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +1 -1
- data/db/migrate/20140911173301_add_kind_to_zone.rb +1 -1
- data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +1 -1
- data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +1 -1
- data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +1 -1
- data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +1 -1
- data/db/migrate/20141009204607_add_store_id_to_orders.rb +1 -1
- data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +1 -1
- data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +1 -1
- data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +2 -7
- data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +1 -1
- data/db/migrate/20141105213646_update_classifications_positions.rb +1 -1
- data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +1 -1
- data/db/migrate/20141215232040_remove_token_permissions_table.rb +1 -1
- data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +1 -1
- data/db/migrate/20141217215630_update_product_slug_index.rb +1 -1
- data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +1 -1
- data/db/migrate/20150118210639_create_spree_store_credits.rb +1 -1
- data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +1 -1
- data/db/migrate/20150118212051_create_spree_store_credit_events.rb +1 -1
- data/db/migrate/20150118212101_create_spree_store_credit_types.rb +1 -1
- data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +1 -1
- data/db/migrate/20150122145607_add_resellable_to_return_items.rb +1 -1
- data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +1 -1
- data/db/migrate/20150128032538_remove_environment_from_tracker.rb +1 -1
- data/db/migrate/20150128060325_remove_spree_configurations.rb +1 -1
- data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +1 -1
- data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +1 -1
- data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +1 -1
- data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +1 -1
- data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +1 -1
- data/db/migrate/20150515211137_fix_adjustment_order_id.rb +1 -1
- data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +1 -1
- data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +1 -1
- data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +1 -1
- data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +1 -1
- data/db/migrate/20150627090949_migrate_payment_methods_display.rb +1 -1
- data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +1 -1
- data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +1 -1
- data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +1 -1
- data/db/migrate/20150727191614_spree_store_credit_types.rb +1 -1
- data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +1 -1
- data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +1 -1
- data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +1 -1
- data/db/migrate/20160219165458_add_indexes.rb +1 -1
- data/db/migrate/20160509064646_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +10 -0
- data/db/migrate/20160511071954_acts_as_taggable_on_spree_migration.rb +40 -0
- data/db/migrate/20160511072249_change_collation_for_spree_tag_names.rb +9 -0
- data/db/migrate/20160511072335_add_missing_indexes_to_spree_taggings.rb +14 -0
- data/db/migrate/20160608090604_add_zipcode_required_to_spree_countries.rb +7 -0
- data/db/migrate/20161014145148_add_created_at_to_variant.rb +8 -0
- data/db/migrate/20161014152814_add_null_false_to_spree_variants_timestamps.rb +6 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +3 -3
- data/lib/generators/spree/custom_user/templates/migration.rb.tt +2 -2
- data/lib/generators/spree/dummy/dummy_generator.rb +11 -11
- data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/database.yml +9 -6
- data/lib/generators/spree/dummy/templates/rails/test.rb +2 -2
- data/lib/generators/spree/install/install_generator.rb +37 -13
- data/lib/spree/core/controller_helpers/common.rb +3 -3
- data/lib/spree/core/controller_helpers/order.rb +2 -5
- data/lib/spree/core/controller_helpers/respond_with.rb +1 -1
- data/lib/spree/core/delegate_belongs_to.rb +2 -2
- data/lib/spree/core/engine.rb +5 -4
- data/lib/spree/core/importer/product.rb +2 -2
- data/lib/spree/core/product_duplicator.rb +1 -1
- data/lib/spree/core/product_filters.rb +1 -1
- data/lib/spree/core/search/base.rb +1 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/i18n/initializer.rb +1 -1
- data/lib/spree/money.rb +1 -15
- data/lib/spree/permitted_attributes.rb +1 -1
- data/lib/spree/testing_support/caching.rb +3 -3
- data/lib/spree/testing_support/common_rake.rb +0 -2
- data/lib/spree/testing_support/controller_requests.rb +4 -4
- data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
- data/lib/spree/testing_support/factories/order_factory.rb +1 -0
- data/lib/spree/testing_support/factories/tag_factory.rb +5 -0
- data/lib/spree/testing_support/kernel.rb +18 -0
- data/lib/spree/testing_support/order_walkthrough.rb +4 -4
- data/lib/tasks/core.rake +2 -2
- data/spec/helpers/base_helper_spec.rb +200 -0
- data/spec/helpers/products_helper_spec.rb +289 -0
- data/spec/lib/calculated_adjustments_spec.rb +7 -0
- data/spec/lib/i18n_spec.rb +123 -0
- data/spec/lib/search/base_spec.rb +86 -0
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +103 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +110 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +72 -0
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
- data/spec/lib/spree/core/importer/order_spec.rb +605 -0
- data/spec/lib/spree/core/number_generator_spec.rb +175 -0
- data/spec/lib/spree/core/token_generator_spec.rb +24 -0
- data/spec/lib/spree/core/validators/email_spec.rb +53 -0
- data/spec/lib/spree/core_spec.rb +23 -0
- data/spec/lib/spree/localized_number_spec.rb +48 -0
- data/spec/lib/spree/migrations_spec.rb +36 -0
- data/spec/lib/spree/money_spec.rb +122 -0
- data/spec/lib/tasks/exchanges_spec.rb +136 -0
- data/spec/mailers/order_mailer_spec.rb +122 -0
- data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
- data/spec/mailers/shipment_mailer_spec.rb +81 -0
- data/spec/mailers/test_mailer_spec.rb +38 -0
- data/spec/models/option_type_prototype_spec.rb +9 -0
- data/spec/models/spree/ability_spec.rb +251 -0
- data/spec/models/spree/address_spec.rb +402 -0
- data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
- data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
- data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +26 -0
- data/spec/models/spree/adjustment_spec.rb +189 -0
- data/spec/models/spree/app_configuration_spec.rb +26 -0
- data/spec/models/spree/asset_spec.rb +28 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +152 -0
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
- data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
- data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
- data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +47 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
- data/spec/models/spree/calculator/shipping.rb +8 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
- data/spec/models/spree/calculator_spec.rb +69 -0
- data/spec/models/spree/classification_spec.rb +93 -0
- data/spec/models/spree/concerns/display_money_spec.rb +43 -0
- data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
- data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
- data/spec/models/spree/country_spec.rb +55 -0
- data/spec/models/spree/credit_card_spec.rb +328 -0
- data/spec/models/spree/customer_return_spec.rb +240 -0
- data/spec/models/spree/exchange_spec.rb +75 -0
- data/spec/models/spree/gateway/bogus_simple.rb +20 -0
- data/spec/models/spree/gateway/bogus_spec.rb +13 -0
- data/spec/models/spree/gateway_spec.rb +61 -0
- data/spec/models/spree/image_spec.rb +8 -0
- data/spec/models/spree/inventory_unit_spec.rb +256 -0
- data/spec/models/spree/line_item_spec.rb +346 -0
- data/spec/models/spree/option_type_spec.rb +14 -0
- data/spec/models/spree/option_value_spec.rb +18 -0
- data/spec/models/spree/order/address_spec.rb +50 -0
- data/spec/models/spree/order/adjustments_spec.rb +29 -0
- data/spec/models/spree/order/callbacks_spec.rb +42 -0
- data/spec/models/spree/order/checkout_spec.rb +770 -0
- data/spec/models/spree/order/currency_updater_spec.rb +32 -0
- data/spec/models/spree/order/finalizing_spec.rb +114 -0
- data/spec/models/spree/order/helpers_spec.rb +5 -0
- data/spec/models/spree/order/payment_spec.rb +214 -0
- data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
- data/spec/models/spree/order/shipments_spec.rb +43 -0
- data/spec/models/spree/order/state_machine_spec.rb +212 -0
- data/spec/models/spree/order/store_credit_spec.rb +426 -0
- data/spec/models/spree/order/tax_spec.rb +84 -0
- data/spec/models/spree/order/totals_spec.rb +24 -0
- data/spec/models/spree/order/updating_spec.rb +18 -0
- data/spec/models/spree/order/validations_spec.rb +15 -0
- data/spec/models/spree/order_contents_spec.rb +297 -0
- data/spec/models/spree/order_inventory_spec.rb +239 -0
- data/spec/models/spree/order_merger_spec.rb +135 -0
- data/spec/models/spree/order_spec.rb +1046 -0
- data/spec/models/spree/order_updater_spec.rb +294 -0
- data/spec/models/spree/payment/gateway_options_spec.rb +127 -0
- data/spec/models/spree/payment/store_credit_spec.rb +60 -0
- data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
- data/spec/models/spree/payment_method_spec.rb +103 -0
- data/spec/models/spree/payment_spec.rb +919 -0
- data/spec/models/spree/preference_spec.rb +80 -0
- data/spec/models/spree/preferences/configuration_spec.rb +30 -0
- data/spec/models/spree/preferences/preferable_spec.rb +344 -0
- data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
- data/spec/models/spree/preferences/store_spec.rb +46 -0
- data/spec/models/spree/price_spec.rb +128 -0
- data/spec/models/spree/product/scopes_spec.rb +183 -0
- data/spec/models/spree/product_duplicator_spec.rb +103 -0
- data/spec/models/spree/product_filter_spec.rb +26 -0
- data/spec/models/spree/product_option_type_spec.rb +9 -0
- data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
- data/spec/models/spree/product_property_spec.rb +22 -0
- data/spec/models/spree/product_spec.rb +619 -0
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
- data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
- data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
- data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
- data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
- data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
- data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
- data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
- data/spec/models/spree/promotion/rules/user_spec.rb +45 -0
- data/spec/models/spree/promotion_action_spec.rb +10 -0
- data/spec/models/spree/promotion_category_spec.rb +17 -0
- data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
- data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
- data/spec/models/spree/promotion_rule_spec.rb +29 -0
- data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
- data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
- data/spec/models/spree/promotion_spec.rb +679 -0
- data/spec/models/spree/property_prototype_spec.rb +9 -0
- data/spec/models/spree/property_spec.rb +5 -0
- data/spec/models/spree/prototype_spec.rb +5 -0
- data/spec/models/spree/prototype_taxon_spec.rb +9 -0
- data/spec/models/spree/refund_reason_spec.rb +20 -0
- data/spec/models/spree/refund_spec.rb +195 -0
- data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
- data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
- data/spec/models/spree/reimbursement_spec.rb +188 -0
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +63 -0
- data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
- data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
- data/spec/models/spree/return_authorization_spec.rb +230 -0
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
- data/spec/models/spree/return_item_spec.rb +731 -0
- data/spec/models/spree/returns_calculator_spec.rb +14 -0
- data/spec/models/spree/role_spec.rb +7 -0
- data/spec/models/spree/shipment_spec.rb +742 -0
- data/spec/models/spree/shipping_calculator_spec.rb +45 -0
- data/spec/models/spree/shipping_category_spec.rb +19 -0
- data/spec/models/spree/shipping_method_spec.rb +95 -0
- data/spec/models/spree/shipping_rate_spec.rb +140 -0
- data/spec/models/spree/state_spec.rb +29 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
- data/spec/models/spree/stock/content_item_spec.rb +31 -0
- data/spec/models/spree/stock/coordinator_spec.rb +61 -0
- data/spec/models/spree/stock/differentiator_spec.rb +39 -0
- data/spec/models/spree/stock/estimator_spec.rb +202 -0
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
- data/spec/models/spree/stock/package_spec.rb +182 -0
- data/spec/models/spree/stock/packer_spec.rb +70 -0
- data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
- data/spec/models/spree/stock/quantifier_spec.rb +126 -0
- data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
- data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
- data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
- data/spec/models/spree/stock_item_spec.rb +432 -0
- data/spec/models/spree/stock_location_spec.rb +243 -0
- data/spec/models/spree/stock_movement_spec.rb +120 -0
- data/spec/models/spree/stock_transfer_spec.rb +50 -0
- data/spec/models/spree/store_credit_event_spec.rb +101 -0
- data/spec/models/spree/store_credit_spec.rb +786 -0
- data/spec/models/spree/store_spec.rb +78 -0
- data/spec/models/spree/tax_category_spec.rb +32 -0
- data/spec/models/spree/tax_rate_spec.rb +561 -0
- data/spec/models/spree/taxon_spec.rb +85 -0
- data/spec/models/spree/taxonomy_spec.rb +18 -0
- data/spec/models/spree/tracker_spec.rb +21 -0
- data/spec/models/spree/user_spec.rb +203 -0
- data/spec/models/spree/variant_spec.rb +809 -0
- data/spec/models/spree/zone_member_spec.rb +38 -0
- data/spec/models/spree/zone_spec.rb +472 -0
- data/spec/spec_helper.rb +79 -0
- data/spec/support/big_decimal.rb +5 -0
- data/spec/support/concerns/adjustment_source.rb +23 -0
- data/spec/support/concerns/default_price.rb +37 -0
- data/spec/support/rake.rb +13 -0
- data/spec/support/test_gateway.rb +2 -0
- data/spree_core.gemspec +12 -12
- metadata +249 -43
- data/config/initializers/premailer_rails.rb +0 -3
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class Promotion
|
5
|
+
module Actions
|
6
|
+
describe CreateItemAdjustments, type: :model do
|
7
|
+
let(:order) { create(:order) }
|
8
|
+
let(:promotion) { create(:promotion) }
|
9
|
+
let(:action) { CreateItemAdjustments.new }
|
10
|
+
let!(:line_item) { create(:line_item, order: order) }
|
11
|
+
let(:payload) { { order: order, promotion: promotion } }
|
12
|
+
|
13
|
+
before do
|
14
|
+
allow(action).to receive(:promotion).and_return(promotion)
|
15
|
+
promotion.promotion_actions = [action]
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'an adjustment source'
|
19
|
+
|
20
|
+
context "#perform" do
|
21
|
+
# Regression test for #3966
|
22
|
+
context "when calculator computes 0" do
|
23
|
+
before do
|
24
|
+
allow(action).to receive_messages compute_amount: 0
|
25
|
+
end
|
26
|
+
|
27
|
+
it "does not create an adjustment when calculator returns 0" do
|
28
|
+
action.perform(payload)
|
29
|
+
expect(action.adjustments).to be_empty
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when calculator returns a non-zero value" do
|
34
|
+
before do
|
35
|
+
promotion.promotion_actions = [action]
|
36
|
+
allow(action).to receive_messages compute_amount: 10
|
37
|
+
end
|
38
|
+
|
39
|
+
it "creates adjustment with item as adjustable" do
|
40
|
+
action.perform(payload)
|
41
|
+
expect(action.adjustments.count).to eq(1)
|
42
|
+
expect(line_item.reload.adjustments).to eq(action.adjustments)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "creates adjustment with self as source" do
|
46
|
+
action.perform(payload)
|
47
|
+
expect(line_item.reload.adjustments.first.source).to eq action
|
48
|
+
end
|
49
|
+
|
50
|
+
it "does not perform twice on the same item" do
|
51
|
+
2.times { action.perform(payload) }
|
52
|
+
expect(action.adjustments.count).to eq(1)
|
53
|
+
end
|
54
|
+
|
55
|
+
context "with products rules" do
|
56
|
+
let!(:second_line_item) { create(:line_item, order: order) }
|
57
|
+
let(:rule) { double Spree::Promotion::Rules::Product }
|
58
|
+
|
59
|
+
before do
|
60
|
+
allow(promotion).to receive(:eligible_rules) { [rule] }
|
61
|
+
allow(rule).to receive(:actionable?).and_return(true, false)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "does not create adjustments for line_items not in product rule" do
|
65
|
+
action.perform(payload)
|
66
|
+
expect(action.adjustments.count).to eql 1
|
67
|
+
expect(line_item.reload.adjustments).to match_array action.adjustments
|
68
|
+
expect(second_line_item.reload.adjustments).to be_empty
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "#compute_amount" do
|
75
|
+
before { promotion.promotion_actions = [action] }
|
76
|
+
|
77
|
+
context "when the adjustable is actionable" do
|
78
|
+
it "calls compute on the calculator" do
|
79
|
+
allow(action.calculator).to receive(:compute).and_return(10)
|
80
|
+
expect(action.calculator).to receive(:compute).with(line_item)
|
81
|
+
action.compute_amount(line_item)
|
82
|
+
end
|
83
|
+
|
84
|
+
context "calculator returns amount greater than item total" do
|
85
|
+
before do
|
86
|
+
expect(action.calculator).to receive(:compute).with(line_item).and_return(300)
|
87
|
+
allow(line_item).to receive_messages(amount: 100)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "does not exceed it" do
|
91
|
+
expect(action.compute_amount(line_item)).to eql(-100)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when the adjustable is not actionable" do
|
97
|
+
before { allow(promotion).to receive(:line_item_actionable?) { false } }
|
98
|
+
|
99
|
+
it 'returns 0' do
|
100
|
+
expect(action.compute_amount(line_item)).to eql(0)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "#destroy" do
|
106
|
+
let!(:action) { CreateItemAdjustments.create! }
|
107
|
+
let(:other_action) { CreateItemAdjustments.create! }
|
108
|
+
before { promotion.promotion_actions = [other_action] }
|
109
|
+
|
110
|
+
it "destroys adjustments for incompleted orders" do
|
111
|
+
order = Order.create
|
112
|
+
action.adjustments.create!(label: "Check",
|
113
|
+
amount: 0,
|
114
|
+
order: order,
|
115
|
+
adjustable: line_item)
|
116
|
+
|
117
|
+
expect {
|
118
|
+
action.destroy
|
119
|
+
}.to change { Adjustment.count }.by(-1)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "nullifies adjustments for completed orders" do
|
123
|
+
order = Order.create(completed_at: Time.current)
|
124
|
+
adjustment = action.adjustments.create!(label: "Check",
|
125
|
+
amount: 0,
|
126
|
+
order: order,
|
127
|
+
adjustable: line_item)
|
128
|
+
|
129
|
+
expect {
|
130
|
+
action.destroy
|
131
|
+
}.to change { adjustment.reload.source_id }.from(action.id).to nil
|
132
|
+
end
|
133
|
+
|
134
|
+
it "doesnt mess with unrelated adjustments" do
|
135
|
+
other_action.adjustments.create!(label: "Check",
|
136
|
+
amount: 0,
|
137
|
+
order: order,
|
138
|
+
adjustable: line_item)
|
139
|
+
|
140
|
+
expect {
|
141
|
+
action.destroy
|
142
|
+
}.not_to change { other_action.adjustments.count }
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Promotion::Actions::CreateLineItems, type: :model do
|
4
|
+
let(:order) { create(:order) }
|
5
|
+
let(:action) { Spree::Promotion::Actions::CreateLineItems.create }
|
6
|
+
let(:promotion) { stub_model(Spree::Promotion) }
|
7
|
+
let(:shirt) { create(:variant) }
|
8
|
+
let(:mug) { create(:variant) }
|
9
|
+
let(:payload) { { order: order } }
|
10
|
+
|
11
|
+
def empty_stock(variant)
|
12
|
+
variant.stock_items.update_all(backorderable: false)
|
13
|
+
variant.stock_items.each(&:reduce_count_on_hand_to_zero)
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#perform" do
|
17
|
+
before do
|
18
|
+
allow(action).to receive_messages promotion: promotion
|
19
|
+
action.promotion_action_line_items.create!(
|
20
|
+
variant: mug,
|
21
|
+
quantity: 1
|
22
|
+
)
|
23
|
+
action.promotion_action_line_items.create!(
|
24
|
+
variant: shirt,
|
25
|
+
quantity: 2
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
context "order is eligible" do
|
30
|
+
before do
|
31
|
+
allow(promotion).to receive_messages eligible: true
|
32
|
+
end
|
33
|
+
|
34
|
+
it "adds line items to order with correct variant and quantity" do
|
35
|
+
action.perform(payload)
|
36
|
+
expect(order.line_items.count).to eq(2)
|
37
|
+
line_item = order.line_items.find_by_variant_id(mug.id)
|
38
|
+
expect(line_item).not_to be_nil
|
39
|
+
expect(line_item.quantity).to eq(1)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "only adds the delta of quantity to an order" do
|
43
|
+
order.contents.add(shirt, 1)
|
44
|
+
action.perform(payload)
|
45
|
+
line_item = order.line_items.find_by_variant_id(shirt.id)
|
46
|
+
expect(line_item).not_to be_nil
|
47
|
+
expect(line_item.quantity).to eq(2)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "doesn't add if the quantity is greater" do
|
51
|
+
order.contents.add(shirt, 3)
|
52
|
+
action.perform(payload)
|
53
|
+
line_item = order.line_items.find_by_variant_id(shirt.id)
|
54
|
+
expect(line_item).not_to be_nil
|
55
|
+
expect(line_item.quantity).to eq(3)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "doesn't try to add an item if it's out of stock" do
|
59
|
+
empty_stock(mug)
|
60
|
+
empty_stock(shirt)
|
61
|
+
|
62
|
+
expect(order.contents).to_not receive(:add)
|
63
|
+
action.perform(order: order)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#item_available?" do
|
69
|
+
let(:item_out_of_stock) do
|
70
|
+
action.promotion_action_line_items.create!(variant: mug, quantity: 1)
|
71
|
+
end
|
72
|
+
|
73
|
+
let(:item_in_stock) do
|
74
|
+
action.promotion_action_line_items.create!(variant: shirt, quantity: 1)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "returns false if the item is out of stock" do
|
78
|
+
empty_stock(mug)
|
79
|
+
expect(action.item_available? item_out_of_stock).to be false
|
80
|
+
end
|
81
|
+
|
82
|
+
it "returns true if the item is in stock" do
|
83
|
+
expect(action.item_available? item_in_stock).to be true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Promotion::Actions::FreeShipping, type: :model do
|
4
|
+
let(:order) { create(:completed_order_with_totals) }
|
5
|
+
let(:promotion) { create(:promotion) }
|
6
|
+
let(:action) { Spree::Promotion::Actions::FreeShipping.create }
|
7
|
+
let(:payload) { { order: order } }
|
8
|
+
|
9
|
+
it_behaves_like 'an adjustment source'
|
10
|
+
|
11
|
+
# From promotion spec:
|
12
|
+
context "#perform" do
|
13
|
+
before do
|
14
|
+
order.shipments << create(:shipment)
|
15
|
+
promotion.promotion_actions << action
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should create a discount with correct negative amount" do
|
19
|
+
expect(order.shipments.count).to eq(2)
|
20
|
+
expect(order.shipments.first.cost).to eq(100)
|
21
|
+
expect(order.shipments.last.cost).to eq(100)
|
22
|
+
expect(action.perform(payload)).to be true
|
23
|
+
expect(promotion.credits_count).to eq(2)
|
24
|
+
expect(order.shipment_adjustments.count).to eq(2)
|
25
|
+
expect(order.shipment_adjustments.first.amount.to_i).to eq(-100)
|
26
|
+
expect(order.shipment_adjustments.last.amount.to_i).to eq(-100)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should not create a discount when order already has one from this promotion" do
|
30
|
+
expect(action.perform(payload)).to be true
|
31
|
+
expect(action.perform(payload)).to be false
|
32
|
+
expect(promotion.credits_count).to eq(2)
|
33
|
+
expect(order.shipment_adjustments.count).to eq(2)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Promotion::Rules::Country, type: :model do
|
4
|
+
let(:rule) { Spree::Promotion::Rules::Country.new }
|
5
|
+
let(:order) { create(:order) }
|
6
|
+
let(:country) { create(:country) }
|
7
|
+
let(:other_country) { create(:country) }
|
8
|
+
|
9
|
+
before { allow(Spree::Country).to receive(:default) { other_country.id } }
|
10
|
+
|
11
|
+
context 'preferred country is set' do
|
12
|
+
before { rule.preferred_country_id = country.id }
|
13
|
+
|
14
|
+
it 'should be eligible for correct country' do
|
15
|
+
allow(order).to receive_message_chain(:ship_address, :country_id) { country.id }
|
16
|
+
expect(rule).to be_eligible(order)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should not be eligible for incorrect country' do
|
20
|
+
allow(order).to receive_message_chain(:ship_address, :country_id) { other_country.id }
|
21
|
+
expect(rule).not_to be_eligible(order)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'preferred country is not set' do
|
26
|
+
it 'should be eligible for default country' do
|
27
|
+
allow(order).to receive_message_chain(:ship_address, :country_id) { other_country.id }
|
28
|
+
expect(rule).to be_eligible(order)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should not be eligible for incorrect country' do
|
32
|
+
allow(order).to receive_message_chain(:ship_address, :country_id) { country.id }
|
33
|
+
expect(rule).not_to be_eligible(order)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Promotion::Rules::FirstOrder, type: :model do
|
4
|
+
let(:rule) { Spree::Promotion::Rules::FirstOrder.new }
|
5
|
+
let(:order) { mock_model(Spree::Order, user: nil, email: nil) }
|
6
|
+
let(:user) { mock_model(Spree::LegacyUser) }
|
7
|
+
|
8
|
+
context "without a user or email" do
|
9
|
+
it { expect(rule).not_to be_eligible(order) }
|
10
|
+
it "sets an error message" do
|
11
|
+
rule.eligible?(order)
|
12
|
+
expect(rule.eligibility_errors.full_messages.first).
|
13
|
+
to eq "You need to login or provide your email before applying this coupon code."
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "first order" do
|
18
|
+
context "for a signed user" do
|
19
|
+
context "with no completed orders" do
|
20
|
+
before(:each) do
|
21
|
+
allow(user).to receive_message_chain(:orders, complete: [])
|
22
|
+
end
|
23
|
+
|
24
|
+
specify do
|
25
|
+
allow(order).to receive_messages(user: user)
|
26
|
+
expect(rule).to be_eligible(order)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be eligible when user passed in payload data" do
|
30
|
+
expect(rule).to be_eligible(order, user: user)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with completed orders" do
|
35
|
+
before(:each) do
|
36
|
+
allow(order).to receive_messages(user: user)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be eligible when checked against first completed order" do
|
40
|
+
allow(user).to receive_message_chain(:orders, complete: [order])
|
41
|
+
expect(rule).to be_eligible(order)
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with another order" do
|
45
|
+
before { allow(user).to receive_message_chain(:orders, complete: [mock_model(Spree::Order)]) }
|
46
|
+
it { expect(rule).not_to be_eligible(order) }
|
47
|
+
it "sets an error message" do
|
48
|
+
rule.eligible?(order)
|
49
|
+
expect(rule.eligibility_errors.full_messages.first).
|
50
|
+
to eq "This coupon code can only be applied to your first order."
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "for a guest user" do
|
57
|
+
let(:email) { 'user@spreecommerce.org' }
|
58
|
+
before { allow(order).to receive_messages email: 'user@spreecommerce.org' }
|
59
|
+
|
60
|
+
context "with no other orders" do
|
61
|
+
it { expect(rule).to be_eligible(order) }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "with another order" do
|
65
|
+
before { allow(rule).to receive_messages(orders_by_email: [mock_model(Spree::Order)]) }
|
66
|
+
it { expect(rule).not_to be_eligible(order) }
|
67
|
+
it "sets an error message" do
|
68
|
+
rule.eligible?(order)
|
69
|
+
expect(rule.eligibility_errors.full_messages.first).
|
70
|
+
to eq "This coupon code can only be applied to your first order."
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,282 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Promotion::Rules::ItemTotal, type: :model do
|
4
|
+
let(:rule) { Spree::Promotion::Rules::ItemTotal.new }
|
5
|
+
let(:order) { double(:order) }
|
6
|
+
|
7
|
+
before { rule.preferred_amount_min = 50 }
|
8
|
+
before { rule.preferred_amount_max = 60 }
|
9
|
+
|
10
|
+
context "preferred operator_min set to gt and preferred operator_max set to lt" do
|
11
|
+
before do
|
12
|
+
rule.preferred_operator_min = 'gt'
|
13
|
+
rule.preferred_operator_max = 'lt'
|
14
|
+
end
|
15
|
+
|
16
|
+
context "and item total is lower than prefered maximum amount" do
|
17
|
+
|
18
|
+
context "and item total is higher than prefered minimum amount" do
|
19
|
+
it "should be eligible" do
|
20
|
+
allow(order).to receive_messages item_total: 51
|
21
|
+
expect(rule).to be_eligible(order)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "and item total is equal to the prefered minimum amount" do
|
26
|
+
|
27
|
+
before { allow(order).to receive_messages item_total: 50 }
|
28
|
+
|
29
|
+
it "should not be eligible" do
|
30
|
+
expect(rule).to_not be_eligible(order)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "set an error message" do
|
34
|
+
rule.eligible?(order)
|
35
|
+
expect(rule.eligibility_errors.full_messages.first).
|
36
|
+
to eq "This coupon code can't be applied to orders less than or equal to $50.00."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "and item total is lower to the prefered minimum amount" do
|
41
|
+
before { allow(order).to receive_messages item_total: 49 }
|
42
|
+
|
43
|
+
it "should not be eligible" do
|
44
|
+
expect(rule).to_not be_eligible(order)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "set an error message" do
|
48
|
+
rule.eligible?(order)
|
49
|
+
expect(rule.eligibility_errors.full_messages.first).
|
50
|
+
to eq "This coupon code can't be applied to orders less than or equal to $50.00."
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "and item total is equal to the prefered maximum amount" do
|
56
|
+
before { allow(order).to receive_messages item_total: 60 }
|
57
|
+
|
58
|
+
it "should not be eligible" do
|
59
|
+
expect(rule).to_not be_eligible(order)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "set an error message" do
|
63
|
+
rule.eligible?(order)
|
64
|
+
expect(rule.eligibility_errors.full_messages.first).
|
65
|
+
to eq "This coupon code can't be applied to orders higher than $60.00."
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "and item total is higher than the prefered maximum amount" do
|
70
|
+
before { allow(order).to receive_messages item_total: 61 }
|
71
|
+
|
72
|
+
it "should not be eligible" do
|
73
|
+
expect(rule).to_not be_eligible(order)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "set an error message" do
|
77
|
+
rule.eligible?(order)
|
78
|
+
expect(rule.eligibility_errors.full_messages.first).
|
79
|
+
to eq "This coupon code can't be applied to orders higher than $60.00."
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
context "preferred operator set to gt and preferred operator_max set to lte" do
|
86
|
+
before do
|
87
|
+
rule.preferred_operator_min = 'gt'
|
88
|
+
rule.preferred_operator_max = 'lte'
|
89
|
+
end
|
90
|
+
|
91
|
+
context "and item total is lower than prefered maximum amount" do
|
92
|
+
|
93
|
+
context "and item total is higher than prefered minimum amount" do
|
94
|
+
it "should be eligible" do
|
95
|
+
allow(order).to receive_messages item_total: 51
|
96
|
+
expect(rule).to be_eligible(order)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "and item total is equal to the prefered minimum amount" do
|
101
|
+
|
102
|
+
before { allow(order).to receive_messages item_total: 50 }
|
103
|
+
|
104
|
+
it "should not be eligible" do
|
105
|
+
expect(rule).to_not be_eligible(order)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "set an error message" do
|
109
|
+
rule.eligible?(order)
|
110
|
+
expect(rule.eligibility_errors.full_messages.first).
|
111
|
+
to eq "This coupon code can't be applied to orders less than or equal to $50.00."
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "and item total is lower to the prefered minimum amount" do
|
116
|
+
before { allow(order).to receive_messages item_total: 49 }
|
117
|
+
|
118
|
+
it "should not be eligible" do
|
119
|
+
expect(rule).to_not be_eligible(order)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "set an error message" do
|
123
|
+
rule.eligible?(order)
|
124
|
+
expect(rule.eligibility_errors.full_messages.first).
|
125
|
+
to eq "This coupon code can't be applied to orders less than or equal to $50.00."
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "and item total is equal to the prefered maximum amount" do
|
131
|
+
before { allow(order).to receive_messages item_total: 60 }
|
132
|
+
|
133
|
+
it "should not be eligible" do
|
134
|
+
expect(rule).to be_eligible(order)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context "and item total is higher than the prefered maximum amount" do
|
139
|
+
before { allow(order).to receive_messages item_total: 61 }
|
140
|
+
|
141
|
+
it "should not be eligible" do
|
142
|
+
expect(rule).to_not be_eligible(order)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "set an error message" do
|
146
|
+
rule.eligible?(order)
|
147
|
+
expect(rule.eligibility_errors.full_messages.first).
|
148
|
+
to eq "This coupon code can't be applied to orders higher than $60.00."
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "preferred operator set to gte and preferred operator_max set to lt" do
|
154
|
+
before do
|
155
|
+
rule.preferred_operator_min = 'gte'
|
156
|
+
rule.preferred_operator_max = 'lt'
|
157
|
+
end
|
158
|
+
|
159
|
+
context "and item total is lower than prefered maximum amount" do
|
160
|
+
|
161
|
+
context "and item total is higher than prefered minimum amount" do
|
162
|
+
it "should be eligible" do
|
163
|
+
allow(order).to receive_messages item_total: 51
|
164
|
+
expect(rule).to be_eligible(order)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context "and item total is equal to the prefered minimum amount" do
|
169
|
+
|
170
|
+
before { allow(order).to receive_messages item_total: 50 }
|
171
|
+
|
172
|
+
it "should not be eligible" do
|
173
|
+
expect(rule).to be_eligible(order)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "and item total is lower to the prefered minimum amount" do
|
178
|
+
before { allow(order).to receive_messages item_total: 49 }
|
179
|
+
|
180
|
+
it "should not be eligible" do
|
181
|
+
expect(rule).to_not be_eligible(order)
|
182
|
+
end
|
183
|
+
|
184
|
+
it "set an error message" do
|
185
|
+
rule.eligible?(order)
|
186
|
+
expect(rule.eligibility_errors.full_messages.first).
|
187
|
+
to eq "This coupon code can't be applied to orders less than $50.00."
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context "and item total is equal to the prefered maximum amount" do
|
193
|
+
before { allow(order).to receive_messages item_total: 60 }
|
194
|
+
|
195
|
+
it "should not be eligible" do
|
196
|
+
expect(rule).to_not be_eligible(order)
|
197
|
+
end
|
198
|
+
|
199
|
+
it "set an error message" do
|
200
|
+
rule.eligible?(order)
|
201
|
+
expect(rule.eligibility_errors.full_messages.first).
|
202
|
+
to eq "This coupon code can't be applied to orders higher than $60.00."
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
context "and item total is higher than the prefered maximum amount" do
|
207
|
+
before { allow(order).to receive_messages item_total: 61 }
|
208
|
+
|
209
|
+
it "should not be eligible" do
|
210
|
+
expect(rule).to_not be_eligible(order)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "set an error message" do
|
214
|
+
rule.eligible?(order)
|
215
|
+
expect(rule.eligibility_errors.full_messages.first).
|
216
|
+
to eq "This coupon code can't be applied to orders higher than $60.00."
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
context "preferred operator set to gte and preferred operator_max set to lte" do
|
223
|
+
before do
|
224
|
+
rule.preferred_operator_min = 'gte'
|
225
|
+
rule.preferred_operator_max = 'lte'
|
226
|
+
end
|
227
|
+
|
228
|
+
context "and item total is lower than prefered maximum amount" do
|
229
|
+
context "and item total is higher than prefered minimum amount" do
|
230
|
+
it "should be eligible" do
|
231
|
+
allow(order).to receive_messages item_total: 51
|
232
|
+
expect(rule).to be_eligible(order)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context "and item total is equal to the prefered minimum amount" do
|
237
|
+
|
238
|
+
before { allow(order).to receive_messages item_total: 50 }
|
239
|
+
|
240
|
+
it "should not be eligible" do
|
241
|
+
expect(rule).to be_eligible(order)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
context "and item total is lower to the prefered minimum amount" do
|
246
|
+
before { allow(order).to receive_messages item_total: 49 }
|
247
|
+
|
248
|
+
it "should not be eligible" do
|
249
|
+
expect(rule).to_not be_eligible(order)
|
250
|
+
end
|
251
|
+
|
252
|
+
it "set an error message" do
|
253
|
+
rule.eligible?(order)
|
254
|
+
expect(rule.eligibility_errors.full_messages.first).
|
255
|
+
to eq "This coupon code can't be applied to orders less than $50.00."
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
context "and item total is equal to the prefered maximum amount" do
|
261
|
+
before { allow(order).to receive_messages item_total: 60 }
|
262
|
+
|
263
|
+
it "should not be eligible" do
|
264
|
+
expect(rule).to be_eligible(order)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
context "and item total is higher than the prefered maximum amount" do
|
269
|
+
before { allow(order).to receive_messages item_total: 61 }
|
270
|
+
|
271
|
+
it "should not be eligible" do
|
272
|
+
expect(rule).to_not be_eligible(order)
|
273
|
+
end
|
274
|
+
|
275
|
+
it "set an error message" do
|
276
|
+
rule.eligible?(order)
|
277
|
+
expect(rule.eligibility_errors.full_messages.first).
|
278
|
+
to eq "This coupon code can't be applied to orders higher than $60.00."
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|