Test stock logic on variant level

VariantOverrides are bolted onto variants to change their logic.
This commit is contained in:
Maikel Linke
2024-07-12 15:17:35 +10:00
parent 90fdf59415
commit 675b7febdf

View File

@@ -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