diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..b2a142fc3 Binary files /dev/null and b/.coverage 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/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/praktikum.py b/praktikum/praktikum.py similarity index 100% rename from praktikum.py rename to praktikum/praktikum.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..d005f42b4 --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,40 @@ +import pytest +from praktikum.bun import Bun + +class TestBun: + """Тесты для класса Bun""" + + @pytest.mark.parametrize("name,price,expected_name,expected_price", [ + ("black bun", 100, "black bun", 100), + ("white bun", 200.5, "white bun", 200.5), + ("red bun", 0, "red bun", 0), + ("", 50, "", 50), + ]) + def test_bun_init(self, name, price, expected_name, expected_price): + """Тест инициализации булочки""" + bun = Bun(name, price) + assert bun.name == expected_name + assert bun.price == expected_price + + @pytest.mark.parametrize("name,price", [ + ("black bun", 100), + ("white bun", 200), + ("test bun", 150.75), + ]) + def test_get_name(self, name, price): + """Тест получения названия булочки""" + bun = Bun(name, price) + result = bun.get_name() + assert result == name + + @pytest.mark.parametrize("name,price", [ + ("black bun", 100), + ("white bun", 200.5), + ("red bun", 0), + ("test", 999.99), + ]) + def test_get_price(self, name, price): + """Тест получения цены булочки""" + bun = Bun(name, price) + result = bun.get_price() + assert result == 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..b72067419 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,127 @@ +import pytest +from unittest.mock import Mock, MagicMock +from praktikum.burger import Burger +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestBurger: + """Тесты для класса Burger""" + + def test_burger_init(self): + """Тест инициализации бургера""" + burger = Burger() + assert burger.bun is None + assert burger.ingredients == [] + + def test_set_buns(self): + """Тест установки булочки""" + burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.name = "test bun" + mock_bun.price = 100 + + burger.set_buns(mock_bun) + + assert burger.bun == mock_bun + assert burger.bun.name == "test bun" + + + def test_add_ingredient(self): + """Тест добавления ингредиента""" + burger = Burger() + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.name = "test ingredient" + + burger.add_ingredient(mock_ingredient) + + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == mock_ingredient + + @pytest.mark.parametrize("ingredient_name,ingredient_price,ingredient_type", [ + ("hot sauce", 100, INGREDIENT_TYPE_SAUCE), + ("cutlet", 200, INGREDIENT_TYPE_FILLING), + ("sour cream", 150, INGREDIENT_TYPE_SAUCE), + ]) + def test_add_ingredient_multiple(self, ingredient_name, ingredient_price, ingredient_type): + """Тест добавления нескольких ингредиентов""" + burger = Burger() + ingredient = Ingredient(ingredient_type, ingredient_name, ingredient_price) + + burger.add_ingredient(ingredient) + + assert len(burger.ingredients) == 1 + assert burger.ingredients[0].get_name() == ingredient_name + assert burger.ingredients[0].get_price() == ingredient_price + + def test_remove_ingredient(self): + """Тест удаления ингредиента""" + burger = Burger() + ingredient1 = Mock(spec=Ingredient) + ingredient2 = Mock(spec=Ingredient) + ingredient3 = Mock(spec=Ingredient) + + burger.ingredients = [ingredient1, ingredient2, ingredient3] + + burger.remove_ingredient(1) + + assert len(burger.ingredients) == 2 + assert ingredient1 in burger.ingredients + assert ingredient2 not in burger.ingredients + assert ingredient3 in burger.ingredients + + + def test_move_ingredient(self): + """Тест перемещения ингредиента""" + burger = Burger() + ingredient1 = Mock(spec=Ingredient) + ingredient2 = Mock(spec=Ingredient) + ingredient3 = Mock(spec=Ingredient) + + burger.ingredients = [ingredient1, ingredient2, ingredient3] + + burger.move_ingredient(2, 0) + + assert burger.ingredients == [ingredient3, ingredient1, ingredient2] + + + def test_get_price_with_bun_no_ingredients(self): + """Тест получения цены с булочкой""" + burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_price.return_value = 100 + + burger.set_buns(mock_bun) + + price = burger.get_price() + + assert price == 200 # 2 булочки по 100 + + + def test_get_receipt(self): + """Тест получения чека""" + burger = Burger() + mock_bun = Mock(spec=Bun) + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100 + burger.set_buns(mock_bun) + + mock_ingredient1 = Mock(spec=Ingredient) + mock_ingredient1.get_type.return_value = INGREDIENT_TYPE_SAUCE + mock_ingredient1.get_name.return_value = "hot sauce" + mock_ingredient1.get_price.return_value = 50 + + mock_ingredient2 = Mock(spec=Ingredient) + mock_ingredient2.get_type.return_value = INGREDIENT_TYPE_FILLING + mock_ingredient2.get_name.return_value = "cutlet" + mock_ingredient2.get_price.return_value = 150 + + burger.add_ingredient(mock_ingredient1) + burger.add_ingredient(mock_ingredient2) + + receipt = burger.get_receipt() + + assert "(==== black bun ====)" in receipt + assert "= sauce hot sauce =" in receipt + assert "= filling cutlet =" in receipt + assert "Price: 400" in receipt diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..6734e40b4 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,52 @@ +import pytest +from praktikum.database import Database +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestDatabase: + """Тесты для класса Database""" + + def test_initialization_database(self): + """Тест инициализации""" + database = Database() + + assert len(database.buns) == 3 + assert len(database.ingredients) == 6 + + + def test_available_buns_content(self): + """Тест содержания доступных булок""" + database = Database() + buns = database.available_buns() + + bun_names = [bun.get_name() for bun in buns] + bun_prices = [bun.get_price() for bun in buns] + + assert "black bun" in bun_names + assert "white bun" in bun_names + assert "red bun" in bun_names + assert 100 in bun_prices + assert 200 in bun_prices + assert 300 in bun_prices + + def test_available_ingredients(self): + """Тест получения доступных ингредиентов""" + database = Database() + ingredients = database.available_ingredients() + + assert len(ingredients) == 6 + + def test_available_ingredients_content(self): + """Тест содержания доступных ингредиентов""" + database = Database() + ingredients = database.available_ingredients() + + ing_names = [ing.get_name() for ing in ingredients] + + assert "hot sauce" in ing_names + assert "sour cream" in ing_names + assert "chili sauce" in ing_names + assert "cutlet" in ing_names + assert "dinosaur" in ing_names + assert "sausage" in ing_names \ No newline at end of file diff --git a/tests/test_ingridient.py b/tests/test_ingridient.py new file mode 100644 index 000000000..9320cd9a9 --- /dev/null +++ b/tests/test_ingridient.py @@ -0,0 +1,52 @@ +import pytest +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestIngredient: + """Тесты для класса Ingredient""" + + @pytest.mark.parametrize("ingredient_type, name, price", [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100), + (INGREDIENT_TYPE_FILLING, "cutlet", 200), + (INGREDIENT_TYPE_SAUCE, "sour cream", 150.5), + (INGREDIENT_TYPE_FILLING, "dinosaur", 0), + ]) + def test_ingredient_init(self, ingredient_type, name, price): + """Тест инициализации ингредиента""" + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.type == ingredient_type + assert ingredient.name == name + assert ingredient.price == price + + @pytest.mark.parametrize("ingredient_type, name, price,expected", [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100, "hot sauce"), + (INGREDIENT_TYPE_FILLING, "cutlet", 200, "cutlet"), + (INGREDIENT_TYPE_SAUCE, "chili sauce", 300, "chili sauce"), + ]) + def test_get_name(self, ingredient_type, name, price, expected): + """Тест получения названия ингредиента""" + ingredient = Ingredient(ingredient_type, name, price) + result = ingredient.get_name() + assert result == expected + + @pytest.mark.parametrize("ingredient_type, name, price, expected", [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100, 100), + (INGREDIENT_TYPE_FILLING, "cutlet", 200.5, 200.5), + (INGREDIENT_TYPE_SAUCE, "sour cream", 0, 0), + ]) + def test_get_price(self, ingredient_type, name, price, expected): + """Тест получения цены ингредиента""" + ingredient = Ingredient(ingredient_type, name, price) + result = ingredient.get_price() + assert result == expected + + @pytest.mark.parametrize("ingredient_type, name, price,expected", [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100, INGREDIENT_TYPE_SAUCE), + (INGREDIENT_TYPE_FILLING, "cutlet", 200, INGREDIENT_TYPE_FILLING), + ]) + def test_get_type(self, ingredient_type, name, price, expected): + """Тест получения типа ингредиента""" + ingredient = Ingredient(ingredient_type, name, price) + result = ingredient.get_type() + assert result == expected + assert result in [INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING] \ No newline at end of file