mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
Test stock logic on variant level
VariantOverrides are bolted onto variants to change their logic.
This commit is contained in:
89
spec/models/spree/variant_stock_spec.rb
Normal file
89
spec/models/spree/variant_stock_spec.rb
Normal 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
|
||||
Reference in New Issue
Block a user