solidus_core 2.10.0.beta1 → 2.10.0
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/helpers/spree/base_helper.rb +4 -4
- data/app/helpers/spree/products_helper.rb +2 -1
- data/app/jobs/spree/promotion_code_batch_job.rb +2 -2
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/spree/address.rb +11 -15
- data/app/models/spree/adjustment.rb +11 -0
- data/app/models/spree/calculator/price_sack.rb +1 -1
- data/app/models/spree/calculator/shipping/flexi_rate.rb +2 -2
- data/app/models/spree/calculator/tiered_flat_rate.rb +5 -5
- data/app/models/spree/calculator/tiered_percent.rb +6 -6
- data/app/models/spree/carton.rb +1 -1
- data/app/models/spree/credit_card.rb +2 -2
- data/app/models/spree/inventory_unit.rb +1 -19
- data/app/models/spree/line_item.rb +1 -1
- data/app/models/spree/order.rb +3 -2
- data/app/models/spree/order/checkout.rb +1 -1
- data/app/models/spree/order/payments.rb +2 -2
- data/app/models/spree/order_capturing.rb +2 -2
- data/app/models/spree/order_taxation.rb +2 -2
- data/app/models/spree/payment.rb +4 -41
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/payment_method.rb +2 -2
- data/app/models/spree/product.rb +3 -3
- data/app/models/spree/product/scopes.rb +8 -7
- data/app/models/spree/promotion.rb +27 -12
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +1 -1
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
- data/app/models/spree/promotion/rules/option_value.rb +2 -2
- data/app/models/spree/promotion/rules/product.rb +3 -3
- data/app/models/spree/promotion_action.rb +1 -1
- data/app/models/spree/promotion_chooser.rb +2 -2
- data/app/models/spree/promotion_code.rb +9 -8
- data/app/models/spree/promotion_code/batch_builder.rb +3 -3
- data/app/models/spree/promotion_rule.rb +1 -1
- data/app/models/spree/refund.rb +2 -2
- data/app/models/spree/reimbursement.rb +3 -11
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
- data/app/models/spree/return_authorization.rb +1 -7
- data/app/models/spree/return_item.rb +3 -42
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/shipment.rb +4 -38
- data/app/models/spree/shipping_calculator.rb +0 -4
- data/app/models/spree/shipping_method.rb +1 -1
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/differentiator.rb +1 -1
- data/app/models/spree/stock/package.rb +1 -1
- data/app/models/spree/stock_item.rb +1 -1
- data/app/models/spree/stock_quantities.rb +13 -12
- data/app/models/spree/tax_calculator/default.rb +0 -4
- data/app/models/spree/tax_calculator/shipping_rate.rb +0 -3
- data/app/models/spree/tax_rate.rb +4 -0
- data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
- data/app/models/spree/user_last_url_storer.rb +46 -0
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
- data/app/models/spree/variant.rb +9 -9
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
- data/app/models/spree/zone.rb +1 -1
- data/config/initializers/money.rb +2 -0
- data/config/locales/en.yml +12 -0
- data/lib/generators/spree/install/install_generator.rb +3 -0
- data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +8 -0
- data/lib/spree/app_configuration.rb +18 -3
- data/lib/spree/core.rb +12 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -13
- data/lib/spree/core/engine.rb +2 -2
- data/lib/spree/core/environment_extension.rb +9 -0
- data/lib/spree/core/importer/order.rb +26 -26
- data/lib/spree/core/product_filters.rb +15 -15
- data/lib/spree/core/role_configuration.rb +2 -2
- data/lib/spree/core/search/variant.rb +1 -1
- data/lib/spree/core/state_machines.rb +78 -0
- data/lib/spree/core/state_machines/inventory_unit.rb +42 -0
- data/lib/spree/core/state_machines/payment.rb +61 -0
- data/lib/spree/core/state_machines/reimbursement.rb +33 -0
- data/lib/spree/core/state_machines/return_authorization.rb +32 -0
- data/lib/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
- data/lib/spree/core/state_machines/return_item/reception_status.rb +42 -0
- data/lib/spree/core/state_machines/shipment.rb +58 -0
- data/lib/spree/core/stock_configuration.rb +1 -0
- data/lib/spree/core/validators/email.rb +1 -8
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/money.rb +2 -2
- data/lib/spree/permission_sets/user_management.rb +3 -0
- data/lib/spree/permitted_attributes.rb +3 -3
- data/lib/spree/preferences/static_model_preferences.rb +2 -2
- data/lib/spree/testing_support/dummy_app.rb +4 -1
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +8 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +7 -0
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
- data/solidus_core.gemspec +2 -2
- data/spec/lib/spree/core/environment_extension_spec.rb +12 -1
- data/spec/lib/spree/core/stock_configuration_spec.rb +36 -0
- data/spec/lib/spree/core/validators/email_spec.rb +18 -18
- data/spec/models/spree/address_spec.rb +23 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +2 -2
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +24 -15
- data/spec/models/spree/carton_spec.rb +8 -0
- data/spec/models/spree/classification_spec.rb +21 -9
- data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
- data/spec/models/spree/concerns/user_methods_spec.rb +2 -1
- data/spec/models/spree/order_merger_spec.rb +3 -3
- data/spec/models/spree/order_spec.rb +8 -15
- data/spec/models/spree/order_updater_spec.rb +4 -3
- data/spec/models/spree/payment_create_spec.rb +4 -14
- data/spec/models/spree/permission_sets/user_management_spec.rb +2 -0
- data/spec/models/spree/preference_spec.rb +4 -4
- data/spec/models/spree/preferences/preferable_spec.rb +3 -3
- data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -2
- data/spec/models/spree/promotion_rule_spec.rb +6 -6
- data/spec/models/spree/promotion_spec.rb +73 -52
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
- data/spec/models/spree/returns_calculator_spec.rb +2 -2
- data/spec/models/spree/shipping_calculator_spec.rb +1 -13
- data/spec/models/spree/shipping_method_spec.rb +32 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +2 -2
- data/spec/models/spree/stock/differentiator_spec.rb +2 -2
- data/spec/models/spree/stock/estimator_spec.rb +3 -3
- data/spec/models/spree/stock/package_spec.rb +28 -28
- data/spec/models/spree/stock/simple_coordinator_spec.rb +11 -11
- data/spec/models/spree/stock/splitter/base_spec.rb +4 -4
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +7 -7
- data/spec/models/spree/stock_quantities_spec.rb +1 -1
- data/spec/models/spree/store_credit_spec.rb +1 -1
- data/spec/models/spree/tax_rate_spec.rb +1 -0
- data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
- data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +31 -0
- data/spec/models/spree/user_last_url_storer_spec.rb +60 -0
- metadata +17 -12
- data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -162
- data/spec/models/spree/order/updating_spec.rb +0 -18
|
@@ -17,13 +17,13 @@ module Spree
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
it "validates unique rules for a promotion" do
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
promotion_one = TestRule.new
|
|
21
|
+
promotion_one.promotion_id = 1
|
|
22
|
+
promotion_one.save
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
expect(
|
|
24
|
+
promotion_two = TestRule.new
|
|
25
|
+
promotion_two.promotion_id = 1
|
|
26
|
+
expect(promotion_two).not_to be_valid
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
it "generates its own partial path" do
|
|
@@ -434,12 +434,12 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
434
434
|
end
|
|
435
435
|
|
|
436
436
|
context 'when expires_at date is not already reached' do
|
|
437
|
-
let(:expires_at) { Time.current + 1.
|
|
437
|
+
let(:expires_at) { Time.current + 1.day }
|
|
438
438
|
it { is_expected.to be_falsey }
|
|
439
439
|
end
|
|
440
440
|
|
|
441
441
|
context 'when expires_at date is in the past' do
|
|
442
|
-
let(:expires_at) { Time.current - 1.
|
|
442
|
+
let(:expires_at) { Time.current - 1.day }
|
|
443
443
|
it { is_expected.to be_truthy }
|
|
444
444
|
end
|
|
445
445
|
end
|
|
@@ -454,12 +454,12 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
454
454
|
end
|
|
455
455
|
|
|
456
456
|
context 'when expires_at date is not already reached' do
|
|
457
|
-
let(:expires_at) { Time.current + 1.
|
|
457
|
+
let(:expires_at) { Time.current + 1.day }
|
|
458
458
|
it { is_expected.to be_truthy }
|
|
459
459
|
end
|
|
460
460
|
|
|
461
461
|
context 'when expires_at date is in the past' do
|
|
462
|
-
let(:expires_at) { Time.current - 1.
|
|
462
|
+
let(:expires_at) { Time.current - 1.day }
|
|
463
463
|
it { is_expected.to be_falsey }
|
|
464
464
|
end
|
|
465
465
|
end
|
|
@@ -569,76 +569,69 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
569
569
|
|
|
570
570
|
context "#eligible?" do
|
|
571
571
|
subject do
|
|
572
|
-
promotion.eligible?(promotable)
|
|
572
|
+
promotion.eligible?(promotable, promotion_code: promotion.codes.first)
|
|
573
573
|
end
|
|
574
574
|
|
|
575
|
-
|
|
575
|
+
shared_examples "a promotable" do
|
|
576
|
+
context "when empty" do
|
|
577
|
+
it { is_expected.to be true }
|
|
578
|
+
end
|
|
576
579
|
|
|
577
|
-
|
|
580
|
+
context "when promotion is expired" do
|
|
581
|
+
before { promotion.expires_at = Time.current - 10.days }
|
|
578
582
|
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
it { is_expected.to be false }
|
|
582
|
-
end
|
|
583
|
+
it { is_expected.to be false }
|
|
584
|
+
end
|
|
583
585
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
+
context "when promotion's usage limit is exceeded" do
|
|
587
|
+
before do
|
|
588
|
+
promotion.usage_limit = 1
|
|
589
|
+
create(:completed_order_with_promotion, promotion: promotion)
|
|
590
|
+
end
|
|
586
591
|
|
|
587
|
-
|
|
588
|
-
FactoryBot.create(
|
|
589
|
-
:completed_order_with_promotion,
|
|
590
|
-
promotion: promotion
|
|
591
|
-
)
|
|
592
|
-
promotion.usage_limit = 1
|
|
592
|
+
it { is_expected.to be false }
|
|
593
593
|
end
|
|
594
594
|
|
|
595
|
-
|
|
596
|
-
|
|
595
|
+
context "when promotion code's usage limit is exceeded" do
|
|
596
|
+
before do
|
|
597
|
+
promotion.per_code_usage_limit = 1
|
|
598
|
+
create(:completed_order_with_promotion, promotion: promotion)
|
|
599
|
+
promotion.codes.first.adjustments.update_all(eligible: true)
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
it { is_expected.to be false }
|
|
597
603
|
end
|
|
598
|
-
end
|
|
599
604
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
605
|
+
context "when promotion is at last usage on the same order" do
|
|
606
|
+
let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
|
|
607
|
+
let(:promotable) { order }
|
|
603
608
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
promotion: promotion
|
|
608
|
-
)
|
|
609
|
-
promotion_code.adjustments.update_all(eligible: true)
|
|
610
|
-
end
|
|
609
|
+
before do
|
|
610
|
+
promotion.usage_limit = 1
|
|
611
|
+
end
|
|
611
612
|
|
|
612
|
-
|
|
613
|
-
expect(promotion.eligible?(promotable, promotion_code: promotion_code)).to eq(false)
|
|
613
|
+
it { is_expected.to be true }
|
|
614
614
|
end
|
|
615
|
-
end
|
|
616
615
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
616
|
+
context "when promotion code is at last usage on the same order" do
|
|
617
|
+
let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
|
|
618
|
+
let(:promotable) { order }
|
|
620
619
|
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
620
|
+
before do
|
|
621
|
+
promotion.per_code_usage_limit = 1
|
|
622
|
+
end
|
|
624
623
|
|
|
625
|
-
context "and product is promotionable" do
|
|
626
|
-
let(:promotionable) { true }
|
|
627
624
|
it { is_expected.to be true }
|
|
628
625
|
end
|
|
629
|
-
|
|
630
|
-
context "and product is not promotionable" do
|
|
631
|
-
let(:promotionable) { false }
|
|
632
|
-
it { is_expected.to be false }
|
|
633
|
-
end
|
|
634
626
|
end
|
|
635
627
|
|
|
636
628
|
context "when promotable is a Spree::Order" do
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
end
|
|
629
|
+
let(:promotion) { create(:promotion, :with_order_adjustment) }
|
|
630
|
+
let(:promotable) { create :order }
|
|
640
631
|
|
|
641
|
-
|
|
632
|
+
it_behaves_like "a promotable"
|
|
633
|
+
|
|
634
|
+
context "when it contains items" do
|
|
642
635
|
let!(:line_item) { create(:line_item, order: promotable) }
|
|
643
636
|
let!(:line_item2) { create(:line_item, order: promotable) }
|
|
644
637
|
|
|
@@ -646,6 +639,7 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
646
639
|
before do
|
|
647
640
|
line_item.product.update_column(:promotionable, false)
|
|
648
641
|
end
|
|
642
|
+
|
|
649
643
|
it { is_expected.to be false }
|
|
650
644
|
end
|
|
651
645
|
|
|
@@ -654,6 +648,7 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
654
648
|
line_item.product.update_column(:promotionable, false)
|
|
655
649
|
line_item2.product.update_column(:promotionable, false)
|
|
656
650
|
end
|
|
651
|
+
|
|
657
652
|
it { is_expected.to be false }
|
|
658
653
|
end
|
|
659
654
|
|
|
@@ -662,6 +657,32 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
662
657
|
end
|
|
663
658
|
end
|
|
664
659
|
end
|
|
660
|
+
|
|
661
|
+
context "when promotable is a Spree::LineItem" do
|
|
662
|
+
let(:promotion) { create(:promotion, :with_line_item_adjustment) }
|
|
663
|
+
let(:promotable) { create(:line_item) }
|
|
664
|
+
|
|
665
|
+
it_behaves_like "a promotable"
|
|
666
|
+
|
|
667
|
+
context "and product is promotionable" do
|
|
668
|
+
before { promotable.product.promotionable = true }
|
|
669
|
+
|
|
670
|
+
it { is_expected.to be true }
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
context "and product is not promotionable" do
|
|
674
|
+
before { promotable.product.promotionable = false }
|
|
675
|
+
|
|
676
|
+
it { is_expected.to be false }
|
|
677
|
+
end
|
|
678
|
+
end
|
|
679
|
+
|
|
680
|
+
context "when promotable is a Spree::Shipment" do
|
|
681
|
+
let(:promotion) { create(:promotion, :with_free_shipping) }
|
|
682
|
+
let(:promotable) { create(:shipment) }
|
|
683
|
+
|
|
684
|
+
it_behaves_like "a promotable"
|
|
685
|
+
end
|
|
665
686
|
end
|
|
666
687
|
|
|
667
688
|
context "#eligible_rules" do
|
|
@@ -57,7 +57,7 @@ module Spree
|
|
|
57
57
|
context "multiple payment methods" do
|
|
58
58
|
let(:simulate) { true }
|
|
59
59
|
let!(:check_payment) { create(:check_payment, order: reimbursement.order, amount: 5.0, state: "completed") }
|
|
60
|
-
let(:payment) { reimbursement.order.payments.detect { |
|
|
60
|
+
let(:payment) { reimbursement.order.payments.detect { |item| item.payment_method.is_a? Spree::PaymentMethod::BogusCreditCard } }
|
|
61
61
|
let(:refund_amount) { 10.0 }
|
|
62
62
|
|
|
63
63
|
let(:refund_payment_methods) { subject.map { |refund| refund.payment.payment_method } }
|
|
@@ -18,7 +18,7 @@ module Spree
|
|
|
18
18
|
context "product has variants" do
|
|
19
19
|
it "returns all variants for the same product" do
|
|
20
20
|
product = create(:product, variants: Array.new(3) { create(:variant) })
|
|
21
|
-
product.variants.map { |
|
|
21
|
+
product.variants.map { |value| value.stock_items.first.update_column(:count_on_hand, 10) }
|
|
22
22
|
|
|
23
23
|
expect(SameProduct.eligible_variants(product.variants.first).sort).to eq product.variants.sort
|
|
24
24
|
end
|
|
@@ -5,9 +5,9 @@ require 'rails_helper'
|
|
|
5
5
|
module Spree
|
|
6
6
|
RSpec.describe ReturnsCalculator, type: :model do
|
|
7
7
|
let(:return_item) { build(:return_item) }
|
|
8
|
-
subject {
|
|
8
|
+
subject { described_class.new }
|
|
9
9
|
|
|
10
|
-
it '
|
|
10
|
+
it 'compute must be overridden' do
|
|
11
11
|
expect {
|
|
12
12
|
subject.compute(return_item)
|
|
13
13
|
}.to raise_error NotImplementedError
|
|
@@ -21,25 +21,13 @@ module Spree
|
|
|
21
21
|
)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
subject {
|
|
25
|
-
|
|
26
|
-
it 'computes with a shipment' do
|
|
27
|
-
shipment = mock_model(Spree::Shipment)
|
|
28
|
-
expect(subject).to receive(:compute_shipment).with(shipment)
|
|
29
|
-
subject.compute(shipment)
|
|
30
|
-
end
|
|
24
|
+
subject { described_class.new }
|
|
31
25
|
|
|
32
26
|
it 'computes with a package' do
|
|
33
27
|
expect(subject).to receive(:compute_package).with(package)
|
|
34
28
|
subject.compute(package)
|
|
35
29
|
end
|
|
36
30
|
|
|
37
|
-
it 'compute_shipment must be overridden' do
|
|
38
|
-
expect {
|
|
39
|
-
subject.compute_shipment(shipment)
|
|
40
|
-
}.to raise_error NameError
|
|
41
|
-
end
|
|
42
|
-
|
|
43
31
|
it 'compute_package must be overridden' do
|
|
44
32
|
expect {
|
|
45
33
|
subject.compute_package(package)
|
|
@@ -257,4 +257,36 @@ RSpec.describe Spree::ShippingMethod, type: :model do
|
|
|
257
257
|
it { should == 'back_end' }
|
|
258
258
|
end
|
|
259
259
|
end
|
|
260
|
+
|
|
261
|
+
describe '.available_to_store' do
|
|
262
|
+
let(:store) { create(:store) }
|
|
263
|
+
let(:first_shipping_method) { create(:shipping_method, stores: [store]) }
|
|
264
|
+
let(:second_shipping_method) { create(:shipping_method, stores: [store]) }
|
|
265
|
+
|
|
266
|
+
subject { [first_shipping_method, second_shipping_method] }
|
|
267
|
+
|
|
268
|
+
it 'raises an exception if no store is passed as argument' do
|
|
269
|
+
expect {
|
|
270
|
+
described_class.available_to_store(nil)
|
|
271
|
+
}.to raise_exception(ArgumentError, 'You must provide a store')
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
context 'when the store has no shipping methods associated' do
|
|
275
|
+
before { store.shipping_methods = [] }
|
|
276
|
+
|
|
277
|
+
it 'returns all shipping methods' do
|
|
278
|
+
expect(store.shipping_methods).to eq([])
|
|
279
|
+
expect(described_class.available_to_store(store)).to eq(subject)
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
context 'when the store has shipping methods associated' do
|
|
284
|
+
before { create(:shipping_method) }
|
|
285
|
+
|
|
286
|
+
it 'returns the associated records' do
|
|
287
|
+
expect(store.shipping_methods).to eq(subject)
|
|
288
|
+
expect(described_class.available_to_store(store)).to eq(subject)
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
260
292
|
end
|
|
@@ -115,8 +115,8 @@ module Spree
|
|
|
115
115
|
let(:stock_location) { order.shipments.first.stock_location }
|
|
116
116
|
|
|
117
117
|
before do
|
|
118
|
-
|
|
119
|
-
order.contents.add(variant, 1, shipment:
|
|
118
|
+
shipment_two = order.shipments.create!(stock_location: order.shipments.first.stock_location)
|
|
119
|
+
order.contents.add(variant, 1, shipment: shipment_two)
|
|
120
120
|
variant.stock_items.first.update_columns(count_on_hand: count_on_hand, backorderable: false)
|
|
121
121
|
end
|
|
122
122
|
|
|
@@ -19,11 +19,11 @@ module Spree
|
|
|
19
19
|
let(:order) { mock_model(Order, line_items: [line_item1, line_item2]) }
|
|
20
20
|
|
|
21
21
|
let(:package1) do
|
|
22
|
-
Package.new(stock_location).tap { |
|
|
22
|
+
Package.new(stock_location).tap { |package| package.add(inventory_unit1) }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
let(:package2) do
|
|
26
|
-
Package.new(stock_location).tap { |
|
|
26
|
+
Package.new(stock_location).tap { |package| package.add(inventory_unit2) }
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
let(:packages) { [package1, package2] }
|
|
@@ -8,8 +8,8 @@ module Spree
|
|
|
8
8
|
let(:shipping_rate) { 4.00 }
|
|
9
9
|
let!(:shipping_method) { create(:shipping_method, cost: shipping_rate, currency: currency) }
|
|
10
10
|
let(:package) do
|
|
11
|
-
build(:stock_package, contents: inventory_units.map { |
|
|
12
|
-
|
|
11
|
+
build(:stock_package, contents: inventory_units.map { |unit| ContentItem.new(unit) }).tap do |package|
|
|
12
|
+
package.shipment = package.to_shipment
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
let(:order) { create(:order_with_line_items, shipping_method: shipping_method) }
|
|
@@ -61,7 +61,7 @@ module Spree
|
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
context "when the order's ship address is in a different zone" do
|
|
64
|
-
before { shipping_method.zones.each{ |
|
|
64
|
+
before { shipping_method.zones.each{ |zone| zone.members.delete_all } }
|
|
65
65
|
it_should_behave_like "shipping rate doesn't match"
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -51,41 +51,41 @@ module Spree
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
it 'builds the correct list of shipping methods based on stock location and categories' do
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
contents = [ContentItem.new(build(:inventory_unit, variant:
|
|
64
|
-
ContentItem.new(build(:inventory_unit, variant:
|
|
65
|
-
ContentItem.new(build(:inventory_unit, variant:
|
|
66
|
-
ContentItem.new(build(:inventory_unit, variant:
|
|
54
|
+
category_one = create(:shipping_category)
|
|
55
|
+
category_two = create(:shipping_category)
|
|
56
|
+
method_one = create(:shipping_method, available_to_all: true)
|
|
57
|
+
method_two = create(:shipping_method, stock_locations: [stock_location])
|
|
58
|
+
method_one.shipping_categories = [category_one, category_two]
|
|
59
|
+
method_two.shipping_categories = [category_one, category_two]
|
|
60
|
+
variant_one = mock_model(Variant, shipping_category_id: category_one.id)
|
|
61
|
+
variant_two = mock_model(Variant, shipping_category_id: category_two.id)
|
|
62
|
+
variant_three = mock_model(Variant, shipping_category_id: nil)
|
|
63
|
+
contents = [ContentItem.new(build(:inventory_unit, variant: variant_one)),
|
|
64
|
+
ContentItem.new(build(:inventory_unit, variant: variant_one)),
|
|
65
|
+
ContentItem.new(build(:inventory_unit, variant: variant_two)),
|
|
66
|
+
ContentItem.new(build(:inventory_unit, variant: variant_three))]
|
|
67
67
|
|
|
68
68
|
package = Package.new(stock_location, contents)
|
|
69
|
-
expect(package.shipping_methods).to match_array([
|
|
69
|
+
expect(package.shipping_methods).to match_array([method_one, method_two])
|
|
70
70
|
end
|
|
71
71
|
# Contains regression test for https://github.com/spree/spree/issues/2804
|
|
72
72
|
it 'builds a list of shipping methods common to all categories' do
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
contents = [ContentItem.new(build(:inventory_unit, variant:
|
|
83
|
-
ContentItem.new(build(:inventory_unit, variant:
|
|
84
|
-
ContentItem.new(build(:inventory_unit, variant:
|
|
85
|
-
ContentItem.new(build(:inventory_unit, variant:
|
|
73
|
+
category_one = create(:shipping_category)
|
|
74
|
+
category_two = create(:shipping_category)
|
|
75
|
+
method_one = create(:shipping_method)
|
|
76
|
+
method_two = create(:shipping_method)
|
|
77
|
+
method_one.shipping_categories = [category_one, category_two]
|
|
78
|
+
method_two.shipping_categories = [category_one]
|
|
79
|
+
variant_one = mock_model(Variant, shipping_category_id: category_one.id)
|
|
80
|
+
variant_two = mock_model(Variant, shipping_category_id: category_two.id)
|
|
81
|
+
variant_three = mock_model(Variant, shipping_category_id: nil)
|
|
82
|
+
contents = [ContentItem.new(build(:inventory_unit, variant: variant_one)),
|
|
83
|
+
ContentItem.new(build(:inventory_unit, variant: variant_one)),
|
|
84
|
+
ContentItem.new(build(:inventory_unit, variant: variant_two)),
|
|
85
|
+
ContentItem.new(build(:inventory_unit, variant: variant_three))]
|
|
86
86
|
|
|
87
87
|
package = Package.new(stock_location, contents)
|
|
88
|
-
expect(package.shipping_methods).to match_array([
|
|
88
|
+
expect(package.shipping_methods).to match_array([method_one])
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
it 'builds an empty list of shipping methods when no categories' do
|
|
@@ -90,8 +90,8 @@ module Spree
|
|
|
90
90
|
|
|
91
91
|
expect(shipments.size).to eq 2
|
|
92
92
|
|
|
93
|
-
location_1_shipment = shipments.detect { |
|
|
94
|
-
location_2_shipment = shipments.detect { |
|
|
93
|
+
location_1_shipment = shipments.detect { |shipment| shipment.stock_location == stock_location_1 }
|
|
94
|
+
location_2_shipment = shipments.detect { |shipment| shipment.stock_location == stock_location_2 }
|
|
95
95
|
|
|
96
96
|
expect(location_1_shipment).to be_present
|
|
97
97
|
expect(location_2_shipment).to be_present
|
|
@@ -107,8 +107,8 @@ module Spree
|
|
|
107
107
|
let!(:variant) { create(:variant, track_inventory: true) }
|
|
108
108
|
|
|
109
109
|
before do
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
stock_item_one = variant.stock_items.create!(stock_location: stock_location_1, backorderable: false)
|
|
111
|
+
stock_item_one.set_count_on_hand(location_1_inventory)
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
let!(:order) { create(:order) }
|
|
@@ -119,7 +119,7 @@ module Spree
|
|
|
119
119
|
shared_examples "a fulfillable package" do
|
|
120
120
|
it "packages correctly" do
|
|
121
121
|
expect(shipments).not_to be_empty
|
|
122
|
-
inventory_units = shipments.flat_map { |
|
|
122
|
+
inventory_units = shipments.flat_map { |shipment| shipment.inventory_units }
|
|
123
123
|
expect(inventory_units.size).to eq(5)
|
|
124
124
|
expect(inventory_units.uniq.size).to eq(5)
|
|
125
125
|
end
|
|
@@ -157,8 +157,8 @@ module Spree
|
|
|
157
157
|
context 'with two stock locations' do
|
|
158
158
|
let!(:stock_location_2) { create(:stock_location, propagate_all_variants: false, active: true) }
|
|
159
159
|
before do
|
|
160
|
-
|
|
161
|
-
|
|
160
|
+
stock_item_two = variant.stock_items.create!(stock_location: stock_location_2, backorderable: false)
|
|
161
|
+
stock_item_two.set_count_on_hand(location_2_inventory)
|
|
162
162
|
end
|
|
163
163
|
|
|
164
164
|
context "with no inventory" do
|
|
@@ -214,11 +214,11 @@ module Spree
|
|
|
214
214
|
let!(:stock_location_2) { create(:stock_location, propagate_all_variants: false, active: true) }
|
|
215
215
|
let!(:stock_location_3) { create(:stock_location, propagate_all_variants: false, active: true) }
|
|
216
216
|
before do
|
|
217
|
-
|
|
218
|
-
|
|
217
|
+
stock_item_two = variant.stock_items.create!(stock_location: stock_location_2, backorderable: false)
|
|
218
|
+
stock_item_two.set_count_on_hand(location_2_inventory)
|
|
219
219
|
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
stock_item_three = variant.stock_items.create!(stock_location: stock_location_3, backorderable: false)
|
|
221
|
+
stock_item_three.set_count_on_hand(location_3_inventory)
|
|
222
222
|
end
|
|
223
223
|
|
|
224
224
|
# Regression test for https://github.com/solidusio/solidus/issues/2122
|