spree_core 3.2.1 → 3.2.2
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/lib/spree/core/version.rb +1 -1
- data/spree_core.gemspec +1 -1
- metadata +3 -206
- data/spec/fixtures/microdata.html +0 -22
- data/spec/fixtures/microdata_itemref.html +0 -15
- data/spec/fixtures/microdata_no_itemscope.html +0 -20
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +0 -200
- data/spec/helpers/products_helper_spec.rb +0 -289
- data/spec/lib/calculated_adjustments_spec.rb +0 -7
- data/spec/lib/i18n_spec.rb +0 -123
- data/spec/lib/search/base_spec.rb +0 -86
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -103
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -110
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -17
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -72
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -39
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -22
- data/spec/lib/spree/core/importer/order_spec.rb +0 -605
- data/spec/lib/spree/core/number_generator_spec.rb +0 -175
- data/spec/lib/spree/core/token_generator_spec.rb +0 -24
- data/spec/lib/spree/core/validators/email_spec.rb +0 -53
- data/spec/lib/spree/core_spec.rb +0 -23
- data/spec/lib/spree/localized_number_spec.rb +0 -48
- data/spec/lib/spree/migrations_spec.rb +0 -36
- data/spec/lib/spree/money_spec.rb +0 -122
- data/spec/lib/tasks/exchanges_spec.rb +0 -136
- data/spec/mailers/order_mailer_spec.rb +0 -122
- data/spec/mailers/reimbursement_mailer_spec.rb +0 -47
- data/spec/mailers/shipment_mailer_spec.rb +0 -81
- data/spec/mailers/test_mailer_spec.rb +0 -38
- data/spec/models/option_type_prototype_spec.rb +0 -9
- data/spec/models/spree/ability_spec.rb +0 -251
- data/spec/models/spree/address_spec.rb +0 -402
- data/spec/models/spree/adjustable/adjuster/base_spec.rb +0 -10
- data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +0 -211
- data/spec/models/spree/adjustable/adjuster/tax_spec.rb +0 -86
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +0 -26
- data/spec/models/spree/adjustment_spec.rb +0 -189
- data/spec/models/spree/app_configuration_spec.rb +0 -26
- data/spec/models/spree/asset_spec.rb +0 -28
- data/spec/models/spree/calculator/default_tax_spec.rb +0 -152
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -25
- data/spec/models/spree/calculator/flat_rate_spec.rb +0 -47
- data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -41
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -15
- data/spec/models/spree/calculator/price_sack_spec.rb +0 -30
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -47
- data/spec/models/spree/calculator/shipping.rb +0 -8
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -23
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -13
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -52
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -20
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -29
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -40
- data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -51
- data/spec/models/spree/calculator_spec.rb +0 -69
- data/spec/models/spree/classification_spec.rb +0 -93
- data/spec/models/spree/concerns/display_money_spec.rb +0 -43
- data/spec/models/spree/concerns/user_methods_spec.rb +0 -82
- data/spec/models/spree/concerns/vat_price_calculation_spec.rb +0 -66
- data/spec/models/spree/country_spec.rb +0 -55
- data/spec/models/spree/credit_card_spec.rb +0 -328
- data/spec/models/spree/customer_return_spec.rb +0 -240
- data/spec/models/spree/exchange_spec.rb +0 -75
- data/spec/models/spree/gateway/bogus_simple.rb +0 -20
- data/spec/models/spree/gateway/bogus_spec.rb +0 -13
- data/spec/models/spree/gateway_spec.rb +0 -61
- data/spec/models/spree/image_spec.rb +0 -8
- data/spec/models/spree/inventory_unit_spec.rb +0 -256
- data/spec/models/spree/line_item_spec.rb +0 -346
- data/spec/models/spree/option_type_spec.rb +0 -14
- data/spec/models/spree/option_value_spec.rb +0 -18
- data/spec/models/spree/order/address_spec.rb +0 -50
- data/spec/models/spree/order/adjustments_spec.rb +0 -29
- data/spec/models/spree/order/callbacks_spec.rb +0 -42
- data/spec/models/spree/order/checkout_spec.rb +0 -770
- data/spec/models/spree/order/currency_updater_spec.rb +0 -32
- data/spec/models/spree/order/finalizing_spec.rb +0 -114
- data/spec/models/spree/order/helpers_spec.rb +0 -5
- data/spec/models/spree/order/payment_spec.rb +0 -214
- data/spec/models/spree/order/risk_assessment_spec.rb +0 -84
- data/spec/models/spree/order/shipments_spec.rb +0 -43
- data/spec/models/spree/order/state_machine_spec.rb +0 -212
- data/spec/models/spree/order/store_credit_spec.rb +0 -426
- data/spec/models/spree/order/tax_spec.rb +0 -84
- data/spec/models/spree/order/totals_spec.rb +0 -24
- data/spec/models/spree/order/updating_spec.rb +0 -18
- data/spec/models/spree/order/validations_spec.rb +0 -15
- data/spec/models/spree/order_contents_spec.rb +0 -297
- data/spec/models/spree/order_inventory_spec.rb +0 -239
- data/spec/models/spree/order_merger_spec.rb +0 -135
- data/spec/models/spree/order_spec.rb +0 -1046
- data/spec/models/spree/order_updater_spec.rb +0 -305
- data/spec/models/spree/payment/gateway_options_spec.rb +0 -127
- data/spec/models/spree/payment/store_credit_spec.rb +0 -60
- data/spec/models/spree/payment_method/store_credit_spec.rb +0 -291
- data/spec/models/spree/payment_method_spec.rb +0 -103
- data/spec/models/spree/payment_spec.rb +0 -919
- data/spec/models/spree/preference_spec.rb +0 -80
- data/spec/models/spree/preferences/configuration_spec.rb +0 -30
- data/spec/models/spree/preferences/preferable_spec.rb +0 -344
- data/spec/models/spree/preferences/scoped_store_spec.rb +0 -58
- data/spec/models/spree/preferences/store_spec.rb +0 -46
- data/spec/models/spree/price_spec.rb +0 -128
- data/spec/models/spree/product/scopes_spec.rb +0 -183
- data/spec/models/spree/product_duplicator_spec.rb +0 -103
- data/spec/models/spree/product_filter_spec.rb +0 -26
- data/spec/models/spree/product_option_type_spec.rb +0 -9
- data/spec/models/spree/product_promotion_rule_spec.rb +0 -9
- data/spec/models/spree/product_property_spec.rb +0 -26
- data/spec/models/spree/product_spec.rb +0 -629
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -113
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -148
- data/spec/models/spree/promotion/actions/create_line_items_spec.rb +0 -86
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -36
- data/spec/models/spree/promotion/rules/country_spec.rb +0 -36
- data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -75
- data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -282
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -42
- data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -90
- data/spec/models/spree/promotion/rules/product_spec.rb +0 -143
- data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -102
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -27
- data/spec/models/spree/promotion/rules/user_spec.rb +0 -45
- data/spec/models/spree/promotion_action_spec.rb +0 -10
- data/spec/models/spree/promotion_category_spec.rb +0 -17
- data/spec/models/spree/promotion_handler/cart_spec.rb +0 -102
- data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -323
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +0 -48
- data/spec/models/spree/promotion_handler/page_spec.rb +0 -44
- data/spec/models/spree/promotion_rule_spec.rb +0 -29
- data/spec/models/spree/promotion_rule_taxon_spec.rb +0 -9
- data/spec/models/spree/promotion_rule_user_spec.rb +0 -9
- data/spec/models/spree/promotion_spec.rb +0 -679
- data/spec/models/spree/property_prototype_spec.rb +0 -9
- data/spec/models/spree/property_spec.rb +0 -5
- data/spec/models/spree/prototype_spec.rb +0 -5
- data/spec/models/spree/prototype_taxon_spec.rb +0 -9
- data/spec/models/spree/refund_reason_spec.rb +0 -20
- data/spec/models/spree/refund_spec.rb +0 -195
- data/spec/models/spree/reimbursement/credit_spec.rb +0 -36
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -140
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -83
- data/spec/models/spree/reimbursement_performer_spec.rb +0 -30
- data/spec/models/spree/reimbursement_spec.rb +0 -188
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -63
- data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -53
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -46
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -55
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -101
- data/spec/models/spree/return_authorization_reason_spec.rb +0 -7
- data/spec/models/spree/return_authorization_spec.rb +0 -230
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -77
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -58
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -61
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -32
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -29
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -35
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -65
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
- data/spec/models/spree/return_item_spec.rb +0 -731
- data/spec/models/spree/returns_calculator_spec.rb +0 -14
- data/spec/models/spree/role_spec.rb +0 -7
- data/spec/models/spree/shipment_spec.rb +0 -742
- data/spec/models/spree/shipping_calculator_spec.rb +0 -45
- data/spec/models/spree/shipping_category_spec.rb +0 -19
- data/spec/models/spree/shipping_method_spec.rb +0 -95
- data/spec/models/spree/shipping_rate_spec.rb +0 -140
- data/spec/models/spree/state_spec.rb +0 -29
- data/spec/models/spree/stock/availability_validator_spec.rb +0 -36
- data/spec/models/spree/stock/content_item_spec.rb +0 -31
- data/spec/models/spree/stock/coordinator_spec.rb +0 -61
- data/spec/models/spree/stock/differentiator_spec.rb +0 -39
- data/spec/models/spree/stock/estimator_spec.rb +0 -202
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -38
- data/spec/models/spree/stock/package_spec.rb +0 -182
- data/spec/models/spree/stock/packer_spec.rb +0 -70
- data/spec/models/spree/stock/prioritizer_spec.rb +0 -125
- data/spec/models/spree/stock/quantifier_spec.rb +0 -126
- data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -29
- data/spec/models/spree/stock/splitter/base_spec.rb +0 -21
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -47
- data/spec/models/spree/stock/splitter/weight_spec.rb +0 -32
- data/spec/models/spree/stock_item_spec.rb +0 -432
- data/spec/models/spree/stock_location_spec.rb +0 -243
- data/spec/models/spree/stock_movement_spec.rb +0 -120
- data/spec/models/spree/stock_transfer_spec.rb +0 -50
- data/spec/models/spree/store_credit_event_spec.rb +0 -101
- data/spec/models/spree/store_credit_spec.rb +0 -786
- data/spec/models/spree/store_spec.rb +0 -78
- data/spec/models/spree/tax_category_spec.rb +0 -32
- data/spec/models/spree/tax_rate_spec.rb +0 -561
- data/spec/models/spree/taxon_spec.rb +0 -85
- data/spec/models/spree/taxonomy_spec.rb +0 -18
- data/spec/models/spree/tracker_spec.rb +0 -21
- data/spec/models/spree/user_spec.rb +0 -203
- data/spec/models/spree/variant_spec.rb +0 -818
- data/spec/models/spree/zone_member_spec.rb +0 -38
- data/spec/models/spree/zone_spec.rb +0 -472
- data/spec/spec_helper.rb +0 -79
- data/spec/support/big_decimal.rb +0 -5
- data/spec/support/concerns/adjustment_source.rb +0 -23
- data/spec/support/concerns/default_price.rb +0 -37
- data/spec/support/rake.rb +0 -13
- data/spec/support/test_gateway.rb +0 -2
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
module Spree
|
|
4
|
-
module Stock
|
|
5
|
-
describe Differentiator, type: :model do
|
|
6
|
-
let(:variant1) { mock_model(Variant) }
|
|
7
|
-
let(:variant2) { mock_model(Variant) }
|
|
8
|
-
|
|
9
|
-
let(:line_item1) { build(:line_item, variant: variant1, quantity: 2) }
|
|
10
|
-
let(:line_item2) { build(:line_item, variant: variant2, quantity: 2) }
|
|
11
|
-
|
|
12
|
-
let(:stock_location) { mock_model(StockLocation) }
|
|
13
|
-
|
|
14
|
-
let(:inventory_unit1) { build(:inventory_unit, variant: variant1, line_item: line_item1) }
|
|
15
|
-
let(:inventory_unit2) { build(:inventory_unit, variant: variant2, line_item: line_item2) }
|
|
16
|
-
|
|
17
|
-
let(:order) { mock_model(Order, line_items: [line_item1, line_item2]) }
|
|
18
|
-
|
|
19
|
-
let(:package1) do
|
|
20
|
-
Package.new(stock_location).tap { |p| p.add(inventory_unit1) }
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
let(:package2) do
|
|
24
|
-
Package.new(stock_location).tap { |p| p.add(inventory_unit2) }
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
let(:packages) { [package1, package2] }
|
|
28
|
-
|
|
29
|
-
subject { Differentiator.new(order, packages) }
|
|
30
|
-
|
|
31
|
-
it { is_expected.to be_missing }
|
|
32
|
-
|
|
33
|
-
it 'calculates the missing items' do
|
|
34
|
-
expect(subject.missing[variant1]).to eq 1
|
|
35
|
-
expect(subject.missing[variant2]).to eq 1
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
module Spree
|
|
4
|
-
module Stock
|
|
5
|
-
describe Estimator, type: :model do
|
|
6
|
-
let!(:shipping_method) { create(:shipping_method) }
|
|
7
|
-
let(:package) { build(:stock_package, contents: inventory_units.map { |i| ContentItem.new(inventory_unit) }) }
|
|
8
|
-
let(:order) { build(:order_with_line_items) }
|
|
9
|
-
let(:inventory_units) { order.inventory_units }
|
|
10
|
-
|
|
11
|
-
subject { Estimator.new(order) }
|
|
12
|
-
|
|
13
|
-
context "#shipping rates" do
|
|
14
|
-
before(:each) do
|
|
15
|
-
shipping_method.zones.first.members.create(zoneable: order.ship_address.country)
|
|
16
|
-
allow_any_instance_of(ShippingMethod).to receive_message_chain(:calculator, :available?).and_return(true)
|
|
17
|
-
allow_any_instance_of(ShippingMethod).to receive_message_chain(:calculator, :compute).and_return(4.00)
|
|
18
|
-
allow_any_instance_of(ShippingMethod).to receive_message_chain(:calculator, :preferences).and_return({currency: currency})
|
|
19
|
-
allow_any_instance_of(ShippingMethod).to receive_message_chain(:calculator, :marked_for_destruction?)
|
|
20
|
-
|
|
21
|
-
allow(package).to receive_messages(shipping_methods: [shipping_method])
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
let(:currency) { "USD" }
|
|
25
|
-
|
|
26
|
-
shared_examples_for "shipping rate matches" do
|
|
27
|
-
it "returns shipping rates" do
|
|
28
|
-
shipping_rates = subject.shipping_rates(package)
|
|
29
|
-
expect(shipping_rates.first.cost).to eq 4.00
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
shared_examples_for "shipping rate doesn't match" do
|
|
34
|
-
it "does not return shipping rates" do
|
|
35
|
-
shipping_rates = subject.shipping_rates(package)
|
|
36
|
-
expect(shipping_rates).to eq([])
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
context "when the order's ship address is in the same zone" do
|
|
41
|
-
it_should_behave_like "shipping rate matches"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
context "when the order's ship address is in a different zone" do
|
|
45
|
-
before { shipping_method.zones.each{|z| z.members.delete_all} }
|
|
46
|
-
it_should_behave_like "shipping rate doesn't match"
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
context "when the calculator is not available for that order" do
|
|
50
|
-
before { allow_any_instance_of(ShippingMethod).to receive_message_chain(:calculator, :available?).and_return(false) }
|
|
51
|
-
it_should_behave_like "shipping rate doesn't match"
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
context "when the currency is nil" do
|
|
55
|
-
let(:currency) { nil }
|
|
56
|
-
it_should_behave_like "shipping rate matches"
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
context "when the currency is an empty string" do
|
|
60
|
-
let(:currency) { "" }
|
|
61
|
-
it_should_behave_like "shipping rate matches"
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
context "when the current matches the order's currency" do
|
|
65
|
-
it_should_behave_like "shipping rate matches"
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
context "if the currency is different than the order's currency" do
|
|
69
|
-
let(:currency) { "GBP" }
|
|
70
|
-
it_should_behave_like "shipping rate doesn't match"
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "sorts shipping rates by cost" do
|
|
74
|
-
shipping_methods = 3.times.map { create(:shipping_method) }
|
|
75
|
-
allow(shipping_methods[0]).to receive_message_chain(:calculator, :compute).and_return(5.00)
|
|
76
|
-
allow(shipping_methods[1]).to receive_message_chain(:calculator, :compute).and_return(3.00)
|
|
77
|
-
allow(shipping_methods[2]).to receive_message_chain(:calculator, :compute).and_return(4.00)
|
|
78
|
-
|
|
79
|
-
allow(subject).to receive(:shipping_methods).and_return(shipping_methods)
|
|
80
|
-
|
|
81
|
-
expect(subject.shipping_rates(package).map(&:cost)).to eq %w[3.00 4.00 5.00].map(&BigDecimal.method(:new))
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
context "general shipping methods" do
|
|
85
|
-
let(:shipping_methods) { 2.times.map { create(:shipping_method) } }
|
|
86
|
-
|
|
87
|
-
it "selects the most affordable shipping rate" do
|
|
88
|
-
allow(shipping_methods[0]).to receive_message_chain(:calculator, :compute).and_return(5.00)
|
|
89
|
-
allow(shipping_methods[1]).to receive_message_chain(:calculator, :compute).and_return(3.00)
|
|
90
|
-
|
|
91
|
-
allow(subject).to receive(:shipping_methods).and_return(shipping_methods)
|
|
92
|
-
|
|
93
|
-
expect(subject.shipping_rates(package).sort_by(&:cost).map(&:selected)).to eq [true, false]
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "selects the most affordable shipping rate and doesn't raise exception over nil cost" do
|
|
97
|
-
allow(shipping_methods[0]).to receive_message_chain(:calculator, :compute).and_return(1.00)
|
|
98
|
-
allow(shipping_methods[1]).to receive_message_chain(:calculator, :compute).and_return(nil)
|
|
99
|
-
|
|
100
|
-
allow(subject).to receive(:shipping_methods).and_return(shipping_methods)
|
|
101
|
-
|
|
102
|
-
subject.shipping_rates(package)
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
context "involves backend only shipping methods" do
|
|
107
|
-
let(:backend_method) { create(:shipping_method, display_on: "back_end") }
|
|
108
|
-
let(:generic_method) { create(:shipping_method) }
|
|
109
|
-
|
|
110
|
-
before do
|
|
111
|
-
allow(backend_method).to receive_message_chain(:calculator, :compute).and_return(0.00)
|
|
112
|
-
allow(generic_method).to receive_message_chain(:calculator, :compute).and_return(5.00)
|
|
113
|
-
allow(package).to receive(:shipping_methods).and_return([backend_method, generic_method])
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "does not return backend rates at all" do
|
|
117
|
-
expect(subject.shipping_rates(package).map(&:shipping_method_id)).to eq([generic_method.id])
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# regression for #3287
|
|
121
|
-
it "doesn't select backend rates even if they're more affordable" do
|
|
122
|
-
expect(subject.shipping_rates(package).map(&:selected)).to eq [true]
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
context "includes tax adjustments if applicable" do
|
|
127
|
-
let!(:tax_rate) { create(:tax_rate, zone: order.tax_zone) }
|
|
128
|
-
|
|
129
|
-
before do
|
|
130
|
-
Spree::ShippingMethod.all.each do |sm|
|
|
131
|
-
sm.tax_category_id = tax_rate.tax_category_id
|
|
132
|
-
sm.save
|
|
133
|
-
end
|
|
134
|
-
package.shipping_methods.map(&:reload)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
it "links the shipping rate and the tax rate" do
|
|
139
|
-
shipping_rates = subject.shipping_rates(package)
|
|
140
|
-
expect(shipping_rates.first.tax_rate).to eq(tax_rate)
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
context "VAT price calculation" do
|
|
145
|
-
let(:tax_category) { create :tax_category }
|
|
146
|
-
let!(:shipping_method) { create(:shipping_method, tax_category: tax_category) }
|
|
147
|
-
|
|
148
|
-
let(:default_zone) { create(:zone_with_country, default_tax: true) }
|
|
149
|
-
let!(:default_vat) do
|
|
150
|
-
create :tax_rate,
|
|
151
|
-
included_in_price: true,
|
|
152
|
-
zone: default_zone,
|
|
153
|
-
amount: 0.2,
|
|
154
|
-
tax_category: shipping_method.tax_category
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
context "when the order does not have a tax zone" do
|
|
158
|
-
before { allow(order).to receive(:tax_zone).and_return nil }
|
|
159
|
-
it_should_behave_like "shipping rate matches"
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
context "when the order's tax zone is the default zone" do
|
|
163
|
-
before { allow(order).to receive(:tax_zone).and_return(default_zone) }
|
|
164
|
-
it_should_behave_like "shipping rate matches"
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
context "when the order's tax zone is a non-VAT zone" do
|
|
168
|
-
let!(:zone_without_vat) { create(:zone_with_country) }
|
|
169
|
-
before { allow(order).to receive(:tax_zone).and_return(zone_without_vat) }
|
|
170
|
-
|
|
171
|
-
it 'deducts the default VAT from the cost' do
|
|
172
|
-
shipping_rates = subject.shipping_rates(package)
|
|
173
|
-
# deduct default vat: 4.00 / 1.2 = 3.33 (rounded)
|
|
174
|
-
expect(shipping_rates.first.cost).to eq(3.33)
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
context "when the order's tax zone is a zone with VAT outside the default zone" do
|
|
179
|
-
let(:other_vat_zone) { create(:zone_with_country) }
|
|
180
|
-
let!(:other_vat) do
|
|
181
|
-
create :tax_rate,
|
|
182
|
-
included_in_price: true,
|
|
183
|
-
zone: other_vat_zone,
|
|
184
|
-
amount: 0.3,
|
|
185
|
-
tax_category: shipping_method.tax_category
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
before { allow(order).to receive(:tax_zone).and_return(other_vat_zone) }
|
|
189
|
-
|
|
190
|
-
it 'deducts the default vat and applies the foreign vat to calculate the price' do
|
|
191
|
-
shipping_rates = subject.shipping_rates(package)
|
|
192
|
-
#
|
|
193
|
-
# deduct default vat: 4.00 / 1.2 = 3.33 (rounded)
|
|
194
|
-
# apply foreign vat: 3.33 * 1.3 = 4.33 (rounded)
|
|
195
|
-
expect(shipping_rates.first.cost).to eq(4.33)
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
end
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
module Spree
|
|
4
|
-
module Stock
|
|
5
|
-
describe InventoryUnitBuilder, type: :model do
|
|
6
|
-
let(:line_item_1) { build(:line_item) }
|
|
7
|
-
let(:line_item_2) { build(:line_item, quantity: 2) }
|
|
8
|
-
let(:order) { build(:order, line_items: [line_item_1, line_item_2]) }
|
|
9
|
-
|
|
10
|
-
subject { InventoryUnitBuilder.new(order) }
|
|
11
|
-
|
|
12
|
-
describe "#units" do
|
|
13
|
-
it "returns an inventory unit for each quantity for the order's line items" do
|
|
14
|
-
units = subject.units
|
|
15
|
-
expect(units.count).to eq 3
|
|
16
|
-
expect(units.first.line_item).to eq line_item_1
|
|
17
|
-
expect(units.first.variant).to eq line_item_1.variant
|
|
18
|
-
|
|
19
|
-
expect(units[1].line_item).to eq line_item_2
|
|
20
|
-
expect(units[1].variant).to eq line_item_2.variant
|
|
21
|
-
|
|
22
|
-
expect(units[2].line_item).to eq line_item_2
|
|
23
|
-
expect(units[2].variant).to eq line_item_2.variant
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "builds the inventory units as pending" do
|
|
27
|
-
expect(subject.units.map(&:pending).uniq).to eq [true]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "associates the inventory units to the order" do
|
|
31
|
-
expect(subject.units.map(&:order).uniq).to eq [order]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
module Spree
|
|
4
|
-
module Stock
|
|
5
|
-
describe Package, type: :model do
|
|
6
|
-
let(:variant) { build(:variant, weight: 25.0) }
|
|
7
|
-
let(:stock_location) { build(:stock_location) }
|
|
8
|
-
let(:order) { build(:order) }
|
|
9
|
-
|
|
10
|
-
subject { Package.new(stock_location) }
|
|
11
|
-
|
|
12
|
-
def build_inventory_unit
|
|
13
|
-
build(:inventory_unit, variant: variant)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it 'calculates the weight of all the contents' do
|
|
17
|
-
4.times { subject.add build_inventory_unit }
|
|
18
|
-
expect(subject.weight).to eq(100.0)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
context "currency" do
|
|
22
|
-
let(:unit) { build_inventory_unit }
|
|
23
|
-
before { subject.add unit }
|
|
24
|
-
|
|
25
|
-
it "returns the currency based on the currency from the order" do
|
|
26
|
-
expect(subject.currency).to eql "USD"
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'filters by on_hand and backordered' do
|
|
31
|
-
4.times { subject.add build_inventory_unit }
|
|
32
|
-
3.times { subject.add build_inventory_unit, :backordered }
|
|
33
|
-
expect(subject.on_hand.count).to eq 4
|
|
34
|
-
expect(subject.backordered.count).to eq 3
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it 'calculates the quantity by state' do
|
|
38
|
-
4.times { subject.add build_inventory_unit }
|
|
39
|
-
3.times { subject.add build_inventory_unit, :backordered }
|
|
40
|
-
|
|
41
|
-
expect(subject.quantity).to eq 7
|
|
42
|
-
expect(subject.quantity(:on_hand)).to eq 4
|
|
43
|
-
expect(subject.quantity(:backordered)).to eq 3
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it 'returns nil for content item not found' do
|
|
47
|
-
unit = build_inventory_unit
|
|
48
|
-
item = subject.find_item(unit, :on_hand)
|
|
49
|
-
expect(item).to be_nil
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it 'finds content item for an inventory unit' do
|
|
53
|
-
unit = build_inventory_unit
|
|
54
|
-
subject.add unit
|
|
55
|
-
item = subject.find_item(unit, :on_hand)
|
|
56
|
-
expect(item.quantity).to eq 1
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Contains regression test for #2804
|
|
60
|
-
it 'builds a list of shipping methods common to all categories' do
|
|
61
|
-
category1 = create(:shipping_category)
|
|
62
|
-
category2 = create(:shipping_category)
|
|
63
|
-
method1 = create(:shipping_method)
|
|
64
|
-
method2 = create(:shipping_method)
|
|
65
|
-
method1.shipping_categories = [category1, category2]
|
|
66
|
-
method2.shipping_categories = [category1]
|
|
67
|
-
variant1 = create(:product, shipping_category: category1).master
|
|
68
|
-
variant2 = create(:product, shipping_category: category2).master
|
|
69
|
-
contents = [ContentItem.new(build(:inventory_unit, variant_id: variant1.id)),
|
|
70
|
-
ContentItem.new(build(:inventory_unit, variant_id: variant1.id)),
|
|
71
|
-
ContentItem.new(build(:inventory_unit, variant_id: variant2.id))]
|
|
72
|
-
|
|
73
|
-
package = Package.new(stock_location, contents)
|
|
74
|
-
expect(package.shipping_methods).to eq([method1])
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it 'builds an empty list of shipping methods when no categories' do
|
|
78
|
-
variant = mock_model(Variant, shipping_category: nil)
|
|
79
|
-
contents = [ContentItem.new(build(:inventory_unit, variant: variant))]
|
|
80
|
-
package = Package.new(stock_location, contents)
|
|
81
|
-
expect(package.shipping_methods).to be_empty
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
it "can convert to a shipment" do
|
|
85
|
-
2.times { subject.add build_inventory_unit }
|
|
86
|
-
subject.add build_inventory_unit, :backordered
|
|
87
|
-
|
|
88
|
-
shipping_method = build(:shipping_method)
|
|
89
|
-
subject.shipping_rates = [ Spree::ShippingRate.new(shipping_method: shipping_method, cost: 10.00, selected: true) ]
|
|
90
|
-
|
|
91
|
-
shipment = subject.to_shipment
|
|
92
|
-
expect(shipment.stock_location).to eq subject.stock_location
|
|
93
|
-
expect(shipment.inventory_units.size).to eq 3
|
|
94
|
-
|
|
95
|
-
first_unit = shipment.inventory_units.first
|
|
96
|
-
expect(first_unit.variant).to eq variant
|
|
97
|
-
expect(first_unit.state).to eq 'on_hand'
|
|
98
|
-
expect(first_unit).to be_pending
|
|
99
|
-
|
|
100
|
-
last_unit = shipment.inventory_units.last
|
|
101
|
-
expect(last_unit.variant).to eq variant
|
|
102
|
-
expect(last_unit.state).to eq 'backordered'
|
|
103
|
-
|
|
104
|
-
expect(shipment.shipping_method).to eq shipping_method
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
describe "#add_multiple" do
|
|
108
|
-
it "adds multiple inventory units" do
|
|
109
|
-
expect { subject.add_multiple [build_inventory_unit, build_inventory_unit] }.to change { subject.quantity }.by(2)
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "allows adding with a state" do
|
|
113
|
-
expect { subject.add_multiple [build_inventory_unit, build_inventory_unit], :backordered }.to change { subject.backordered.count }.by(2)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "defaults to adding with the on hand state" do
|
|
117
|
-
expect { subject.add_multiple [build_inventory_unit, build_inventory_unit] }.to change { subject.on_hand.count }.by(2)
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
describe "#remove" do
|
|
122
|
-
let(:unit) { build_inventory_unit }
|
|
123
|
-
context "there is a content item for the inventory unit" do
|
|
124
|
-
|
|
125
|
-
before { subject.add unit }
|
|
126
|
-
|
|
127
|
-
it "removes that content item" do
|
|
128
|
-
expect { subject.remove(unit) }.to change { subject.quantity }.by(-1)
|
|
129
|
-
expect(subject.contents.map(&:inventory_unit)).not_to include unit
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
context "there is no content item for the inventory unit" do
|
|
134
|
-
it "doesn't change the set of content items" do
|
|
135
|
-
expect { subject.remove(unit) }.not_to change { subject.quantity }
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
describe "#order" do
|
|
141
|
-
let(:unit) { build_inventory_unit }
|
|
142
|
-
context "there is an inventory unit" do
|
|
143
|
-
|
|
144
|
-
before { subject.add unit }
|
|
145
|
-
|
|
146
|
-
it "returns an order" do
|
|
147
|
-
expect(subject.order).to be_a_kind_of Spree::Order
|
|
148
|
-
expect(subject.order).to eq unit.order
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
context "there is no inventory unit" do
|
|
153
|
-
it "returns nil" do
|
|
154
|
-
expect(subject.order).to eq nil
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
context "#volume" do
|
|
160
|
-
it "calculates the sum of the volume of all the items" do
|
|
161
|
-
contents = [ContentItem.new(build(:inventory_unit, variant: build(:variant))),
|
|
162
|
-
ContentItem.new(build(:inventory_unit, variant: build(:variant))),
|
|
163
|
-
ContentItem.new(build(:inventory_unit, variant: build(:variant))),
|
|
164
|
-
ContentItem.new(build(:inventory_unit, variant: build(:variant)))]
|
|
165
|
-
package = Package.new(stock_location, contents)
|
|
166
|
-
expect(package.volume).to eq contents.sum(&:volume)
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
context "#dimension" do
|
|
171
|
-
it "calculates the sum of the dimension of all the items" do
|
|
172
|
-
contents = [ContentItem.new(build(:inventory_unit, variant: build(:variant))),
|
|
173
|
-
ContentItem.new(build(:inventory_unit, variant: build(:variant))),
|
|
174
|
-
ContentItem.new(build(:inventory_unit, variant: build(:variant))),
|
|
175
|
-
ContentItem.new(build(:inventory_unit, variant: build(:variant)))]
|
|
176
|
-
package = Package.new(stock_location, contents)
|
|
177
|
-
expect(package.dimension).to eq contents.sum(&:dimension)
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|