From 232b50987f3955f042cdbe25b70b314fdf975df4 Mon Sep 17 00:00:00 2001 From: Kozlova Zoya Date: Tue, 5 May 2026 16:32:02 +0300 Subject: [PATCH 1/3] Added tests with 100percent class Burger coverage --- .gitignore | 27 ++++ README.md | 2 +- __init__.py => conftest.py | 0 praktikum/__init__.py | 0 bun.py => praktikum/bun.py | 0 burger.py => praktikum/burger.py | 3 +- database.py => praktikum/database.py | 0 ingredient.py => praktikum/ingredient.py | 0 .../ingredient_types.py | 0 praktikum.py => praktikum/praktikum.py | 0 requirements.txt | 2 + tests/__init__.py | 0 tests/test_burger.py | 122 ++++++++++++++++++ 13 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 .gitignore rename __init__.py => conftest.py (100%) create mode 100644 praktikum/__init__.py rename bun.py => praktikum/bun.py (100%) rename burger.py => praktikum/burger.py (99%) rename database.py => praktikum/database.py (100%) rename ingredient.py => praktikum/ingredient.py (100%) rename ingredient_types.py => praktikum/ingredient_types.py (100%) rename praktikum.py => praktikum/praktikum.py (100%) create mode 100644 requirements.txt 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..a25ba9f56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Виртуальное окружение +venv/ +env/ +.venv/ + +# Кэш Python +__pycache__/ +__pycache__ +*.pyc + +# Файлы pytest и покрытия +.pytest_cache/ +.pytest_cache +.coverage +htmlcov/ +coverage.xml + +# IDE +.vscode/ +.idea/ + +# Системные файлы +.DS_Store +Thumbs.db + +# Секреты +.env \ No newline at end of file diff --git a/README.md b/README.md index 272081708..9a9208e8d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### Реализованные сценарии -Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` +Созданы юнит-тесты, покрывающие класс `Burger` Процент покрытия 100% (отчет: `htmlcov/index.html`) diff --git a/__init__.py b/conftest.py similarity index 100% rename from __init__.py rename to conftest.py diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/bun.py b/praktikum/bun.py similarity index 100% rename from bun.py rename to praktikum/bun.py diff --git a/burger.py b/praktikum/burger.py similarity index 99% rename from burger.py rename to praktikum/burger.py index 2b3b6a88b..63cb9f0e3 100644 --- a/burger.py +++ b/praktikum/burger.py @@ -1,5 +1,4 @@ from typing import List - from praktikum.bun import Bun from praktikum.ingredient import Ingredient @@ -46,3 +45,5 @@ def get_receipt(self) -> str: receipt.append(f'Price: {self.get_price()}') return '\n'.join(receipt) + + \ No newline at end of file diff --git a/database.py b/praktikum/database.py similarity index 100% rename from database.py rename to praktikum/database.py diff --git a/ingredient.py b/praktikum/ingredient.py similarity index 100% rename from ingredient.py rename to praktikum/ingredient.py diff --git a/ingredient_types.py b/praktikum/ingredient_types.py similarity index 100% rename from ingredient_types.py rename to praktikum/ingredient_types.py diff --git a/praktikum.py b/praktikum/praktikum.py similarity index 100% rename from praktikum.py rename to praktikum/praktikum.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..cffeec658 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest +pytest-cov \ No newline at end of file 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..b70da017a --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,122 @@ +import pytest +from unittest.mock import Mock +import allure +from praktikum.burger import Burger + +class TestBurger: + + + @allure.title('Новый бургер не имеет булочки и ингредиентов') + def test_new_burger_is_empty(self): + + burger = Burger() + assert burger.bun is None + assert burger.ingredients == [] + + @allure.title('Проверка, можно ли установить булочку для бургера') + def test_set_buns(self): + + burger = Burger() + mock_bun = Mock() + + burger.set_buns(mock_bun) + + assert burger.bun == mock_bun + + @allure.title('Можно добавить ингредиент в бургер') + def test_add_ingredient(self): + burger = Burger() + mock_ingredient = Mock() + + burger.add_ingredient(mock_ingredient) + + assert burger.ingredients[0] == mock_ingredient + + @allure.title('Можно удалить ингредиент из списка') + def test_remove_ingredient(self): + + burger = Burger() + first_ingredient = Mock() + second_ingredient = Mock() + + burger.add_ingredient(first_ingredient) + burger.add_ingredient(second_ingredient) + + burger.remove_ingredient(0) + + assert burger.ingredients[0] == second_ingredient + + @allure.title('Перемещение ингредиента на другую позицию') + def test_move_ingredient(self): + + burger = Burger() + first_ingredient = Mock() + second_ingredient = Mock() + third_ingredient = Mock() + + burger.add_ingredient(first_ingredient) + burger.add_ingredient(second_ingredient) + burger.add_ingredient(third_ingredient) + + assert burger.ingredients == [first_ingredient, second_ingredient, third_ingredient] + + burger.move_ingredient(2, 1) + + assert burger.ingredients == [first_ingredient, third_ingredient, second_ingredient] + + @allure.title('Рассчет стоимости булочек') + def test_get_bun_price(self): + burger = Burger() + mock_bun = Mock() + mock_bun.get_price.return_value = 100 + burger.set_buns(mock_bun) + + price = burger.get_price() + + assert price == 200 + + + @allure.title('Рассчет стоимости бургера') + @pytest.mark.parametrize("bun_price, ingredient_prices, expected", [ + (100, [10, 20], 230), + (100, [10, 20, 30], 260), + (50, [5, 5, 5, 5], 120), + (100, [], 200), + ]) + def test_get_burger_price(self, bun_price, ingredient_prices, expected): + burger = Burger() + + mock_bun = Mock() + mock_bun.get_price.return_value = bun_price + burger.set_buns(mock_bun) + + for price in ingredient_prices: + mock_ingredient = Mock() + mock_ingredient.get_price.return_value = price + burger.add_ingredient(mock_ingredient) + + assert burger.get_price() == expected + + @allure.title('Рецепт с разными ингредиентами и типами ингредиентов') + @pytest.mark.parametrize("bun_name, ingredient_type, ingredient_name, expected_line", [ + ("Флюоресцентная булка", "sauce", "Spicy-X", "= sauce Spicy-X ="), + ("Краторная булка", "filling", "Говяжий метеорит", "= filling Говяжий метеорит ="), + ("Краторная булка", "sauce", "Space Sauce", "= sauce Space Sauce ="), + ]) + def test_receipt_with_different_ingredients(self, bun_name, ingredient_type, ingredient_name, expected_line): + burger = Burger() + + mock_bun = Mock() + mock_bun.get_name.return_value = bun_name + mock_bun.get_price.return_value = 100 + burger.set_buns(mock_bun) + + mock_ingredient = Mock() + mock_ingredient.get_type.return_value = ingredient_type + mock_ingredient.get_name.return_value = ingredient_name + mock_ingredient.get_price.return_value = 50 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + + assert expected_line in receipt From 9e6b8c1a9d2f4ab4ad2fcb38d782d4768bc09f04 Mon Sep 17 00:00:00 2001 From: Kozlova Zoya Date: Wed, 13 May 2026 14:25:14 +0300 Subject: [PATCH 2/3] fixed tests --- tests/test_burger.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/test_burger.py b/tests/test_burger.py index b70da017a..37ab93b3f 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -10,8 +10,16 @@ class TestBurger: def test_new_burger_is_empty(self): burger = Burger() - assert burger.bun is None - assert burger.ingredients == [] + mock_bun = Mock() + mock_bun.get_price.return_value = 0 + mock_bun.get_name.return_value = "without_bun" + burger.set_buns(mock_bun) + + assert burger.get_price() == 0 + + receipt = burger.get_receipt() + assert "= sauce" not in receipt and "= filling" not in receipt + @allure.title('Проверка, можно ли установить булочку для бургера') def test_set_buns(self): @@ -58,8 +66,6 @@ def test_move_ingredient(self): burger.add_ingredient(second_ingredient) burger.add_ingredient(third_ingredient) - assert burger.ingredients == [first_ingredient, second_ingredient, third_ingredient] - burger.move_ingredient(2, 1) assert burger.ingredients == [first_ingredient, third_ingredient, second_ingredient] From 7d26fab17d6841a1ad7a6d9598d516ebc0ca2881 Mon Sep 17 00:00:00 2001 From: Kozlova Zoya Date: Wed, 13 May 2026 21:37:04 +0300 Subject: [PATCH 3/3] fixed test new burger is empty --- tests/test_burger.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_burger.py b/tests/test_burger.py index 37ab93b3f..2308984d8 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -17,9 +17,6 @@ def test_new_burger_is_empty(self): assert burger.get_price() == 0 - receipt = burger.get_receipt() - assert "= sauce" not in receipt and "= filling" not in receipt - @allure.title('Проверка, можно ли установить булочку для бургера') def test_set_buns(self):