Ejemplo n.º 1
0
    def test_out_of_stock(self):
        empty_system = GourmetBurgerSystem()
        bun_string_list = ['Sesame bun']
        buns = [
            empty_system.get_object_by_name(bun) for bun in bun_string_list
        ]

        with pytest.raises(OutOfStockError) as e:
            GourmetBurgerSystem.check_item_list(buns)
        assert "Sesame bun" in e.value.msg
Ejemplo n.º 2
0
class TestSystem:
    def setup_method(self):
        self.system = GourmetBurgerSystem()
        assert self.system != None
        assert self.system.drinks != None
        assert self.system.sides != None
        assert self.system.ingredients != None
        assert self.system.buns != None

    def test_create_new_order(self):
        self.order_id = self.system.create_new_order()
        assert self.order_id != None
        assert self.order_id == '0'

    def test_order_exists(self):
        self.order_id = self.system.create_new_order()
        assert self.system.id_exists(self.order_id)
        assert self.system.id_exists("100") == False

    def test_successful_order(self):
        # making an order of every item on the menu
        items = []
        items += self.system.sides
        items += self.system.drinks

        for item in items:
            item.increment(item.quantity_per_serving)

        # creating the order
        self.order_id = self.system.create_new_order()

        order = self.system.get_order_by_id(self.order_id)
        print(self.system._stock_levels)
        order.set_sides(self.system.sides)
        order.set_drinks(self.system.drinks)

        assert order.price == sum([item.price for item in items])
        assert order.status == "selection"
        assert order.sides == tuple(self.system.sides)
        assert order.drinks == tuple(self.system.drinks)

        GourmetBurgerSystem.checkout(order)

        assert order.status == "being prepared"

        #checking the stock levels after placing order
        for (key, (value, units)) in self.system._stock_levels.items():
            assert value == 0

    def test_staff_update_order(self):
        self.order_id = self.system.create_new_order()
        order = self.system.get_order_by_id(self.order_id)
        assert order.status == "selection"
        order.status = "ready"

        assert order.status == "ready"

    def test_customer_check_order(self):
        self.order_id = self.system.create_new_order()
        order = self.system.get_order_by_id(self.order_id)

        print(order)

    def test_stock_shortage(self):
        # set stock levels to the minimum ammount required to order all sides and drinks on the menu
        items = []
        items += self.system.sides
        items += self.system.drinks

        for item in items:
            item.increment(1)

        for item in items:
            if item.name == "Large Fries":
                item.stock = item.stock - 1
            if item.name == "Large Orange Juice":
                item.stock = item.stock - 1

        self.order_id = self.system.create_new_order()

        order = self.system.get_order_by_id(self.order_id)

        try:
            order.set_sides(self.system.sides)
        except OutOfStockError as e:
            assert "Large Fries" in e.msg

        try:
            order.set_drinks(self.system.drinks)
        except OutOfStockError as e:
            assert "Large Orange Juice" in e.msg

    def test_two_orders_with_stock(self):
        items = []
        items += self.system.sides
        items += self.system.drinks

        for item in items:
            item.increment(item.quantity_per_serving)
            item.increment(item.quantity_per_serving)

        self.order_id = self.system.create_new_order()
        order1 = self.system.get_order_by_id(self.order_id)
        self.order_id = self.system.create_new_order()
        order2 = self.system.get_order_by_id(self.order_id)
        assert order1 != order2

        # placing order 1 - valid
        order1.set_sides(self.system.sides)
        order1.set_drinks(self.system.drinks)
        assert order1.price == sum([item.price for item in items])
        assert order1.status == "selection"
        assert order1.sides == tuple(self.system.sides)
        assert order1.drinks == tuple(self.system.drinks)
        GourmetBurgerSystem.checkout(order1)
        assert order1.status == "being prepared"

        # placing order 2 - valid
        order2.set_sides(self.system.sides)
        order2.set_drinks(self.system.drinks)
        assert order2.price == sum([item.price for item in items])
        assert order2.status == "selection"
        assert order2.sides == tuple(self.system.sides)
        assert order2.drinks == tuple(self.system.drinks)
        GourmetBurgerSystem.checkout(order2)
        assert order2.status == "being prepared"

    def test_two_orders_when_stock_runs_out(self):
        items = []
        items += self.system.sides
        items += self.system.drinks

        for item in items:
            item.increment(item.quantity_per_serving)

        self.order_id = self.system.create_new_order()
        order1 = self.system.get_order_by_id(self.order_id)
        self.order_id = self.system.create_new_order()
        order2 = self.system.get_order_by_id(self.order_id)
        assert order1 != order2

        # placing order 1 - valid
        order1.set_sides(self.system.sides)
        order1.set_drinks(self.system.drinks)
        assert order1.price == sum([item.price for item in items])
        assert order1.status == "selection"
        assert order1.sides == tuple(self.system.sides)
        assert order1.drinks == tuple(self.system.drinks)
        GourmetBurgerSystem.checkout(order1)
        assert order1.status == "being prepared"

        # placing order 2 - not valid
        try:
            order2.set_sides(self.system.sides)
        except OutOfStockError as e:
            assert "Large Fries" in e.msg

        try:
            order2.set_drinks(self.system.drinks)
        except OutOfStockError as e:
            assert "Large Orange Juice" in e.msg

        assert order2.status == "selection"

    def test_confirmation_print_out(self):
        items = []
        items += self.system.sides
        for item in items:
            item.increment(item.quantity_per_serving)
        self.order_id = self.system.create_new_order()
        order = self.system.get_order_by_id(self.order_id)
        # print(self.system._stock_levels)
        order.set_sides(self.system.sides)
        GourmetBurgerSystem.checkout(order)
        self.system.print_order(self.order_id)

    def test_stock_levels_set(self):

        # Check stock levels setting

        self.system = GourmetBurgerSystem()

        dictionary = {'Nuggets': '3'}

        self.system.update_stock_levels(dictionary)

        assert self.system.stock_levels['Nuggets'] == [3, 'pcs']

        dictionary['Nuggets'] = 4

        assert self.system.stock_levels['Nuggets'] == [3, 'pcs']

        # test attempted insertion of a new key
        dictionary = {'new_key': 0}

        self.system.update_stock_levels(dictionary)

        print(self.system.stock_levels)

        assert 'new_key' not in self.system.stock_levels

        # test invalid alphabet character
        dictionary = {'Nuggets': 'a'}

        with pytest.raises(StockSetterError) as e:
            self.system.update_stock_levels(dictionary)
        assert e.value.errors['Nuggets'] == 'Please enter an integer.'
        assert self.system.stock_levels['Nuggets'] != ['a', 'pcs']
        assert self.system.stock_levels['Nuggets'] == [3, 'pcs']

        # test negative stock level
        dictionary = {'Nuggets': '-1'}

        with pytest.raises(StockSetterError) as e:
            self.system.update_stock_levels(dictionary)
        assert e.value.errors[
            'Nuggets'] == 'Please enter a stock level greater than 0.'
        assert self.system.stock_levels['Nuggets'] != ['-1', 'pcs']
        assert self.system.stock_levels['Nuggets'] == [3, 'pcs']

        # test valid and invalid input
        dictionary = {
            'Nuggets': '-1',
            'Fries': 5,
        }

        with pytest.raises(StockSetterError) as e:
            self.system.update_stock_levels(dictionary)
        assert e.value.errors[
            'Nuggets'] == 'Please enter a stock level greater than 0.'
        assert self.system.stock_levels['Nuggets'] != ['-1', 'pcs']
        assert self.system.stock_levels['Fries'] == [5, 'grams']

    def test_get_orders(self):
        self.system = GourmetBurgerSystem()

        self.system.create_new_order()
        self.system.create_new_order()

        assert self.system.orders == self.system._order_manager.orders

    def test_lookups(self):

        self.system = GourmetBurgerSystem()

        items = (*self.system.sides, *self.system.drinks,
                 *self.system.ingredients, *self.system.buns)

        for item in items:
            assert item == self.system.get_object_by_name(item.name)