diff --git a/htmlcov.zip b/htmlcov.zip
new file mode 100644
index 000000000..ada0a57aa
Binary files /dev/null and b/htmlcov.zip differ
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/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/conftest.py b/tests/conftest.py
new file mode 100644
index 000000000..280c2ce88
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,38 @@
+import pytest
+from praktikum.bun import Bun
+from praktikum.burger import Burger
+from praktikum.ingredient import Ingredient
+from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING
+
+BUN_PRICE = 50
+BUN_NAME_1 = "Test Bun 1"
+BUN_NAME_2 = "Test Bun 2"
+SAUCE_NAME = "Test Sauce"
+FILLING_NAME = "Test Filling"
+SAUCE_PRICE = 20
+FILLING_PRICE = 40
+
+
+@pytest.fixture
+def mock_bun():
+ return Bun(BUN_NAME_1, BUN_PRICE)
+
+
+@pytest.fixture
+def mock_bun_2():
+ return Bun(BUN_NAME_2, BUN_PRICE)
+
+
+@pytest.fixture
+def mock_sauce():
+ return Ingredient(INGREDIENT_TYPE_SAUCE, SAUCE_NAME, SAUCE_PRICE)
+
+
+@pytest.fixture
+def mock_filling():
+ return Ingredient(INGREDIENT_TYPE_FILLING, FILLING_NAME, FILLING_PRICE)
+
+
+@pytest.fixture
+def burger():
+ return Burger()
diff --git a/tests/test_bun.py b/tests/test_bun.py
new file mode 100644
index 000000000..76b283fb1
--- /dev/null
+++ b/tests/test_bun.py
@@ -0,0 +1,15 @@
+import pytest
+from praktikum.bun import Bun
+
+BUN_NAME_1 = "sesame"
+BUN_NAME_2 = "plain"
+BUN_PRICE = 50.0
+
+@pytest.mark.parametrize("name", [BUN_NAME_1, BUN_NAME_2])
+def test_bun_name(name):
+ bun = Bun(name, BUN_PRICE)
+ assert bun.get_name() == name
+
+def test_bun_price():
+ bun = Bun(BUN_NAME_1, BUN_PRICE)
+ assert bun.get_price() == BUN_PRICE
\ No newline at end of file
diff --git a/tests/test_burger.py b/tests/test_burger.py
new file mode 100644
index 000000000..da1c7418f
--- /dev/null
+++ b/tests/test_burger.py
@@ -0,0 +1,53 @@
+BUN_PRICE = 50
+BUN_NAME_1 = "Test Bun 1"
+BUN_NAME_2 = "Test Bun 2"
+SAUCE_NAME = "Test Sauce"
+FILLING_NAME = "Test Filling"
+SAUCE_PRICE = 20
+FILLING_PRICE = 40
+
+def test_add_one_ingredient(burger, mock_sauce):
+ burger.add_ingredient(mock_sauce)
+ assert burger.ingredients[0].get_name() == SAUCE_NAME, "Ингредиент не был добавлен корректно"
+
+def test_add_two_ingredients(burger, mock_sauce, mock_filling):
+ burger.add_ingredient(mock_sauce)
+ burger.add_ingredient(mock_filling)
+ assert burger.ingredients[0].get_name() == SAUCE_NAME and burger.ingredients[
+ 1].get_name() == FILLING_NAME, "Ингредиенты не были добавлены корректно"
+
+def test_remove_ingredient(burger, mock_sauce, mock_filling):
+ burger.add_ingredient(mock_sauce)
+ burger.add_ingredient(mock_filling)
+ burger.remove_ingredient(1)
+ assert burger.ingredients[0].get_name() == SAUCE_NAME and len(
+ burger.ingredients) == 1, "Ингредиент не был удален корректно"
+
+def test_move_ingredient(burger, mock_sauce, mock_filling):
+ burger.add_ingredient(mock_sauce)
+ burger.add_ingredient(mock_filling)
+ burger.move_ingredient(0, 1)
+ assert burger.ingredients[0].get_name() == FILLING_NAME and burger.ingredients[
+ 1].get_name() == SAUCE_NAME, "Ингредиент не был перемещен корректно"
+
+def test_get_price(burger, mock_bun, mock_sauce, mock_filling):
+ burger.set_buns(mock_bun)
+ burger.add_ingredient(mock_sauce)
+ burger.add_ingredient(mock_filling)
+ expected_price = BUN_PRICE * 2 + SAUCE_PRICE + FILLING_PRICE
+ assert burger.get_price() == expected_price, f"Общая цена бургера {burger.get_price()} не соответствует ожидаемой {expected_price}"
+
+def test_get_receipt(burger, mock_bun, mock_sauce, mock_filling):
+ burger.set_buns(mock_bun)
+ burger.add_ingredient(mock_sauce)
+ burger.add_ingredient(mock_filling)
+ expected_price = BUN_PRICE * 2 + SAUCE_PRICE + FILLING_PRICE
+ expected = (
+ f'(==== {BUN_NAME_1} ====)\n'
+ f'= sauce {SAUCE_NAME} =\n'
+ f'= filling {FILLING_NAME} =\n'
+ f'(==== {BUN_NAME_1} ====)\n'
+ f'\n'
+ f'Price: {expected_price}'
+ )
+ assert burger.get_receipt() == expected, 'Полный вывод чека не совпадает с ожидаемым'
diff --git a/tests/test_database.py b/tests/test_database.py
new file mode 100644
index 000000000..4d7293bb5
--- /dev/null
+++ b/tests/test_database.py
@@ -0,0 +1,14 @@
+from database import Database
+from praktikum.bun import Bun
+from praktikum.ingredient import Ingredient
+
+
+def test_database_lists():
+ db = Database()
+ buns = db.available_buns()
+ ingredients = db.available_ingredients()
+
+ assert isinstance(buns, list)
+ assert isinstance(ingredients, list)
+ assert len(buns) == 3
+ assert len(ingredients) == 6
diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py
new file mode 100644
index 000000000..15cd859da
--- /dev/null
+++ b/tests/test_ingredient.py
@@ -0,0 +1,32 @@
+import pytest
+from praktikum.ingredient import Ingredient
+from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING
+
+SAUCE_NAME = "Test Sauce"
+FILLING_NAME = "Test Filling"
+SAUCE_PRICE = 20
+FILLING_PRICE = 40
+
+@pytest.mark.parametrize("ingredient_type, name, price", [
+ (INGREDIENT_TYPE_SAUCE, SAUCE_NAME, SAUCE_PRICE),
+ (INGREDIENT_TYPE_FILLING, FILLING_NAME, FILLING_PRICE)
+])
+def test_ingredient_type(ingredient_type, name, price):
+ ingredient = Ingredient(ingredient_type, name, price)
+ assert ingredient.get_type() == ingredient_type, f"Тип ингредиента '{ingredient.get_type()}' не соответствует ожидаемому '{ingredient_type}'"
+
+@pytest.mark.parametrize("ingredient_type, name, price", [
+ (INGREDIENT_TYPE_SAUCE, SAUCE_NAME, SAUCE_PRICE),
+ (INGREDIENT_TYPE_FILLING, FILLING_NAME, FILLING_PRICE)
+])
+def test_ingredient_name(ingredient_type, name, price):
+ ingredient = Ingredient(ingredient_type, name, price)
+ assert ingredient.get_name() == name, f"Название ингредиента '{ingredient.get_name()}' не соответствует ожидаемому '{name}'"
+
+@pytest.mark.parametrize("ingredient_type, name, price", [
+ (INGREDIENT_TYPE_SAUCE, SAUCE_NAME, SAUCE_PRICE),
+ (INGREDIENT_TYPE_FILLING, FILLING_NAME, FILLING_PRICE)
+])
+def test_ingredient_price(ingredient_type, name, price):
+ ingredient = Ingredient(ingredient_type, name, price)
+ assert ingredient.get_price() == price, f"Цена ингредиента {ingredient.get_price()} не соответствует ожидаемой {price}"
\ No newline at end of file