diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..7db906e54 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +__pycache__/ +*.pyc +*.pyo +*.pyd +venv/ +env/ +.venv/ +ENV/ +dist/ +build/ +*.egg-info/ +*.egg +.pytest_cache/ +.coverage +htmlcov/ +.tox/ \ No newline at end of file diff --git a/burger.py b/burger.py index 2b3b6a88b..4c9904fc4 100644 --- a/burger.py +++ b/burger.py @@ -1,8 +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/data.py b/data.py new file mode 100644 index 000000000..6ea429e82 --- /dev/null +++ b/data.py @@ -0,0 +1,10 @@ +BUN_DATA = { + "name": "black bun", + "price": 100 +} + +INGREDIENTS_DATA = [ + {"type": "SAUCE", "name": "hot sauce", "price": 100}, + {"type": "FILLING", "name": "cutlet", "price": 100}, + {"type": "FILLING", "name": "dinosaur", "price": 200}, +] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..3952ae2b8 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/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..aa2352e5e --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,42 @@ +import pytest +from unittest.mock import Mock +from burger import Burger +from data import * + + +#пустой объект Burger +@pytest.fixture +def new_burger(): + return Burger() + +# Мок-булка +@pytest.fixture +def bun_in_burger(): + bun = Mock() + bun.name = BUN_DATA["name"] + bun.price = BUN_DATA["price"] + bun.get_price.return_value = BUN_DATA["price"] + bun.get_name.return_value = BUN_DATA["name"] + return bun + +# список для бургера +@pytest.fixture +def ingredients_in_burger(): + ingredients = [] + for i in INGREDIENTS_DATA: + ingredient = Mock() + ingredient.type = i["type"] + ingredient.name = i["name"] + ingredient.price = i["price"] + ingredient.get_type.return_value = i["type"] + ingredient.get_name.return_value = i["name"] + ingredient.get_price.return_value = i["price"] + ingredients.append(ingredient) + return ingredients + +# мок с булкой и ингредиентами +@pytest.fixture +def mocked_burger(new_burger, bun_in_burger, ingredients_in_burger): + new_burger.set_buns(bun_in_burger) + new_burger.ingredients = ingredients_in_burger.copy() + return new_burger \ No newline at end of file diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..9a826f634 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,54 @@ +import pytest + +class TestBurger: + + # изначальное состояние (без ингредиентов) + def test_burger_initialization(self, new_burger): + assert new_burger.bun is None + assert new_burger.ingredients == [] + + # проверяем добав. одной булки + def test_set_buns_single_bun_added_in_burger(self, new_burger, bun_in_burger): + new_burger.set_buns(bun_in_burger) + assert new_burger.bun == bun_in_burger + + # Проверка добавления 2-ух ингрдтв. в бугрере + def test_add_ingredient_two_ingridients_added_in_burger(self, new_burger, ingredients_in_burger): + new_burger.add_ingredient(ingredients_in_burger[0]) + new_burger.add_ingredient(ingredients_in_burger[1]) + assert ingredients_in_burger[0] and ingredients_in_burger[1] in new_burger.ingredients + + # удаляем первый ингредиент + def test_remove_ingredient_first_ingredient_delete_from_burger(self, new_burger, ingredients_in_burger): + new_burger.ingredients = ingredients_in_burger.copy() + new_burger.remove_ingredient(0) + expected_ingredients = ingredients_in_burger[1:] + assert new_burger.ingredients == expected_ingredients + + # ингредиенты внутри списка + def test_move_ingredient_moves_two_ingredient_in_burger_changed(self, new_burger, ingredients_in_burger): + new_burger.ingredients = ingredients_in_burger.copy() + new_burger.move_ingredient(0, 1) + assert new_burger.ingredients[0] == ingredients_in_burger[1] and new_burger.ingredients[1] == ingredients_in_burger[0] + + # расчет цены + @pytest.mark.parametrize("ingredients", [[0, 1], [1, 2], [0, 2], [0, 1, 2]]) + def test_get_price_various_ingredients_correct_price(self, mocked_burger, bun_in_burger, ingredients_in_burger, ingredients): + selected_ingredients = [ingredients_in_burger[i] for i in ingredients] + mocked_burger.ingredients = selected_ingredients + expected_price = bun_in_burger.get_price.return_value * 2 + sum(i.get_price.return_value for i in selected_ingredients) + price = mocked_burger.get_price() + assert price == expected_price + + # чек + @pytest.mark.parametrize("ingredients", [[0, 1], [1, 2], [0, 2], [0, 1, 2]]) + def test_get_receipt_various_ingredients_expected_price(self, mocked_burger, bun_in_burger, ingredients_in_burger, ingredients): + selected_ingredients = [ingredients_in_burger[i] for i in ingredients] + mocked_burger.ingredients = selected_ingredients + receipt = mocked_burger.get_receipt() + expected_lines = [f'(==== {bun_in_burger.get_name.return_value} ====)'] + expected_lines += [f'= {ing.get_type.return_value.lower()} {ing.get_name.return_value} =' for ing in selected_ingredients] + expected_lines.append(f'(==== {bun_in_burger.get_name.return_value} ====)\n') + expected_lines.append(f'Price: {mocked_burger.get_price()}') + expected_receipt = '\n'.join(expected_lines) + assert receipt == expected_receipt \ No newline at end of file