Exemple #1
0
    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
Exemple #2
0
 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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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)
Exemple #7
0
    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)
Exemple #8
0
    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)
Exemple #9
0
    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"),
]