Skip to content

Commit 4189146

Browse files
committed
first cut of out of stock event [domain_event]
1 parent e6f13ef commit 4189146

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

src/allocation/domain/events.py

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

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):
@@ -13,6 +14,7 @@ def __init__(self, sku: str, batches: List[Batch], version_number: int = 0):
1314
self.sku = sku
1415
self.batches = batches
1516
self.version_number = version_number
17+
self.events = [] # type: List[events.Event]
1618

1719
def allocate(self, line: OrderLine) -> str:
1820
try:
@@ -21,7 +23,9 @@ def allocate(self, line: OrderLine) -> str:
2123
self.version_number += 1
2224
return batch.reference
2325
except StopIteration:
24-
raise OutOfStock(f"Out of stock for sku {line.sku}")
26+
self.events.append(events.OutOfStock(line.sku))
27+
# raise OutOfStock(f"Out of stock for sku {line.sku}")
28+
return None
2529

2630

2731
@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()
@@ -51,6 +53,16 @@ def test_raises_out_of_stock_exception_if_cannot_allocate():
5153
product.allocate(OrderLine("order2", "SMALL-FORK", 1))
5254

5355

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

0 commit comments

Comments
 (0)