def calculate_discount(self, basket: List[ShopItem]) -> Tuple[str, int]: """ Custom offer, this offer is: For every 2x soup in the basket, the shopper gets 50% off a loaf of bread """ soup_quantity = self.count_item_in_basket(basket, Soup) bread_discount_max_quantity = int(soup_quantity / 2).__floor__() bread_quantity = self.count_item_in_basket(basket, Bread) # Get the number of bread we could apply discount on discount_quantity = min(bread_quantity, bread_discount_max_quantity) logger.debug( f"Applying discount {self.name} to {discount_quantity} items") bread_offer = PercentageOffer("Bread Offer if you buy Soup", Bread, 50, discount_quantity) _, discount = bread_offer.calculate_discount(basket) logger.debug( f"Offer {self.name}, total discount is {discount} on {discount_quantity} items" ) message = ( f"Soup, Buy 2 and get 50% off a loaf of Bread: -{format_currency(discount)}" if discount > 0 else None) return message, discount
def test_apply_no_quantity_of_discount(self): basket = [Apples(), Apples(), Apples(), Apples(), Bread(), Soup()] percentage = 25 number_on_offer = 0 offer = PercentageOffer("Apple discount", Apples, percentage, number_on_offer) text, discount = offer.calculate_discount(basket) self.assertEqual(0, discount) self.assertEqual(None, text)
def test_apply_no_items(self): basket = [] percentage = 10 offer = PercentageOffer("Apple discount", Apples, percentage) text, discount = offer.calculate_discount(basket) discount_per_apple = int(Apples().pence_price / percentage).__ceil__() self.assertEqual(basket.count(Apples()) * discount_per_apple, discount) self.assertEqual(None, text)
def test_apply_single_apple(self): percentage = 10 offer = PercentageOffer("Apple discount", Apples, percentage) basket = [Apples()] text, discount = offer.calculate_discount(basket) discount_per_apple = int(Apples().pence_price / percentage).__floor__() self.assertEqual(discount_per_apple, discount) self.assertEqual("Apples 10% off: -10p", text)
def test_apply_no_apples_other_items(self): basket = [Bread(), Soup()] percentage = 25 offer = PercentageOffer("Apple discount", Apples, percentage) text, discount = offer.calculate_discount(basket) discount_per_apple = self.discount_each(Apples().pence_price, percentage) self.assertEqual(basket.count(Apples) * discount_per_apple, discount) self.assertEqual(None, text)
def test_apply_more_items_in_basket_than_discount(self): basket = [Apples(), Apples(), Apples(), Apples(), Bread(), Soup()] percentage = 25 number_on_offer = 2 offer = PercentageOffer("Apple discount", Apples, percentage, number_on_offer) text, discount = offer.calculate_discount(basket) discount_per_apple = int(Apples().pence_price * (percentage / 100)).__floor__() self.assertEqual(discount_per_apple * number_on_offer, discount) self.assertEqual(f"Apples {percentage}% off: -50p", text)
def test_apply_apples_and_other_items(self): basket = [Apples(), Apples(), Apples(), Apples(), Bread(), Soup()] percentage = 25 offer = PercentageOffer("Apple discount", Apples, percentage) text, discount = offer.calculate_discount(basket) discount_per_apple = int(Apples().pence_price * (percentage / 100)).__floor__() self.assertEqual( self.count_items_of_type(basket, Apples) * discount_per_apple, discount) self.assertEqual(f"Apples {percentage}% off: -£1.00", text)
def test_apply_many_apples(self): basket = [Apples(), Apples(), Apples(), Apples()] percentage = 10.11 offer = PercentageOffer("Apple discount", Apples, percentage) text, discount = offer.calculate_discount(basket) discount_per_apple = self.discount_each(Apples().pence_price, percentage) self.assertEqual( self.count_items_of_type(basket, Apples) * discount_per_apple, discount) self.assertEqual("Apples 10.11% off: -40p", text)
def setUp(self) -> None: self.products = { "apples": Apples, "bread": Bread, "soup": Soup, "milk": Milk } self.offers = [ PercentageOffer("Apples, 10% off", Apples, 10), SoupOffer("Buy 2 soup and get 50% off a loaf of bread"), ]
from goods.apples import Apples from offers.percentage_offer import PercentageOffer from offers.soup_offer import SoupOffer # This week's offers offers = [ PercentageOffer("Apples, 10% off", Apples, 10), SoupOffer("Buy 2 soup and get 50% off a loaf of bread"), ]