class Test_WhenRemovingAProductThatDoesNotExists(BasketTest): def given_a_basket(self) -> None: self.exn: Union[Exception, None] = None self.basket = Basket([ events.BasketCreated(self.BASKET_ID), events.ItemAdded(BasketTest.BASKET_ID, "apple", 1), ]) def because_we_remove_an_unknown_item(self) -> None: try: self.basket.remove("sausages") except Exception as e: self.exn = e def test_it_should_not_empty_the_items(self) -> None: self.given_a_basket() self.because_we_remove_an_unknown_item() assert not self.basket.is_empty() def test_it_should_raise_a_key_error(self) -> None: self.given_a_basket() self.because_we_remove_an_unknown_item() assert isinstance(self.exn, KeyError) def test_it_should_not_raise_any_events(self) -> None: self.given_a_basket() self.because_we_remove_an_unknown_item() assert self.raised_no_events()
class When_adding_an_item_with_quantity: def given_an_empty_basket(self): self.basket = Basket() def because_we_add_an_apple(self): self.basket.add_item("apple", qty=3) def it_should_add_one_apple(self): assert self.basket['apple'] == 3
class When_adding_a_new_item: def given_an_empty_basket(self): self.basket = Basket() def because_we_add_an_apple(self): self.basket.add_item("apple") def it_should_add_one_apple(self): assert self.basket['apple'] == 1
class When_removing_a_product: def given_a_basket(self): self.basket = Basket() self.basket.add_item("apple", 2) def because_we_remove_an_item(self): self.basket.remove("apple") def it_should_empty_the_items(self): assert self.basket.is_empty()
class When_adding_more_to_an_existing_product: def given_a_basket(self): self.basket = Basket() self.basket.add_item("apple", 2) def because_we_add_an_apple(self): self.basket.add_item("apple", qty=3) def it_should_add_to_the_quantity(self): assert self.basket['apple'] == 5
class When_removing_a_product_that_doesnt_exist: def given_a_basket(self): self.basket = Basket() self.basket.add_item("apple") def because_we_remove_an_item(self): try: self.basket.remove("sausages") except Exception as e: self.exn = e def it_should_not_empty_the_items(self): assert not self.basket.is_empty() def it_should_raise_a_key_error(self): assert isinstance(self.exn, KeyError)
class Test_WhenRemovingAProduct(BasketTest): def given_a_basket(self) -> None: self.basket = Basket([ events.BasketCreated(self.BASKET_ID), events.ItemAdded(BasketTest.BASKET_ID, "apple", 2), ]) def because_we_remove_an_item(self) -> None: self.basket.remove("apple") def test_it_should_empty_the_items(self) -> None: self.given_a_basket() self.because_we_remove_an_item() assert self.basket.is_empty() def test_it_should_raise_item_removed(self) -> None: self.given_a_basket() self.because_we_remove_an_item() assert self.has_event(events.ItemRemoved) assert self.event.basket_id == self.BASKET_ID assert self.event.product == "apple" # type: ignore
class Test_WhenAddingANewItem(BasketTest): def given_an_empty_basket(self) -> None: self.basket = Basket([events.BasketCreated(BasketTest.BASKET_ID)]) def add_coffe_to_basket(self) -> None: self.basket.add_item("coffee", qty=3) def test_it_should_contain_the_product(self) -> None: self.given_an_empty_basket() self.add_coffe_to_basket() assert self.basket.get_item("coffee") == 3, "Should contain 3 coffees" def test_it_should_raise_item_added(self) -> None: self.given_an_empty_basket() self.add_coffe_to_basket() assert isinstance(self.event, events.ItemAdded) assert self.event.basket_id == self.BASKET_ID assert self.event.product == "coffee" assert self.event.qty == 3 def test_it_should_not_be_empty(self) -> None: self.given_an_empty_basket() self.add_coffe_to_basket() assert not self.basket.is_empty()
class BasketTest: BASKET_ID = uuid.uuid4() basket = Basket() @property def event(self) -> events.Event: assert len(self.basket.new_events) == 1, "Should have one new event" return self.basket.new_events[0] def has_event(self, cls: Type) -> bool: return isinstance(self.event, cls) def raised_no_events(self) -> bool: return not any(self.basket.new_events) @staticmethod def create_basket() -> Basket: return Basket.create(BasketTest.BASKET_ID)
def given_a_basket(self): self.basket = Basket() self.basket.add_item("apple")
def given_an_empty_basket(self): self.basket = Basket()
def given_a_basket(self) -> None: self.exn: Union[Exception, None] = None self.basket = Basket([ events.BasketCreated(self.BASKET_ID), events.ItemAdded(BasketTest.BASKET_ID, "apple", 1), ])
def given_a_basket(self) -> None: self.basket = Basket([ events.BasketCreated(self.BASKET_ID), events.ItemAdded(BasketTest.BASKET_ID, "apple", 2), ])
def given_an_empty_basket(self) -> None: self.basket = Basket([events.BasketCreated(BasketTest.BASKET_ID)])
class When_creating_a_new_basket: def because_we_create_a_basket(self): self.basket = Basket() def it_should_not_contain_any_products(self): assert self.basket.is_empty()
def because_we_create_a_basket(self): self.basket = Basket()
def create_basket() -> Basket: return Basket.create(BasketTest.BASKET_ID)