Exemple #1
0
def test_prefers_current_stock_batches_to_shipments():
    in_stock_batch = Batch("in-stock-batch", "RETRO-CLOCK", 100, eta=None)
    shipment_batch = Batch("shipment-batch", "RETRO-CLOCK", 100, eta=tomorrow)
    line = OrderLine("oref", "RETRO-CLOCK", 10)

    prod = Product(line.sku, [in_stock_batch, shipment_batch])
    prod.allocate(line)

    assert in_stock_batch.available_quantity == 90
    assert shipment_batch.available_quantity == 100
Exemple #2
0
def test_prefers_earlier_batches():
    earliest = Batch("speedy-batch", "MINIMALIST-SPOON", 100, eta=today)
    medium = Batch("normal-batch", "MINIMALIST-SPOON", 100, eta=tomorrow)
    latest = Batch("slow-batch", "MINIMALIST-SPOON", 100, eta=later)
    line = OrderLine("order1", "MINIMALIST-SPOON", 10)

    prod = Product(line.sku, [medium, earliest, latest])
    prod.allocate(line)

    assert earliest.available_quantity == 90
    assert medium.available_quantity == 100
    assert latest.available_quantity == 100
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
def test_returns_allocated_batch_ref():
    in_stock_batch = Batch("in-stock-batch-ref",
                           "HIGHBROW-POSTER",
                           100,
                           eta=None)
    shipment_batch = Batch("shipment-batch-ref",
                           "HIGHBROW-POSTER",
                           100,
                           eta=tomorrow)
    line = OrderLine("oref", "HIGHBROW-POSTER", 10)

    prod = Product(line.sku, [in_stock_batch, shipment_batch])
    allocation = prod.allocate(line)
    assert allocation == in_stock_batch.reference
def test_increments_version_number():
    line = OrderLine('oref', "SCANDI-PEN", 10)
    product = Product(sku="SCANDI-PEN",
                      batches=[Batch('b1', "SCANDI-PEN", 100, eta=None)])
    product.version_number = 7
    product.allocate(line)
    assert product.version_number == 8
def test_records_out_of_stock_event_if_cannot_allocate():
    batch = Batch('batch1', 'SMALL-FORK', 10, eta=today)
    product = Product(sku="SMALL-FORK", batches=[batch])
    product.allocate(OrderLine('order1', 'SMALL-FORK', 10))

    allocation = product.allocate(OrderLine('order2', 'SMALL-FORK', 1))
    assert product.events[-1] == events.OutOfStock(sku="SMALL-FORK")
    assert allocation is None
Exemple #8
0
def test_raises_out_of_stock_exception_if_cannot_allocate():
    batch = Batch('batch1', 'SMALL-FORK', 10, eta=today)
    line = OrderLine('order1', 'SMALL-FORK', 10)

    prod = Product(line.sku, [batch])
    prod.allocate(line)

    with pytest.raises(OutOfStock, match='SMALL-FORK'):
        prod.allocate(OrderLine('order2', 'SMALL-FORK', 1))
Exemple #9
0
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 test_outputs_allocated_event():
    batch = Batch("batchref", "RETRO-LAMPSHADE", 100, eta=None)
    line = OrderLine("oref", "RETRO-LAMPSHADE", 10)
    product = Product(sku="RETRO-LAMPSHADE", batches=[batch])
    product.allocate(line)
    expected = events.Allocated(orderid="oref",
                                sku="RETRO-LAMPSHADE",
                                qty=10,
                                batchref=batch.reference)
    assert product.events[-1] == expected
Exemple #11
0
def test_cannot_allocate_if_skus_do_not_match():
    batch = Batch("batch-001", "UNCOMFORTABLE-CHAIR", 100, eta=None)
    different_sku_line = OrderLine("order-123", "EXPENSIVE-TOASTER", 10)
    assert batch.can_allocate(different_sku_line) is False
Exemple #12
0
def make_batch_and_line(sku, batch_qty, line_qty):
    return (
        Batch("batch-001", sku, batch_qty, eta=date.today()),
        OrderLine("order-123", sku, line_qty)
    )
Exemple #13
0
def test_cannot_allocate_if_skus_do_not_match():
    batch = Batch('batch-001', 'NOT-ELEGANT-CHAIR', 100, eta=None)
    different_sku_line = OrderLine('order-123', 'TOSTER', 10)

    assert batch.can_allocate(different_sku_line) is False
Exemple #14
0
 def _make_batch_and_line(sku, batch_qty, line_qty):
     return (Batch('batch-001', sku, batch_qty,
                   eta=date.today()), OrderLine('order-123', sku, line_qty))
Exemple #15
0
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])