diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..f958eaa59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +venv/ +__pycache__/ +.pytest_cache/ +.coverage +.idea/ +.vscode/ +.DS_Store +Thumbs.db +*.py[cod] +*.log \ No newline at end of file diff --git a/burger.py b/burger.py index 2b3b6a88b..3f71aaa29 100644 --- a/burger.py +++ b/burger.py @@ -1,7 +1,7 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient +from bun import Bun +from ingredient import Ingredient class Burger: diff --git a/database.py b/database.py index 4c75baf71..84d3685d0 100644 --- a/database.py +++ b/database.py @@ -1,8 +1,8 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient -from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING +from bun import Bun +from ingredient import Ingredient +from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING class Database: diff --git a/kriterii.txt b/kriterii.txt new file mode 100644 index 000000000..2d7d409aa --- /dev/null +++ b/kriterii.txt @@ -0,0 +1,67 @@ +К р и т е р и и о ц е н к и +К а к б у д у т п р о в е р я т ь т в о й п р о е к т +На что обращают внимание ревьюеры, к огда проверяют т вой дипломный +проект. +Ю н и т - т е с т ы +Названия пак етов, файлов, классов, мет одов, тестов и переменных +корректные: соот ветствуют пр авилам, к оторые удалось из учить в курсе. +Тесты запускаются и не падают . +В тестах ест ь моки и пар аметризация. +Тесты независимы др уг от др уга. +Тесты не избыт очны. +В конце каждог о теста ест ь a s s e r t. +Тесты лежат в t e s t s. +Сделан отчёт в p y t e s t - c o v. Тестовое покрыт ие не ниж е 100%. Отчёт +добавлен в п ул-реквест . +В проект е нет ничег о лишнег о. Например, неиспольз уемых зависимост ей +в r e q u i r e m e n t s . t x t, неиспольз уемых импорт ов, закоммент ированных блок ов +кода, файлов наст роек IDE. Мо жешь оставлят ь комментарии, к оторые +объясняют т воё решения. Эт о не будет ошибк ой. +А в т о т е с т ы A P I +Названия пак етов, файлов, классов, мет одов, тестов и переменных — +корректные. +Для каждог о эндпоинта т есты лежат в отдельном классе. +Тесты запускаются и про ходят. +Написаны все т есты, указанные в задании. +Критерии оценки +1В тестах проверяет ся тело и код ответа. +Все тесты независимы. +Нужные т естовые данные создают ся перед т естом и удаляются после +того, как он выполнит ся. +Сделан Allur e-отчёт. Отчёт добавлен в п ул-реквест . +Тесты лежат в t e s t s. +В проект е нет ничег о лишнег о. Например, неиспольз уемых зависимост ей +в r e q u i r e m e n t s . t x t, неиспольз уемых импорт ов, закоммент ированных блок ов +кода, файлов наст роек IDE. Мо жешь оставлят ь комментарии, к оторые +объясняют т воё решения. Эт о не будет ошибк ой. +А в т о т е с т ы U I +Тесты лежат в t e s t s. +Для Page Object создан отдельный пак ет. +Для каждой ст раницы создан отдельный класс с Page Object. +Тесты разделены по т ематике или функциональност и. Для т естов созданы +отдельные классы. +Все элемент ы страниц, которые ты использ уешь в тестах, опис аны в Page +Object. +Название класс а Page Object от ражает ег о содер жимое. +Локаторы нах одятся в отдельном пак ете с файлами или ф айле. +Названия локат оров понят ны. +Тесты запускаются и не падают . +Тесты не зависят др уг от др уга. +Названия т естов понят ные и неизбыт очные. +Тест — пре жде всег о проверка, а не набор дейст вий. Каждый т ест что-то +проверяет . +Критерии оценки +2Нужные т естовые данные создают ся перед т естом и удаляются после +того, как он выполнит ся. +Если для т еста нуж ен тестовый юзер, он создаёт ся с помощью API. +Есть все тесты, которые опис аны в задании. +Сделан Allur e-отчёт. Отчёт добавлен в п ул-реквест . +В проект е нет ничег о лишнег о. Например, неиспольз уемых зависимост ей +в r e q u i r e m e n t s . t x t, неиспольз уемых импорт ов, закоммент ированных блок ов +кода, файлов наст роек IDE. Мо жешь оставлят ь комментарии, к оторые +объясняют т воё решения. Эт о не будет ошибк ой. +Выполнит ь диплом т ебе помог ут материалы, шпаргалки и к онспект ы курса по +тестированию. +Успехов! +Критерии оценки +3 \ No newline at end of file diff --git a/praktikum.py b/praktikum.py index ec522fa6d..88b77abd1 100644 --- a/praktikum.py +++ b/praktikum.py @@ -1,9 +1,9 @@ from typing import List -from praktikum.bun import Bun -from praktikum.burger import Burger -from praktikum.database import Database -from praktikum.ingredient import Ingredient +from bun import Bun +from burger import Burger +from database import Database +from ingredient import Ingredient def main(): diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..460a60079 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +testpaths = tests +addopts = + -v + --tb=short + --cov=burger + --cov-report=term-missing \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..6f9c6069c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest==9.1.1 +pytest-cov==7.1.0 \ 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..9bbde6a84 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,177 @@ +"""Тесты для класса Burger.""" + +import pytest +from unittest.mock import Mock + +from burger import Burger + + +class TestBurger: + """Тесты для класса Burger.""" + + def test_set_buns_assigns_bun(self): + """Проверка, что булочка устанавливается в поле bun.""" + burger = Burger() + mock_bun = Mock() + + burger.set_buns(mock_bun) + + assert burger.bun == mock_bun + + def test_set_buns_returns_name(self): + """Проверка, что метод get_name булочки возвращает корректное имя.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + + burger.set_buns(mock_bun) + + assert burger.bun.get_name() == "black bun" + + def test_set_buns_returns_price(self): + """Проверка, что метод get_price булочки возвращает корректную цену.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_price.return_value = 100.0 + + burger.set_buns(mock_bun) + + assert burger.bun.get_price() == 100.0 + + def test_add_ingredient_increases_count(self): + """Проверка, что при добавлении ингредиента его количество увеличивается.""" + burger = Burger() + mock_ingredient = Mock() + + burger.add_ingredient(mock_ingredient) + + assert len(burger.ingredients) == 1 + + def test_add_ingredient_stores_value(self): + """Проверка, что добавленный ингредиент хранится в списке.""" + burger = Burger() + mock_ingredient = Mock() + + burger.add_ingredient(mock_ingredient) + + assert burger.ingredients[0] == mock_ingredient + + def test_remove_ingredient(self): + """Проверка удаления ингредиента.""" + burger = Burger() + mock_ingredient = Mock() + burger.add_ingredient(mock_ingredient) + + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 0 + + def test_move_ingredient_first_to_second(self): + """Проверка, что первый ингредиент перемещается на позицию второго.""" + burger = Burger() + mock_1 = Mock() + mock_2 = Mock() + burger.add_ingredient(mock_1) + burger.add_ingredient(mock_2) + + burger.move_ingredient(0, 1) + + assert burger.ingredients[0] == mock_2 + + def test_move_ingredient_second_to_first(self): + """Проверка, что второй ингредиент перемещается на позицию первого.""" + burger = Burger() + mock_1 = Mock() + mock_2 = Mock() + burger.add_ingredient(mock_1) + burger.add_ingredient(mock_2) + + burger.move_ingredient(0, 1) + + assert burger.ingredients[1] == mock_1 + + @pytest.mark.parametrize("bun_price,ingredient_prices,expected", [ + (100.0, [], 200.0), + (100.0, [100.0], 300.0), + (200.0, [100.0, 200.0], 700.0), + (300.0, [100.0, 200.0, 300.0], 1200.0), + ]) + def test_get_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 + + @pytest.mark.parametrize("ingredient_type,ingredient_name,expected_line", [ + ("SAUCE", "hot sauce", "= sauce hot sauce ="), + ("FILLING", "cutlet", "= filling cutlet ="), + ]) + def test_get_receipt_contains_bun(self, ingredient_type, ingredient_name, expected_line): + """Проверка, что чек содержит название булочки.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100.0 + 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 = 100.0 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + + assert "(==== black bun ====)" in receipt + + @pytest.mark.parametrize("ingredient_type,ingredient_name,expected_line", [ + ("SAUCE", "hot sauce", "= sauce hot sauce ="), + ("FILLING", "cutlet", "= filling cutlet ="), + ]) + def test_get_receipt_contains_ingredient(self, ingredient_type, ingredient_name, expected_line): + """Проверка, что чек содержит ингредиент.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100.0 + 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 = 100.0 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + + assert expected_line in receipt + + @pytest.mark.parametrize("ingredient_type,ingredient_name,expected_line", [ + ("SAUCE", "hot sauce", "= sauce hot sauce ="), + ("FILLING", "cutlet", "= filling cutlet ="), + ]) + def test_get_receipt_contains_price(self, ingredient_type, ingredient_name, expected_line): + """Проверка, что чек содержит итоговую цену.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100.0 + 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 = 100.0 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + + assert "Price: 300.0" in receipt \ No newline at end of file