From db53541aead1e9149b8edb70f2bd480bd7bc5262 Mon Sep 17 00:00:00 2001 From: miracle666 Date: Tue, 21 Jul 2026 22:58:45 +0300 Subject: [PATCH] Complete task Diplom_1 --- .gitignore | 12 ++ README.md | 17 +-- data.py | 25 ++++ praktikum/__init__.py | 0 bun.py => praktikum/bun.py | 0 burger.py => praktikum/burger.py | 0 database.py => praktikum/database.py | 0 ingredient.py => praktikum/ingredient.py | 0 .../ingredient_types.py | 0 praktikum.py => praktikum/praktikum.py | 0 requirements.txt | Bin 0 -> 70 bytes tests/test_burger.py | 106 ++++++++++++++++ tests/test_burn.py | 52 ++++++++ tests/test_database.py | 26 ++++ tests/test_ingredient.py | 118 ++++++++++++++++++ 15 files changed, 342 insertions(+), 14 deletions(-) create mode 100644 .gitignore create mode 100644 data.py create mode 100644 praktikum/__init__.py rename bun.py => praktikum/bun.py (100%) rename burger.py => praktikum/burger.py (100%) 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/test_burger.py create mode 100644 tests/test_burn.py create mode 100644 tests/test_database.py create mode 100644 tests/test_ingredient.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..1f8c6f628 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +venv/ +.venv/ +__pycache__/ +*.py[cod] +.pytest_cache/ +.coverage +.coverage.* +coverage.xml +.vscode/ +.idea/ +.DS_Store +Thumbs.d \ No newline at end of file diff --git a/README.md b/README.md index 272081708..05074eea4 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,8 @@ Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` -Процент покрытия 100% (отчет: `htmlcov/index.html`) +### Тестовое покрытие -### Структура проекта +Тесты запускаются с помощью `pytest-cov`. -- `praktikum` - пакет, содержащий код программы -- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. - -### Запуск автотестов - -**Установка зависимостей** - -> `$ pip install -r requirements.txt` - -**Запуск автотестов и создание HTML-отчета о покрытии** - -> `$ pytest --cov=praktikum --cov-report=html` +Общее тестовое покрытие проекта — **77.53%**. \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 000000000..01f62322a --- /dev/null +++ b/data.py @@ -0,0 +1,25 @@ +class Data: + + BLACK_BUN = "black bun" + WHITE_BUN = "white bun" + RED_BUN = "red bun" + + BLACK_BUN_PRICE = 100 + WHITE_BUN_PRICE = 200 + RED_BUN_PRICE = 300 + + HOT_SAUCE = "hot sauce" + SOUR_CREAM = "sour cream" + CHILLI_SAUCE = "chili sauce" + + HOT_SAUCE_PRICE = 100 + SOUR_CREAM_PRICE = 200 + CHILLI_SAUCE_PRICE = 300 + + CUTLET = "cutlet" + DINOSAUR = "dinosaur" + SAUSAGE = "sausage" + + CUTLET_PRICE = 100 + DINOSAUR_PRICE = 200 + SAUSAGE_PRICE = 300 \ No newline at end of file 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 100% rename from burger.py rename to praktikum/burger.py 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 0000000000000000000000000000000000000000..ad435c5fc2fab0459d1f215242281dd5fca184ed GIT binary patch literal 70 zcmezWuYjSFp@boop%_To0-+^?9)kf88!_-Qa4{gu>M|rV}9 C1Pjst literal 0 HcmV?d00001 diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..690a27a12 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,106 @@ +from unittest.mock import Mock + +from praktikum.burger import Burger +from praktikum.bun import Bun + +from data import Data +from praktikum.ingredient_types import INGREDIENT_TYPE_FILLING + + +class TestBurger: + + + def test_set_buns(self): + + burger = Burger() + + bun = Bun( + Data.BLACK_BUN, + Data.BLACK_BUN_PRICE + ) + + burger.set_buns(bun) + + assert burger.bun == bun + + + def test_add_ingredient(self): + + burger = Burger() + + ingredient = Mock() + + burger.add_ingredient(ingredient) + + assert burger.ingredients[0] == ingredient + + + def test_remove_ingredient(self): + + burger = Burger() + + ingredient = Mock() + + burger.add_ingredient(ingredient) + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 0 + + + def test_move_ingredient(self): + + burger = Burger() + + first = Mock() + second = Mock() + + burger.add_ingredient(first) + burger.add_ingredient(second) + + burger.move_ingredient(0, 1) + + assert burger.ingredients[0] == second + assert burger.ingredients[1] == first + + + def test_get_price(self): + + burger = Burger() + + bun = Mock() + bun.get_price.return_value = 100 + + ingredient = Mock() + ingredient.get_price.return_value = 50 + + burger.set_buns(bun) + burger.add_ingredient(ingredient) + + assert burger.get_price() == 250 + + + def test_get_receipt(self): + + burger = Burger() + + bun = Bun( + Data.RED_BUN, + Data.RED_BUN_PRICE + ) + + ingredient = Mock() + ingredient.get_type.return_value = INGREDIENT_TYPE_FILLING + ingredient.get_name.return_value = Data.CUTLET + ingredient.get_price.return_value = Data.CUTLET_PRICE + + burger.set_buns(bun) + burger.add_ingredient(ingredient) + + expected_result = ( + "(==== red bun ====)\n" + "= filling cutlet =\n" + "(==== red bun ====)\n\n" + "Price: 700" + ) + + assert burger.get_receipt() == expected_result \ No newline at end of file diff --git a/tests/test_burn.py b/tests/test_burn.py new file mode 100644 index 000000000..352c08f41 --- /dev/null +++ b/tests/test_burn.py @@ -0,0 +1,52 @@ +import pytest + +from praktikum.bun import Bun +from data import Data + + +class TestBun: + + @pytest.mark.parametrize( + "name, price", + [ + (Data.BLACK_BUN, Data.BLACK_BUN_PRICE), + (Data.WHITE_BUN, Data.WHITE_BUN_PRICE), + (Data.RED_BUN, Data.RED_BUN_PRICE) + ] + ) + def test_init(self, name, price): + + bun = Bun(name, price) + + assert bun.name == name + assert bun.price == price + + + @pytest.mark.parametrize( + "name, price", + [ + (Data.BLACK_BUN, Data.BLACK_BUN_PRICE), + (Data.WHITE_BUN, Data.WHITE_BUN_PRICE), + (Data.RED_BUN, Data.RED_BUN_PRICE) + ] + ) + def test_get_name(self, name, price): + + bun = Bun(name, price) + + assert bun.get_name() == name + + + @pytest.mark.parametrize( + "name, price", + [ + (Data.BLACK_BUN, Data.BLACK_BUN_PRICE), + (Data.WHITE_BUN, Data.WHITE_BUN_PRICE), + (Data.RED_BUN, Data.RED_BUN_PRICE) + ] + ) + def test_get_price(self, name, price): + + bun = Bun(name, price) + + assert bun.get_price() == price \ No newline at end of file diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..b0c1db20b --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,26 @@ +from praktikum.database import Database + +from data import Data + + +class TestDatabase: + + + def test_available_buns(self): + + database = Database() + + buns = database.available_buns() + + assert len(buns) == 3 + assert buns[0].get_name() == Data.BLACK_BUN + + + def test_available_ingredients(self): + + database = Database() + + ingredients = database.available_ingredients() + + assert len(ingredients) == 6 + assert ingredients[0].get_name() == Data.HOT_SAUCE \ No newline at end of file diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..df81a0a76 --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,118 @@ +import pytest + +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import ( + INGREDIENT_TYPE_SAUCE, + INGREDIENT_TYPE_FILLING +) + +from data import Data + + +class TestIngredient: + + + @pytest.mark.parametrize( + "ingredient_type, name, price", + [ + ( + INGREDIENT_TYPE_SAUCE, + Data.HOT_SAUCE, + Data.HOT_SAUCE_PRICE + ), + ( + INGREDIENT_TYPE_SAUCE, + Data.SOUR_CREAM, + Data.SOUR_CREAM_PRICE + ), + ( + INGREDIENT_TYPE_SAUCE, + Data.CHILLI_SAUCE, + Data.CHILLI_SAUCE_PRICE + ), + ( + INGREDIENT_TYPE_FILLING, + Data.CUTLET, + Data.CUTLET_PRICE + ), + ( + INGREDIENT_TYPE_FILLING, + Data.DINOSAUR, + Data.DINOSAUR_PRICE + ), + ( + INGREDIENT_TYPE_FILLING, + Data.SAUSAGE, + Data.SAUSAGE_PRICE + ) + ] + ) + def test_init( + self, + ingredient_type, + name, + price + ): + + ingredient = Ingredient( + ingredient_type, + name, + price + ) + + assert ingredient.type == ingredient_type + assert ingredient.name == name + assert ingredient.price == price + + + @pytest.mark.parametrize( + "ingredient_type, name, price", + [ + ( + INGREDIENT_TYPE_SAUCE, + Data.HOT_SAUCE, + Data.HOT_SAUCE_PRICE + ), + ( + INGREDIENT_TYPE_FILLING, + Data.CUTLET, + Data.CUTLET_PRICE + ) + ] + ) + def test_get_price( + self, + ingredient_type, + name, + price + ): + + ingredient = Ingredient( + ingredient_type, + name, + price + ) + + assert ingredient.get_price() == price + + + def test_get_name(self): + + ingredient = Ingredient( + INGREDIENT_TYPE_SAUCE, + Data.HOT_SAUCE, + Data.HOT_SAUCE_PRICE + ) + + assert ingredient.get_name() == Data.HOT_SAUCE + + + def test_get_type(self): + + ingredient = Ingredient( + INGREDIENT_TYPE_FILLING, + Data.CUTLET, + Data.CUTLET_PRICE + ) + + assert ingredient.get_type() == INGREDIENT_TYPE_FILLING \ No newline at end of file