From ecf632625eefcf0bee41e4262890ae9529506ae0 Mon Sep 17 00:00:00 2001 From: Ksenia Kozyreva Date: Fri, 5 Jun 2026 15:23:06 +0300 Subject: [PATCH 1/6] feat: add unit tests for burger class with 100 coverage --- .gitignore | 7 ++ __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 | 0 tests/test_burger.py | 114 ++++++++++++++++++ 8 files changed, 121 insertions(+) create mode 100644 .gitignore 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%) create mode 100644 tests/test_burger.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..534913ce9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.pytest_cache/ +htmlcov/ +.coverage +__pycache__/ +*.pyc +venv/ +.venv/ 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/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..889e84d22 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,114 @@ +from unittest.mock import Mock +import pytest +from praktikum.burger import Burger + + +from unittest.mock import Mock +import pytest +from praktikum.burger import Burger + + +class Bun: + + def get_name(self): + pass + + def get_price(self): + pass + + +class Ingredient: + + def get_name(self): + pass + + def get_price(self): + pass + + def get_type(self): + pass + + +class TestBurger: + + def test_init_burger_is_empty(self): + burger = Burger() + assert burger.bun is None + assert burger.ingredients == [] + + def test_set_buns_adds_bun(self): + burger = Burger() + mock_bun = Mock(spec=Bun) + burger.set_buns(mock_bun) + assert burger.bun == mock_bun + + def test_add_ingredient_adds_to_list(self): + burger = Burger() + mock_ingredient = Mock(spec=Ingredient) + burger.add_ingredient(mock_ingredient) + assert burger.ingredients == [mock_ingredient] + + def test_remove_ingredient_clears_list(self): + burger = Burger() + mock_ingredient = Mock(spec=Ingredient) + burger.add_ingredient(mock_ingredient) + burger.remove_ingredient(0) + assert burger.ingredients == [] + + def test_move_ingredient_swaps_positions(self): + burger = Burger() + mock_ing1 = Mock(spec=Ingredient) + mock_ing2 = Mock(spec=Ingredient) + burger.add_ingredient(mock_ing1) + burger.add_ingredient(mock_ing2) + burger.move_ingredient(0, 1) + assert burger.ingredients == [mock_ing2, mock_ing1] + + @pytest.mark.parametrize( + "bun_price, ingredient_price, expected_total", + [ + (100.0, 50.0, 250.0), + (0.0, 10.0, 10.0), + (250.5, 0.0, 501.0), + (150.0, 100.0, 400.0), + ], + ) + def test_get_price_calculation( + self, bun_price, ingredient_price, expected_total + ): + burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_price.return_value = bun_price + burger.set_buns(mock_bun) + + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_price.return_value = ingredient_price + burger.add_ingredient(mock_ingredient) + assert burger.get_price() == expected_total + + @pytest.mark.parametrize( + "bun_name, ing_type, ing_name, ing_price, expected_price_str", + [ + ("Краторная булка", "SAUCE", "чили", 50.0, "Price: 250.0"), + ("Супер булка", "FILLING", "биг котлета", 150.0, "Price: 350.0"), + ], + ) + def test_get_receipt_formatting( + self, bun_name, ing_type, ing_name, ing_price, expected_price_str + ): + burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_name.return_value = bun_name + mock_bun.get_price.return_value = 100.0 + burger.set_buns(mock_bun) + + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_type.return_value = ing_type + mock_ingredient.get_name.return_value = ing_name + mock_ingredient.get_price.return_value = ing_price + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + assert f"(==== {bun_name} ====)" in receipt + assert f"= {ing_type.lower()} {ing_name} =" in receipt + assert expected_price_str in receipt From d1388ccdb33db28584391f4c8df0409efa6690ba Mon Sep 17 00:00:00 2001 From: Ksenia Kozyreva Date: Fri, 5 Jun 2026 15:34:42 +0300 Subject: [PATCH 2/6] fix: remove duplicate imports --- tests/test_burger.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/test_burger.py b/tests/test_burger.py index 889e84d22..a91905fdc 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -3,11 +3,6 @@ from praktikum.burger import Burger -from unittest.mock import Mock -import pytest -from praktikum.burger import Burger - - class Bun: def get_name(self): From ef01a3363abc9337cd50f6075a10433b42fdc5df Mon Sep 17 00:00:00 2001 From: Ksenia Kozyreva Date: Sat, 6 Jun 2026 14:56:43 +0300 Subject: [PATCH 3/6] add unit tests for Burger class with 100% coverage --- tests/test_burger.py | 45 +++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/tests/test_burger.py b/tests/test_burger.py index a91905fdc..947e2913f 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -1,27 +1,8 @@ from unittest.mock import Mock import pytest from praktikum.burger import Burger - - -class Bun: - - def get_name(self): - pass - - def get_price(self): - pass - - -class Ingredient: - - def get_name(self): - pass - - def get_price(self): - pass - - def get_type(self): - pass +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient class TestBurger: @@ -82,19 +63,19 @@ def test_get_price_calculation( assert burger.get_price() == expected_total @pytest.mark.parametrize( - "bun_name, ing_type, ing_name, ing_price, expected_price_str", + "bun_name, bun_price, ing_type, ing_name, ing_price, expected_total_price", [ - ("Краторная булка", "SAUCE", "чили", 50.0, "Price: 250.0"), - ("Супер булка", "FILLING", "биг котлета", 150.0, "Price: 350.0"), + ("Краторная булка", 100.0, "SAUCE", "чили", 50.0, 250.0), + ("Супер булка", 100.0, "FILLING", "биг котлета", 150.0, 350.0), ], ) def test_get_receipt_formatting( - self, bun_name, ing_type, ing_name, ing_price, expected_price_str + self, bun_name, bun_price, ing_type, ing_name, ing_price, expected_total_price ): burger = Burger() mock_bun = Mock(spec=Bun) mock_bun.get_name.return_value = bun_name - mock_bun.get_price.return_value = 100.0 + mock_bun.get_price.return_value = bun_price burger.set_buns(mock_bun) mock_ingredient = Mock(spec=Ingredient) @@ -103,7 +84,11 @@ def test_get_receipt_formatting( mock_ingredient.get_price.return_value = ing_price burger.add_ingredient(mock_ingredient) - receipt = burger.get_receipt() - assert f"(==== {bun_name} ====)" in receipt - assert f"= {ing_type.lower()} {ing_name} =" in receipt - assert expected_price_str in receipt + expected_receipt = ( + f"(==== {bun_name} ====)\n" + f"= {ing_type.lower()} {ing_name} =\n" + f"(==== {bun_name} ====)\n\n" + f"Price: {expected_total_price}" + ) + + assert burger.get_receipt() == expected_receipt From 7dad5dfd17e3669d738d34ebd32135bff6d1dd69 Mon Sep 17 00:00:00 2001 From: Ksenia Kozyreva Date: Mon, 8 Jun 2026 22:47:34 +0300 Subject: [PATCH 4/6] feat: complete unit tests with 100% html coverage report --- tests/test_burger.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/test_burger.py b/tests/test_burger.py index 947e2913f..e502a2703 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -90,5 +90,18 @@ def test_get_receipt_formatting( f"(==== {bun_name} ====)\n\n" f"Price: {expected_total_price}" ) + assert burger.get_receipt() == expected_receipt + def test_get_receipt_without_ingredients(self): + burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_name.return_value = "Марсианская булка" + mock_bun.get_price.return_value = 100.0 + burger.set_buns(mock_bun) + + expected_receipt = ( + f"(==== Марсианская булка ====)\n" + f"(==== Марсианская булка ====)\n\n" + f"Price: 200.0" + ) assert burger.get_receipt() == expected_receipt From 06425447da6c87677569fb7cff1ff76d17687920 Mon Sep 17 00:00:00 2001 From: Ksenia Kozyreva Date: Mon, 8 Jun 2026 22:58:42 +0300 Subject: [PATCH 5/6] chore: add requirements.txt --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..d19852709 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest==8.1.1 +pytest-cov==4.1.0 From 469c74801331f9b372ddbb904d8649aeabfc1107 Mon Sep 17 00:00:00 2001 From: Ksenia Kozyreva Date: Thu, 11 Jun 2026 00:58:00 +0300 Subject: [PATCH 6/6] fix --- tests/test_burger.py | 47 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/tests/test_burger.py b/tests/test_burger.py index e502a2703..5d7f18e99 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -7,38 +7,69 @@ class TestBurger: - def test_init_burger_is_empty(self): - burger = Burger() - assert burger.bun is None - assert burger.ingredients == [] def test_set_buns_adds_bun(self): burger = Burger() mock_bun = Mock(spec=Bun) + mock_bun.get_price.return_value = 100.0 + burger.set_buns(mock_bun) - assert burger.bun == mock_bun + + assert burger.get_price() == 200.0 def test_add_ingredient_adds_to_list(self): burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_price.return_value = 0.0 + burger.set_buns(mock_bun) + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_price.return_value = 50.0 + burger.add_ingredient(mock_ingredient) - assert burger.ingredients == [mock_ingredient] + + assert burger.get_price() == 50.0 def test_remove_ingredient_clears_list(self): burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_price.return_value = 0.0 + burger.set_buns(mock_bun) + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_price.return_value = 50.0 + burger.add_ingredient(mock_ingredient) + burger.remove_ingredient(0) - assert burger.ingredients == [] + + assert burger.get_price() == 0.0 def test_move_ingredient_swaps_positions(self): burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_name.return_value = "Булка" + mock_bun.get_price.return_value = 0.0 + burger.set_buns(mock_bun) + mock_ing1 = Mock(spec=Ingredient) + mock_ing1.get_name.return_value = "соус" + mock_ing1.get_type.return_value = "SAUCE" + mock_ing1.get_price.return_value = 0.0 + mock_ing2 = Mock(spec=Ingredient) + mock_ing2.get_name.return_value = "котлета" + mock_ing2.get_type.return_value = "FILLING" + mock_ing2.get_price.return_value = 0.0 + burger.add_ingredient(mock_ing1) burger.add_ingredient(mock_ing2) + burger.move_ingredient(0, 1) - assert burger.ingredients == [mock_ing2, mock_ing1] + + receipt = burger.get_receipt() + assert receipt.index("котлета") < receipt.index("соус") + @pytest.mark.parametrize( "bun_price, ingredient_price, expected_total",