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/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/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/__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 95% rename from burger.py rename to praktikum/burger.py index 2b3b6a88b..110302ed7 100644 --- a/burger.py +++ b/praktikum/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/praktikum/database.py similarity index 86% rename from database.py rename to praktikum/database.py index 4c75baf71..44872889c 100644 --- a/database.py +++ b/praktikum/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.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 87% rename from praktikum.py rename to praktikum/praktikum.py index ec522fa6d..9782565fe 100644 --- a/praktikum.py +++ b/praktikum/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..fefc1785a --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,23 @@ +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