def test_prefers_current_stock_batches_to_shipments(days_after_today): in_stock = Batch('in-stock-batch', 'RETRO-CLOCK', 100, eta=None) shipment_batch = Batch('shipment-batch', 'RETRO-CLOCK', 100, eta=days_after_today(1)) line = OrderLine('oref', 'RETRO-CLOCK', 10) allocate(line, [in_stock, shipment_batch]) assert in_stock.available_quantity == 90 assert shipment_batch.available_quantity == 100
def test_prefers_earlier_batches(days_after_today): earliest = Batch('speedy-batch', 'MINIMALIST-SPOON', 100, eta=date.today()) medium = Batch('medium-batch', 'MINIMALIST-SPOON', 100, eta=days_after_today(1)) latest = Batch('latest-batch', 'MINIMALIST-SPOON', 100, eta=days_after_today(2)) line = OrderLine('order1', 'MINIMALIST-SPOON', 10) allocate(line, [medium, earliest, latest]) assert earliest.available_quantity == 90 assert medium.available_quantity == 100 assert latest.available_quantity == 100
def allocate(orderid: str, sku: str, qty: int, uow: unit_of_work.AbstractUnitOfWork) -> \ str: line = OrderLine(orderid, sku, qty) with uow: batches = uow.batches.list() if not is_valid_sku(line.sku, batches): raise InvalidSku(f'Invalid sku {line.sku}') batchref = model.allocate(line, batches) uow.commit() return batchref
def reallocate(orderid: str, sku: str, qty: int, uow: unit_of_work.AbstractUnitOfWork) \ -> str: line = OrderLine(orderid, sku, qty) with uow: batch = uow.batches.get(sku=line.sku) if batch is None: raise InvalidSku(f'Invalid sku {line.sku}') batch.deallocate(line) batches = uow.batches.list() batchref = model.allocate(line, batches) uow.commit() return batchref
def test_returns_allocated_batch_ref(days_after_today): in_stock_batch = Batch('in-stock-batch-ref', 'HIGHBROW-POSTER', 100, eta=None) shipment_batch = Batch('shipment-batch-ref', 'HIGHBROW-POSTER', 100, eta=days_after_today(1)) line = OrderLine('oref', 'HIGHBROW-POSTER', 10) allocation = allocate(line, [in_stock_batch, shipment_batch]) assert allocation == in_stock_batch.reference
def test_raises_out_of_stock_exception_if_cannot_allocate(): batch = Batch('batch1', 'SMALL-FORK', 10, eta=date.today()) allocate(OrderLine('order1', 'SMALL-FORK', 10), [batch]) with pytest.raises(OutOfStock, match='SMALL-FORK'): allocate(OrderLine('order2', 'SMALL-FORK', 1), [batch])