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 +