Skip to content

Commit b111bb0

Browse files
committed
first cut of out of stock event [domain_event]
1 parent 132920b commit b111bb0

3 files changed

Lines changed: 26 additions & 1 deletion

File tree

src/allocation/domain/events.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from dataclasses import dataclass
2+
3+
class Event:
4+
pass
5+
6+
@dataclass
7+
class OutOfStock(Event):
8+
sku: str
9+

src/allocation/domain/model.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from dataclasses import dataclass
33
from datetime import date
44
from typing import Optional, List, Set
5+
from . import events
56

67

78
class OutOfStock(Exception):
@@ -14,6 +15,7 @@ def __init__(self, sku: str, batches: List[Batch], version_number: int = 0):
1415
self.sku = sku
1516
self.batches = batches
1617
self.version_number = version_number
18+
self.events = [] # type: List[events.Event]
1719

1820
def allocate(self, line: OrderLine) -> str:
1921
try:
@@ -24,7 +26,9 @@ def allocate(self, line: OrderLine) -> str:
2426
self.version_number += 1
2527
return batch.reference
2628
except StopIteration:
27-
raise OutOfStock(f'Out of stock for sku {line.sku}')
29+
self.events.append(events.OutOfStock(line.sku))
30+
# raise OutOfStock(f'Out of stock for sku {line.sku}')
31+
return None
2832

2933

3034
@dataclass(unsafe_hash=True)

tests/unit/test_product.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from datetime import date, timedelta
22
import pytest
3+
4+
from allocation.domain import events
35
from allocation.domain.model import Product, OrderLine, Batch, OutOfStock
46

57
today = date.today()
@@ -50,6 +52,16 @@ def test_raises_out_of_stock_exception_if_cannot_allocate():
5052
product.allocate(OrderLine('order2', 'SMALL-FORK', 1))
5153

5254

55+
def test_records_out_of_stock_event_if_cannot_allocate():
56+
sku1_batch = Batch('batch1', 'sku1', 100, eta=today)
57+
sku2_line = OrderLine('oref', 'sku2', 10)
58+
product = Product(sku='sku1', batches=[sku1_batch])
59+
60+
with pytest.raises(OutOfStock):
61+
product.allocate(sku2_line)
62+
assert product.events[-1] == events.OutOfStock(sku='sku2')
63+
64+
5365
def test_increments_version_number():
5466
line = OrderLine('oref', "SCANDI-PEN", 10)
5567
product = Product(sku="SCANDI-PEN", batches=[Batch('b1', "SCANDI-PEN", 100, eta=None)])

0 commit comments

Comments
 (0)