From 9119ee23e1ee238e04e6c7b5a3d2b8cdea999ee6 Mon Sep 17 00:00:00 2001 From: zhbronn Date: Thu, 5 Mar 2026 12:23:22 +0300 Subject: [PATCH] commit --- .gitignore | 24 ++++++++++++ burger.py | 4 +- conftest.py | 51 ++++++++++++++++++++++++++ database.py | 6 +-- helpers/data.py | 13 +++++++ praktikum.py | 8 ++-- pytest.ini | 2 + tests/__init__.py | 0 tests/test_bun.py | 20 ++++++++++ tests/test_burger.py | 79 ++++++++++++++++++++++++++++++++++++++++ tests/test_database.py | 16 ++++++++ tests/test_ingredient.py | 27 ++++++++++++++ 12 files changed, 241 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 conftest.py create mode 100644 helpers/data.py create mode 100644 pytest.ini create mode 100644 tests/__init__.py create mode 100644 tests/test_bun.py create mode 100644 tests/test_burger.py create mode 100644 tests/test_database.py create mode 100644 tests/test_ingredient.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..f7fb6edbe --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +*.log + +tmp/ + +.env.* +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +.idea/ +.vscode/ + +*cache/ +.cache/ +__pycache__/ +*.py[cod] +*$py.class +.pytest_cache/ +.cache + 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/conftest.py b/conftest.py new file mode 100644 index 000000000..6a6593ea0 --- /dev/null +++ b/conftest.py @@ -0,0 +1,51 @@ +import pytest +from unittest.mock import MagicMock + +import sys +import os +sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) + + +from bun import Bun + +from burger import Burger +from database import Database +from helpers.data import BUNS_INFO, INGREDIENTS_INFO +from ingredient import Ingredient + + +@pytest.fixture +def burger(): + return Burger() + + +@pytest.fixture +def mock_create_buns(): + bun_mock = MagicMock(spec=Bun) + bun_mock.get_name.return_value = BUNS_INFO[0]["bun_name"] + bun_mock.get_price.return_value = BUNS_INFO[0]["bun_price"] + return bun_mock + +@pytest.fixture +def mock_create_ingredient(): + ingredient_mock = MagicMock(spec=Ingredient) + + ingredient_mock.get_name.return_value = INGREDIENTS_INFO[0]["ingredient_name"] + ingredient_mock.get_type.return_value = INGREDIENTS_INFO[0]["ingredient_type"] + ingredient_mock.get_price.return_value = INGREDIENTS_INFO[0]["ingredient_price"] + + return ingredient_mock + +@pytest.fixture +def mock_create_additional_ingredient(): + ingredient_mock_2 = MagicMock(spec=Ingredient) + + ingredient_mock_2.get_name.return_value = INGREDIENTS_INFO[1]["ingredient_name"] + ingredient_mock_2.get_type.return_value = INGREDIENTS_INFO[1]["ingredient_type"] + ingredient_mock_2.get_price.return_value = INGREDIENTS_INFO[1]["ingredient_price"] + + return ingredient_mock_2 + +@pytest.fixture +def db(): + return Database() 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/helpers/data.py b/helpers/data.py new file mode 100644 index 000000000..c8442f659 --- /dev/null +++ b/helpers/data.py @@ -0,0 +1,13 @@ + +BUNS_INFO = [ + {"bun_name": "Краторная булка N-200i", "bun_price": 999.9}, + {"bun_name": "Флюоресцентная булка R2-D3", "bun_price": 444.4} +] + +INGREDIENTS_INFO = [ + {"ingredient_name": "Биокотлета из марсианской Магнолии", "ingredient_type": "FILLING", "ingredient_price": 424.0}, + {"ingredient_name": "Плоды Фалленианского дерева", "ingredient_type": "FILLING", "ingredient_price": 874.0} +] + + + 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..de19c9f0b --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +testpaths = tests \ 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_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..4face5bb9 --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,20 @@ +import pytest + +from bun import Bun +from helpers.data import BUNS_INFO + +class TestBun: + + @pytest.mark.parametrize("bun_data", BUNS_INFO) + def test_get_name_returns_bun_name(self, bun_data): + bun = Bun(bun_data["bun_name"], bun_data["bun_price"]) + + assert bun.get_name() == bun_data["bun_name"] + assert isinstance(bun_data["bun_name"], str) + + @pytest.mark.parametrize("bun_data", BUNS_INFO) + def test_get_price_returns_bun_price(self, bun_data): + bun = Bun(bun_data["bun_name"], bun_data["bun_price"]) + + assert bun.get_price() == bun_data["bun_price"] + assert isinstance(bun_data["bun_price"] , float) \ No newline at end of file diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..e67d39d63 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,79 @@ + +class TestBurger: + + def test_set_buns_adds_buns_to_burger(self, burger, mock_create_buns): + burger.set_buns(mock_create_buns) + + assert mock_create_buns.get_name() == burger.bun.get_name() + + def test_add_ingredient_adds_ingredients_to_burger(self, burger, mock_create_ingredient): + burger.add_ingredient(mock_create_ingredient) + + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == mock_create_ingredient + + + def test_remove_ingredient_deletes_ingredient_from_burger(self, burger, mock_create_ingredient): + burger.add_ingredient(mock_create_ingredient) + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 0 + assert mock_create_ingredient not in burger.ingredients + + def test_move_ingredient_replaces_ingredients(self, burger, mock_create_ingredient, mock_create_additional_ingredient): + burger.add_ingredient(mock_create_ingredient) + burger.add_ingredient(mock_create_additional_ingredient) + + burger.move_ingredient(1, 0) + + assert burger.ingredients[0].get_name() == mock_create_additional_ingredient.get_name() + assert burger.ingredients[1].get_name() == mock_create_ingredient.get_name() + + + def test_get_price_returns_burger_price(self, burger, mock_create_buns, mock_create_ingredient): + burger.set_buns(mock_create_buns) + burger.add_ingredient(mock_create_ingredient) + + expected_price = mock_create_buns.get_price.return_value * 2 + \ + mock_create_ingredient.get_price.return_value + + actual_price = burger.get_price() + + assert actual_price == expected_price + + + def test_get_receipt_returns_receipt_of_order(self, burger, mock_create_buns, mock_create_ingredient, mock_create_additional_ingredient): + burger.set_buns(mock_create_buns) + burger.add_ingredient(mock_create_ingredient) + burger.add_ingredient(mock_create_additional_ingredient) + + expected_receipt_lines = [ + f'(==== {mock_create_buns.get_name()} ====)', + f'= {mock_create_ingredient.get_type().lower()} {mock_create_ingredient.get_name()} =', + f'= {mock_create_additional_ingredient.get_type().lower()} {mock_create_additional_ingredient.get_name()} =', + f'(==== {mock_create_buns.get_name()} ====)\n', + f'Price: {burger.get_price()}' + ] + + expected_receipt = '\n'.join(expected_receipt_lines) + true_receipt = burger.get_receipt() + + assert true_receipt == expected_receipt + + + + + + + + + + + + + + + + + + diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..c62e45560 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,16 @@ + +class TestDatabase: + def test_available_buns_returns_list_of_buns(self, db): + available_buns = db.available_buns() + + assert len(available_buns) == 3 + assert isinstance(available_buns, list) + + + def test_available_ingredients_returns_list_of_ingredients(self, db): + available_ingredients = db.available_ingredients() + + assert len(available_ingredients) == 6 + assert isinstance(available_ingredients, list) + + diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..c8cb931b2 --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,27 @@ +import pytest + +from ingredient import Ingredient +from helpers.data import INGREDIENTS_INFO + + +class TestIngredient: + + @pytest.mark.parametrize("ingredient_data", INGREDIENTS_INFO) + def test_get_price_returns_price_of_ingredient(self, ingredient_data): + ingredient = Ingredient(ingredient_data["ingredient_type"], ingredient_data["ingredient_name"], ingredient_data["ingredient_price"]) + + assert ingredient.get_price() == ingredient_data["ingredient_price"] + + + @pytest.mark.parametrize("ingredient_data", INGREDIENTS_INFO) + def test_get_name_returns_name_of_ingredient(self, ingredient_data): + ingredient = Ingredient(ingredient_data["ingredient_type"], ingredient_data["ingredient_name"], ingredient_data["ingredient_price"]) + + assert ingredient.get_name() == ingredient_data["ingredient_name"] + + + @pytest.mark.parametrize("ingredient_data", INGREDIENTS_INFO) + def test_get_type_returns_type_of_ingredient(self, ingredient_data): + ingredient = Ingredient(ingredient_data["ingredient_type"], ingredient_data["ingredient_name"], ingredient_data["ingredient_price"]) + + assert ingredient.get_type() == ingredient_data["ingredient_type"] \ No newline at end of file