mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-26 20:56:48 +00:00
One spec was only passing due to a bug. The setup wasn't complete and despite the variant being unavailable in the order cycle it was reported as being available. The order cycle has now been set up correctly. Another spec was added to cover an edge case lead to a bug before this pull request. When all subscription items where unavailable, all were marked as available.
121 lines
4.3 KiB
Ruby
121 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
describe CapQuantity do
|
|
describe "checking that line items are available to purchase" do
|
|
let(:order_cycle) { create(:simple_order_cycle) }
|
|
let(:shop) { order_cycle.coordinator }
|
|
let(:order) { create(:order, order_cycle: order_cycle, distributor: shop) }
|
|
let(:ex) {
|
|
create(:exchange, order_cycle: order_cycle, sender: shop, receiver: shop, incoming: false)
|
|
}
|
|
let(:variant1) { create(:variant, on_hand: 5) }
|
|
let(:variant2) { create(:variant, on_hand: 5) }
|
|
let(:variant3) { create(:variant, on_hand: 5) }
|
|
|
|
let(:line_item1) { create(:line_item, variant: variant1, quantity: 3) }
|
|
let(:line_item2) { create(:line_item, variant: variant2, quantity: 3) }
|
|
let(:line_item3) { create(:line_item, variant: variant3, quantity: 3) }
|
|
|
|
before do
|
|
order.line_items << line_item1
|
|
order.line_items << line_item2
|
|
order.line_items << line_item3
|
|
end
|
|
|
|
context "when all items are available from the order cycle" do
|
|
before { [variant1, variant2, variant3].each { |v| ex.variants << v } }
|
|
|
|
context "and insufficient stock exists to fulfil the order for some items" do
|
|
before do
|
|
variant1.update_attribute(:on_hand, 5)
|
|
variant2.update_attribute(:on_hand, 2)
|
|
variant3.update_attribute(:on_hand, 0)
|
|
end
|
|
|
|
it "caps quantity at the stock level for stock-limited items, and reports the change" do
|
|
changes = CapQuantity.new.call(order)
|
|
|
|
expect(line_item1.reload.quantity).to be 3 # not capped
|
|
expect(line_item2.reload.quantity).to be 2 # capped
|
|
expect(line_item3.reload.quantity).to be 0 # capped
|
|
expect(changes[line_item1.id]).to be nil
|
|
expect(changes[line_item2.id]).to be 3
|
|
expect(changes[line_item3.id]).to be 3
|
|
end
|
|
end
|
|
end
|
|
|
|
context "and some items are not available from the order cycle" do
|
|
before { [variant2, variant3].each { |v| ex.variants << v } }
|
|
|
|
context "and insufficient stock exists to fulfil the order for some items" do
|
|
before do
|
|
variant1.update_attribute(:on_hand, 5)
|
|
variant2.update_attribute(:on_hand, 2)
|
|
variant3.update_attribute(:on_hand, 0)
|
|
end
|
|
|
|
it "sets quantity to 0 for unavailable items, and reports the change" do
|
|
changes = CapQuantity.new.call(order)
|
|
|
|
expect(line_item1.reload.quantity).to be 0 # unavailable
|
|
expect(line_item2.reload.quantity).to be 2 # capped
|
|
expect(line_item3.reload.quantity).to be 0 # capped
|
|
expect(changes[line_item1.id]).to be 3
|
|
expect(changes[line_item2.id]).to be 3
|
|
expect(changes[line_item3.id]).to be 3
|
|
end
|
|
|
|
context "and the order has been placed" do
|
|
before do
|
|
allow(order).to receive(:ensure_available_shipping_rates) { true }
|
|
allow(order).to receive(:process_each_payment) { true }
|
|
|
|
order.create_proposed_shipments
|
|
end
|
|
|
|
it "removes the unavailable items from the shipment" do
|
|
expect { CapQuantity.new.call(order) }
|
|
.to change { order.reload.shipment.manifest.size }.from(2).to(1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when no items are available" do
|
|
it "sets quantity to 0 for unavailable items, and reports the change" do
|
|
changes = {}
|
|
|
|
expect {
|
|
changes = CapQuantity.new.call(order)
|
|
[line_item1, line_item2, line_item3].each(&:reload)
|
|
}.to change { line_item1.quantity }.to(0)
|
|
.and change { line_item2.quantity }.to(0)
|
|
.and change { line_item3.quantity }.to(0)
|
|
|
|
expect(changes[line_item1.id]).to eq 3
|
|
expect(changes[line_item2.id]).to eq 3
|
|
expect(changes[line_item3.id]).to eq 3
|
|
end
|
|
|
|
context "and the order has been placed" do
|
|
before do
|
|
allow(order).to receive(:ensure_available_shipping_rates) { true }
|
|
allow(order).to receive(:process_each_payment) { true }
|
|
|
|
order.create_proposed_shipments
|
|
end
|
|
|
|
it "removes the unavailable items from the shipment" do
|
|
expect {
|
|
CapQuantity.new.call(order)
|
|
order.reload
|
|
}.to change { order.shipment }.to(nil)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|