From d312444f34489916c7a4e2ed32eb27b9f13c2a79 Mon Sep 17 00:00:00 2001 From: Regina Date: Tue, 21 Jul 2026 02:36:30 +0400 Subject: [PATCH 1/2] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 46 ++++++++++ __init__.py | 0 conftest.py | 37 ++++++++ data.py | 35 ++++++++ README.md => praktikum/README.md | 0 praktikum/__init__.py | 1 + bun.py => praktikum/bun.py | 0 burger.py => praktikum/burger.py | 0 database.py => praktikum/database.py | 0 ingredient.py => praktikum/ingredient.py | 0 .../ingredient_types.py | 0 praktikum.py => praktikum/praktikum.py | 0 requirements.txt | Bin 0 -> 1186 bytes tests/__init__.py | 1 + tests/bun_test.py | 24 +++++ tests/burger_test.py | 85 ++++++++++++++++++ tests/database_test.py | 57 ++++++++++++ tests/ingredient_test.py | 28 ++++++ 18 files changed, 314 insertions(+) create mode 100644 .gitignore delete mode 100644 __init__.py create mode 100644 conftest.py create mode 100644 data.py rename README.md => praktikum/README.md (100%) create mode 100644 praktikum/__init__.py rename bun.py => praktikum/bun.py (100%) rename burger.py => praktikum/burger.py (100%) rename database.py => praktikum/database.py (100%) rename ingredient.py => praktikum/ingredient.py (100%) rename ingredient_types.py => praktikum/ingredient_types.py (100%) rename praktikum.py => praktikum/praktikum.py (100%) create mode 100644 requirements.txt create mode 100644 tests/__init__.py create mode 100644 tests/bun_test.py create mode 100644 tests/burger_test.py create mode 100644 tests/database_test.py create mode 100644 tests/ingredient_test.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..85bd9dfec --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +venv/ +ENV/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Testing +.pytest_cache/ +.coverage +htmlcov/ +.tox/ +.allure/ +allure-results/ +allure-report/ + +# IDE +.vscode/ +.idea/ +*.iml + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log \ No newline at end of file diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..a742b72f0 --- /dev/null +++ b/conftest.py @@ -0,0 +1,37 @@ +import pytest +from unittest.mock import Mock + +from praktikum.burger import Burger +from praktikum.database import Database +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + +@pytest.fixture +def db(): + db = Database() + return db + +@pytest.fixture +def burger(): + burger = Burger() + return burger + +@pytest.fixture +def mock_bun(): + bun = Mock(spec=Bun) + bun.get_name.return_value = "test bun" + bun.get_price.return_value = 100.0 + return bun + +@pytest.fixture +def mock_ingredients(): + ingredients = [] + for i in range(3): + ingredient = Mock(spec=Ingredient) + ingredient.get_name.return_value = f"ingredient_{i}" + ingredient.get_price.return_value = float(50 * (i + 1)) + ingredient.get_type.return_value = INGREDIENT_TYPE_SAUCE if i % 2 == 0 else INGREDIENT_TYPE_FILLING + ingredients.append(ingredient) + return ingredients \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 000000000..0d33d845f --- /dev/null +++ b/data.py @@ -0,0 +1,35 @@ +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + +BUN_DATA1 = { + "name": "bun1", + "price": 111, +} + +BUN_DATA2 = { + "name": "bun2", + "price": 111.5, +} + +BUN_DATA3 = { + "name": "", + "price": 0, +} + +INGREDIENT_DATA1 = { + "ingredient_type": INGREDIENT_TYPE_SAUCE, + "name": "hot sauce", + "price": 200, +} + +INGREDIENT_DATA2 = { + "ingredient_type": INGREDIENT_TYPE_FILLING, + "name": "cutlet", + "price": 150.5 +} + +INGREDIENT_DATA3 = { + "ingredient_type": INGREDIENT_TYPE_SAUCE, + "name": "", + "price": 0 +} \ No newline at end of file diff --git a/README.md b/praktikum/README.md similarity index 100% rename from README.md rename to praktikum/README.md diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..d4308e6db --- /dev/null +++ b/praktikum/__init__.py @@ -0,0 +1 @@ +# tests package \ No newline at end of file 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 0000000000000000000000000000000000000000..679568e49fc20e89efa8717ee79ae12f2cd186a2 GIT binary patch literal 1186 zcmZ`&?M}i#5ZvD;K1vCt2=RySVB!Oq+G4o~w6+z+hgWB2d!>G*p@=&>J2$iU`H|ZW z&x^ITvBVlXS&zRuyl?OF&YXj#cueBX@zh zE$YD@@$u<%C?M(zpT(e|K>duMvZ$`GEfkV}1D*srYW&(ub+C8wlQ%=h5}&osMBO_f zb76@fClRX=aa4D16~2jBqnZli&TR23RfWA%&w`aulB>qatkKJW{|32s(0M8$=r~c% zS|gc$aMtJ2FR#y#R;{EQ+h9gvPk2}2j(q3z8YNw!e$p&*O{*vLlf@luN5#&6i>?X| zZJ@g!Gvs-$!L!hrh`EC*>hK-l4EKs>{<&Z5q+i}Wt@=J4rNR57Cyt6+S7I7B_F#_X zJbLJi-0Ej|=o@|B%1p^QhTF0eLjZEGiOhaENw-s0zIXNLou|ojb=n{5D3ul+%9R3l z`aGAs?k4X+Kv&$hY?6AcCH4x&2eH#pZgs?`lT-F^y%{pU2kLEbq|=0W8#z1GO>zai z^St{36EgAAH+t=LpIu6)Z-1iu!CmGp@cnRBGSi3OdYL0<_|{N86Y|`>ql5NVDSmg> G)A<6g?XS83 literal 0 HcmV?d00001 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..d4308e6db --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +# tests package \ No newline at end of file diff --git a/tests/bun_test.py b/tests/bun_test.py new file mode 100644 index 000000000..538bf1e61 --- /dev/null +++ b/tests/bun_test.py @@ -0,0 +1,24 @@ +import pytest +from praktikum.bun import Bun +from data import BUN_DATA1, BUN_DATA2, BUN_DATA3 + + +class TestBun: + + @pytest.mark.parametrize("name, price", [ + (BUN_DATA1["name"], BUN_DATA1["price"]), + (BUN_DATA2["name"], BUN_DATA2["price"]), + (BUN_DATA3["name"], BUN_DATA3["price"]), + ]) + def test_bun_creation(self, name, price): + bun = Bun(name, price) + assert bun.get_name() == name + assert bun.get_price() == price + + def test_bun_get_name(self): + bun = Bun(BUN_DATA1['name'], BUN_DATA1['price']) + assert bun.get_name() == BUN_DATA1['name'] + + def test_bun_get_price(self): + bun = Bun(BUN_DATA2['name'], BUN_DATA2['price']) + assert bun.get_price() == BUN_DATA2['price'] \ No newline at end of file diff --git a/tests/burger_test.py b/tests/burger_test.py new file mode 100644 index 000000000..60a9f6a46 --- /dev/null +++ b/tests/burger_test.py @@ -0,0 +1,85 @@ +import pytest +from unittest.mock import Mock +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient + + +class TestBurger: + + def test_burger_initialization(self, burger): + assert burger.bun is None + assert burger.ingredients == [] + + def test_set_buns(self, burger, mock_bun): + burger.set_buns(mock_bun) + assert burger.bun == mock_bun + + def test_add_ingredient(self, burger, mock_ingredients): + burger.add_ingredient(mock_ingredients[0]) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == mock_ingredients[0] + + burger.add_ingredient(mock_ingredients[1]) + assert len(burger.ingredients) == 2 + assert burger.ingredients[1] == mock_ingredients[1] + + def test_remove_ingredient(self, burger, mock_ingredients): + for ingredient in mock_ingredients: + burger.add_ingredient(ingredient) + + assert len(burger.ingredients) == 3 + + burger.remove_ingredient(1) + assert len(burger.ingredients) == 2 + assert burger.ingredients[0] == mock_ingredients[0] + assert burger.ingredients[1] == mock_ingredients[2] + + def test_move_ingredient(self, burger, mock_ingredients): + for ingredient in mock_ingredients: + burger.add_ingredient(ingredient) + + burger.move_ingredient(2, 0) + assert burger.ingredients[0] == mock_ingredients[2] + assert burger.ingredients[1] == mock_ingredients[0] + assert burger.ingredients[2] == mock_ingredients[1] + + burger.move_ingredient(1, 2) + assert burger.ingredients[0] == mock_ingredients[2] + assert burger.ingredients[1] == mock_ingredients[1] + assert burger.ingredients[2] == mock_ingredients[0] + + + def test_get_price_with_bun_no_ingredients(self, burger, mock_bun): + burger.set_buns(mock_bun) + price = burger.get_price() + assert price == 200.0 + mock_bun.get_price.assert_called_once() + + def test_get_price_with_bun_and_ingredients(self, burger, mock_bun, mock_ingredients): + burger.set_buns(mock_bun) + for ingredient in mock_ingredients: + burger.add_ingredient(ingredient) + + expected_price = 200.0 + 50 + 100 + 150 + assert burger.get_price() == expected_price + + mock_bun.get_price.assert_called_once() + for ingredient in mock_ingredients: + ingredient.get_price.assert_called_once() + + @pytest.mark.parametrize("bun_price, ingredient_prices, expected_price", [ + (100, [50, 75], 100*2 + 50 + 75), + (200, [100, 150, 200], 200*2 + 100 + 150 + 200), + (150, [], 150*2), + ]) + def test_get_price_parametrized(self, burger, bun_price, ingredient_prices, expected_price): + mock_bun = Mock(spec=Bun) + mock_bun.get_price.return_value = float(bun_price) + burger.set_buns(mock_bun) + + for price in ingredient_prices: + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_price.return_value = float(price) + burger.add_ingredient(mock_ingredient) + + assert burger.get_price() == expected_price \ No newline at end of file diff --git a/tests/database_test.py b/tests/database_test.py new file mode 100644 index 000000000..32e716542 --- /dev/null +++ b/tests/database_test.py @@ -0,0 +1,57 @@ +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + +class TestDatabase: + + def test_database_initialization(self,db): + assert len(db.buns) == 3 + assert len(db.ingredients) == 6 + + def test_available_buns(self,db): + buns = db.available_buns() + + assert len(buns) == 3 + assert all(isinstance(bun, Bun) for bun in buns) + + assert buns[0].get_name() == "black bun" + assert buns[0].get_price() == 100 + assert buns[1].get_name() == "white bun" + assert buns[1].get_price() == 200 + assert buns[2].get_name() == "red bun" + assert buns[2].get_price() == 300 + + def test_available_ingredients(self,db): + ingredients = db.available_ingredients() + + assert len(ingredients) == 6 + assert all(isinstance(ingredient, Ingredient) for ingredient in ingredients) + + sauces = [i for i in ingredients if i.get_type() == INGREDIENT_TYPE_SAUCE] + assert len(sauces) == 3 + assert sauces[0].get_name() == "hot sauce" + assert sauces[0].get_price() == 100 + assert sauces[1].get_name() == "sour cream" + assert sauces[1].get_price() == 200 + assert sauces[2].get_name() == "chili sauce" + assert sauces[2].get_price() == 300 + + fillings = [i for i in ingredients if i.get_type() == INGREDIENT_TYPE_FILLING] + assert len(fillings) == 3 + assert fillings[0].get_name() == "cutlet" + assert fillings[0].get_price() == 100 + assert fillings[1].get_name() == "dinosaur" + assert fillings[1].get_price() == 200 + assert fillings[2].get_name() == "sausage" + assert fillings[2].get_price() == 300 + + def test_database_buns_are_different_objects(self,db): + buns = db.available_buns() + assert buns[0] is not buns[1] + assert buns[1] is not buns[2] + + def test_database_ingredients_are_different_objects(self,db): + ingredients = db.available_ingredients() + for i in range(len(ingredients) - 1): + assert ingredients[i] is not ingredients[i + 1] \ No newline at end of file diff --git a/tests/ingredient_test.py b/tests/ingredient_test.py new file mode 100644 index 000000000..b6905138c --- /dev/null +++ b/tests/ingredient_test.py @@ -0,0 +1,28 @@ +import pytest +from praktikum.ingredient import Ingredient +from data import INGREDIENT_DATA1, INGREDIENT_DATA2, INGREDIENT_DATA3 + +class TestIngredient: + + @pytest.mark.parametrize("ingredient_type, name, price", [ + (INGREDIENT_DATA1["ingredient_type"], INGREDIENT_DATA1["name"], INGREDIENT_DATA1["price"]), + (INGREDIENT_DATA2["ingredient_type"], INGREDIENT_DATA2["name"], INGREDIENT_DATA2["price"]), + (INGREDIENT_DATA3["ingredient_type"], INGREDIENT_DATA3["name"], INGREDIENT_DATA3["price"]) + ]) + def test_ingredient_creation(self, ingredient_type, name, price): + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_type() == ingredient_type + assert ingredient.get_name() == name + assert ingredient.get_price() == price + + def test_ingredient_get_type(self): + ingredient = Ingredient(INGREDIENT_DATA1['ingredient_type'], INGREDIENT_DATA1['name'], INGREDIENT_DATA1['price']) + assert ingredient.get_type() == INGREDIENT_DATA1['ingredient_type'] + + def test_ingredient_get_name(self): + ingredient = Ingredient(INGREDIENT_DATA1['ingredient_type'], INGREDIENT_DATA1['name'], INGREDIENT_DATA1['price']) + assert ingredient.get_name() == INGREDIENT_DATA1['name'] + + def test_ingredient_get_price(self): + ingredient = Ingredient(INGREDIENT_DATA2['ingredient_type'], INGREDIENT_DATA2['name'], INGREDIENT_DATA2['price']) + assert ingredient.get_price() == INGREDIENT_DATA2['price'] From c2135d8dc3979af684a7d1e775272b9aa9b9d9f7 Mon Sep 17 00:00:00 2001 From: Regina Date: Sat, 25 Jul 2026 18:33:49 +0400 Subject: [PATCH 2/2] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=201=20-=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/burger_test.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/tests/burger_test.py b/tests/burger_test.py index 60a9f6a46..85deb3fbb 100644 --- a/tests/burger_test.py +++ b/tests/burger_test.py @@ -6,35 +6,36 @@ class TestBurger: - def test_burger_initialization(self, burger): - assert burger.bun is None - assert burger.ingredients == [] + def test_burger_initialization_allows_adding_bun(self, burger, mock_bun): + burger.set_buns(mock_bun) + assert burger.get_price() == 200.0 def test_set_buns(self, burger, mock_bun): burger.set_buns(mock_bun) assert burger.bun == mock_bun - def test_add_ingredient(self, burger, mock_ingredients): + def test_add_one_ingredient(self, burger, mock_ingredients): burger.add_ingredient(mock_ingredients[0]) assert len(burger.ingredients) == 1 assert burger.ingredients[0] == mock_ingredients[0] - + + def test_add_two_ingredients(self, burger, mock_ingredients): + burger.add_ingredient(mock_ingredients[0]) burger.add_ingredient(mock_ingredients[1]) assert len(burger.ingredients) == 2 + assert burger.ingredients[0] == mock_ingredients[0] assert burger.ingredients[1] == mock_ingredients[1] def test_remove_ingredient(self, burger, mock_ingredients): for ingredient in mock_ingredients: burger.add_ingredient(ingredient) - - assert len(burger.ingredients) == 3 burger.remove_ingredient(1) assert len(burger.ingredients) == 2 assert burger.ingredients[0] == mock_ingredients[0] assert burger.ingredients[1] == mock_ingredients[2] - def test_move_ingredient(self, burger, mock_ingredients): + def test_move_ingredient_moves_from_end_to_beginning(self, burger, mock_ingredients): for ingredient in mock_ingredients: burger.add_ingredient(ingredient) @@ -42,11 +43,15 @@ def test_move_ingredient(self, burger, mock_ingredients): assert burger.ingredients[0] == mock_ingredients[2] assert burger.ingredients[1] == mock_ingredients[0] assert burger.ingredients[2] == mock_ingredients[1] - + + def test_move_ingredient_moves_from_middle_to_end(self, burger, mock_ingredients): + for ingredient in mock_ingredients: + burger.add_ingredient(ingredient) + burger.move_ingredient(1, 2) - assert burger.ingredients[0] == mock_ingredients[2] - assert burger.ingredients[1] == mock_ingredients[1] - assert burger.ingredients[2] == mock_ingredients[0] + assert burger.ingredients[0] == mock_ingredients[0] + assert burger.ingredients[1] == mock_ingredients[2] + assert burger.ingredients[2] == mock_ingredients[1] def test_get_price_with_bun_no_ingredients(self, burger, mock_bun):