From 675b7febdf16cfffb00a0579f34494c7eb2bd785 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Fri, 12 Jul 2024 15:17:35 +1000 Subject: [PATCH] Test stock logic on variant level VariantOverrides are bolted onto variants to change their logic. --- spec/models/spree/variant_stock_spec.rb | 89 +++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 spec/models/spree/variant_stock_spec.rb diff --git a/spec/models/spree/variant_stock_spec.rb b/spec/models/spree/variant_stock_spec.rb new file mode 100644 index 0000000000..137d130402 --- /dev/null +++ b/spec/models/spree/variant_stock_spec.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: false + +require 'spec_helper' + +RSpec.describe Spree::Variant do + # This method is defined in app/models/concerns/variant_stock.rb. + # There is a separate spec for that concern but here I want to test + # the interplay of Spree::Variant and VariantOverride. + # + # A variant can be scoped to a hub which means that all stock methods + # like this one get overridden. Future calls to `variant.move` are then + # handled by the ScopeVariantToHub module which may call the + # VariantOverride. + describe "#move" do + subject(:variant) { create(:variant, on_hand: 5) } + + it "changes stock" do + expect { variant.move(-2) }.to change { variant.on_hand }.from(5).to(3) + end + + it "ignores stock when on demand" do + variant.on_demand = true + + expect { variant.move(-2) }.not_to change { variant.on_hand } + end + + it "rejects negative stock" do + expect { variant.move(-7) }.to raise_error( + ActiveRecord::RecordInvalid, + "Validation failed: Count on hand must be greater than or equal to 0" + ) + end + + describe "with VariantOverride" do + subject(:hub_variant) { + Spree::Variant.find(variant.id).tap { |v| scoper.scope(v) } + } + let(:override) { + VariantOverride.create!( + variant:, + hub: create(:distributor_enterprise), + count_on_hand: 7, + on_demand: false, + ) + } + let(:scoper) { OpenFoodNetwork::ScopeVariantToHub.new(override.hub) } + + it "changes stock only on the variant override" do + expect { + hub_variant.move(-3) + override.reload + } + .to change { override.count_on_hand }.from(7).to(4) + .and change { hub_variant.on_hand }.from(7).to(4) + .and change { variant.on_hand }.by(0) + end + + it "ignores stock when on demand" do + override.update!(on_demand: true, count_on_hand: nil) + + expect { + hub_variant.move(-3) + override.reload + } + .not_to change { + [ + override.count_on_hand, + hub_variant.on_hand, + variant.on_hand, + ] + } + end + + it "doesn't prevent negative stock" do + # VariantOverride relies on other stock checks during checkout. :-( + expect { + hub_variant.move(-8) + override.reload + } + .to change { override.count_on_hand }.from(7).to(-1) + .and change { hub_variant.on_hand }.from(7).to(-1) + .and change { variant.on_hand }.by(0) + + # The update didn't run validations and now it's invalid: + expect(override).not_to be_valid + end + end + end +end