diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..2a2b56cce Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..55ec5e02f --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +__pycache__/ +.pytest_cache/ +allure-results/ +allure-report/ + +*.pyc +*.pyo +*.pyd + +.idea/ +.vscode/ + +.env 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/requirements.txt b/requirements.txt new file mode 100644 index 000000000..65a06064d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest==9.0.3 +pytest-cov==7.1.0 \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..4258dadde --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,19 @@ +from unittest.mock import Mock + +import pytest + +from praktikum.burger import Burger + + +@pytest.fixture +def burger(): + return Burger() + + +@pytest.fixture +def bun(): + bun = Mock() + bun.get_name.return_value = 'black bun' + bun.get_price.return_value = 100 + return bun + \ No newline at end of file diff --git a/tests/data.py b/tests/data.py new file mode 100644 index 000000000..0fe563906 --- /dev/null +++ b/tests/data.py @@ -0,0 +1,8 @@ +BUN_NAME = 'black bun' +BUN_PRICE = 100 + +SAUCE_NAME = 'hot sauce' +SAUCE_PRICE = 20 + +FILLING_NAME = 'cutlet' +FILLING_PRICE = 50 diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..0c990b387 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,119 @@ +from unittest.mock import Mock + +import pytest + +from praktikum.ingredient_types import ( + INGREDIENT_TYPE_FILLING, + INGREDIENT_TYPE_SAUCE +) + +from tests.data import ( + BUN_NAME, + SAUCE_NAME, + SAUCE_PRICE, + FILLING_NAME, + FILLING_PRICE +) + + +class TestBurger: + + def test_set_buns_sets_bun(self, burger, bun): + burger.set_buns(bun) + + assert burger.bun == bun + + def test_add_ingredient_adds_ingredient_to_list(self, burger): + ingredient = Mock() + + burger.add_ingredient(ingredient) + + assert ingredient in burger.ingredients + + def test_remove_ingredient_removes_ingredient_from_list(self, burger): + ingredient = Mock() + + burger.add_ingredient(ingredient) + burger.remove_ingredient(0) + + assert ingredient not in burger.ingredients + + def test_remove_ingredient_with_invalid_index_raises_index_error( + self, + burger + ): + with pytest.raises(IndexError): + burger.remove_ingredient(0) + + def test_move_ingredient_changes_order_of_ingredients(self, burger): + ingredient_1 = Mock() + ingredient_2 = Mock() + + burger.add_ingredient(ingredient_1) + burger.add_ingredient(ingredient_2) + + burger.move_ingredient(0, 1) + + assert burger.ingredients == [ingredient_2, ingredient_1] + + def test_move_ingredient_with_invalid_index_raises_index_error( + self, + burger + ): + with pytest.raises(IndexError): + burger.move_ingredient(0, 1) + + @pytest.mark.parametrize( + 'ingredient_prices, expected_price', + [ + ([], 200), + ([50], 250), + ([50, 30], 280) + ] + ) + def test_get_price_returns_correct_price( + self, + burger, + bun, + ingredient_prices, + expected_price + ): + burger.set_buns(bun) + + for price in ingredient_prices: + ingredient = Mock() + ingredient.get_price.return_value = price + burger.add_ingredient(ingredient) + + assert burger.get_price() == expected_price + + def test_get_receipt_returns_correct_receipt( + self, + burger, + bun + ): + burger.set_buns(bun) + + sauce = Mock() + sauce.get_type.return_value = INGREDIENT_TYPE_SAUCE + sauce.get_name.return_value = SAUCE_NAME + sauce.get_price.return_value = SAUCE_PRICE + + filling = Mock() + filling.get_type.return_value = INGREDIENT_TYPE_FILLING + filling.get_name.return_value = FILLING_NAME + filling.get_price.return_value = FILLING_PRICE + + burger.add_ingredient(sauce) + burger.add_ingredient(filling) + + expected_receipt = ( + f'(==== {BUN_NAME} ====)\n' + f'= sauce {SAUCE_NAME} =\n' + f'= filling {FILLING_NAME} =\n' + f'(==== {BUN_NAME} ====)\n\n' + 'Price: 270' + ) + + assert burger.get_receipt() == expected_receipt + \ No newline at end of file