From 91653eccccd313a8847e02aa5ab2418cd5ac0e6b Mon Sep 17 00:00:00 2001 From: Roman Korenkov Date: Thu, 30 Jul 2026 12:09:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0=20?= =?UTF-8?q?class=20burger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + burger.py | 7 +- database.py | 6 +- praktikum.py | 8 +- tests/__init__.py | 0 tests/test_burger.py | 230 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 245 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 tests/__init__.py create mode 100644 tests/test_burger.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ae2f86f33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +.pytest_cache +__pycache__ diff --git a/burger.py b/burger.py index 2b3b6a88b..d5ce92bab 100644 --- a/burger.py +++ b/burger.py @@ -1,7 +1,7 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient +from bun import Bun +from ingredient import Ingredient class Burger: @@ -46,3 +46,6 @@ def get_receipt(self) -> str: receipt.append(f'Price: {self.get_price()}') return '\n'.join(receipt) + + + diff --git a/database.py b/database.py index 4c75baf71..84d3685d0 100644 --- a/database.py +++ b/database.py @@ -1,8 +1,8 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient -from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING +from bun import Bun +from ingredient import Ingredient +from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING class Database: diff --git a/praktikum.py b/praktikum.py index ec522fa6d..88b77abd1 100644 --- a/praktikum.py +++ b/praktikum.py @@ -1,9 +1,9 @@ from typing import List -from praktikum.bun import Bun -from praktikum.burger import Burger -from praktikum.database import Database -from praktikum.ingredient import Ingredient +from bun import Bun +from burger import Burger +from database import Database +from ingredient import Ingredient def main(): diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..0be7ceaa8 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,230 @@ +import pytest +from unittest.mock import Mock +from burger import Burger +from bun import Bun +from ingredient import Ingredient + + +class TestBurger: + + def test_burger_initial_state(self): + "Проверка начального состояния бургера" + burger = Burger() + assert burger.bun is None + assert burger.ingredients == [] + assert len(burger.ingredients) == 0 + + def test_set_buns(self): + "Проверка установки булочки" + burger = Burger() + bun = Bun("Sesame Bun", 50) + burger.set_buns(bun) + assert burger.bun is bun + assert burger.bun.get_name() == "Sesame Bun" + assert burger.bun.get_price() == 50 + + def test_set_buns_with_mock(self): + "Проверка установки булочки с моком" + burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_name.return_value = "Mock Bun" + mock_bun.get_price.return_value = 175 + burger.set_buns(mock_bun) + assert burger.bun is mock_bun + + @pytest.mark.parametrize("bun_name,bun_price", [ + ("Sesame Bun", 50), + ("Black Bun", 100), + ("Red Bun", 300), + ("White Bun", 200), + ]) + def test_set_installing_different_buns(self, bun_name, bun_price): + "Установка различных булочек" + burger = Burger() + bun = Bun(bun_name, bun_price) + burger.set_buns(bun) + assert burger.bun.get_name() == bun_name + assert burger.bun.get_price() == bun_price + + def test_set_buns_replace(self): + "Проверка замены булочки" + burger = Burger() + bun1 = Bun("White Bun", 200) + bun2 = Bun("Black Bun", 100) + burger.set_buns(bun1) + assert burger.bun.get_name() == "White Bun" + burger.set_buns(bun2) + assert burger.bun.get_name() == "Black Bun" + assert burger.bun.get_price() == 100 + + def test_add_ingredient(self): + "Проверка добавления ингредиента" + burger = Burger() + bun = Bun("white bun", 200) + burger.set_buns(bun) + ingredient = Ingredient("FILLING", "dinosaur", 200) + burger.add_ingredient(ingredient) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] is ingredient + assert burger.ingredients[0].get_name() == "dinosaur" + + def test_add_ingredient_with_mock(self): + "Проверка добавления ингредиента с моком" + burger = Burger() + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_type.return_value = "FILLING" + mock_ingredient.get_name.return_value = "Mock Ingredient" + mock_ingredient.get_price.return_value = 275 + burger.add_ingredient(mock_ingredient) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] is mock_ingredient + + def test_add_multiple_ingredients(self): + "Проверка добавления нескольких ингредиентов" + burger = Burger() + ingredients = [ + Ingredient("FILLING", "cutlet", 100), + Ingredient("SAUCE", "sour cream", 200), + Ingredient("FILLING", "sausage", 300), + Ingredient("SAUCE", "chili sauce", 300), + ] + for ing in ingredients: + burger.add_ingredient(ing) + assert len(burger.ingredients) == 4 + assert burger.ingredients == ingredients + + def test_remove_ingredient(self): + "Проверка удаления ингредиента" + burger = Burger() + bun = Bun("white bun", 200) + burger.set_buns(bun) + ingredient1 = Ingredient("FILLING", "dinosaur", 200) + ingredient2 = Ingredient("SAUCE", "hot sauce", 100) + burger.add_ingredient(ingredient1) + burger.add_ingredient(ingredient2) + assert len(burger.ingredients) == 2 + burger.remove_ingredient(0) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] is ingredient2 + assert burger.ingredients[0].get_name() == "hot sauce" + + def test_move_ingredient(self): + "Проверка перемещения ингредиента" + burger = Burger() + bun = Bun("white bun", 200) + burger.set_buns(bun) + ingredient1 = Ingredient("FILLING", "dinosaur", 200) + ingredient2 = Ingredient("FILLING", "cutlet", 100) + ingredient3 = Ingredient("SAUCE", "hot sauce", 100) + burger.add_ingredient(ingredient1) + burger.add_ingredient(ingredient2) + burger.add_ingredient(ingredient3) + assert burger.ingredients == [ingredient1, ingredient2, ingredient3] + burger.move_ingredient(0, 2) + assert burger.ingredients == [ingredient2, ingredient3, ingredient1] + + def test_get_price_only_bun(self): + "Проверка цены только булочек" + burger = Burger() + bun = Bun("White Bun", 200) + burger.set_buns(bun) + assert burger.get_price() == 400 + + @pytest.mark.parametrize( + "bun_name,bun_price,ingredients_data,expected_total", + [ + ("black bun", 100, [], 200), + ("white bun", 200, [("FILLING", "cutlet", 100)], 500), + ("red bun", 300, [("FILLING", "cutlet", 100), ("SAUCE", "hot sauce", 100)], 800), + ("black bun", 100, [("FILLING", "dinosaur", 200), ("FILLING", "sausage", 300), ("SAUCE", "chili sauce", 300)], 1000), + ] + ) + def test_get_price_with_different_combinations(self, bun_name, bun_price, ingredients_data, expected_total): + "Проверка цены с различными комбинациями ингредиентов" + burger = Burger() + bun = Bun(bun_name, bun_price) + burger.set_buns(bun) + for ing_type, ing_name, ing_price in ingredients_data: + ingredient = Ingredient(ing_type, ing_name, ing_price) + burger.add_ingredient(ingredient) + assert burger.get_price() == expected_total + + def test_get_price_with_mock_ingredients(self): + "Проверка ингредиентов с моками" + burger = Burger() + bun = Bun("Test Bun", 100) + burger.set_buns(bun) + mock_ingredient1 = Mock(spec=Ingredient) + mock_ingredient1.get_price.return_value = 150 + mock_ingredient2 = Mock(spec=Ingredient) + mock_ingredient2.get_price.return_value = 200 + burger.add_ingredient(mock_ingredient1) + burger.add_ingredient(mock_ingredient2) + assert burger.get_price() == 550 + + + def test_get_receipt(self): + "Проверка формирования рецепта" + burger = Burger() + bun = Bun("Sesame Bun", 50) + burger.set_buns(bun) + ingredient1 = Ingredient("FILLING", "dinosaur", 200) + ingredient2 = Ingredient("SAUCE", "hot sauce", 100) + burger.add_ingredient(ingredient1) + burger.add_ingredient(ingredient2) + receipt = burger.get_receipt() + assert ("(==== Sesame Bun ====)") in receipt + assert "= filling dinosaur =" in receipt + assert "= sauce hot sauce =" in receipt + assert "Price: 400" in receipt + assert receipt.count("(==== Sesame Bun ====)") == 2 + + def test_get_receipt_no_ingredients(self): + "Проверка рецепта без ингредиентов" + burger = Burger() + bun = Bun("White Bun", 200) + burger.set_buns(bun) + receipt = burger.get_receipt() + assert "(==== White Bun ====)" in receipt + assert receipt.count("(==== White Bun ====") == 2 + assert "Price: 400" in receipt + + @pytest.mark.parametrize( + "ingredient_type,ingredient_name,ingredient_price", + [ + ("FILLING", "cutlet", 100), + ("SAUCE", "sour cream", 200), + ("FILLING", "sausage", 300), + ("SAUCE", "chili sauce", 300), + ] + ) + def test_receipt_with_different_ingredients(self, ingredient_type, ingredient_name, ingredient_price): + "Проверка рецепта с различными ингредиентами" + burger = Burger() + bun = Bun("White Bun", 100) + burger.set_buns(bun) + ingredient = Ingredient(ingredient_type, ingredient_name, ingredient_price) + burger.add_ingredient(ingredient) + receipt = burger.get_receipt() + expected_type_lower = ingredient_type.lower() + assert f"= {expected_type_lower} {ingredient_name} =" in receipt + assert f"Price: {100 * 2 + ingredient_price}" in receipt + + def test_get_receipt_format(self): + burger = Burger() + bun = Bun("black bun", 100) + burger.set_buns(bun) + ingredient1 = Ingredient("FILLING", "cutlet", 100) + ingredient2 = Ingredient("SAUCE", "hot sauce", 100) + burger.add_ingredient(ingredient1) + burger.add_ingredient(ingredient2) + receipt = burger.get_receipt() + lines = receipt.split('\n') + assert lines[0] == "(==== black bun ====)" + assert "= filling cutlet =" in lines[1] + assert "= sauce hot sauce =" in lines[2] + assert "(==== black bun ====)" in lines[3] + assert "" in lines[4] + assert "Price: 400" in lines[5] + + \ No newline at end of file