solidus_core 1.0.2 → 1.0.3
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/CHANGELOG.md +1 -0
- data/Gemfile +3 -0
- data/Rakefile +16 -0
- data/script/rails +9 -0
- data/solidus_core.gemspec +48 -0
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +173 -0
- data/spec/helpers/order_helper_spec.rb +12 -0
- data/spec/helpers/products_helper_spec.rb +220 -0
- data/spec/helpers/taxons_helper_spec.rb +17 -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/search/variant_spec.rb +92 -0
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
- data/spec/lib/spree/core/current_store_spec.rb +36 -0
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
- data/spec/lib/spree/core/importer/order_spec.rb +431 -0
- data/spec/lib/spree/core/role_configuration_spec.rb +138 -0
- data/spec/lib/spree/core/validators/email_spec.rb +48 -0
- data/spec/lib/spree/localized_number_spec.rb +38 -0
- data/spec/lib/spree/migrations_spec.rb +36 -0
- data/spec/lib/spree/money_spec.rb +127 -0
- data/spec/lib/tasks/exchanges_spec.rb +231 -0
- data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
- data/spec/lib/tasks/order_capturing_spec.rb +56 -0
- data/spec/mailers/carton_mailer_spec.rb +43 -0
- data/spec/mailers/order_mailer_spec.rb +122 -0
- data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
- data/spec/mailers/test_mailer_spec.rb +15 -0
- data/spec/models/spree/ability_spec.rb +276 -0
- data/spec/models/spree/address_spec.rb +250 -0
- data/spec/models/spree/adjustment_reason_spec.rb +13 -0
- data/spec/models/spree/adjustment_spec.rb +177 -0
- data/spec/models/spree/app_configuration_spec.rb +20 -0
- data/spec/models/spree/asset_spec.rb +24 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +127 -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 +51 -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 +30 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
- data/spec/models/spree/calculator_spec.rb +36 -0
- data/spec/models/spree/carton_spec.rb +133 -0
- data/spec/models/spree/classification_spec.rb +15 -0
- data/spec/models/spree/concerns/display_money_spec.rb +43 -0
- data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
- data/spec/models/spree/credit_card_spec.rb +334 -0
- data/spec/models/spree/customer_return_spec.rb +276 -0
- data/spec/models/spree/exchange_spec.rb +79 -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 +82 -0
- data/spec/models/spree/inventory_unit_spec.rb +307 -0
- data/spec/models/spree/item_adjustments_spec.rb +256 -0
- data/spec/models/spree/line_item_spec.rb +191 -0
- data/spec/models/spree/option_type_spec.rb +14 -0
- data/spec/models/spree/option_value_spec.rb +22 -0
- data/spec/models/spree/order/address_spec.rb +50 -0
- data/spec/models/spree/order/adjustments_spec.rb +39 -0
- data/spec/models/spree/order/callbacks_spec.rb +42 -0
- data/spec/models/spree/order/checkout_spec.rb +902 -0
- data/spec/models/spree/order/currency_updater_spec.rb +32 -0
- data/spec/models/spree/order/finalizing_spec.rb +111 -0
- data/spec/models/spree/order/payment_spec.rb +210 -0
- data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
- data/spec/models/spree/order/state_machine_spec.rb +221 -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_cancellations_spec.rb +120 -0
- data/spec/models/spree/order_capturing_spec.rb +116 -0
- data/spec/models/spree/order_contents_spec.rb +265 -0
- data/spec/models/spree/order_inventory_spec.rb +228 -0
- data/spec/models/spree/order_mutex_spec.rb +85 -0
- data/spec/models/spree/order_promotion_spec.rb +31 -0
- data/spec/models/spree/order_shipping_spec.rb +247 -0
- data/spec/models/spree/order_spec.rb +1412 -0
- data/spec/models/spree/order_stock_location_spec.rb +18 -0
- data/spec/models/spree/order_updater_spec.rb +299 -0
- data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
- data/spec/models/spree/payment_method_spec.rb +96 -0
- data/spec/models/spree/payment_spec.rb +1044 -0
- data/spec/models/spree/permission_sets/base_spec.rb +12 -0
- data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
- data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
- data/spec/models/spree/permission_sets/order_display_spec.rb +49 -0
- data/spec/models/spree/permission_sets/order_management_spec.rb +36 -0
- data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
- data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
- data/spec/models/spree/permission_sets/promotion_display_spec.rb +34 -0
- data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
- data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
- data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +132 -0
- data/spec/models/spree/permission_sets/stock_display_spec.rb +26 -0
- data/spec/models/spree/permission_sets/stock_management_spec.rb +24 -0
- data/spec/models/spree/permission_sets/user_display_spec.rb +36 -0
- data/spec/models/spree/permission_sets/user_management_spec.rb +28 -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 +294 -0
- data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
- data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
- data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
- data/spec/models/spree/preferences/store_spec.rb +39 -0
- data/spec/models/spree/price_spec.rb +42 -0
- data/spec/models/spree/product/scopes_spec.rb +148 -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_property_spec.rb +20 -0
- data/spec/models/spree/product_spec.rb +437 -0
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
- data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
- data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
- data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -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 +94 -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 +37 -0
- data/spec/models/spree/promotion_builder_spec.rb +118 -0
- data/spec/models/spree/promotion_category_spec.rb +17 -0
- data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
- data/spec/models/spree/promotion_code_spec.rb +187 -0
- data/spec/models/spree/promotion_handler/cart_spec.rb +114 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
- data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
- data/spec/models/spree/promotion_rule_spec.rb +28 -0
- data/spec/models/spree/promotion_spec.rb +767 -0
- data/spec/models/spree/refund_spec.rb +204 -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 +231 -0
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -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 +107 -0
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
- data/spec/models/spree/return_authorization_spec.rb +290 -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 +85 -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 +775 -0
- data/spec/models/spree/returns_calculator_spec.rb +14 -0
- data/spec/models/spree/shipment_spec.rb +709 -0
- data/spec/models/spree/shipping_calculator_spec.rb +45 -0
- data/spec/models/spree/shipping_method_spec.rb +88 -0
- data/spec/models/spree/shipping_rate_spec.rb +142 -0
- data/spec/models/spree/state_spec.rb +14 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
- data/spec/models/spree/stock/coordinator_spec.rb +116 -0
- data/spec/models/spree/stock/differentiator_spec.rb +39 -0
- data/spec/models/spree/stock/estimator_spec.rb +146 -0
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
- data/spec/models/spree/stock/package_spec.rb +163 -0
- data/spec/models/spree/stock/packer_spec.rb +91 -0
- data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
- data/spec/models/spree/stock/quantifier_spec.rb +115 -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 +50 -0
- data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
- data/spec/models/spree/stock_item_spec.rb +426 -0
- data/spec/models/spree/stock_location_spec.rb +279 -0
- data/spec/models/spree/stock_movement_spec.rb +56 -0
- data/spec/models/spree/stock_transfer_spec.rb +290 -0
- data/spec/models/spree/store_credit_category_spec.rb +17 -0
- data/spec/models/spree/store_credit_event_spec.rb +314 -0
- data/spec/models/spree/store_credit_spec.rb +876 -0
- data/spec/models/spree/store_spec.rb +55 -0
- data/spec/models/spree/tax_category_spec.rb +27 -0
- data/spec/models/spree/tax_rate_spec.rb +378 -0
- data/spec/models/spree/taxon_spec.rb +74 -0
- data/spec/models/spree/taxonomy_spec.rb +18 -0
- data/spec/models/spree/tracker_spec.rb +21 -0
- data/spec/models/spree/transfer_item_spec.rb +264 -0
- data/spec/models/spree/unit_cancel_spec.rb +148 -0
- data/spec/models/spree/user_spec.rb +223 -0
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
- data/spec/models/spree/variant/scopes_spec.rb +55 -0
- data/spec/models/spree/variant_spec.rb +546 -0
- data/spec/models/spree/zone_spec.rb +305 -0
- data/spec/spec_helper.rb +78 -0
- data/spec/support/big_decimal.rb +5 -0
- data/spec/support/concerns/default_price.rb +34 -0
- data/spec/support/dummy_ability.rb +4 -0
- data/spec/support/test_gateway.rb +2 -0
- metadata +229 -3
- data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +0 -8
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Store, :type => :model do
|
|
4
|
+
|
|
5
|
+
describe ".by_url" do
|
|
6
|
+
let!(:store) { create(:store, url: "website1.com\nwww.subdomain.com") }
|
|
7
|
+
let!(:store_2) { create(:store, url: 'freethewhales.com') }
|
|
8
|
+
|
|
9
|
+
it "should find stores by url" do
|
|
10
|
+
by_domain = Spree::Store.by_url('www.subdomain.com')
|
|
11
|
+
|
|
12
|
+
expect(by_domain).to include(store)
|
|
13
|
+
expect(by_domain).not_to include(store_2)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '.current' do
|
|
18
|
+
# there is a default store created with the test_app rake task.
|
|
19
|
+
let!(:store_1) { Spree::Store.first || create(:store) }
|
|
20
|
+
|
|
21
|
+
let!(:store_2) { create(:store, default: false, url: 'www.subdomain.com') }
|
|
22
|
+
let!(:store_3) { create(:store, default: false, url: 'www.another.com', code: 'CODE')}
|
|
23
|
+
|
|
24
|
+
it 'should return default when no domain' do
|
|
25
|
+
expect(subject.class.current).to eql(store_1)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should return store for domain' do
|
|
29
|
+
expect(subject.class.current('spreecommerce.com')).to eql(store_1)
|
|
30
|
+
expect(subject.class.current('www.subdomain.com')).to eql(store_2)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'should return store by code' do
|
|
34
|
+
expect(subject.class.current('CODE')).to eql(store_3)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe ".default" do
|
|
39
|
+
let!(:store) { create(:store) }
|
|
40
|
+
let!(:store_2) { create(:store, default: true) }
|
|
41
|
+
|
|
42
|
+
it "should ensure there is a default if one doesn't exist yet" do
|
|
43
|
+
expect(store_2.default).to be true
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should ensure there is only one default" do
|
|
47
|
+
[store, store_2].each(&:reload)
|
|
48
|
+
|
|
49
|
+
expect(Spree::Store.where(default: true).count).to eq(1)
|
|
50
|
+
expect(store_2.default).to be true
|
|
51
|
+
expect(store.default).not_to be true
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::TaxCategory, :type => :model do
|
|
4
|
+
context 'default tax category' do
|
|
5
|
+
let(:tax_category) { create(:tax_category) }
|
|
6
|
+
let(:new_tax_category) { create(:tax_category) }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
tax_category.update_column(:is_default, true)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should undefault the previous default tax category" do
|
|
13
|
+
new_tax_category.update_attributes({:is_default => true})
|
|
14
|
+
expect(new_tax_category.is_default).to be true
|
|
15
|
+
|
|
16
|
+
tax_category.reload
|
|
17
|
+
expect(tax_category.is_default).to be false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should undefault the previous default tax category except when updating the existing default tax category" do
|
|
21
|
+
tax_category.update_column(:description, "Updated description")
|
|
22
|
+
|
|
23
|
+
tax_category.reload
|
|
24
|
+
expect(tax_category.is_default).to be true
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::TaxRate, :type => :model do
|
|
4
|
+
context "match" do
|
|
5
|
+
let(:order) { create(:order) }
|
|
6
|
+
let(:country) { create(:country) }
|
|
7
|
+
let(:tax_category) { create(:tax_category) }
|
|
8
|
+
let(:calculator) { Spree::Calculator::FlatRate.new }
|
|
9
|
+
|
|
10
|
+
it "should return an empty array when tax_zone is nil" do
|
|
11
|
+
allow(order).to receive_messages :tax_zone => nil
|
|
12
|
+
expect(Spree::TaxRate.match(order.tax_zone)).to eq([])
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "when no rate zones match the tax zone" do
|
|
16
|
+
before do
|
|
17
|
+
Spree::TaxRate.create(:amount => 1, :zone => create(:zone))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "when there is no default tax zone" do
|
|
21
|
+
before do
|
|
22
|
+
@zone = create(:zone, :name => "Country Zone", :default_tax => false, :zone_members => [])
|
|
23
|
+
@zone.zone_members.create(:zoneable => country)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should return an empty array" do
|
|
27
|
+
allow(order).to receive_messages :tax_zone => @zone
|
|
28
|
+
expect(Spree::TaxRate.match(order.tax_zone)).to eq([])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should return the rate that matches the rate zone" do
|
|
32
|
+
rate = Spree::TaxRate.create(
|
|
33
|
+
:amount => 1,
|
|
34
|
+
:zone => @zone,
|
|
35
|
+
:tax_category => tax_category,
|
|
36
|
+
:calculator => calculator
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
allow(order).to receive_messages :tax_zone => @zone
|
|
40
|
+
expect(Spree::TaxRate.match(order.tax_zone)).to eq([rate])
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should return all rates that match the rate zone" do
|
|
44
|
+
rate1 = Spree::TaxRate.create(
|
|
45
|
+
:amount => 1,
|
|
46
|
+
:zone => @zone,
|
|
47
|
+
:tax_category => tax_category,
|
|
48
|
+
:calculator => calculator
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
rate2 = Spree::TaxRate.create(
|
|
52
|
+
:amount => 2,
|
|
53
|
+
:zone => @zone,
|
|
54
|
+
:tax_category => tax_category,
|
|
55
|
+
:calculator => Spree::Calculator::FlatRate.new
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
allow(order).to receive_messages :tax_zone => @zone
|
|
59
|
+
expect(Spree::TaxRate.match(order.tax_zone)).to match_array([rate1, rate2])
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context "when the tax_zone is contained within a rate zone" do
|
|
63
|
+
before do
|
|
64
|
+
sub_zone = create(:zone, :name => "State Zone", :zone_members => [])
|
|
65
|
+
sub_zone.zone_members.create(:zoneable => create(:state, :country => country))
|
|
66
|
+
allow(order).to receive_messages :tax_zone => sub_zone
|
|
67
|
+
@rate = Spree::TaxRate.create(
|
|
68
|
+
:amount => 1,
|
|
69
|
+
:zone => @zone,
|
|
70
|
+
:tax_category => tax_category,
|
|
71
|
+
:calculator => calculator
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should return the rate zone" do
|
|
76
|
+
expect(Spree::TaxRate.match(order.tax_zone)).to eq([@rate])
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context "when there is a default tax zone" do
|
|
82
|
+
before do
|
|
83
|
+
@zone = create(:zone, :name => "Country Zone", :default_tax => true, :zone_members => [])
|
|
84
|
+
@zone.zone_members.create(:zoneable => country)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
let(:included_in_price) { false }
|
|
88
|
+
let!(:rate) do
|
|
89
|
+
Spree::TaxRate.create(:amount => 1,
|
|
90
|
+
:zone => @zone,
|
|
91
|
+
:tax_category => tax_category,
|
|
92
|
+
:calculator => calculator,
|
|
93
|
+
:included_in_price => included_in_price)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
subject { Spree::TaxRate.match(order.tax_zone) }
|
|
97
|
+
|
|
98
|
+
context "when the order has the same tax zone" do
|
|
99
|
+
before do
|
|
100
|
+
allow(order).to receive_messages :tax_zone => @zone
|
|
101
|
+
allow(order).to receive_messages :tax_address => tax_address
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
let(:tax_address) { stub_model(Spree::Address) }
|
|
105
|
+
|
|
106
|
+
context "when the tax is not a VAT" do
|
|
107
|
+
it { is_expected.to eq([rate]) }
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
context "when the tax is a VAT" do
|
|
111
|
+
let(:included_in_price) { true }
|
|
112
|
+
it { is_expected.to eq([rate]) }
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context "when the order has a different tax zone" do
|
|
117
|
+
before do
|
|
118
|
+
allow(order).to receive_messages :tax_zone => create(:zone, :name => "Other Zone")
|
|
119
|
+
allow(order).to receive_messages :tax_address => tax_address
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
context "when the order has a tax_address" do
|
|
123
|
+
let(:tax_address) { stub_model(Spree::Address) }
|
|
124
|
+
|
|
125
|
+
context "when the tax is a VAT" do
|
|
126
|
+
let(:included_in_price) { true }
|
|
127
|
+
# The rate should match in this instance because:
|
|
128
|
+
# 1) It's the default rate (and as such, a negative adjustment should apply)
|
|
129
|
+
it { is_expected.to eq([rate]) }
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context "when the tax is not VAT" do
|
|
133
|
+
it "returns no tax rate" do
|
|
134
|
+
expect(subject).to be_empty
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
context "when the order does not have a tax_address" do
|
|
140
|
+
let(:tax_address) { nil}
|
|
141
|
+
|
|
142
|
+
context "when the tax is a VAT" do
|
|
143
|
+
let(:included_in_price) { true }
|
|
144
|
+
# The rate should match in this instance because:
|
|
145
|
+
# 1) The order has no tax address by this stage
|
|
146
|
+
# 2) With no tax address, it has no tax zone
|
|
147
|
+
# 3) Therefore, we assume the default tax zone
|
|
148
|
+
# 4) This default zone has a default tax rate.
|
|
149
|
+
it { is_expected.to eq([rate]) }
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
context "when the tax is not a VAT" do
|
|
153
|
+
it { is_expected.to be_empty }
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
context ".adjust" do
|
|
162
|
+
let(:order) { stub_model(Spree::Order) }
|
|
163
|
+
let(:tax_category_1) { stub_model(Spree::TaxCategory) }
|
|
164
|
+
let(:tax_category_2) { stub_model(Spree::TaxCategory) }
|
|
165
|
+
let(:rate_1) { stub_model(Spree::TaxRate, :tax_category => tax_category_1) }
|
|
166
|
+
let(:rate_2) { stub_model(Spree::TaxRate, :tax_category => tax_category_2) }
|
|
167
|
+
|
|
168
|
+
context "with line items" do
|
|
169
|
+
let(:line_item) do
|
|
170
|
+
stub_model(Spree::LineItem,
|
|
171
|
+
:price => 10.0,
|
|
172
|
+
:quantity => 1,
|
|
173
|
+
:tax_category => tax_category_1,
|
|
174
|
+
:variant => stub_model(Spree::Variant)
|
|
175
|
+
)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
let(:line_items) { [line_item] }
|
|
179
|
+
|
|
180
|
+
before do
|
|
181
|
+
allow(Spree::TaxRate).to receive_messages :match => [rate_1, rate_2]
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "should apply adjustments for two tax rates to the order" do
|
|
185
|
+
expect(rate_1).to receive(:adjust)
|
|
186
|
+
expect(rate_2).not_to receive(:adjust)
|
|
187
|
+
Spree::TaxRate.adjust(order.tax_zone, line_items)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
context "with shipments" do
|
|
192
|
+
let(:shipments) { [stub_model(Spree::Shipment, :cost => 10.0, :tax_category => tax_category_1)] }
|
|
193
|
+
|
|
194
|
+
before do
|
|
195
|
+
allow(Spree::TaxRate).to receive_messages :match => [rate_1, rate_2]
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
it "should apply adjustments for two tax rates to the order" do
|
|
199
|
+
expect(rate_1).to receive(:adjust)
|
|
200
|
+
expect(rate_2).not_to receive(:adjust)
|
|
201
|
+
Spree::TaxRate.adjust(order.tax_zone, shipments)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
context "#adjust" do
|
|
207
|
+
before do
|
|
208
|
+
@country = create(:country)
|
|
209
|
+
@zone = create(:zone, :name => "Country Zone", :default_tax => true, :zone_members => [])
|
|
210
|
+
@zone.zone_members.create(:zoneable => @country)
|
|
211
|
+
@category = Spree::TaxCategory.create :name => "Taxable Foo"
|
|
212
|
+
@category2 = Spree::TaxCategory.create(:name => "Non Taxable")
|
|
213
|
+
@rate1 = Spree::TaxRate.create(
|
|
214
|
+
:amount => 0.10,
|
|
215
|
+
:calculator => Spree::Calculator::DefaultTax.create,
|
|
216
|
+
:tax_category => @category,
|
|
217
|
+
:zone => @zone
|
|
218
|
+
)
|
|
219
|
+
@rate2 = Spree::TaxRate.create(
|
|
220
|
+
:amount => 0.05,
|
|
221
|
+
:calculator => Spree::Calculator::DefaultTax.create,
|
|
222
|
+
:tax_category => @category,
|
|
223
|
+
:zone => @zone
|
|
224
|
+
)
|
|
225
|
+
@order = Spree::Order.create!
|
|
226
|
+
@taxable = create(:product, :tax_category => @category)
|
|
227
|
+
@nontaxable = create(:product, :tax_category => @category2)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context "not taxable line item " do
|
|
231
|
+
let!(:line_item) { @order.contents.add(@nontaxable.master, 1) }
|
|
232
|
+
|
|
233
|
+
it "should not create a tax adjustment" do
|
|
234
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
235
|
+
expect(line_item.adjustments.tax.charge.count).to eq(0)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "should not create a refund" do
|
|
239
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
240
|
+
expect(line_item.adjustments.credit.count).to eq(0)
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
context "taxable line item" do
|
|
245
|
+
let!(:line_item) { @order.contents.add(@taxable.master, 1) }
|
|
246
|
+
|
|
247
|
+
context "when price includes tax" do
|
|
248
|
+
before do
|
|
249
|
+
@rate1.update_column(:included_in_price, true)
|
|
250
|
+
@rate2.update_column(:included_in_price, true)
|
|
251
|
+
Spree::TaxRate.store_pre_tax_amount(line_item, [@rate1, @rate2])
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
context "when zone is contained by default tax zone" do
|
|
255
|
+
it "should create two adjustments, one for each tax rate" do
|
|
256
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
257
|
+
expect(line_item.adjustments.count).to eq(1)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
it "should not create a tax refund" do
|
|
261
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
262
|
+
expect(line_item.adjustments.credit.count).to eq(0)
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
context "when order's zone is neither the default zone, or included in the default zone, but matches the rate's zone" do
|
|
267
|
+
before do
|
|
268
|
+
# With no zone members, this zone will not contain anything
|
|
269
|
+
# Previously:
|
|
270
|
+
# Zone.stub_chain :default_tax, :contains? => false
|
|
271
|
+
@zone.zone_members.delete_all
|
|
272
|
+
end
|
|
273
|
+
it "should create an adjustment" do
|
|
274
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
275
|
+
expect(line_item.adjustments.charge.count).to eq(1)
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
it "should not create a tax refund for each tax rate" do
|
|
279
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
280
|
+
expect(line_item.adjustments.credit.count).to eq(0)
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
context "when order's zone does not match default zone, is not included in the default zone, AND does not match the rate's zone" do
|
|
285
|
+
before do
|
|
286
|
+
@new_zone = create(:zone, :name => "New Zone", :default_tax => false)
|
|
287
|
+
@new_country = create(:country, :name => "New Country")
|
|
288
|
+
@new_zone.zone_members.create(:zoneable => @new_country)
|
|
289
|
+
@order.ship_address = create(:address, :country => @new_country)
|
|
290
|
+
@order.save
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
it "should not create positive adjustments" do
|
|
294
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
295
|
+
expect(line_item.adjustments.charge.count).to eq(0)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
it "should create a tax refund for each tax rate" do
|
|
299
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
300
|
+
expect(line_item.adjustments.credit.count).to eq(1)
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
context "when price does not include tax" do
|
|
305
|
+
before do
|
|
306
|
+
allow(@order).to receive_messages :tax_zone => @zone
|
|
307
|
+
[@rate1, @rate2].each do |rate|
|
|
308
|
+
rate.included_in_price = false
|
|
309
|
+
rate.zone = @zone
|
|
310
|
+
rate.save
|
|
311
|
+
end
|
|
312
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
it "should delete adjustments for open order when taxrate is deleted" do
|
|
316
|
+
@rate1.destroy!
|
|
317
|
+
@rate2.destroy!
|
|
318
|
+
expect(line_item.adjustments.count).to eq(0)
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
it "should not delete adjustments for complete order when taxrate is deleted" do
|
|
322
|
+
@order.update_column :completed_at, Time.now
|
|
323
|
+
@rate1.destroy!
|
|
324
|
+
@rate2.destroy!
|
|
325
|
+
expect(line_item.adjustments.count).to eq(2)
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
it "should create an adjustment" do
|
|
329
|
+
expect(line_item.adjustments.count).to eq(2)
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
it "should not create a tax refund" do
|
|
333
|
+
expect(line_item.adjustments.credit.count).to eq(0)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
describe 'tax adjustments' do
|
|
337
|
+
before { Spree::TaxRate.adjust(@order.tax_zone, @order.line_items) }
|
|
338
|
+
|
|
339
|
+
it "should apply adjustments when a tax zone is present" do
|
|
340
|
+
expect(line_item.adjustments.count).to eq(2)
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
describe 'when the tax zone is removed' do
|
|
344
|
+
before { allow(@order).to receive_messages :tax_zone => nil }
|
|
345
|
+
|
|
346
|
+
it 'does not apply any adjustments' do
|
|
347
|
+
Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
|
|
348
|
+
expect(line_item.adjustments.count).to eq(0)
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
context "when two rates apply" do
|
|
355
|
+
before do
|
|
356
|
+
@price_before_taxes = line_item.price / (1 + @rate1.amount + @rate2.amount)
|
|
357
|
+
# Use the same rounding method as in DefaultTax calculator
|
|
358
|
+
@price_before_taxes = BigDecimal.new(@price_before_taxes).round(2, BigDecimal::ROUND_HALF_UP)
|
|
359
|
+
line_item.update_column(:pre_tax_amount, @price_before_taxes)
|
|
360
|
+
# Clear out any previously automatically-applied adjustments
|
|
361
|
+
@order.all_adjustments.delete_all
|
|
362
|
+
@rate1.adjust(@order.tax_zone, line_item)
|
|
363
|
+
@rate2.adjust(@order.tax_zone, line_item)
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
it "should create two price adjustments" do
|
|
367
|
+
expect(@order.line_item_adjustments.count).to eq(2)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
it "price adjustments should be accurate" do
|
|
371
|
+
included_tax = @order.line_item_adjustments.sum(:amount)
|
|
372
|
+
expect(@price_before_taxes + included_tax).to eq(line_item.price)
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
end
|