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