From a561818fc9ee4f0c205735979f115d031949527d Mon Sep 17 00:00:00 2001 From: lanabanana1996 Date: Wed, 29 Jul 2026 12:08:32 +0300 Subject: [PATCH 1/7] Fix project package structure --- __init__.py => 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 => praktikum/ingredient_types.py | 0 praktikum.py => praktikum/praktikum.py | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename __init__.py => praktikum/__init__.py (100%) 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%) diff --git a/__init__.py b/praktikum/__init__.py similarity index 100% rename from __init__.py rename to praktikum/__init__.py 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 From a1a00bea39c748460c370f32d8dcdc7d308c59f5 Mon Sep 17 00:00:00 2001 From: lanabanana1996 Date: Wed, 29 Jul 2026 12:09:03 +0300 Subject: [PATCH 2/7] Add test dependencies and gitignore --- .gitignore | 5 +++++ requirements.txt | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 .gitignore create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..7ebf3e260 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +venv/ +__pycache__/ +.pytest_cache/ +htmlcov/ +.coverage diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..9955deccd --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest +pytest-cov From a267061ed5687fea2e34136fae406069ea9b0b72 Mon Sep 17 00:00:00 2001 From: lanabanana1996 Date: Wed, 29 Jul 2026 13:01:00 +0300 Subject: [PATCH 3/7] Add burger initialization tests --- pytest.ini | 2 ++ tests/test_burger.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 pytest.ini create mode 100644 tests/test_burger.py diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..a635c5c03 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +pythonpath = . diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..582292105 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,18 @@ +from praktikum.bun import Bun +from praktikum.burger import Burger + + +def test_burger_initializes_without_bun_and_ingredients(): + burger = Burger() + + assert burger.bun is None + assert burger.ingredients == [] + + +def test_set_buns_sets_bun(): + burger = Burger() + bun = Bun("black bun", 100) + + burger.set_buns(bun) + + assert burger.bun is bun From 8348bdc54f41900adc67ce7fbe84ffce1155bebd Mon Sep 17 00:00:00 2001 From: lanabanana1996 Date: Thu, 30 Jul 2026 18:43:11 +0300 Subject: [PATCH 4/7] Add burger ingredient list tests --- tests/test_burger.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/test_burger.py b/tests/test_burger.py index 582292105..1fb8674da 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -1,5 +1,7 @@ from praktikum.bun import Bun from praktikum.burger import Burger +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_FILLING, INGREDIENT_TYPE_SAUCE def test_burger_initializes_without_bun_and_ingredients(): @@ -16,3 +18,35 @@ def test_set_buns_sets_bun(): burger.set_buns(bun) assert burger.bun is bun + + +def test_add_ingredient_adds_ingredient_to_burger(): + burger = Burger() + ingredient = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200) + + burger.add_ingredient(ingredient) + + assert burger.ingredients == [ingredient] + + +def test_remove_ingredient_removes_ingredient_by_index(): + burger = Burger() + ingredient_to_remove = Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 50) + ingredient_to_keep = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200) + burger.ingredients = [ingredient_to_remove, ingredient_to_keep] + + burger.remove_ingredient(0) + + assert burger.ingredients == [ingredient_to_keep] + + +def test_move_ingredient_moves_ingredient_to_new_index(): + burger = Burger() + first_ingredient = Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 50) + second_ingredient = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200) + third_ingredient = Ingredient(INGREDIENT_TYPE_SAUCE, "cheese sauce", 60) + burger.ingredients = [first_ingredient, second_ingredient, third_ingredient] + + burger.move_ingredient(0, 2) + + assert burger.ingredients == [second_ingredient, third_ingredient, first_ingredient] From 7b44de0992f2485fbd99a6c43fba7cbd91cb13a2 Mon Sep 17 00:00:00 2001 From: lanabanana1996 Date: Thu, 30 Jul 2026 18:48:19 +0300 Subject: [PATCH 5/7] Add burger price and receipt tests --- tests/test_burger.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_burger.py b/tests/test_burger.py index 1fb8674da..b5cf1c583 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -50,3 +50,39 @@ def test_move_ingredient_moves_ingredient_to_new_index(): burger.move_ingredient(0, 2) assert burger.ingredients == [second_ingredient, third_ingredient, first_ingredient] + + +def test_get_price_returns_total_price_with_two_buns_and_all_ingredients(): + burger = Burger() + bun = Bun("black bun", 100.0) + sauce = Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 50.0) + filling = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200.0) + burger.set_buns(bun) + burger.add_ingredient(sauce) + burger.add_ingredient(filling) + + price = burger.get_price() + + assert price == 450.0 + + +def test_get_receipt_returns_formatted_receipt(): + burger = Burger() + bun = Bun("black bun", 100.0) + sauce = Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 50.0) + filling = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200.0) + burger.set_buns(bun) + burger.add_ingredient(sauce) + burger.add_ingredient(filling) + + receipt = burger.get_receipt() + + expected_receipt = ( + "(==== black bun ====)\n" + "= sauce hot sauce =\n" + "= filling cutlet =\n" + "(==== black bun ====)\n" + "\n" + "Price: 450.0" + ) + assert receipt == expected_receipt From 8226f78f016bb2f7d8e668832177489bf8f7545b Mon Sep 17 00:00:00 2001 From: lanabanana1996 Date: Tue, 4 Aug 2026 15:54:43 +0300 Subject: [PATCH 6/7] Address reviewer feedback for burger tests --- tests/test_burger.py | 45 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/tests/test_burger.py b/tests/test_burger.py index b5cf1c583..0fcd6b6a3 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -1,13 +1,21 @@ +import pytest +from unittest.mock import MagicMock + from praktikum.bun import Bun from praktikum.burger import Burger from praktikum.ingredient import Ingredient from praktikum.ingredient_types import INGREDIENT_TYPE_FILLING, INGREDIENT_TYPE_SAUCE -def test_burger_initializes_without_bun_and_ingredients(): +def test_burger_initializes_without_bun(): burger = Burger() assert burger.bun is None + + +def test_burger_initializes_with_empty_ingredients(): + burger = Burger() + assert burger.ingredients == [] @@ -40,6 +48,16 @@ def test_remove_ingredient_removes_ingredient_by_index(): assert burger.ingredients == [ingredient_to_keep] +@pytest.mark.parametrize("index", [1, -2]) +def test_remove_ingredient_with_invalid_index_raises_index_error(index): + burger = Burger() + ingredient = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200) + burger.add_ingredient(ingredient) + + with pytest.raises(IndexError): + burger.remove_ingredient(index) + + def test_move_ingredient_moves_ingredient_to_new_index(): burger = Burger() first_ingredient = Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 50) @@ -52,6 +70,16 @@ def test_move_ingredient_moves_ingredient_to_new_index(): assert burger.ingredients == [second_ingredient, third_ingredient, first_ingredient] +@pytest.mark.parametrize("index", [1, -2]) +def test_move_ingredient_with_invalid_source_index_raises_index_error(index): + burger = Burger() + ingredient = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200) + burger.add_ingredient(ingredient) + + with pytest.raises(IndexError): + burger.move_ingredient(index, 0) + + def test_get_price_returns_total_price_with_two_buns_and_all_ingredients(): burger = Burger() bun = Bun("black bun", 100.0) @@ -66,6 +94,21 @@ def test_get_price_returns_total_price_with_two_buns_and_all_ingredients(): assert price == 450.0 +def test_get_price_returns_total_with_mocked_bun_and_ingredients(): + burger = Burger() + bun = MagicMock() + bun.get_price.return_value = 100.0 + sauce = MagicMock() + sauce.get_price.return_value = 50.0 + filling = MagicMock() + filling.get_price.return_value = 200.0 + burger.set_buns(bun) + burger.add_ingredient(sauce) + burger.add_ingredient(filling) + + assert burger.get_price() == 450.0 + + def test_get_receipt_returns_formatted_receipt(): burger = Burger() bun = Bun("black bun", 100.0) From c4895deaf7ac721ea923a3d262738fc3c909361b Mon Sep 17 00:00:00 2001 From: lanabanana1996 Date: Tue, 4 Aug 2026 19:10:22 +0300 Subject: [PATCH 7/7] Update README to match test coverage --- README.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 272081708..254502a1e 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,25 @@ ### Реализованные сценарии -Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` +Созданы юнит-тесты для класса `Burger`. В тестах используются реальные объекты `Bun` и `Ingredient`, а также моки и параметризация там, где это уместно. -Процент покрытия 100% (отчет: `htmlcov/index.html`) +Покрытие класса `Burger` — 100%. ### Структура проекта -- `praktikum` - пакет, содержащий код программы -- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. +- `praktikum` — пакет, содержащий код программы +- `tests/test_burger.py` — юнит-тесты класса `Burger` ### Запуск автотестов **Установка зависимостей** -> `$ pip install -r requirements.txt` +`pip install -r requirements.txt` -**Запуск автотестов и создание HTML-отчета о покрытии** +**Запуск автотестов** -> `$ pytest --cov=praktikum --cov-report=html` +`pytest -v` + +**Проверка покрытия класса Burger** + +`pytest --cov=praktikum.burger --cov-report=term-missing`