diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a25ba9f56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Виртуальное окружение +venv/ +env/ +.venv/ + +# Кэш Python +__pycache__/ +__pycache__ +*.pyc + +# Файлы pytest и покрытия +.pytest_cache/ +.pytest_cache +.coverage +htmlcov/ +coverage.xml + +# IDE +.vscode/ +.idea/ + +# Системные файлы +.DS_Store +Thumbs.db + +# Секреты +.env \ No newline at end of file diff --git a/README.md b/README.md index 272081708..9a9208e8d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### Реализованные сценарии -Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` +Созданы юнит-тесты, покрывающие класс `Burger` Процент покрытия 100% (отчет: `htmlcov/index.html`) diff --git a/__init__.py b/conftest.py similarity index 100% rename from __init__.py rename to conftest.py diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..e69de29bb 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 99% rename from burger.py rename to praktikum/burger.py index 2b3b6a88b..63cb9f0e3 100644 --- a/burger.py +++ b/praktikum/burger.py @@ -1,5 +1,4 @@ from typing import List - from praktikum.bun import Bun from praktikum.ingredient import Ingredient @@ -46,3 +45,5 @@ def get_receipt(self) -> str: receipt.append(f'Price: {self.get_price()}') return '\n'.join(receipt) + + \ No newline at end of file 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/requirements.txt b/requirements.txt new file mode 100644 index 000000000..cffeec658 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest +pytest-cov \ No newline at end of file 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..2308984d8 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,125 @@ +import pytest +from unittest.mock import Mock +import allure +from praktikum.burger import Burger + +class TestBurger: + + + @allure.title('Новый бургер не имеет булочки и ингредиентов') + def test_new_burger_is_empty(self): + + burger = Burger() + mock_bun = Mock() + mock_bun.get_price.return_value = 0 + mock_bun.get_name.return_value = "without_bun" + burger.set_buns(mock_bun) + + assert burger.get_price() == 0 + + + @allure.title('Проверка, можно ли установить булочку для бургера') + def test_set_buns(self): + + burger = Burger() + mock_bun = Mock() + + burger.set_buns(mock_bun) + + assert burger.bun == mock_bun + + @allure.title('Можно добавить ингредиент в бургер') + def test_add_ingredient(self): + burger = Burger() + mock_ingredient = Mock() + + burger.add_ingredient(mock_ingredient) + + assert burger.ingredients[0] == mock_ingredient + + @allure.title('Можно удалить ингредиент из списка') + def test_remove_ingredient(self): + + burger = Burger() + first_ingredient = Mock() + second_ingredient = Mock() + + burger.add_ingredient(first_ingredient) + burger.add_ingredient(second_ingredient) + + burger.remove_ingredient(0) + + assert burger.ingredients[0] == second_ingredient + + @allure.title('Перемещение ингредиента на другую позицию') + def test_move_ingredient(self): + + burger = Burger() + first_ingredient = Mock() + second_ingredient = Mock() + third_ingredient = Mock() + + burger.add_ingredient(first_ingredient) + burger.add_ingredient(second_ingredient) + burger.add_ingredient(third_ingredient) + + burger.move_ingredient(2, 1) + + assert burger.ingredients == [first_ingredient, third_ingredient, second_ingredient] + + @allure.title('Рассчет стоимости булочек') + def test_get_bun_price(self): + burger = Burger() + mock_bun = Mock() + mock_bun.get_price.return_value = 100 + burger.set_buns(mock_bun) + + price = burger.get_price() + + assert price == 200 + + + @allure.title('Рассчет стоимости бургера') + @pytest.mark.parametrize("bun_price, ingredient_prices, expected", [ + (100, [10, 20], 230), + (100, [10, 20, 30], 260), + (50, [5, 5, 5, 5], 120), + (100, [], 200), + ]) + def test_get_burger_price(self, bun_price, ingredient_prices, expected): + burger = Burger() + + mock_bun = Mock() + mock_bun.get_price.return_value = bun_price + burger.set_buns(mock_bun) + + for price in ingredient_prices: + mock_ingredient = Mock() + mock_ingredient.get_price.return_value = price + burger.add_ingredient(mock_ingredient) + + assert burger.get_price() == expected + + @allure.title('Рецепт с разными ингредиентами и типами ингредиентов') + @pytest.mark.parametrize("bun_name, ingredient_type, ingredient_name, expected_line", [ + ("Флюоресцентная булка", "sauce", "Spicy-X", "= sauce Spicy-X ="), + ("Краторная булка", "filling", "Говяжий метеорит", "= filling Говяжий метеорит ="), + ("Краторная булка", "sauce", "Space Sauce", "= sauce Space Sauce ="), + ]) + def test_receipt_with_different_ingredients(self, bun_name, ingredient_type, ingredient_name, expected_line): + burger = Burger() + + mock_bun = Mock() + mock_bun.get_name.return_value = bun_name + mock_bun.get_price.return_value = 100 + burger.set_buns(mock_bun) + + mock_ingredient = Mock() + mock_ingredient.get_type.return_value = ingredient_type + mock_ingredient.get_name.return_value = ingredient_name + mock_ingredient.get_price.return_value = 50 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + + assert expected_line in receipt