diff --git a/.coverage b/.coverage
new file mode 100644
index 000000000..961e77219
Binary files /dev/null and b/.coverage differ
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/Diplom_1.iml b/.idea/Diplom_1.iml
new file mode 100644
index 000000000..67e1d0e20
--- /dev/null
+++ b/.idea/Diplom_1.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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..391ef09ff
--- /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/__pycache__/test_bun.cpython-313-pytest-9.1.0.pyc b/__pycache__/test_bun.cpython-313-pytest-9.1.0.pyc
new file mode 100644
index 000000000..5b3fcbdbe
Binary files /dev/null and b/__pycache__/test_bun.cpython-313-pytest-9.1.0.pyc differ
diff --git a/__pycache__/test_burger.cpython-313-pytest-9.1.0.pyc b/__pycache__/test_burger.cpython-313-pytest-9.1.0.pyc
new file mode 100644
index 000000000..eb7378efb
Binary files /dev/null and b/__pycache__/test_burger.cpython-313-pytest-9.1.0.pyc differ
diff --git a/praktikum.py b/praktikum.py
deleted file mode 100644
index ec522fa6d..000000000
--- a/praktikum.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from typing import List
-
-from praktikum.bun import Bun
-from praktikum.burger import Burger
-from praktikum.database import Database
-from praktikum.ingredient import Ingredient
-
-
-def main():
- # Инициализируем базу данных
- database: Database = Database()
-
- # Создадим новый бургер
- burger: Burger = Burger()
-
- # Считаем список доступных булок из базы данных
- buns: List[Bun] = database.available_buns()
-
- # Считаем список доступных ингредиентов из базы данных
- ingredients: List[Ingredient] = database.available_ingredients()
-
- # Соберём бургер
- burger.set_buns(buns[0])
-
- burger.add_ingredient(ingredients[1])
- burger.add_ingredient(ingredients[4])
- burger.add_ingredient(ingredients[3])
- burger.add_ingredient(ingredients[5])
-
- # Переместим слой с ингредиентом
- burger.move_ingredient(2, 1)
-
- # Удалим ингредиент
- burger.remove_ingredient(3)
-
- # Распечатаем рецепт бургера
- print(burger.get_receipt())
-
-
-if __name__ == "__main__":
- main()
diff --git a/__init__.py b/praktikum/__init__.py
similarity index 100%
rename from __init__.py
rename to praktikum/__init__.py
diff --git a/praktikum/__pycache__/__init__.cpython-313.pyc b/praktikum/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 000000000..b80c0383a
Binary files /dev/null and b/praktikum/__pycache__/__init__.cpython-313.pyc differ
diff --git a/praktikum/__pycache__/bun.cpython-313.pyc b/praktikum/__pycache__/bun.cpython-313.pyc
new file mode 100644
index 000000000..5f6f941a2
Binary files /dev/null and b/praktikum/__pycache__/bun.cpython-313.pyc differ
diff --git a/praktikum/__pycache__/burger.cpython-313.pyc b/praktikum/__pycache__/burger.cpython-313.pyc
new file mode 100644
index 000000000..7b1b86166
Binary files /dev/null and b/praktikum/__pycache__/burger.cpython-313.pyc differ
diff --git a/praktikum/__pycache__/database.cpython-313.pyc b/praktikum/__pycache__/database.cpython-313.pyc
new file mode 100644
index 000000000..2d0c01297
Binary files /dev/null and b/praktikum/__pycache__/database.cpython-313.pyc differ
diff --git a/praktikum/__pycache__/ingredient.cpython-313.pyc b/praktikum/__pycache__/ingredient.cpython-313.pyc
new file mode 100644
index 000000000..784575e31
Binary files /dev/null and b/praktikum/__pycache__/ingredient.cpython-313.pyc differ
diff --git a/praktikum/__pycache__/ingredient_types.cpython-313.pyc b/praktikum/__pycache__/ingredient_types.cpython-313.pyc
new file mode 100644
index 000000000..545d93ac2
Binary files /dev/null and b/praktikum/__pycache__/ingredient_types.cpython-313.pyc differ
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/requirements.txt b/requirements.txt
new file mode 100644
index 000000000..617d627c7
Binary files /dev/null and b/requirements.txt differ
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/__pycache__/__init__.cpython-313.pyc b/tests/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 000000000..8376263ba
Binary files /dev/null and b/tests/__pycache__/__init__.cpython-313.pyc differ
diff --git a/tests/__pycache__/bun_test.cpython-313-pytest-9.1.0.pyc b/tests/__pycache__/bun_test.cpython-313-pytest-9.1.0.pyc
new file mode 100644
index 000000000..126fc1594
Binary files /dev/null and b/tests/__pycache__/bun_test.cpython-313-pytest-9.1.0.pyc differ
diff --git a/tests/__pycache__/burger_test.cpython-313-pytest-9.1.0.pyc b/tests/__pycache__/burger_test.cpython-313-pytest-9.1.0.pyc
new file mode 100644
index 000000000..9b2bd0f5d
Binary files /dev/null and b/tests/__pycache__/burger_test.cpython-313-pytest-9.1.0.pyc differ
diff --git a/tests/__pycache__/database_test.cpython-313-pytest-9.1.0.pyc b/tests/__pycache__/database_test.cpython-313-pytest-9.1.0.pyc
new file mode 100644
index 000000000..2f5ee97ae
Binary files /dev/null and b/tests/__pycache__/database_test.cpython-313-pytest-9.1.0.pyc differ
diff --git a/tests/__pycache__/ingredient_test.cpython-313-pytest-9.1.0.pyc b/tests/__pycache__/ingredient_test.cpython-313-pytest-9.1.0.pyc
new file mode 100644
index 000000000..04e1c7b75
Binary files /dev/null and b/tests/__pycache__/ingredient_test.cpython-313-pytest-9.1.0.pyc differ
diff --git a/tests/bun_test.py b/tests/bun_test.py
new file mode 100644
index 000000000..43feeaf1f
--- /dev/null
+++ b/tests/bun_test.py
@@ -0,0 +1,34 @@
+import pytest
+from praktikum.bun import Bun
+
+
+class TestBun:
+
+ @pytest.mark.parametrize(
+ "name, price",
+ [
+ ("Краторная булка", 300),
+ ("Флюоресцентная булка", 999.99),
+ ("", 150), # Граничное значение: пустое имя
+ ("Булка с кунжутом", 150)
+ ]
+ )
+ # 1. Атомарный тест метода получения названия булочки
+ def test_bun_get_name_returns_correct_value(self, name, price):
+ bun = Bun(name, price)
+ assert bun.get_name() == name
+
+ @pytest.mark.parametrize(
+ "name, price",
+ [
+ ("Краторная булка", 300),
+ ("Флюоресцентная булка", 999.99),
+ ("Обычная булка", 0), # Граничное значение: нулевая цена
+ ("Булка с кунжутом", 150)
+ ]
+ )
+ # 2. Атомарный тест метода получения цены булочки
+ def test_bun_get_price_returns_correct_value(self, name, price):
+ bun = Bun(name, price)
+ assert bun.get_price() == price
+
diff --git a/tests/burger_test.py b/tests/burger_test.py
new file mode 100644
index 000000000..47eef40ef
--- /dev/null
+++ b/tests/burger_test.py
@@ -0,0 +1,84 @@
+from unittest.mock import Mock
+from praktikum.burger import Burger
+
+
+class TestBurger:
+
+ # 1. Тест установки булочки
+ def test_set_buns_sets_correct_bun(self):
+ burger = Burger()
+ mock_bun = Mock()
+
+ burger.set_buns(mock_bun)
+ assert burger.bun == mock_bun
+
+ # 2. Тест добавления ингредиента
+ def test_add_ingredient_adds_to_list(self):
+ burger = Burger()
+ mock_ingredient = Mock()
+
+ burger.add_ingredient(mock_ingredient)
+ assert mock_ingredient in burger.ingredients
+ assert len(burger.ingredients) == 1
+
+ # 3. Тест удаления ингредиента по индексу
+ def test_remove_ingredient_removes_from_list(self):
+ burger = Burger()
+ mock_ingredient = Mock()
+
+ burger.add_ingredient(mock_ingredient)
+ burger.remove_ingredient(0)
+ assert mock_ingredient not in burger.ingredients
+ assert len(burger.ingredients) == 0
+
+ # 4. Тест перемещения ингредиентов местами в списке
+ def test_move_ingredient_changes_position(self):
+ burger = Burger()
+ mock_ing_1 = Mock()
+ mock_ing_2 = Mock()
+
+ burger.add_ingredient(mock_ing_1)
+ burger.add_ingredient(mock_ing_2)
+
+ # Перемещаем первый ингредиент на позицию второго
+ burger.move_ingredient(0, 1)
+ assert burger.ingredients[0] == mock_ing_2
+ assert burger.ingredients[1] == mock_ing_1
+
+ # 5. Тест расчета стоимости (Используем моки с возвращаемыми значениями)
+ def test_get_price_calculates_total_cost(self):
+ burger = Burger()
+
+ mock_bun = Mock()
+ mock_bun.get_price.return_value = 100.0 # Цена булки 100
+
+ mock_ingredient = Mock()
+ mock_ingredient.get_price.return_value = 50.0 # Цена ингредиента 50
+
+ burger.set_buns(mock_bun)
+ burger.add_ingredient(mock_ingredient)
+
+ # Расчет: (100 * 2) + 50 = 250
+ assert burger.get_price() == 250.0
+
+ # 6. Тест печати чека (Мокаем методы булки и ингредиента для генерации текста)
+ def test_get_receipt_returns_formatted_string(self):
+ burger = Burger()
+
+ mock_bun = Mock()
+ mock_bun.get_name.return_value = "Марсианская булка"
+ mock_bun.get_price.return_value = 100.0
+
+ mock_ingredient = Mock()
+ mock_ingredient.get_type.return_value = "SAUCE"
+ mock_ingredient.get_name.return_value = "Chili"
+ mock_ingredient.get_price.return_value = 50.0
+
+ burger.set_buns(mock_bun)
+ burger.add_ingredient(mock_ingredient)
+
+ receipt = burger.get_receipt()
+
+ assert "(==== Марсианская булка ====)" in receipt
+ assert "= sauce Chili =" in receipt
+ assert "Price: 250.0" in receipt
diff --git a/tests/database_test.py b/tests/database_test.py
new file mode 100644
index 000000000..e3c22c548
--- /dev/null
+++ b/tests/database_test.py
@@ -0,0 +1,30 @@
+from praktikum.database import Database
+
+class TestDatabase:
+
+ # 1. тест: проверка точного количества булочек в базе данных
+ def test_available_buns_returns_correct_count(self):
+ database = Database()
+ buns = database.available_buns()
+ assert len(buns) == 3
+
+ # 2. тест: проверка содержимого списка булочек (названия)
+ def test_available_buns_contains_correct_names(self):
+ database = Database()
+ buns = database.available_buns()
+ assert buns[0].get_name() == "black bun"
+ assert buns[1].get_name() == "white bun"
+ assert buns[2].get_name() == "red bun"
+
+ # 3. тест: проверка точного количества ингредиентов в базе данных
+ def test_available_ingredients_returns_correct_count(self):
+ database = Database()
+ ingredients = database.available_ingredients()
+ assert len(ingredients) == 6
+
+ # 4. тест: проверка точечного содержимого списка ингредиентов
+ def test_available_ingredients_contains_correct_names(self):
+ database = Database()
+ ingredients = database.available_ingredients()
+ assert ingredients[0].get_name() == "hot sauce"
+ assert ingredients[-1].get_name() == "sausage"
diff --git a/tests/ingredient_test.py b/tests/ingredient_test.py
new file mode 100644
index 000000000..da1d56b60
--- /dev/null
+++ b/tests/ingredient_test.py
@@ -0,0 +1,43 @@
+import pytest
+from praktikum.ingredient import Ingredient
+from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING
+
+class TestIngredient:
+
+ @pytest.mark.parametrize(
+ "ingredient_type, name, price",
+ [
+ (INGREDIENT_TYPE_SAUCE, "Chili Sauce", 100.0),
+ (INGREDIENT_TYPE_FILLING, "Cutlet", 250.50)
+ ]
+ )
+ # 1. Проверяем только тип ингредиента
+ def test_ingredient_get_type_returns_correct_value(self, ingredient_type, name, price):
+ ingredient = Ingredient(ingredient_type, name, price)
+ assert ingredient.get_type() == ingredient_type
+
+ @pytest.mark.parametrize(
+ "ingredient_type, name, price",
+ [
+ (INGREDIENT_TYPE_SAUCE, "Chili Sauce", 100.0),
+ (INGREDIENT_TYPE_FILLING, "Cutlet", 250.50)
+ ]
+ )
+ # 2. Проверяем только имя ингредиента
+ def test_ingredient_get_name_returns_correct_value(self, ingredient_type, name, price):
+ ingredient = Ingredient(ingredient_type, name, price)
+ assert ingredient.get_name() == name
+
+ @pytest.mark.parametrize(
+ "ingredient_type, name, price",
+ [
+ (INGREDIENT_TYPE_SAUCE, "Chili Sauce", 100.0),
+ (INGREDIENT_TYPE_FILLING, "Cutlet", 250.50),
+ (INGREDIENT_TYPE_SAUCE, "Sour cream", 0.0) # Граничное значение
+ ]
+ )
+ # 3. Проверяем только цену ингредиента
+ def test_ingredient_get_price_returns_correct_value(self, ingredient_type, name, price):
+ ingredient = Ingredient(ingredient_type, name, price)
+ assert ingredient.get_price() == price
+