mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
162 lines
5.4 KiB
Ruby
162 lines
5.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe BackorderUpdater do
|
|
let(:order) { create(:completed_order_with_totals) }
|
|
let(:order_cycle) { order.order_cycle }
|
|
let(:distributor) { order.distributor }
|
|
let(:beans) { beans_item.variant }
|
|
let(:beans_item) { order.line_items[0] }
|
|
let(:chia_seed) { chia_item.variant }
|
|
let(:chia_item) { order.line_items[1] }
|
|
let(:user) { order.distributor.owner }
|
|
let(:catalog_json) { file_fixture("fdc-catalog.json").read }
|
|
let(:catalog_url) {
|
|
"https://env-0105831.jcloud-ver-jpe.ik-server.com/api/dfc/Enterprises/test-hodmedod/SuppliedProducts"
|
|
}
|
|
let(:product_link) {
|
|
"https://env-0105831.jcloud-ver-jpe.ik-server.com/api/dfc/Enterprises/test-hodmedod/SuppliedProducts/44519466467635"
|
|
}
|
|
let(:chia_seed_wholesale_link) {
|
|
"https://env-0105831.jcloud-ver-jpe.ik-server.com/api/dfc/Enterprises/test-hodmedod/SuppliedProducts/44519468433715"
|
|
}
|
|
|
|
before do
|
|
# This ensures that callbacks adjust stock correctly.
|
|
# See: https://github.com/openfoodfoundation/openfoodnetwork/pull/12938
|
|
order.reload
|
|
|
|
user.oidc_account = build(:testdfc_account)
|
|
|
|
beans.semantic_links << SemanticLink.new(
|
|
semantic_id: product_link
|
|
)
|
|
chia_seed.semantic_links << SemanticLink.new(
|
|
semantic_id: chia_seed_wholesale_link
|
|
)
|
|
order.order_cycle = create(
|
|
:simple_order_cycle,
|
|
distributors: [distributor],
|
|
variants: order.variants,
|
|
)
|
|
order.save!
|
|
|
|
beans.on_demand = true
|
|
beans_item.update!(quantity: 6)
|
|
beans.on_hand = -3
|
|
|
|
chia_item.update!(quantity: 5)
|
|
chia_seed.on_demand = false
|
|
chia_seed.on_hand = 7
|
|
end
|
|
|
|
describe "#amend_backorder" do
|
|
it "updates an order" do
|
|
stub_request(:get, catalog_url).to_return(body: catalog_json)
|
|
|
|
# Record the placed backorder:
|
|
backorder = nil
|
|
allow_any_instance_of(FdcBackorderer).to receive(:find_order) do |*_args|
|
|
backorder
|
|
end
|
|
allow_any_instance_of(FdcBackorderer).to receive(:find_open_order) do |*_args|
|
|
backorder
|
|
end
|
|
allow_any_instance_of(FdcBackorderer).to receive(:send_order) do |*args|
|
|
backorder = args[1]
|
|
end
|
|
|
|
BackorderJob.new.place_backorder(order)
|
|
|
|
# We ordered a case of 12 cans: -3 + 12 = 9
|
|
expect(beans.on_hand).to eq 9
|
|
|
|
# Stock controlled items don't change stock in backorder:
|
|
expect(chia_seed.on_hand).to eq 7
|
|
|
|
expect(backorder.lines[0].quantity).to eq 1 # beans
|
|
expect(backorder.lines[1].quantity).to eq 5 # chia
|
|
|
|
# Without any change, the backorder shouldn't get changed either:
|
|
subject.amend_backorder(order)
|
|
|
|
# Same as before:
|
|
expect(beans.on_hand).to eq 9
|
|
expect(chia_seed.on_hand).to eq 7
|
|
expect(backorder.lines[0].quantity).to eq 1 # beans
|
|
expect(backorder.lines[1].quantity).to eq 5 # chia
|
|
|
|
# We increase quantities which should be reflected in the backorder:
|
|
beans.on_hand = -1
|
|
chia_item.quantity += 3
|
|
chia_item.save!
|
|
|
|
expect { subject.amend_backorder(order) }
|
|
.to change { beans.on_hand }.from(-1).to(11)
|
|
.and change { backorder.lines[0].quantity }.from(1).to(2)
|
|
.and change { backorder.lines[1].quantity }.from(5).to(8)
|
|
|
|
# We cancel the only order.
|
|
expect { order.cancel! }
|
|
.to change { beans.reload.on_hand }.from(11).to(17)
|
|
.and change { chia_seed.reload.on_hand }.from(4).to(12)
|
|
|
|
# But we decreased the stock of beans outside of orders above.
|
|
# So only the chia seeds are cancelled. The beans still need replenishing.
|
|
expect { subject.amend_backorder(order) }
|
|
.to change { backorder.lines.count }.from(2).to(1)
|
|
.and change { beans.reload.on_hand }.by(-12)
|
|
end
|
|
|
|
it "skips updating if there's is no backorder" do
|
|
allow_any_instance_of(FdcBackorderer).to receive(:find_open_order)
|
|
.and_return(nil)
|
|
|
|
expect { subject.amend_backorder(order) }.not_to raise_error
|
|
end
|
|
end
|
|
|
|
describe "#update_order_lines" do
|
|
it "skips unavailable items" do
|
|
stub_request(:get, catalog_url).to_return(body: catalog_json)
|
|
|
|
# Record the placed backorder:
|
|
backorder = nil
|
|
allow_any_instance_of(FdcBackorderer).to receive(:find_order) do |*_args|
|
|
backorder
|
|
end
|
|
allow_any_instance_of(FdcBackorderer).to receive(:send_order) do |*args|
|
|
backorder = args[1]
|
|
end
|
|
|
|
BackorderJob.new.place_backorder(order)
|
|
|
|
# Now one of the products becomes unavailable in the catalog.
|
|
# I simulate that by changing the link so something unknown.
|
|
beans.semantic_links[0].update!(semantic_id: "https://example.net/unknown")
|
|
|
|
variants = [beans, chia_seed]
|
|
reference_link = chia_seed.semantic_links[0].semantic_id
|
|
urls = FdcUrlBuilder.new(reference_link)
|
|
catalog = DfcCatalog.load(user, urls.catalog_url)
|
|
orderer = FdcBackorderer.new(user, urls)
|
|
broker = FdcOfferBroker.new(catalog)
|
|
updated_lines = subject.update_order_lines(
|
|
backorder, order_cycle, variants, broker, orderer
|
|
)
|
|
|
|
expect(updated_lines.count).to eq 1
|
|
expect(updated_lines[0].offer.offeredItem.semanticId)
|
|
.to eq chia_seed.semantic_links[0].semantic_id
|
|
end
|
|
end
|
|
|
|
describe "#distributed_linked_variants" do
|
|
it "selects available variants with semantic links" do
|
|
variants = subject.distributed_linked_variants(order_cycle, distributor)
|
|
expect(variants).to match_array [beans, chia_seed]
|
|
end
|
|
end
|
|
end
|