示例#1
0
def count_orders(user=None):
    if user is not None:
        user = User.get_by_username(user)
        res = Order.objects(user=user)
    else:
        res = Order.objects
    return res.count()
def test_order_details_string(app):
    """ Test GetDetailsString in Order class
  """
    with app.app_context():
        sburger = Stock(name="burger", amount=1)
        swrap = Stock(name="wrap", amount=1)
        db.session.add(sburger)
        db.session.add(swrap)
        imain = Item(name="main", price=0)
        iburger = Item(name="burger", price=5)
        iwrap = Item(name="wrap", price=3.3)
        gtype = IngredientGroup(name="type",
                                min_item=1,
                                max_item=1,
                                min_option=1,
                                max_option=1)
        db.session.add(imain)
        db.session.add(iburger)
        db.session.add(iwrap)
        db.session.add(gtype)
        sburger.items.append(iburger)
        swrap.items.append(iwrap)
        gtype.options.append(iburger)
        gtype.options.append(iwrap)
        imain.ingredientgroups.append(gtype)
        db.session.commit()

        order = Order()
        order.AddRootItem(imain.GetID(), 1)
        order.AddIG("0.0", [iburger.GetID()], [1])
        order.AddRootItem(imain.GetID(), 1)
        order.AddIG("1.0", [iwrap.GetID()], [1])

        assert order.GetDetailsString(
        ) == """main\n  type:burger ......$5.00\nmain
def test_checkout_page(client, app):
  """ Test checkout page
  """
  with app.app_context():
    sburger = Stock(name="burger", amount=10)
    swrap = Stock(name="wrap", amount=10)
    db.session.add(sburger)
    db.session.add(swrap)
    imain = Item(name="main")
    iburger = Item(name="burger")
    iwrap = Item(name="wrap")
    gtype = IngredientGroup(
        name="type", min_item=1, max_item=1, min_option=1, max_option=1)
    db.session.add(imain)
    db.session.add(iburger)
    db.session.add(iwrap)
    db.session.add(gtype)
    sburger.items.append(iburger)
    swrap.items.append(iwrap)
    gtype.options.append(iburger)
    gtype.options.append(iwrap)
    imain.ingredientgroups.append(gtype)
    db.session.commit()
    user = User(
        name="Dickson", email="*****@*****.**", user_type=UserType.ADMIN)
    user.SetPassword("123456")
    user2 = User(
        name="Superman",
        email="*****@*****.**",
        user_type=UserType.CUSTOMER)
    user2.SetPassword("123456")
    order = Order(status=OrderStatus.PAID, price=100)
    user2.orders.append(order)
    order.AddRootItem(imain.GetID(), 1)
    order.AddIG("0.0", [iburger.GetID()], [1])
    db.session.add(user)
    db.session.add(user2)
    db.session.add(order)
    db.session.commit()
    login(client, "*****@*****.**", "123456")
    order = Order.query.get(order.GetID())
    response = client.get('/order/%d' % order.GetID())
    # Check if the customer can see the unique ID for the order.
    assert str(order.GetID()).encode("utf-8") in response.data
    client.get('/admin/order/%d/done' % order.GetID())
    # Check if the customer can see the details of his order.
    assert order.GetDetailsString().encode("utf-8") in response.data
示例#4
0
def get_orders(user=None, limit=None, offset=None, sorting='-number'):
    if user is not None:
        user = User.get_by_username(user)
        res = Order.objects(user=user)
    else:
        res = Order.objects
    if offset:
        res = res.skip(offset)
    if limit:
        res = res.limit(limit)
    return res.order_by(sorting)
def test_create_order(app):
    """Test creating order and adding items to it"""
    with app.app_context():
        sburger = Stock(name="burger", amount=3)
        swrap = Stock(name="wrap", amount=0)
        db.session.add(sburger)
        db.session.add(swrap)
        imain = Item(name="main")
        iburger = Item(name="burger")
        iwrap = Item(name="wrap")
        gtype = IngredientGroup(name="type",
                                min_item=1,
                                max_item=1,
                                min_option=1,
                                max_option=1)
        db.session.add(imain)
        db.session.add(iburger)
        db.session.add(iwrap)
        db.session.add(gtype)
        sburger.items.append(iburger)
        swrap.items.append(iwrap)
        gtype.options.append(iburger)
        gtype.options.append(iwrap)
        imain.ingredientgroups.append(gtype)
        db.session.commit()

        order = Order()
        order.AddRootItem(imain.GetID(), 1)
        order.AddIG("0.0", [iburger.GetID()], [1])
        order.AddRootItem(imain.GetID(), 1)
        with pytest.raises(RuntimeError):
            order.AddIG("0.0", [iburger.GetID()], [1])
        with pytest.raises(ValueError):
            order.AddIG("1.0", [iburger.GetID()], [2])
        with pytest.raises(ValueError):
            order.AddIG("1.0", [], [])
        with pytest.raises(RuntimeError):
            order.AddIG("1.0", [iwrap.GetID()], [1])
        swrap.IncreaseAmount(1)
        order.AddIG("1.0", [iwrap.GetID()], [1])
def test_mark_as_done(client, app):
    """test mark done page"""
    with app.app_context():
        sburger = Stock(name="burger", amount=10)
        swrap = Stock(name="wrap", amount=10)
        db.session.add(sburger)
        db.session.add(swrap)
        imain = Item(name="main")
        iburger = Item(name="burger")
        iwrap = Item(name="wrap")
        gtype = IngredientGroup(name="type",
                                min_item=1,
                                max_item=1,
                                min_option=1,
                                max_option=1)
        db.session.add(imain)
        db.session.add(iburger)
        db.session.add(iwrap)
        db.session.add(gtype)
        sburger.items.append(iburger)
        swrap.items.append(iwrap)
        gtype.options.append(iburger)
        gtype.options.append(iwrap)
        imain.ingredientgroups.append(gtype)
        db.session.commit()

        user = User(name="Dickson",
                    email="*****@*****.**",
                    user_type=UserType.ADMIN)
        user.SetPassword("123456")
        user2 = User(name="Superman",
                     email="*****@*****.**",
                     user_type=UserType.CUSTOMER)
        user2.SetPassword("123456")

        order = Order(status=OrderStatus.PAID, price=100)
        user2.orders.append(order)
        order.AddRootItem(imain.GetID(), 1)
        order.AddIG("0.0", [iburger.GetID()], [1])

        db.session.add(user)
        db.session.add(user2)
        db.session.add(order)
        db.session.commit()

        login(client, "*****@*****.**", "123456")
        order = Order.query.get(order.GetID())
        response = client.get('/order/%d' % order.GetID())
        assert b"paid" in response.data

        client.get('/admin/order/%d/done' % order.GetID())
        response = client.get('/order/%d' % order.GetID())
        assert b"ready" in response.data
def test_order_list(client, app):
    """test order list page"""
    with app.app_context():
        order = Order(price=123, status=OrderStatus.PAID)
        db.session.add(order)
        db.session.commit()
        timestamp = order.GetCreatedAt()
        user = User(name="Dickson",
                    email="*****@*****.**",
                    user_type=UserType.ADMIN)
        user.SetPassword("123456")
        db.session.add(user)
        db.session.commit()
        login(client, "*****@*****.**", "123456")

    response = client.get('/admin/orderlist')
    rsp = str(response.data)
    assert "ID" in rsp
    assert "User Name" in rsp
    assert "Price" in rsp
    assert "Created at" in rsp
    assert "Updated at" in rsp
    assert "Status" in rsp
    assert "123" in rsp
    assert "paid" in rsp
    assert str(timestamp) in rsp

    with app.app_context():
        order1 = Order(price=231, status=OrderStatus.PAID)
        db.session.add(order1)
        db.session.commit()

    response = client.get('/admin/orderlist')
    rsp = str(response.data)
    assert "231" in rsp
    position = rsp.find("123")
    position1 = rsp.find("231")
    assert position1 < position
示例#8
0
def test_order_details(client, app):
    """ Test correct order details on front end
  """
    with app.app_context():
        sburger = Stock(name="burger", amount=10)
        swrap = Stock(name="wrap", amount=10)
        db.session.add(sburger)
        db.session.add(swrap)
        imain = Item(name="main")
        iburger = Item(name="burger")
        iwrap = Item(name="wrap")
        gtype = IngredientGroup(name="type",
                                min_item=1,
                                max_item=1,
                                min_option=1,
                                max_option=1)
        db.session.add(imain)
        db.session.add(iburger)
        db.session.add(iwrap)
        db.session.add(gtype)
        sburger.items.append(iburger)
        swrap.items.append(iwrap)
        gtype.options.append(iburger)
        gtype.options.append(iwrap)
        imain.ingredientgroups.append(gtype)
        db.session.commit()

        user = User(name="Dickson",
                    email="*****@*****.**",
                    user_type=UserType.ADMIN)
        user.SetPassword("123456")
        user1 = User(name="123",
                     email="*****@*****.**",
                     user_type=UserType.CUSTOMER)
        user1.SetPassword("123456")
        user2 = User(name="Superman",
                     email="*****@*****.**",
                     user_type=UserType.CUSTOMER)
        user2.SetPassword("123456")

        order = Order(status=OrderStatus.PAID, price=100)
        user2.orders.append(order)
        order.AddRootItem(imain.GetID(), 1)
        order.AddIG("0.0", [iburger.GetID()], [1])

        db.session.add(user)
        db.session.add(user1)
        db.session.add(user2)
        db.session.add(order)
        db.session.commit()

        login(client, "*****@*****.**", "654321")
        response = client.get('/order/%d' % order.GetID())
        assert response.status == '302 FOUND'

        login(client, "*****@*****.**", "123456")
        response = client.get('/order/%d' % order.GetID())
        assert b"Superman" in response.data
        assert order.GetDetailsString().encode("utf-8") in response.data
        if order.GetStatusText() != "ready":
            assert b"Mark as done" in response.data

        login(client, "*****@*****.**", "123456")
        response = client.get('/order/%d' % order.GetID())
        assert response.status == '302 FOUND'

        login(client, "*****@*****.**", "123456")
        response = client.get('/order/%d' % order.GetID())
        assert b"Superman" in response.data

        # Check if the user can see his unique order ID in the details page.
        assert "ORDER {0}".format(
            order.GetID()).encode("utf-8") in response.data

        # Customer shouldn't have access to details page of unpaid orders
        order.SetStatus(OrderStatus.CREATED)
        db.session.commit()
        response = client.get('/order/%d' % order.GetID())
        assert response.status == '302 FOUND'
def test_pay_stock(app):
    """ Test stocks are correctly deducted after paid and order doesn't violate the
      stock level
  """

    with app.app_context():
        main = Item(name="Main", root=True)
        db.session.add(main)

        main_type_group = IngredientGroup(name="Main Type",
                                          max_item=1,
                                          min_item=1,
                                          max_option=1,
                                          min_option=1)

        main.ingredientgroups.append(main_type_group)
        db.session.add(main_type_group)

        burger = Item(name="Burger", root=False, price=10)
        db.session.add(burger)

        main_type_group.options.append(burger)
        bun_group = IngredientGroup(name="Bun",
                                    max_item=3,
                                    min_item=2,
                                    max_option=1,
                                    min_option=1)
        db.session.add(bun_group)
        burger.ingredientgroups.append(bun_group)

        muffin_bun = Item(name="Muffin Bun",
                          root=False,
                          identical=True,
                          price=1)
        sesame_bun = Item(name="Sesame Bun",
                          root=False,
                          identical=True,
                          price=2)
        standard_bun = Item(name="Standard Bun",
                            root=False,
                            identical=True,
                            price=1)

        db.session.add(muffin_bun)
        db.session.add(sesame_bun)
        db.session.add(standard_bun)

        bun_group.options.append(muffin_bun)
        bun_group.options.append(sesame_bun)
        bun_group.options.append(standard_bun)

        wrap = Item(name="Wrap", root=False, price=5)
        db.session.add(wrap)
        main_type_group.options.append(wrap)

        patty_group = IngredientGroup(name="Patties",
                                      max_item=3,
                                      min_item=1,
                                      max_option=3,
                                      min_option=1)
        db.session.add(patty_group)
        main.ingredientgroups.append(patty_group)
        chicken_patty = Item(name="Chicken Patty",
                             root=False,
                             identical=True,
                             price=4)
        beef_patty = Item(name="Beef Patty",
                          root=False,
                          identical=True,
                          price=5)
        vegetarian_patty = Item(name="Vegetarian Patty",
                                root=False,
                                identical=True,
                                price=3)
        tuna_patty = Item(name="Tuna Patty",
                          root=False,
                          identical=True,
                          price=3)

        db.session.add(chicken_patty)
        db.session.add(beef_patty)
        db.session.add(vegetarian_patty)
        db.session.add(tuna_patty)

        patty_group.options.append(chicken_patty)
        patty_group.options.append(beef_patty)
        patty_group.options.append(vegetarian_patty)
        patty_group.options.append(tuna_patty)

        ingredients = IngredientGroup(name="Other Ingredients",
                                      max_item=5,
                                      max_option=5)
        db.session.add(ingredients)
        main.ingredientgroups.append(ingredients)
        tomato = Item(name="Tomato", root=False, identical=True, price=1)
        tomato_sauce = Item(name="Tomato Sauce",
                            root=False,
                            identical=True,
                            price=0.5)
        bbq_sauce = Item(name="BBQ Sauce",
                         root=False,
                         identical=True,
                         price=0.5)
        mint_sauce = Item(name="Mint Sauce",
                          root=False,
                          identical=True,
                          price=0.5)
        chocolate_sauce = Item(name="Chocolate Sauce",
                               root=False,
                               identical=True,
                               price=0.5)
        cheddar_cheese = Item(name="Cheddar Cheese",
                              root=False,
                              identical=True,
                              price=0.5)
        db.session.add(tomato)
        db.session.add(tomato_sauce)
        db.session.add(bbq_sauce)
        db.session.add(mint_sauce)
        db.session.add(chocolate_sauce)
        db.session.add(cheddar_cheese)

        ingredients.options.append(tomato)
        ingredients.options.append(tomato_sauce)
        ingredients.options.append(bbq_sauce)
        ingredients.options.append(mint_sauce)
        ingredients.options.append(chocolate_sauce)
        ingredients.options.append(cheddar_cheese)
        nuggets = Item(name="Nuggets", root=True, price=2)
        db.session.add(nuggets)
        nuggets_amount = IngredientGroup(name="Nuggets Amount",
                                         max_item=1,
                                         min_item=1,
                                         max_option=1,
                                         min_option=1)

        nuggets.ingredientgroups.append(nuggets_amount)
        nuggets_3_pack = Item(name="3-pack Nuggets",
                              root=False,
                              identical=True,
                              price=6,
                              stock_unit=3)
        nuggets_6_pack = Item(name="6-pack Nuggets",
                              root=False,
                              identical=True,
                              price=12,
                              stock_unit=6)
        nuggets_12_pack = Item(name="12-pack Nuggets",
                               root=False,
                               identical=True,
                               price=18,
                               stock_unit=12)
        db.session.add(nuggets_3_pack)
        db.session.add(nuggets_6_pack)
        db.session.add(nuggets_12_pack)
        nuggets_amount.options.append(nuggets_3_pack)
        nuggets_amount.options.append(nuggets_6_pack)
        nuggets_amount.options.append(nuggets_12_pack)

        fries = Item(name="Fries", root=True, price=2)
        db.session.add(fries)

        fries_size = IngredientGroup(name="fries Size",
                                     max_item=1,
                                     min_item=1,
                                     max_option=1,
                                     min_option=1)
        db.session.add(fries_size)

        fries.ingredientgroups.append(fries_size)
        small_size = Item(name="Small Fries",
                          root=False,
                          identical=True,
                          price=0,
                          stock_unit=150)
        medium_size = Item(name="Medium Fries",
                           root=False,
                           identical=True,
                           price=1,
                           stock_unit=200)
        large_size = Item(name="Large Fries",
                          root=False,
                          identical=True,
                          price=2,
                          stock_unit=250)
        db.session.add(small_size)
        db.session.add(medium_size)
        db.session.add(large_size)

        fries_size.options.append(small_size)
        fries_size.options.append(medium_size)
        fries_size.options.append(large_size)

        sauce = IngredientGroup(name="Sauce", max_item=3, max_option=3)
        db.session.add(sauce)
        nuggets.ingredientgroups.append(sauce)
        fries.ingredientgroups.append(sauce)
        chilli_sauce = Item(name="Chilli Sauce",
                            root=False,
                            identical=True,
                            price=1)
        db.session.add(chilli_sauce)

        sauce.options.append(tomato_sauce)
        sauce.options.append(bbq_sauce)
        sauce.options.append(chilli_sauce)
        sauce.options.append(mint_sauce)

        coke = Item(name="Coke", root=True, price=0)
        db.session.add(coke)
        coke_size = IngredientGroup(name="Coke Size",
                                    max_item=1,
                                    min_item=1,
                                    max_option=1,
                                    min_option=1)
        db.session.add(coke_size)
        coke.ingredientgroups.append(coke_size)
        small_coke = Item(name="Small Coke",
                          root=False,
                          identical=True,
                          price=0,
                          stock_unit=150)
        medium_coke = Item(name="Medium Coke",
                           root=False,
                           identical=True,
                           price=1,
                           stock_unit=250)
        large_coke = Item(name="Large Coke",
                          root=False,
                          identical=True,
                          price=2,
                          stock_unit=350)
        db.session.add(small_coke)
        db.session.add(medium_coke)
        db.session.add(large_coke)

        coke_size.options.append(small_coke)
        coke_size.options.append(medium_coke)
        coke_size.options.append(large_coke)

        sundaes = Item(name="Sundaes", root=True, price=3)
        db.session.add(sundaes)
        sundaes_flavor = IngredientGroup(name="Sundaes Flavors",
                                         max_item=1,
                                         min_item=1,
                                         max_option=1,
                                         min_option=1)
        db.session.add(sundaes)
        sundaes.ingredientgroups.append(sundaes_flavor)
        chocolate_flavor = Item(name="Chocolate Sundaes",
                                root=False,
                                identical=True,
                                price=0)
        strawberry_flavor = Item(name="Strawberry Sundaes",
                                 root=False,
                                 identical=True,
                                 price=0)

        db.session.add(chocolate_flavor)
        db.session.add(strawberry_flavor)

        sundaes_flavor.options.append(chocolate_flavor)
        sundaes_flavor.options.append(strawberry_flavor)

        sundaes_size = IngredientGroup(name="Sundaes Size",
                                       max_item=1,
                                       min_item=1,
                                       max_option=1,
                                       min_option=1)

        db.session.add(sundaes_size)
        sundaes.ingredientgroups.append(sundaes_size)

        small_sundaes = Item(name="Small Sundaes",
                             root=False,
                             identical=True,
                             price=0,
                             stock_unit=100)
        medium_sundaes = Item(name="Medium Sundaes",
                              root=False,
                              identical=True,
                              price=1,
                              stock_unit=150)
        large_sundaes = Item(name="Large Sundaes",
                             root=False,
                             identical=True,
                             price=2,
                             stock_unit=200)

        db.session.add(small_sundaes)
        db.session.add(medium_sundaes)
        db.session.add(large_sundaes)

        sundaes_size.options.append(small_sundaes)
        sundaes_size.options.append(medium_sundaes)
        sundaes_size.options.append(large_sundaes)

        db.session.commit()

        # Building the stock
        s_muffin_bun = Stock(name="Muffin Bun", amount=3)
        s_sesame_bun = Stock(name="Sesame Bun", amount=2)
        s_standard_bun = Stock(name="Standard Bun", amount=1000)

        s_wrap = Stock(name="Wrap", amount=1)

        s_chicken_patty = Stock(name="Chicken Patty", amount=10)
        s_beef_patty = Stock(name="Beef Patty", amount=10)
        s_vegetarian_patty = Stock(name="Vegetarian Patty", amount=1)
        s_tuna_patty = Stock(name="Tuna Patty", amount=10)

        s_tomato = Stock(name="Tomato", amount=100)
        s_tomato_sauce = Stock(name="Tomato Sauce", amount=4)
        s_bbq_sauce = Stock(name="BBQ Sauce", amount=10)
        s_mint_sauce = Stock(name="Mint Sauce", amount=100)
        s_chocolate_sauce = Stock(name="Chocolate Sauce", amount=30)
        s_cheddar_cheese = Stock(name="Cheddar Cheese", amount=0)

        s_nuggets = Stock(name="Nuggets", amount=100)

        s_fries = Stock(name="Fries (g)", amount=1000)

        s_coke = Stock(name="Coke (ml)", amount=1000)

        s_sundaes = Stock(name="Sundaes (ml)", amount=1000)

        db.session.add(s_muffin_bun)
        db.session.add(s_sesame_bun)
        db.session.add(s_standard_bun)

        db.session.add(s_wrap)

        db.session.add(s_chicken_patty)
        db.session.add(s_beef_patty)
        db.session.add(s_vegetarian_patty)
        db.session.add(s_tuna_patty)

        db.session.add(s_tomato)
        db.session.add(s_tomato_sauce)
        db.session.add(s_bbq_sauce)
        db.session.add(s_mint_sauce)
        db.session.add(s_chocolate_sauce)
        db.session.add(s_cheddar_cheese)

        db.session.add(s_nuggets)

        db.session.add(s_fries)

        db.session.add(s_coke)

        db.session.add(s_sundaes)

        s_muffin_bun.items.append(muffin_bun)
        s_sesame_bun.items.append(sesame_bun)
        s_standard_bun.items.append(standard_bun)

        s_wrap.items.append(wrap)

        s_chicken_patty.items.append(chicken_patty)
        s_beef_patty.items.append(beef_patty)
        s_vegetarian_patty.items.append(vegetarian_patty)
        s_tuna_patty.items.append(tuna_patty)

        s_tomato.items.append(tomato)
        s_tomato_sauce.items.append(tomato_sauce)
        s_bbq_sauce.items.append(bbq_sauce)
        s_mint_sauce.items.append(mint_sauce)
        s_chocolate_sauce.items.append(chocolate_sauce)
        s_cheddar_cheese.items.append(cheddar_cheese)

        s_nuggets.items.append(nuggets_3_pack)
        s_nuggets.items.append(nuggets_6_pack)
        s_nuggets.items.append(nuggets_12_pack)

        s_fries.items.append(small_size)
        s_fries.items.append(medium_size)
        s_fries.items.append(large_size)

        s_coke.items.append(small_coke)
        s_coke.items.append(medium_coke)
        s_coke.items.append(large_coke)

        s_sundaes.items.append(small_sundaes)
        s_sundaes.items.append(medium_sundaes)
        s_sundaes.items.append(large_sundaes)

        db.session.commit()

        order = Order()

        # Add first main.
        order.AddRootItem(main.GetID(), 1)
        order.AddIG("0.0", [burger.GetID()], [1])
        assert order.GetPrice() == 10

        # There's only 2 sesame bun on stock
        with pytest.raises(RuntimeError):
            order.AddIG("0.0.0.0", [sesame_bun.GetID()], [3])

        order.AddIG("0.0.0.0", [sesame_bun.GetID()], [2])
        assert order.GetPrice() == 14

        order.AddIG("0.1", [chicken_patty.GetID(), beef_patty.GetID()], [2, 1])
        assert order.GetPrice() == 27

        # Unfortunately, cheddar cheese is out of stock
        with pytest.raises(RuntimeError):
            order.AddIG("0.2", [
                tomato.GetID(),
                tomato_sauce.GetID(),
                bbq_sauce.GetID(),
                mint_sauce.GetID(),
                cheddar_cheese.GetID()
            ], [1, 1, 1, 1, 1])
        assert order.GetPrice() == 27

        order.AddIG("0.2", [
            tomato.GetID(),
            tomato_sauce.GetID(),
            bbq_sauce.GetID(),
            mint_sauce.GetID(),
        ], [1, 1, 1, 1])
        assert order.GetPrice() == 29.5

        # Add second main.
        order.AddRootItem(main.GetID(), 1)
        order.AddIG("1.0", [wrap.GetID()], [1])
        assert order.GetPrice() == 34.5

        order.AddIG("1.1", [chicken_patty.GetID()], [3])
        assert order.GetPrice() == 46.5

        order.AddIG("1.2", [tomato.GetID()], [2])
        assert order.GetPrice() == 48.5

        order.AddRootItem(nuggets.GetID(), 1)

        # Buy a 3 pack nuggets
        order.AddIG("2.0", [nuggets_3_pack.GetID()], [1])

        order.AddIG("2.1", [tomato_sauce.GetID()], [0])
        assert order.GetPrice() == 56.5

        order.AddRootItem(nuggets.GetID(), 1)

        # Buy a 6 pack nuggets
        order.AddIG("3.0", [nuggets_6_pack.GetID()], [1])

        order.AddIG("3.1", [tomato_sauce.GetID()], [0])
        assert order.GetPrice() == 70.5

        order.AddRootItem(nuggets.GetID(), 1)

        # Buy a 12 pack nuggets
        order.AddIG("4.0", [nuggets_12_pack.GetID()], [1])

        order.AddIG("4.1", [tomato_sauce.GetID()], [0])
        assert order.GetPrice() == 90.5

        # Buy a small size fries
        order.AddRootItem(fries.GetID(), 1)

        order.AddIG("5.0", [small_size.GetID()], [1])
        assert order.GetPrice() == 92.5

        order.AddIG("5.1", [tomato_sauce.GetID()], [0])
        # Buy a medium size fries
        order.AddRootItem(fries.GetID(), 1)

        order.AddIG("6.0", [medium_size.GetID()], [1])
        assert order.GetPrice() == 95.5

        order.AddIG("6.1", [tomato_sauce.GetID()], [0])

        # Buy a large size fries
        order.AddRootItem(fries.GetID(), 1)

        order.AddIG("7.0", [large_size.GetID()], [1])
        assert order.GetPrice() == 99.5

        order.AddIG("7.1", [tomato_sauce.GetID()], [0])

        # Buy a small coke
        order.AddRootItem(coke.GetID(), 1)

        order.AddIG("8.0", [small_coke.GetID()], [1])
        assert order.GetPrice() == 99.5

        # Buy a medium coke
        order.AddRootItem(coke.GetID(), 1)

        order.AddIG("9.0", [medium_coke.GetID()], [1])
        assert order.GetPrice() == 100.5

        # Buy a large coke
        order.AddRootItem(coke.GetID(), 1)

        order.AddIG("10.0", [large_coke.GetID()], [1])
        assert order.GetPrice() == 102.5

        # Buy a chocolate flavor sundaes
        order.AddRootItem(sundaes.GetID(), 1)

        order.AddIG("11.0", [chocolate_flavor.GetID()], [1])

        order.AddIG("11.1", [small_sundaes.GetID()], [1])
        assert order.GetPrice() == 105.5

        # Buy a strawberry flavor sundaes
        order.AddRootItem(sundaes.GetID(), 1)

        order.AddIG("12.0", [strawberry_flavor.GetID()], [1])

        order.AddIG("12.1", [medium_sundaes.GetID()], [1])
        assert order.GetPrice() == 109.5

        db.session.add(order)
        db.session.commit()

        assert order.GetStatus() == OrderStatus.CREATED

        order.Pay()
        db.session.commit()

        assert s_muffin_bun.GetAmount() == 3
        assert s_sesame_bun.GetAmount() == 0
        assert s_standard_bun.GetAmount() == 1000

        assert s_chicken_patty.GetAmount() == 5
        assert s_beef_patty.GetAmount() == 9
        assert s_vegetarian_patty.GetAmount() == 1
        assert s_tuna_patty.GetAmount() == 10

        assert s_tomato.GetAmount() == 97
        assert s_tomato_sauce.GetAmount() == 3
        assert s_bbq_sauce.GetAmount() == 9
        assert s_mint_sauce.GetAmount() == 99
        assert s_chocolate_sauce.GetAmount() == 30
        assert s_cheddar_cheese.GetAmount() == 0

        assert s_nuggets.GetAmount() == 79

        assert s_fries.GetAmount() == 400

        assert s_coke.GetAmount() == 250

        assert s_sundaes.GetAmount() == 750
        assert order.GetStatus() == OrderStatus.PAID

        assert order.GetPrice() == 109.5
示例#10
0
def test_pay_order(app):
    """ Test price are correctly calculated and the order follows business rules.
  """
    with app.app_context():
        main = Item(name="Main", root=True)
        db.session.add(main)

        main_type_group = IngredientGroup(name="Main Type",
                                          max_item=1,
                                          min_item=1,
                                          max_option=1,
                                          min_option=1)

        main.ingredientgroups.append(main_type_group)
        db.session.add(main_type_group)

        burger = Item(name="Burger", root=False, price=10)
        db.session.add(burger)

        main_type_group.options.append(burger)
        bun_group = IngredientGroup(name="Bun",
                                    max_item=3,
                                    min_item=2,
                                    max_option=1,
                                    min_option=1)
        db.session.add(bun_group)
        burger.ingredientgroups.append(bun_group)

        muffin_bun = Item(name="Muffin Bun",
                          root=False,
                          identical=True,
                          price=1)
        sesame_bun = Item(name="Sesame Bun",
                          root=False,
                          identical=True,
                          price=2)
        standard_bun = Item(name="Standard Bun",
                            root=False,
                            identical=True,
                            price=1)

        db.session.add(muffin_bun)
        db.session.add(sesame_bun)
        db.session.add(standard_bun)

        bun_group.options.append(muffin_bun)
        bun_group.options.append(sesame_bun)
        bun_group.options.append(standard_bun)

        wrap = Item(name="Wrap", root=False, price=5)
        db.session.add(wrap)
        main_type_group.options.append(wrap)

        patty_group = IngredientGroup(name="Patties",
                                      max_item=3,
                                      min_item=1,
                                      max_option=3,
                                      min_option=1)
        db.session.add(patty_group)
        main.ingredientgroups.append(patty_group)
        chicken_patty = Item(name="Chicken Patty",
                             root=False,
                             identical=True,
                             price=4)
        beef_patty = Item(name="Beef Patty",
                          root=False,
                          identical=True,
                          price=5)
        vegetarian_patty = Item(name="Vegetarian Patty",
                                root=False,
                                identical=True,
                                price=3)
        tuna_patty = Item(name="Tuna Patty",
                          root=False,
                          identical=True,
                          price=3)

        db.session.add(chicken_patty)
        db.session.add(beef_patty)
        db.session.add(vegetarian_patty)
        db.session.add(tuna_patty)

        patty_group.options.append(chicken_patty)
        patty_group.options.append(beef_patty)
        patty_group.options.append(vegetarian_patty)
        patty_group.options.append(tuna_patty)

        ingredients = IngredientGroup(name="Other Ingredients",
                                      max_item=5,
                                      max_option=5)
        db.session.add(ingredients)
        main.ingredientgroups.append(ingredients)
        tomato = Item(name="Tomato", root=False, identical=True, price=1)
        tomato_sauce = Item(name="Tomato Sauce",
                            root=False,
                            identical=True,
                            price=0.5)
        bbq_sauce = Item(name="BBQ Sauce",
                         root=False,
                         identical=True,
                         price=0.5)
        mint_sauce = Item(name="Mint Sauce",
                          root=False,
                          identical=True,
                          price=0.5)
        chocolate_sauce = Item(name="Chocolate Sauce",
                               root=False,
                               identical=True,
                               price=0.5)
        cheddar_cheese = Item(name="Cheddar Cheese",
                              root=False,
                              identical=True,
                              price=0.5)
        db.session.add(tomato)
        db.session.add(tomato_sauce)
        db.session.add(bbq_sauce)
        db.session.add(mint_sauce)
        db.session.add(chocolate_sauce)
        db.session.add(cheddar_cheese)

        ingredients.options.append(tomato)
        ingredients.options.append(tomato_sauce)
        ingredients.options.append(bbq_sauce)
        ingredients.options.append(mint_sauce)
        ingredients.options.append(chocolate_sauce)
        ingredients.options.append(cheddar_cheese)
        nuggets = Item(name="Nuggets", root=True, price=2)
        db.session.add(nuggets)
        nuggets_amount = IngredientGroup(name="Nuggets Amount",
                                         max_item=1,
                                         min_item=1,
                                         max_option=1,
                                         min_option=1)

        nuggets.ingredientgroups.append(nuggets_amount)
        nuggets_3_pack = Item(name="3-pack Nuggets",
                              root=False,
                              identical=True,
                              price=6)
        nuggets_6_pack = Item(name="6-pack Nuggets",
                              root=False,
                              identical=True,
                              price=12)
        nuggets_12_pack = Item(name="12-pack Nuggets",
                               root=False,
                               identical=True,
                               price=18)
        db.session.add(nuggets_3_pack)
        db.session.add(nuggets_6_pack)
        db.session.add(nuggets_12_pack)
        nuggets_amount.options.append(nuggets_3_pack)
        nuggets_amount.options.append(nuggets_6_pack)
        nuggets_amount.options.append(nuggets_12_pack)

        fries = Item(name="Fries", root=True, price=2)
        db.session.add(fries)

        fries_size = IngredientGroup(name="fries Size",
                                     max_item=1,
                                     min_item=1,
                                     max_option=1,
                                     min_option=1)
        db.session.add(fries_size)

        fries.ingredientgroups.append(fries_size)
        small_size = Item(name="Small Fries",
                          root=False,
                          identical=True,
                          price=0)
        medium_size = Item(name="Medium Fries",
                           root=False,
                           identical=True,
                           price=1)
        large_size = Item(name="Large Fries",
                          root=False,
                          identical=True,
                          price=2)
        db.session.add(small_size)
        db.session.add(medium_size)
        db.session.add(large_size)

        fries_size.options.append(small_size)
        fries_size.options.append(medium_size)
        fries_size.options.append(large_size)

        sauce = IngredientGroup(name="Sauce", max_item=3, max_option=3)
        db.session.add(sauce)
        nuggets.ingredientgroups.append(sauce)
        fries.ingredientgroups.append(sauce)
        chilli_sauce = Item(name="Chilli Sauce",
                            root=False,
                            identical=True,
                            price=1)
        db.session.add(chilli_sauce)

        sauce.options.append(tomato_sauce)
        sauce.options.append(bbq_sauce)
        sauce.options.append(chilli_sauce)
        sauce.options.append(mint_sauce)

        coke = Item(name="Coke", root=True, price=0)
        db.session.add(coke)
        coke_size = IngredientGroup(name="Coke Size",
                                    max_item=1,
                                    min_item=1,
                                    max_option=1,
                                    min_option=1)
        db.session.add(coke_size)
        coke.ingredientgroups.append(coke_size)
        small_coke = Item(name="Small Coke",
                          root=False,
                          identical=True,
                          price=0)
        medium_coke = Item(name="Medium Coke",
                           root=False,
                           identical=True,
                           price=1)
        large_coke = Item(name="Large Coke",
                          root=False,
                          identical=True,
                          price=2)
        db.session.add(small_coke)
        db.session.add(medium_coke)
        db.session.add(large_coke)
        coke_size.options.append(small_coke)
        coke_size.options.append(medium_coke)
        coke_size.options.append(large_coke)

        sundaes = Item(name="Sundaes", root=True, price=3)
        db.session.add(sundaes)
        sundaes_flavor = IngredientGroup(name="Sundaes Flavors",
                                         max_item=1,
                                         min_item=1,
                                         max_option=1,
                                         min_option=1)
        db.session.add(sundaes)
        sundaes.ingredientgroups.append(sundaes_flavor)
        chocolate_flavor = Item(name="Chocolate Sundaes",
                                root=False,
                                identical=True,
                                price=0)
        strawberry_flavor = Item(name="Strawberry Sundaes",
                                 root=False,
                                 identical=True,
                                 price=0)

        db.session.add(chocolate_flavor)
        db.session.add(strawberry_flavor)

        sundaes_flavor.options.append(chocolate_flavor)
        sundaes_flavor.options.append(strawberry_flavor)

        sundaes_size = IngredientGroup(name="Sundaes Size",
                                       max_item=1,
                                       min_item=1,
                                       max_option=1,
                                       min_option=1)

        db.session.add(sundaes_size)
        sundaes.ingredientgroups.append(sundaes_size)

        small_sundaes = Item(name="Small Sundaes",
                             root=False,
                             identical=True,
                             price=0,
                             stock_unit=100)
        medium_sundaes = Item(name="Medium Sundaes",
                              root=False,
                              identical=True,
                              price=1,
                              stock_unit=150)
        large_sundaes = Item(name="Large Sundaes",
                             root=False,
                             identical=True,
                             price=2,
                             stock_unit=200)

        db.session.add(small_sundaes)
        db.session.add(medium_sundaes)
        db.session.add(large_sundaes)

        sundaes_size.options.append(small_sundaes)
        sundaes_size.options.append(medium_sundaes)
        sundaes_size.options.append(large_sundaes)
        db.session.commit()

        order = Order()

        # Add first main.
        order.AddRootItem(main.GetID(), 1)
        order.AddIG("0.0", [burger.GetID()], [1])
        assert order.GetPrice() == 10

        # Can't complete the order without choosing at least one bun.
        with pytest.raises(RuntimeError):
            order.Pay()

        # Customer can't order less than 1 bun or more than 3 buns.
        with pytest.raises(ValueError):
            order.AddIG("0.0.0.0", [muffin_bun.GetID()], [1])

        with pytest.raises(ValueError):
            order.AddIG("0.0.0.0", [muffin_bun.GetID()], [4])

        order.AddIG("0.0.0.0", [muffin_bun.GetID()], [2])
        assert order.GetPrice() == 12

        # Can't complete the order without choosing at least one patty.
        with pytest.raises(RuntimeError):
            order.Pay()

        # Can't choose more than three types of patties.
        with pytest.raises(ValueError):
            order.AddIG("0.1", [
                chicken_patty.GetID(),
                beef_patty.GetID(),
                vegetarian_patty.GetID(),
                tuna_patty.GetID()
            ], [1, 1, 1, 1])

        # Can't choose more than three patties.
        with pytest.raises(ValueError):
            order.AddIG("0.1", [
                chicken_patty.GetID(),
                beef_patty.GetID(),
                vegetarian_patty.GetID()
            ], [1, 1, 2])

        # Customer can't choose zero patties or more than 4 patties.
        with pytest.raises(ValueError):
            order.AddIG("0.1", [chicken_patty.GetID()], [0])

        with pytest.raises(ValueError):
            order.AddIG("0.1", [chicken_patty.GetID()], [4])

        order.AddIG("0.1", [chicken_patty.GetID()], [3])

        assert order.GetPrice() == 24

        # Patty has been fulfilled so RuntimeError is raised.
        with pytest.raises(RuntimeError):
            order.AddIG("0.1", [beef_patty.GetID()], [3])

        # Can't choose more than five types of ingredients.
        with pytest.raises(ValueError):
            order.AddIG("0.2", [
                tomato.GetID(),
                tomato_sauce.GetID(),
                bbq_sauce.GetID(),
                mint_sauce.GetID(),
                chocolate_sauce.GetID(),
                cheddar_cheese.GetID()
            ], [1, 1, 1, 1, 1, 1])

        # Can't choose more than five ingredients with more than one ingredient.
        with pytest.raises(ValueError):
            order.AddIG("0.2", [
                tomato.GetID(),
                tomato_sauce.GetID(),
                bbq_sauce.GetID(),
                mint_sauce.GetID(),
                cheddar_cheese.GetID()
            ], [1, 1, 2, 1, 1])

        # Can't choose more than five ingredients with one ingredient.
        with pytest.raises(ValueError):
            order.AddIG("0.2", [tomato.GetID()], [6])

        order.AddIG("0.2", [
            tomato.GetID(),
            tomato_sauce.GetID(),
            bbq_sauce.GetID(),
            mint_sauce.GetID(),
            cheddar_cheese.GetID()
        ], [1, 1, 1, 1, 1])
        assert order.GetPrice() == 27

        # Add second main.
        order.AddRootItem(main.GetID(), 1)
        order.AddIG("1.0", [wrap.GetID()], [1])
        assert order.GetPrice() == 32

        order.AddIG("1.1", [chicken_patty.GetID()], [3])
        assert order.GetPrice() == 44

        order.AddIG("1.2", [tomato.GetID()], [2])
        assert order.GetPrice() == 46

        order.AddRootItem(nuggets.GetID(), 1)

        # Can't choose more than one nuggets pack.
        with pytest.raises(ValueError):
            order.AddIG("2.0", [nuggets_3_pack.GetID()], [2])

        # Can't choose more than one type of nuggets pack.
        with pytest.raises(ValueError):
            order.AddIG("2.0",
                        [nuggets_3_pack.GetID(),
                         nuggets_3_pack.GetID()], [1, 1])

        order.AddIG("2.0", [nuggets_3_pack.GetID()], [1])

        # Can't pay before configure any sauces for nuggets.
        with pytest.raises(RuntimeError):
            order.Pay()

        # Can't choose more than three sauces.
        with pytest.raises(ValueError):
            order.AddIG("2.1", [tomato_sauce.GetID()], [4])

        # Can't choose more than three types of sauces.
        with pytest.raises(ValueError):
            order.AddIG("2.1", [
                tomato_sauce.GetID(),
                bbq_sauce.GetID(),
                chilli_sauce.GetID(),
                mint_sauce.GetID()
            ], [1, 1, 1, 1])

        order.AddIG("2.1", [tomato_sauce.GetID()], [0])
        assert order.GetPrice() == 54

        order.AddRootItem(fries.GetID(), 1)

        # Can't pay without choosing a pack of fries.
        with pytest.raises(RuntimeError):
            order.Pay()

        # Can't choose more than one pack of fries.
        with pytest.raises(ValueError):
            order.AddIG("3.0", [small_size.GetID()], [2])

        # Can't choose more than one type of fries.
        with pytest.raises(ValueError):
            order.AddIG(
                "3.0",
                [small_size.GetID(), medium_size.GetID()], [1, 1])

        order.AddIG("3.0", [small_size.GetID()], [1])
        assert order.GetPrice() == 56

        # Can't pay without choosing any sauces.
        with pytest.raises(RuntimeError):
            order.Pay()

        # Can't choose more than three sauces.
        with pytest.raises(ValueError):
            order.AddIG("3.1", [tomato_sauce.GetID()], [4])

        # Can't choose more than three types of sauces.
        with pytest.raises(ValueError):
            order.AddIG("3.1", [
                tomato_sauce.GetID(),
                bbq_sauce.GetID(),
                chilli_sauce.GetID(),
                mint_sauce.GetID()
            ], [1, 1, 1, 1])

        order.AddIG("3.1", [tomato_sauce.GetID()], [0])

        order.AddRootItem(coke.GetID(), 1)

        # Can't pay without choosing a coke.
        with pytest.raises(RuntimeError):
            order.Pay()

        # Can't choose more than one coke.
        with pytest.raises(ValueError):
            order.AddIG("4.0", [small_coke.GetID()], [2])

        # Can't choose more than one type of coke.
        with pytest.raises(ValueError):
            order.AddIG(
                "4.0",
                [small_coke.GetID(), medium_coke.GetID()], [1, 1])

        order.AddIG("4.0", [medium_coke.GetID()], [1])
        assert order.GetPrice() == 57

        # Buy a chocolate flavor sundaes
        order.AddRootItem(sundaes.GetID(), 1)

        order.AddIG("5.0", [chocolate_flavor.GetID()], [1])

        with pytest.raises(RuntimeError):
            order.AddIG("5.0", [strawberry_flavor.GetID()], [1])

        order.AddIG("5.1", [small_sundaes.GetID()], [1])

        with pytest.raises(RuntimeError):
            order.AddIG("5.1", [large_sundaes.GetID()], [1])

        assert order.GetPrice() == 60

        # Buy a strawberry flavor sundaes
        order.AddRootItem(sundaes.GetID(), 1)

        order.AddIG("6.0", [strawberry_flavor.GetID()], [1])

        with pytest.raises(RuntimeError):
            order.AddIG("6.0", [chocolate_flavor.GetID()], [1])

        order.AddIG("6.1", [medium_sundaes.GetID()], [1])

        with pytest.raises(RuntimeError):
            order.AddIG("6.1", [large_sundaes.GetID()], [1])

        assert order.GetPrice() == 64

        db.session.add(order)
        db.session.commit()

        assert order.GetStatus() == OrderStatus.CREATED

        order.Pay()
        db.session.commit()

        assert order.GetStatus() == OrderStatus.PAID
        assert order.GetPrice() == 64
示例#11
0
def create_order(sid: str) -> Order:
    session = session_utility.get_session(sid)
    order = Order()
    if session.cart is None:
        raise ValueError('В корзине нет товаров')
    order.cart = session.cart
    order.user = User.get_by_username(session.user)
    order.contragent = session.contragent
    order.comment = session.comment
    order._price = session.cart.subtotal
    order.sale = session.sale
    order.time_created = datetime.datetime.now(
        tz=pytz.timezone('Europe/Moscow'))
    num = utility.find_last_order_num()
    order.order_num = 'РВ-' + str(num + 1)
    order._number = num + 1
    order.save()
    return order
示例#12
0
def find_last_order_num():
    last_num = Order.objects().order_by('-_number').only('_number')
    if last_num.count() == 0 or last_num[0]._number is None:
        return 0
    return last_num[0]._number
示例#13
0
def get_order(order_id):
    return Order.objects(id=order_id)[0]
示例#14
0
def NewOrder():
    order = Order(user_id=session['uid'], status=OrderStatus.CREATED, price=0)
    db.session.add(order)
    db.session.commit()
    return redirect("/order/%d/menu" % order.GetID())