Beispiel #1
0
def test_ten_percent_discount():
    catalog = FakeCatalog()
    toothbrush = Product("toothbrush", ProductUnit.EACH)
    catalog.add_product(toothbrush, 0.99)

    apples = Product("apples", ProductUnit.KILO)
    catalog.add_product(apples, 1.99)

    teller = Teller(catalog)
    teller.add_special_offer(SpecialOfferType.TEN_PERCENT_DISCOUNT, toothbrush,
                             10.0)

    cart = ShoppingCart()
    cart.add_item_quantity(apples, 2.5)

    receipt = teller.checks_out_articles_from(cart)

    assert 4.975 == pytest.approx(receipt.total_price(), 0.01)
    assert [] == receipt.discounts
    assert 1 == len(receipt.items)
    receipt_item = receipt.items[0]
    assert apples == receipt_item.product
    assert 1.99 == receipt_item.price
    assert 2.5 * 1.99 == pytest.approx(receipt_item.total_price, 0.01)
    assert 2.5 == receipt_item.quantity
    def test_shopping_cart_handle_offers_ten_percent_discount(self):
        catalog = FakeCatalog()
        toothbrush = Product("toothbrush", ProductUnit.EACH)
        apples = Product("apples", ProductUnit.KILO)
        catalog.add_product(toothbrush, 0.99)
        catalog.add_product(apples, 1.99)

        # teller special offers 10% discount on toothbrush
        teller = Teller(catalog)
        teller.add_special_offer(SpecialOfferType.TEN_PERCENT_DISCOUNT,
                                 toothbrush, 10.0)
        #offers = teller.offers
        #discount = Discount(product, "2 for " + str(offer.argument), discount_n)

        # add apples to shopping cart
        cart = ShoppingCart()
        cart.add_item_quantity(apples, 2.5)
        #cart.add_item_quantity(toothbrush, 2)

        receipt = teller.checks_out_articles_from(cart)

        # add apples to shopping cart : check no discounts and 1 item
        self.assertEqual([], receipt.discounts)
        self.assertEqual(len(cart.items), len(receipt.items))
        receipt_item = receipt.items[0]
        self.assertEqual(apples, receipt_item.product)
        self.assertEqual(catalog.unit_price(apples), receipt_item.price)
        self.assertEqual(cart.product_quantities[apples],
                         receipt_item.quantity)
        self.assertAlmostEqual(
            cart.product_quantities[apples] * catalog.unit_price(apples),
            receipt.total_price(), 0.01)
    def test_catalog_unit_price(self):
        catalog = FakeCatalog()
        toothbrush = Product("toothbrush", ProductUnit.EACH)
        apples = Product("apples", ProductUnit.KILO)

        catalog.add_product(toothbrush, 0.99)
        catalog.add_product(apples, 1.99)

        self.assertEqual(0.99, catalog.unit_price(toothbrush))
        self.assertEqual(1.99, catalog.unit_price(apples))
    def test_receipt_add_product(self):
        toothbrush = Product("toothbrush", ProductUnit.EACH)
        apples = Product("apples", ProductUnit.KILO)
        receipt_toothbrush = ReceiptItem(toothbrush, 2, 1.5, 3)

        receipt = Receipt()
        receipt.discount = []
        receipt._items = [receipt_toothbrush]
        self.assertEqual(1, len(receipt._items))

        receipt.add_product(apples, 2, 1, 2)
        self.assertEqual(2, len(receipt._items))
    def test_catalog_add_product(self):
        catalog = FakeCatalog()
        toothbrush = Product("toothbrush", ProductUnit.EACH)
        apples = Product("apples", ProductUnit.KILO)

        catalog.add_product(toothbrush, 0.99)
        catalog.add_product(apples, 1.99)

        self.assertEqual({
            "apples": apples,
            "toothbrush": toothbrush
        }, catalog.products)
    def test_receipt_total_price(self):
        toothbrush = Product("toothbrush", ProductUnit.EACH)
        apples = Product("apples", ProductUnit.KILO)
        toothbrush_discount = Discount(toothbrush, "my_description", 0.2)
        receipt_toothbrush = ReceiptItem(toothbrush, 2, 1.5, 3)
        receipt_apples = ReceiptItem(apples, 3, 1, 3)

        receipt = Receipt()
        receipt.discounts = [toothbrush_discount]
        receipt.items = [receipt_toothbrush, receipt_apples]
        totalprice = receipt.total_price()

        self.assertEqual([toothbrush_discount], receipt.discounts)
        self.assertEqual(5.8, totalprice)
    def test_shopping_cart_add_item(self):
        cart = ShoppingCart()
        apples = Product("apples", ProductUnit.KILO)

        self.assertEqual(0, len(cart._items))
        cart.add_item(apples)
        self.assertEqual(1, len(cart._items))
    def test_shopping_cart_add_item_quantity(self):
        cart = ShoppingCart()
        apples = Product("apples", ProductUnit.KILO)

        cart.add_item_quantity(apples, 2.5)
        self.assertEqual(2.5, cart.product_quantities[apples])

        cart.add_item_quantity(apples, 1.2)
        self.assertEqual(3.7, cart.product_quantities[apples])
    def test_receipt_add_discount(self):
        toothbrush = Product("toothbrush", ProductUnit.EACH)
        receipt_toothbrush = ReceiptItem(toothbrush, 2, 1.5, 3)

        discount = Discount(toothbrush, "test", 1.5)

        receipt = Receipt()
        receipt._items = [receipt_toothbrush]
        self.assertEqual(0, len(receipt._discounts))

        receipt.add_discount(discount)
        self.assertEqual(1, len(receipt._discounts))
        self.assertEqual(discount, receipt._discounts[0])
    def test_shopping_handle_offers_no_offers(self):
        catalog = FakeCatalog()
        toothbrush = Product("toothbrush", ProductUnit.EACH)
        receipt_toothbrush = ReceiptItem(toothbrush, 2, 1.5, 3)

        receipt = Receipt()
        receipt.items = [receipt_toothbrush]

        receipt_offers = {}

        cart = ShoppingCart()
        cart._items = [toothbrush]
        cart._product_quantities = {toothbrush: 2}

        cart.handle_offers(receipt, receipt_offers, catalog)
        self.assertEqual([], receipt.discounts)
def validate_and_add(product_data: ProductFormData, db):
    if product_data.name == "":
        return Response(0, -2, "Missing Name")
    if product_data.product_type == "":
        return Response(0, -2, "Missing Type")

    product = Product(product_data.name)
    product.product_type = "Unknown"

    if "Eyeshadow" == product_data.product_type or "Mascara" == product_data.product_type:
        product.product_type = product_data.product_type
        product.product_family = ProductFamily.EYES
        if "Eyeshadow" == product_data.product_type and product.name.contains(
                "Queen"):
            product.product_range = ProductRange.QUEEN

    product.range = ProductRange.BUDGET
    if product_data.packaging_recyclable:
        product.range = ProductRange.PROFESSIONAL

    if "Foundation" == product_data.product_type:
        if product_data.suggested_price > 10:
            product.range = ProductRange.PROFESSIONAL

    if "Lipstick" == product_data.product_type:
        product.product_type = product_data.product_type
        product.product_family = ProductFamily.LIPS

    if product_data.suggested_price > 10:
        product.range = ProductRange.PROFESSIONAL

    if product_data.suggested_price > 20:
        if 0 < product_data.weight < 10:
            return Response(0, -1,
                            "Error - failed quality check for Queen Range")
        product.range = ProductRange.QUEEN

    if "Mascara" == product_data.product_type:
        product.product_family = ProductFamily.LASHES
        if product_data.suggested_price > 15:
            product.range = ProductRange.PROFESSIONAL

        if product_data.suggested_price > 25 and product_data.packaging_recyclable:
            product.range = ProductRange.QUEEN

    if product_data.weight < 0:
        return Response(0, -3, "Weight error")

    product.weight = product_data.weight

    if "Blusher" == product_data.product_type or "Foundation" == product_data.product_type:
        product.product_type = product_data.product_type
        product.product_family = ProductFamily.SKIN
        if "Blusher" == product_data.product_type and product_data.weight > 10:
            return Response(0, -3, "Error - weight too high")

    if not product_data.packaging_recyclable and product.range == ProductRange.QUEEN:
        return Response(0, -1, "Error - failed quality check for Queen Range")

    if "Unknown" == product.product_type:
        return Response(0, -1,
                        f"Unknown product type {product_data.product_type}")

    return Response(db.store_product(product), 0, "Product Successfully Added")
from dateutil.parser import parse

from model_objects import Product, Price, Store, StoreEvent, Order

CherryBloom = Product("Cherry Bloom", "LIPSTICK01", 30, Price(14.99, "USD"))
RosePetal = Product("Rose Petal", "LIPSTICK02", 30, Price(14.99, "USD"))
BlusherBrush = Product("Blusher Brush", "TOOL01", 50, Price(24.99, "USD"))
EyelashCurler = Product("Eyelash curler", "TOOL01", 100, Price(19.99, "USD"))
WildRose = Product("Wild Rose", "PURFUME01", 200, Price(34.99, "USD"))
CocoaButter = Product("Cocoa Butter", "SKIN_CREAM01", 250, Price(10.99, "USD"))

FlagshipStore = Store("Nordstan", "4189", [CherryBloom])

# Store events add themselves to the stocked items at their store
Masterclass = StoreEvent("Eyeshadow Masterclass", "EVENT01", FlagshipStore,
                         Price(119.99, "USD"))
Makeover = StoreEvent("Makeover", FlagshipStore, "EVENT02",
                      Price(149.99, "USD"))

RecentOrder = Order("1234", parse("2018-09-01T00:00Z"), FlagshipStore,
                    [Makeover])