From 607afe9e8c9e59ab209a955fddb4368e7c017c1d Mon Sep 17 00:00:00 2001 From: Anastasiya Luhavets Date: Mon, 2 Mar 2026 13:02:22 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 5 + .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 7 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ burger.py | 3 +- database.py | 6 +- models.py | 59 ++++++++++++ praktikum.py | 6 +- tests/__init__.py | 0 tests/test_burger.py | 92 +++++++++++++++++++ 11 files changed, 189 insertions(+), 9 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 models.py create mode 100644 tests/__init__.py create mode 100644 tests/test_burger.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..b58b603fe --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 000000000..105ce2da2 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..1d3ce46ba --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..2cbdfb84d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/burger.py b/burger.py index 2b3b6a88b..110302ed7 100644 --- a/burger.py +++ b/burger.py @@ -1,7 +1,6 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient +from models import Burger, Bun, Ingredient class Burger: diff --git a/database.py b/database.py index 4c75baf71..5359ff478 100644 --- a/database.py +++ b/database.py @@ -1,8 +1,8 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient -from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING +from praktikum import Bun +from praktikum import Ingredient +from praktikum import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING class Database: diff --git a/models.py b/models.py new file mode 100644 index 000000000..9480ba9d3 --- /dev/null +++ b/models.py @@ -0,0 +1,59 @@ +class Bun: + def __init__(self, name, price): + self.name = name + self.price = price + + def get_name(self): + return self.name + + def get_price(self): + return self.price + +class Ingredient: + def __init__(self, name, ingredient_type, price): + self.name = name + self.type = ingredient_type + self.price = price + + def get_name(self): + return self.name + + def get_type(self): + return self.type + + def get_price(self): + return self.price + +class Burger: + def __init__(self): + self.bun = None + self.ingredients = [] + + def set_buns(self, bun): + self.bun = bun + + def add_ingredient(self, ingredient): + self.ingredients.append(ingredient) + + def remove_ingredient(self, ingredient): + self.ingredients.remove(ingredient) + + def move_ingredient(self, old_index, new_index): + self.ingredients.insert(new_index, self.ingredients.pop(old_index)) + + def get_price(self): + total = 0 + if self.bun: + total += self.bun.get_price() * 2 + for ing in self.ingredients: + total += ing.get_price() + return total + + def get_receipt(self): + lines = [] + lines.append(f"(==== {self.bun.get_name()} ====)") + for ing in self.ingredients: + lines.append(f"= {str(ing.get_type()).lower()} {ing.get_name()} =") + lines.append(f"(==== {self.bun.get_name()} ====)") + lines.append(f"Price: {self.get_price()}") + return "\n".join(lines) \ No newline at end of file diff --git a/praktikum.py b/praktikum.py index ec522fa6d..9782565fe 100644 --- a/praktikum.py +++ b/praktikum.py @@ -1,10 +1,8 @@ from typing import List -from praktikum.bun import Bun -from praktikum.burger import Burger -from praktikum.database import Database -from praktikum.ingredient import Ingredient +from database import Database +from models import Burger, Bun, Ingredient def main(): # Инициализируем базу данных 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..11e86d692 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,92 @@ +# tests/test_burger.py +import pytest +from unittest.mock import Mock + +# Подгоняем импорты под предполагаемую структуру проекта. +# Если в вашем репозитории Burger находится в burger.py в корне, +# используйте: from burger import Burger +from burger import Burger + +# Вспомог: создаём фиктивные Bun и Ingredient с нужным интерфейсом +def make_mock_bun(name="Sesame Bun", price=3.0): + bun = Mock() + bun.get_name.return_value = name + bun.get_price.return_value = price + return bun + +def make_mock_ingredient(name="Lettuce", ing_type="Vegetable", price=1.2): + ing = Mock() + ing.get_name.return_value = name + ing.get_type.return_value = ing_type + ing.get_price.return_value = price + return ing + +@pytest.fixture +def burger(): + return Burger() + +@pytest.mark.parametrize( + "bun_price, expected_price", + [ + (3.0, 6.0), # без ингредиентов: цена бекона стандартная двойная булочка + (2.5, 5.0), + ], +) +def test_price_without_ingredients(bun_price, expected_price): + b = make_mock_bun(price=bun_price) + burg = Burger() + burg.set_buns(b) + assert burg.get_price() == expected_price + +def test_set_bun_and_add_ingredients_and_price(): + burg = Burger() + bun = make_mock_bun(name="Big Bun", price=2.5) + ing1 = make_mock_ingredient(name="Cheese", ing_type="Cheese", price=1.0) + ing2 = make_mock_ingredient(name="Lettuce", ing_type="Vegetable", price=0.5) + + burg.set_buns(bun) + + burg.add_ingredient(ing1) + burg.add_ingredient(ing2) + + # Цена: bun*2 + ингредиенты + expected_price = bun.get_price.return_value * 2 + ing1.get_price.return_value + ing2.get_price.return_value + assert burg.get_price() == expected_price + +def test_move_and_remove_ingredients_order(): + burg = Burger() + ing_a = make_mock_ingredient(name="Patty", ing_type="Meat", price=2.0) + ing_b = make_mock_ingredient(name="Tomato", ing_type="Vegetable", price=0.5) + ing_c = make_mock_ingredient(name="Cheese", ing_type="Cheese", price=1.5) + + burg.add_ingredient(ing_a) + burg.add_ingredient(ing_b) + burg.add_ingredient(ing_c) + + # начальная последовательность: [A, B, C] + burg.move_ingredient(0, 2) # A -> позиция 2 -> [B, C, A] + assert burg.ingredients[0] is ing_b + assert burg.ingredients[1] is ing_c + assert burg.ingredients[2] is ing_a + + burg.remove_ingredient(1) # удалить C -> [B, A] + assert burg.ingredients == [ing_b, ing_a] + +def test_receipt_format_includes_bun_and_ingredients(burger=None): + burg = Burger() + bun = make_mock_bun(name="Sesame", price=1.5) + ing1 = make_mock_ingredient(name="Tomato", ing_type="Vegetable", price=0.6) + ing2 = make_mock_ingredient(name="Beef", ing_type="Meat", price=2.4) + + burg.set_buns(bun) + burg.add_ingredient(ing1) + burg.add_ingredient(ing2) + + receipt = burg.get_receipt() + assert f"(==== {bun.get_name()} ====)" in receipt + assert f"= {str(ing1.get_type()).lower()} {ing1.get_name()} =" in receipt + assert f"= {str(ing2.get_type()).lower()} {ing2.get_name()} =" in receipt + assert f"(==== {bun.get_name()} ====)" in receipt + # Цена должна быть рассчитана корректно + expected_price = bun.get_price.return_value * 2 + ing1.get_price.return_value + ing2.get_price.return_value + assert f"Price: {expected_price}" in receipt \ No newline at end of file From 447c96ff13e0968f8134441df975e71f7ff565cf Mon Sep 17 00:00:00 2001 From: Anastasiya Luhavets Date: Mon, 2 Mar 2026 13:12:50 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=201.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_burger.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/test_burger.py b/tests/test_burger.py index 11e86d692..a0dbea4a3 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -1,4 +1,4 @@ -# tests/test_burger.py + import pytest from unittest.mock import Mock @@ -7,7 +7,6 @@ # используйте: from burger import Burger from burger import Burger -# Вспомог: создаём фиктивные Bun и Ingredient с нужным интерфейсом def make_mock_bun(name="Sesame Bun", price=3.0): bun = Mock() bun.get_name.return_value = name @@ -49,7 +48,7 @@ def test_set_bun_and_add_ingredients_and_price(): burg.add_ingredient(ing1) burg.add_ingredient(ing2) - # Цена: bun*2 + ингредиенты + expected_price = bun.get_price.return_value * 2 + ing1.get_price.return_value + ing2.get_price.return_value assert burg.get_price() == expected_price @@ -63,7 +62,7 @@ def test_move_and_remove_ingredients_order(): burg.add_ingredient(ing_b) burg.add_ingredient(ing_c) - # начальная последовательность: [A, B, C] + burg.move_ingredient(0, 2) # A -> позиция 2 -> [B, C, A] assert burg.ingredients[0] is ing_b assert burg.ingredients[1] is ing_c @@ -87,6 +86,6 @@ def test_receipt_format_includes_bun_and_ingredients(burger=None): assert f"= {str(ing1.get_type()).lower()} {ing1.get_name()} =" in receipt assert f"= {str(ing2.get_type()).lower()} {ing2.get_name()} =" in receipt assert f"(==== {bun.get_name()} ====)" in receipt - # Цена должна быть рассчитана корректно + expected_price = bun.get_price.return_value * 2 + ing1.get_price.return_value + ing2.get_price.return_value assert f"Price: {expected_price}" in receipt \ No newline at end of file From 656685c3b723bda989d381caca3ae777ee47ea0f Mon Sep 17 00:00:00 2001 From: Anastasiya Luhavets Date: Fri, 6 Mar 2026 21:20:00 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=B2=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conftest.py | 16 +++ helpers.py | 15 +++ __init__.py => praktikum/__init__.py | 0 bun.py => praktikum/bun.py | 0 burger.py => praktikum/burger.py | 0 database.py => praktikum/database.py | 6 +- ingredient.py => praktikum/ingredient.py | 0 .../ingredient_types.py | 0 praktikum.py => praktikum/praktikum.py | 0 tests/test_burger.py | 114 ++++-------------- 10 files changed, 57 insertions(+), 94 deletions(-) create mode 100644 conftest.py create mode 100644 helpers.py 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 (87%) 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/conftest.py b/conftest.py new file mode 100644 index 000000000..f40215e45 --- /dev/null +++ b/conftest.py @@ -0,0 +1,16 @@ +# conftest.py +import pytest +from praktikum.burger import Burger +from helpers import make_mock_bun, make_mock_ingredient + +@pytest.fixture +def burger(): + return Burger() + +@pytest.fixture +def mock_bun(): + return make_mock_bun() + +@pytest.fixture +def mock_ingredient(): + return make_mock_ingredient() \ No newline at end of file diff --git a/helpers.py b/helpers.py new file mode 100644 index 000000000..7df52c00c --- /dev/null +++ b/helpers.py @@ -0,0 +1,15 @@ +# helpers.py +from unittest.mock import Mock + +def make_mock_bun(name="Sesame Bun", price=3.0): + bun = Mock() + bun.get_name.return_value = name + bun.get_price.return_value = price + return bun + +def make_mock_ingredient(name="Lettuce", ing_type="Vegetable", price=1.2): + ing = Mock() + ing.get_name.return_value = name + ing.get_type.return_value = ing_type + ing.get_price.return_value = price + return ing \ No newline at end of file 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 87% rename from database.py rename to praktikum/database.py index 5359ff478..44872889c 100644 --- a/database.py +++ b/praktikum/database.py @@ -1,8 +1,8 @@ from typing import List -from praktikum import Bun -from praktikum import Ingredient -from praktikum import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING +from praktikum.praktikum import Bun +from praktikum.praktikum import Ingredient +from praktikum.praktikum import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING class Database: 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/tests/test_burger.py b/tests/test_burger.py index a0dbea4a3..fefc1785a 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -1,91 +1,23 @@ - -import pytest -from unittest.mock import Mock - -# Подгоняем импорты под предполагаемую структуру проекта. -# Если в вашем репозитории Burger находится в burger.py в корне, -# используйте: from burger import Burger -from burger import Burger - -def make_mock_bun(name="Sesame Bun", price=3.0): - bun = Mock() - bun.get_name.return_value = name - bun.get_price.return_value = price - return bun - -def make_mock_ingredient(name="Lettuce", ing_type="Vegetable", price=1.2): - ing = Mock() - ing.get_name.return_value = name - ing.get_type.return_value = ing_type - ing.get_price.return_value = price - return ing - -@pytest.fixture -def burger(): - return Burger() - -@pytest.mark.parametrize( - "bun_price, expected_price", - [ - (3.0, 6.0), # без ингредиентов: цена бекона стандартная двойная булочка - (2.5, 5.0), - ], -) -def test_price_without_ingredients(bun_price, expected_price): - b = make_mock_bun(price=bun_price) - burg = Burger() - burg.set_buns(b) - assert burg.get_price() == expected_price - -def test_set_bun_and_add_ingredients_and_price(): - burg = Burger() - bun = make_mock_bun(name="Big Bun", price=2.5) - ing1 = make_mock_ingredient(name="Cheese", ing_type="Cheese", price=1.0) - ing2 = make_mock_ingredient(name="Lettuce", ing_type="Vegetable", price=0.5) - - burg.set_buns(bun) - - burg.add_ingredient(ing1) - burg.add_ingredient(ing2) - - - expected_price = bun.get_price.return_value * 2 + ing1.get_price.return_value + ing2.get_price.return_value - assert burg.get_price() == expected_price - -def test_move_and_remove_ingredients_order(): - burg = Burger() - ing_a = make_mock_ingredient(name="Patty", ing_type="Meat", price=2.0) - ing_b = make_mock_ingredient(name="Tomato", ing_type="Vegetable", price=0.5) - ing_c = make_mock_ingredient(name="Cheese", ing_type="Cheese", price=1.5) - - burg.add_ingredient(ing_a) - burg.add_ingredient(ing_b) - burg.add_ingredient(ing_c) - - - burg.move_ingredient(0, 2) # A -> позиция 2 -> [B, C, A] - assert burg.ingredients[0] is ing_b - assert burg.ingredients[1] is ing_c - assert burg.ingredients[2] is ing_a - - burg.remove_ingredient(1) # удалить C -> [B, A] - assert burg.ingredients == [ing_b, ing_a] - -def test_receipt_format_includes_bun_and_ingredients(burger=None): - burg = Burger() - bun = make_mock_bun(name="Sesame", price=1.5) - ing1 = make_mock_ingredient(name="Tomato", ing_type="Vegetable", price=0.6) - ing2 = make_mock_ingredient(name="Beef", ing_type="Meat", price=2.4) - - burg.set_buns(bun) - burg.add_ingredient(ing1) - burg.add_ingredient(ing2) - - receipt = burg.get_receipt() - assert f"(==== {bun.get_name()} ====)" in receipt - assert f"= {str(ing1.get_type()).lower()} {ing1.get_name()} =" in receipt - assert f"= {str(ing2.get_type()).lower()} {ing2.get_name()} =" in receipt - assert f"(==== {bun.get_name()} ====)" in receipt - - expected_price = bun.get_price.return_value * 2 + ing1.get_price.return_value + ing2.get_price.return_value - assert f"Price: {expected_price}" in receipt \ No newline at end of file +def test_price_without_ingredients(burger, mock_bun): + burger.set_buns(mock_bun) + assert burger.get_price() == mock_bun.get_price.return_value * 2 + +def test_set_bun_and_add_ingredients_and_price(burger, mock_bun, mock_ingredient): + burger.set_buns(mock_bun) + burger.add_ingredient(mock_ingredient) + expected_price = mock_bun.get_price.return_value * 2 + mock_ingredient.get_price.return_value + assert burger.get_price() == expected_price + +def test_move_and_remove_ingredients_order(burger, mock_ingredient): + burger.add_ingredient(mock_ingredient) + burger.move_ingredient(0, 0) # пример перемещения, если есть такая логика + burger.remove_ingredient(0) + assert burger.ingredients == [] + +def test_receipt_format_includes_bun_and_ingredients(burger, mock_bun, mock_ingredient): + burger.set_buns(mock_bun) + burger.add_ingredient(mock_ingredient) + receipt = burger.get_receipt() + assert f"(==== {mock_bun.get_name()} ====)" in receipt + assert f"= {str(mock_ingredient.get_type()).lower()} {mock_ingredient.get_name()}" in receipt + assert f"Price: {burger.get_price()}" in receipt \ No newline at end of file