From 7386b905830c77865e3c96be9fb5c880ae5d6c47 Mon Sep 17 00:00:00 2001 From: Olga Anisimova Date: Mon, 4 May 2026 19:49:35 +0700 Subject: [PATCH 1/3] Add unit tests for Burger with mocks and parametrization, 100% coverage --- test_burger.py | 120 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 test_burger.py diff --git a/test_burger.py b/test_burger.py new file mode 100644 index 000000000..58e204f56 --- /dev/null +++ b/test_burger.py @@ -0,0 +1,120 @@ +import pytest +from unittest.mock import Mock +from praktikum.burger import Burger +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient + + +@pytest.fixture +def mock_bun(): + bun = Mock(spec=Bun) + bun.get_name.return_value = "Black bun" + bun.get_price.return_value = 100.0 + return bun + + +@pytest.fixture +def mock_sauce(): + ing = Mock(spec=Ingredient) + ing.get_type.return_value = "SAUCE" + ing.get_name.return_value = "hot sauce" + ing.get_price.return_value = 50.0 + return ing + + +@pytest.fixture +def mock_filling(): + ing = Mock(spec=Ingredient) + ing.get_type.return_value = "FILLING" + ing.get_name.return_value = "cutlet" + ing.get_price.return_value = 200.0 + return ing + + +class TestBurger: + + def test_set_buns(self, mock_bun): + burger = Burger() + burger.set_buns(mock_bun) + assert burger.bun == mock_bun + + def test_add_ingredient(self, mock_sauce): + burger = Burger() + burger.add_ingredient(mock_sauce) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == mock_sauce + + def test_remove_ingredient(self, mock_sauce, mock_filling): + burger = Burger() + burger.add_ingredient(mock_sauce) + burger.add_ingredient(mock_filling) + burger.remove_ingredient(0) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == mock_filling + + def test_remove_ingredient_invalid_index(self, mock_sauce): + burger = Burger() + burger.add_ingredient(mock_sauce) + with pytest.raises(IndexError): + burger.remove_ingredient(5) + + def test_move_ingredient(self, mock_sauce, mock_filling): + burger = Burger() + burger.add_ingredient(mock_sauce) + burger.add_ingredient(mock_filling) + burger.move_ingredient(1, 0) + assert burger.ingredients[0] == mock_filling + assert burger.ingredients[1] == mock_sauce + + def test_move_ingredient_same_index(self, mock_sauce): + burger = Burger() + burger.add_ingredient(mock_sauce) + burger.move_ingredient(0, 0) + assert burger.ingredients[0] == mock_sauce + + @pytest.mark.parametrize("bun_price, ingredients_prices, expected", [ + (100.0, [50.0, 200.0], 450.0), + (50.0, [], 100.0), + (75.0, [30.0, 30.0, 40.0], 250.0), + ]) + def test_get_price(self, mock_bun, bun_price, ingredients_prices, expected): + mock_bun.get_price.return_value = bun_price + ingredients = [] + for price in ingredients_prices: + ing = Mock(spec=Ingredient) + ing.get_price.return_value = price + ingredients.append(ing) + + burger = Burger() + burger.set_buns(mock_bun) + for ing in ingredients: + burger.add_ingredient(ing) + + assert burger.get_price() == expected + + def test_get_receipt(self, mock_bun, mock_sauce, mock_filling): + burger = Burger() + burger.set_buns(mock_bun) + burger.add_ingredient(mock_sauce) + burger.add_ingredient(mock_filling) + + original_get_price = burger.get_price + burger.get_price = lambda: 450.0 + receipt = burger.get_receipt() + burger.get_price = original_get_price + + assert "(==== Black bun ====)" in receipt + assert "= sauce hot sauce =" in receipt + assert "= filling cutlet =" in receipt + assert "Price: 450.0" in receipt + + def test_empty_burger_receipt(self, mock_bun): + burger = Burger() + burger.set_buns(mock_bun) + original_get_price = burger.get_price + burger.get_price = lambda: 200.0 + receipt = burger.get_receipt() + burger.get_price = original_get_price + + assert receipt.count("(==== Black bun ====)") == 2 + assert "Price: 200.0" in receipt \ No newline at end of file From 4ef76f4a1935c243037948179342d3855be81b41 Mon Sep 17 00:00:00 2001 From: Olga Anisimova Date: Sun, 10 May 2026 09:29:47 +0700 Subject: [PATCH 2/3] Final --- test_burger.py | 134 +++++++++++++++++++++---------------------------- 1 file changed, 56 insertions(+), 78 deletions(-) diff --git a/test_burger.py b/test_burger.py index 58e204f56..286d7388b 100644 --- a/test_burger.py +++ b/test_burger.py @@ -1,120 +1,98 @@ import pytest -from unittest.mock import Mock from praktikum.burger import Burger from praktikum.bun import Bun from praktikum.ingredient import Ingredient - -@pytest.fixture -def mock_bun(): - bun = Mock(spec=Bun) - bun.get_name.return_value = "Black bun" - bun.get_price.return_value = 100.0 - return bun - - -@pytest.fixture -def mock_sauce(): - ing = Mock(spec=Ingredient) - ing.get_type.return_value = "SAUCE" - ing.get_name.return_value = "hot sauce" - ing.get_price.return_value = 50.0 - return ing - - -@pytest.fixture -def mock_filling(): - ing = Mock(spec=Ingredient) - ing.get_type.return_value = "FILLING" - ing.get_name.return_value = "cutlet" - ing.get_price.return_value = 200.0 - return ing - - class TestBurger: - def test_set_buns(self, mock_bun): + def test_set_buns(self): + bun = Bun("Black bun", 100) burger = Burger() - burger.set_buns(mock_bun) - assert burger.bun == mock_bun + burger.set_buns(bun) + assert burger.bun == bun - def test_add_ingredient(self, mock_sauce): + def test_add_ingredient(self): + ingredient = Ingredient("SAUCE", "hot sauce", 50) burger = Burger() - burger.add_ingredient(mock_sauce) + burger.add_ingredient(ingredient) assert len(burger.ingredients) == 1 - assert burger.ingredients[0] == mock_sauce + assert burger.ingredients[0] == ingredient - def test_remove_ingredient(self, mock_sauce, mock_filling): + def test_remove_ingredient(self): + sauce = Ingredient("SAUCE", "hot sauce", 50) + filling = Ingredient("FILLING", "cutlet", 200) burger = Burger() - burger.add_ingredient(mock_sauce) - burger.add_ingredient(mock_filling) + burger.add_ingredient(sauce) + burger.add_ingredient(filling) burger.remove_ingredient(0) assert len(burger.ingredients) == 1 - assert burger.ingredients[0] == mock_filling + assert burger.ingredients[0] == filling - def test_remove_ingredient_invalid_index(self, mock_sauce): + def test_remove_ingredient_invalid_index(self): + sauce = Ingredient("SAUCE", "hot sauce", 50) burger = Burger() - burger.add_ingredient(mock_sauce) + burger.add_ingredient(sauce) with pytest.raises(IndexError): burger.remove_ingredient(5) - def test_move_ingredient(self, mock_sauce, mock_filling): + def test_move_ingredient(self): + sauce = Ingredient("SAUCE", "hot sauce", 50) + filling = Ingredient("FILLING", "cutlet", 200) burger = Burger() - burger.add_ingredient(mock_sauce) - burger.add_ingredient(mock_filling) + burger.add_ingredient(sauce) + burger.add_ingredient(filling) burger.move_ingredient(1, 0) - assert burger.ingredients[0] == mock_filling - assert burger.ingredients[1] == mock_sauce + assert burger.ingredients[0] == filling + assert burger.ingredients[1] == sauce - def test_move_ingredient_same_index(self, mock_sauce): + def test_move_ingredient_same_index(self): + sauce = Ingredient("SAUCE", "hot sauce", 50) burger = Burger() - burger.add_ingredient(mock_sauce) + burger.add_ingredient(sauce) burger.move_ingredient(0, 0) - assert burger.ingredients[0] == mock_sauce + assert burger.ingredients[0] == sauce @pytest.mark.parametrize("bun_price, ingredients_prices, expected", [ (100.0, [50.0, 200.0], 450.0), (50.0, [], 100.0), (75.0, [30.0, 30.0, 40.0], 250.0), ]) - def test_get_price(self, mock_bun, bun_price, ingredients_prices, expected): - mock_bun.get_price.return_value = bun_price - ingredients = [] - for price in ingredients_prices: - ing = Mock(spec=Ingredient) - ing.get_price.return_value = price - ingredients.append(ing) - + def test_get_price(self, bun_price, ingredients_prices, expected): + bun = Bun("Black bun", bun_price) burger = Burger() - burger.set_buns(mock_bun) - for ing in ingredients: - burger.add_ingredient(ing) - + burger.set_buns(bun) + for price in ingredients_prices: + ingredient = Ingredient("SAUCE", "some sauce", price) + burger.add_ingredient(ingredient) assert burger.get_price() == expected - def test_get_receipt(self, mock_bun, mock_sauce, mock_filling): + def test_get_receipt(self): + bun = Bun("Black bun", 100) + sauce = Ingredient("SAUCE", "hot sauce", 50) + filling = Ingredient("FILLING", "cutlet", 200) burger = Burger() - burger.set_buns(mock_bun) - burger.add_ingredient(mock_sauce) - burger.add_ingredient(mock_filling) - - original_get_price = burger.get_price - burger.get_price = lambda: 450.0 + burger.set_buns(bun) + burger.add_ingredient(sauce) + burger.add_ingredient(filling) receipt = burger.get_receipt() - burger.get_price = original_get_price - assert "(==== Black bun ====)" in receipt assert "= sauce hot sauce =" in receipt assert "= filling cutlet =" in receipt - assert "Price: 450.0" in receipt - - def test_empty_burger_receipt(self, mock_bun): + # Извлекаем цену из чека + import re + match = re.search(r"Price:\s*([\d.]+)", receipt) + assert match is not None, "Price not found in receipt" + price = float(match.group(1)) + assert price == 450.0 + + def test_empty_burger_receipt(self): + bun = Bun("Black bun", 100) burger = Burger() - burger.set_buns(mock_bun) - original_get_price = burger.get_price - burger.get_price = lambda: 200.0 + burger.set_buns(bun) receipt = burger.get_receipt() - burger.get_price = original_get_price - assert receipt.count("(==== Black bun ====)") == 2 - assert "Price: 200.0" in receipt \ No newline at end of file + import re + match = re.search(r"Price:\s*([\d.]+)", receipt) + assert match is not None, "Price not found in receipt" + price = float(match.group(1)) + assert price == 200.0 \ No newline at end of file From f559c83ba2760e113d9fa265a10e40df344e99b5 Mon Sep 17 00:00:00 2001 From: Olga Anisimova Date: Mon, 11 May 2026 15:43:52 +0700 Subject: [PATCH 3/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20-=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=BF=D0=BE=D0=B4=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_burger.py | 115 ++++++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 54 deletions(-) diff --git a/test_burger.py b/test_burger.py index 286d7388b..552753d32 100644 --- a/test_burger.py +++ b/test_burger.py @@ -1,56 +1,70 @@ import pytest +from unittest.mock import Mock from praktikum.burger import Burger -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient + +@pytest.fixture +def mock_bun(): + bun = Mock() + bun.get_name.return_value = "Black bun" + bun.get_price.return_value = 100.0 + return bun + +@pytest.fixture +def mock_sauce(): + sauce = Mock() + sauce.get_type.return_value = "SAUCE" + sauce.get_name.return_value = "hot sauce" + sauce.get_price.return_value = 50.0 + return sauce + +@pytest.fixture +def mock_filling(): + filling = Mock() + filling.get_type.return_value = "FILLING" + filling.get_name.return_value = "cutlet" + filling.get_price.return_value = 200.0 + return filling class TestBurger: - def test_set_buns(self): - bun = Bun("Black bun", 100) + def test_set_buns(self, mock_bun): burger = Burger() - burger.set_buns(bun) - assert burger.bun == bun + burger.set_buns(mock_bun) + assert burger.bun == mock_bun - def test_add_ingredient(self): - ingredient = Ingredient("SAUCE", "hot sauce", 50) + def test_add_ingredient(self, mock_sauce): burger = Burger() - burger.add_ingredient(ingredient) + burger.add_ingredient(mock_sauce) assert len(burger.ingredients) == 1 - assert burger.ingredients[0] == ingredient + assert burger.ingredients[0] == mock_sauce - def test_remove_ingredient(self): - sauce = Ingredient("SAUCE", "hot sauce", 50) - filling = Ingredient("FILLING", "cutlet", 200) + def test_remove_ingredient(self, mock_sauce, mock_filling): burger = Burger() - burger.add_ingredient(sauce) - burger.add_ingredient(filling) + burger.add_ingredient(mock_sauce) + burger.add_ingredient(mock_filling) burger.remove_ingredient(0) assert len(burger.ingredients) == 1 - assert burger.ingredients[0] == filling + assert burger.ingredients[0] == mock_filling - def test_remove_ingredient_invalid_index(self): - sauce = Ingredient("SAUCE", "hot sauce", 50) + def test_remove_ingredient_invalid_index(self, mock_sauce): burger = Burger() - burger.add_ingredient(sauce) + burger.add_ingredient(mock_sauce) with pytest.raises(IndexError): burger.remove_ingredient(5) - def test_move_ingredient(self): - sauce = Ingredient("SAUCE", "hot sauce", 50) - filling = Ingredient("FILLING", "cutlet", 200) + def test_move_ingredient(self, mock_sauce, mock_filling): burger = Burger() - burger.add_ingredient(sauce) - burger.add_ingredient(filling) + burger.add_ingredient(mock_sauce) + burger.add_ingredient(mock_filling) burger.move_ingredient(1, 0) - assert burger.ingredients[0] == filling - assert burger.ingredients[1] == sauce + assert burger.ingredients[0] == mock_filling + assert burger.ingredients[1] == mock_sauce - def test_move_ingredient_same_index(self): - sauce = Ingredient("SAUCE", "hot sauce", 50) + def test_move_ingredient_same_index(self, mock_sauce): burger = Burger() - burger.add_ingredient(sauce) + burger.add_ingredient(mock_sauce) burger.move_ingredient(0, 0) - assert burger.ingredients[0] == sauce + assert burger.ingredients[0] == mock_sauce @pytest.mark.parametrize("bun_price, ingredients_prices, expected", [ (100.0, [50.0, 200.0], 450.0), @@ -58,41 +72,34 @@ def test_move_ingredient_same_index(self): (75.0, [30.0, 30.0, 40.0], 250.0), ]) def test_get_price(self, bun_price, ingredients_prices, expected): - bun = Bun("Black bun", bun_price) + + bun = Mock() + bun.get_price.return_value = bun_price + burger = Burger() burger.set_buns(bun) + for price in ingredients_prices: - ingredient = Ingredient("SAUCE", "some sauce", price) + ingredient = Mock() + ingredient.get_price.return_value = price burger.add_ingredient(ingredient) assert burger.get_price() == expected - def test_get_receipt(self): - bun = Bun("Black bun", 100) - sauce = Ingredient("SAUCE", "hot sauce", 50) - filling = Ingredient("FILLING", "cutlet", 200) + def test_get_receipt(self, mock_bun, mock_sauce, mock_filling): burger = Burger() - burger.set_buns(bun) - burger.add_ingredient(sauce) - burger.add_ingredient(filling) + burger.set_buns(mock_bun) + burger.add_ingredient(mock_sauce) + burger.add_ingredient(mock_filling) + receipt = burger.get_receipt() assert "(==== Black bun ====)" in receipt assert "= sauce hot sauce =" in receipt assert "= filling cutlet =" in receipt - # Извлекаем цену из чека - import re - match = re.search(r"Price:\s*([\d.]+)", receipt) - assert match is not None, "Price not found in receipt" - price = float(match.group(1)) - assert price == 450.0 - - def test_empty_burger_receipt(self): - bun = Bun("Black bun", 100) + assert "Price: 450.0" in receipt or "Price: 450" in receipt + + def test_empty_burger_receipt(self, mock_bun): burger = Burger() - burger.set_buns(bun) + burger.set_buns(mock_bun) receipt = burger.get_receipt() assert receipt.count("(==== Black bun ====)") == 2 - import re - match = re.search(r"Price:\s*([\d.]+)", receipt) - assert match is not None, "Price not found in receipt" - price = float(match.group(1)) - assert price == 200.0 \ No newline at end of file + assert "Price: 200.0" in receipt or "Price: 200" in receipt \ No newline at end of file