From a88d1e27a89540b466bfb5510a5e919c2fad605a Mon Sep 17 00:00:00 2001 From: Aleksand Kiselev Date: Sun, 28 Jun 2026 10:33:12 +0300 Subject: [PATCH] Completed task_1 for diplom. Created unit tests --- .coverage | Bin 0 -> 53248 bytes .gitignore | 13 ++++ README.md | 1 + __init__.py | 0 burger.py | 5 +- database.py | 6 +- praktikum.py | 8 +-- requirements.txt | 2 + tests/test_bun.py | 13 ++++ tests/test_burger.py | 143 +++++++++++++++++++++++++++++++++++++++ tests/test_database.py | 42 ++++++++++++ tests/test_ingredient.py | 27 ++++++++ 12 files changed, 251 insertions(+), 9 deletions(-) create mode 100644 .coverage create mode 100644 .gitignore delete mode 100644 __init__.py create mode 100644 requirements.txt 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/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..725ce302463f86596f54c51c3e9c668dd876919a GIT binary patch literal 53248 zcmeI4OKclO7{_=fGN+Xics6gBFP|`L)d58k#afmQ$dy*{i?z+3{ zrr{xEK!A7%#1X+638@_6gg|fr!3mHM65=5tB#=-MLI?pp@XbE_Xq(EZTJ@p-%HExw zneW^0`^`5qJG+VRz55O;5PaVCY%}27m0?9ym76$M6vd!#k-o{MQzD(5&{6G4ua-2F z$rm;h+5Ji(`=G)eDqhVd3JZllhTbUbH0~R+^l@X73b26y2!H?xTs8#ScNg^XrcLTo zPXuPQAp*~=2`}0g_uVr)b7+MN+%vi@Kb%D34|>S#dIym#K)^PAmTUyC z*BjFHuyp9*NHV@w51p>?X(Z$7vG6<@=eP;huAsa$35Pa2ExSs{A8FZ5**GK-T{v)8 zlUz+UaARi&ZkyAzW!K-n=1h>w7LBA@j&-;tI*mWhyOQIf8;(29r4tkZ*9>LLyVk1; zMWs0EA8ydCQ^jlrZg^gy#;;7#uJFvdoL=6tMSbpY7$_1?rD_F!Ct>sjO(%Pm(2?b< z$BpbI{XrsoQKP}#`LN4KX&yBWMRRYTxh{cWda|Q&H?ByQUeIWh#*z)Z+HkA=u@*** zFQ|jiSddhkZ#gyDReb3~%{?MKb3shTrO~i(p#zCRXUfQyXSb{tI-L-xOm&j^_NJ^} z9vM-eGQu#5TPr^3eIb;zasKjM>7DI73(HdHmhzc z2;*0thT$pap02%-g6?_3o@$MS)v0?Qbba5VX;n^J{&bSdM;A?Bjzaz@uexqSm`*e| zki-F>u4(x^wBgiQX-`*&zan)k92pI5N+uUM%pamom-H`6*tY4^%SP$ZxV$J%Q5Vfd`^`WEmMyrf z5*iZ**0SmInkT3*o=Zc+h}h!ERz+%VrIKU}jl3Bf)y@<O`qEVV|k$Qtm0`FlcPopcy5ix4^YJ@JS z72hD`$K(QEW&bJk!3F{#00JNY0w4eaAOHd&00JNY0w8et5zy3>s>}6%iv6gtTs2DgGOP9g|brCvV7;S1I<3 z!hT_YU6KyMXb=Da5C8!X009sH0T2KI5C8!X0D%sHg0@*r9s{KE+K3T91(5Im^Tn4G z_5pi=-ONg*FH5hK4wP8&6UxK}0w4eaAOHd&00JNY0w4eaAaGs??8fmd+-t~X}mUMgF8f1Icf!!rEEeDNV+VUFI^sL--v*~tm4Wd03^k~udrrY`& zv~-Q{tpBsSwa3m%1G%5sq4{f&?X2C?`_gS=4T3$+cXVjiYxWvcMC&wfB*=900@8p z2!H?xfB*=900>-$1T?K^$oKySdre_~vtQYF>?`&;`|gc;`;-05zGt7Y-zW;H4l6&gVR1V8`;KmY_l00ck)1V8`;K;U8` jfcO6wQ)|E$5C8!X009sH0T2KI5C8!X009s `$ pytest --cov=praktikum --cov-report=html` + diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/burger.py b/burger.py index 2b3b6a88b..7fbc74f8d 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: @@ -46,3 +46,4 @@ def get_receipt(self) -> str: receipt.append(f'Price: {self.get_price()}') return '\n'.join(receipt) + 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/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/requirements.txt b/requirements.txt new file mode 100644 index 000000000..cffeec658 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest +pytest-cov \ No newline at end of file diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..a59e6c57d --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,13 @@ + +from bun import Bun + +class TestBun: + + def test_get_name_returns_correct_value(self): + bun = Bun("test_bun", 999.99) + assert bun.get_name() == "test_bun" + + def test_get_price_returns_correct_value(self): + bun = Bun("test_bun", 999.99) + assert bun.get_price() == 999.99 + diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..9c64cf3e1 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,143 @@ +import pytest + +from burger import Burger +from bun import Bun +from ingredient import Ingredient +from ingredient_types import INGREDIENT_TYPE_FILLING, INGREDIENT_TYPE_SAUCE + +class TestBurger: + + + def test_set_buns_succsess(self): + burger = Burger() + test_bun = Bun("Origin bun",50) + burger.set_buns(test_bun) + assert burger.bun == test_bun + + + @pytest.mark.parametrize("ingredient_type, name, price", [ + (INGREDIENT_TYPE_FILLING,"chicken",100), + (INGREDIENT_TYPE_FILLING,"meet",120), + (INGREDIENT_TYPE_SAUCE, "salsa", 50), + (INGREDIENT_TYPE_SAUCE, "ancle bens", 60) + ]) + def test_add_ingredient_several_succsess(self,ingredient_type, name, price): + burger = Burger() + bun = Bun("Origin Bun", 40) + burger.set_buns(bun) + + initial_count= len(burger.ingredients) + ingredient = Ingredient( ingredient_type,name,price) + burger.add_ingredient(ingredient) + final_count = len(burger.ingredients) + assert final_count == initial_count + 1 + assert ingredient in burger.ingredients + + + def test_rremove_ingredient_only_one_leaves_empty_list(self): + + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + one_ing= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + burger.add_ingredient(one_ing) + + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 0 + assert one_ing not in burger.ingredients + + + def test_remove_ingredient_from_empty_list_wait_error(self): + + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + with pytest.raises(IndexError): + burger.remove_ingredient(0) + + def test_remove_ingredient_for_index_del_correctly_ingredient(self): + + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + first_ing= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + second_ing= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + burger.add_ingredient(first_ing) + burger.add_ingredient(second_ing) + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 1 + assert first_ing not in burger.ingredients + + def test_move_ingredient_single_to_new_position(self): + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + ing3 = Ingredient(INGREDIENT_TYPE_FILLING,"meet",120) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + burger.add_ingredient(ing3) + + burger.move_ingredient(0, 1) + + moved_ingredients = burger.ingredients + assert len(moved_ingredients) == 3 + assert moved_ingredients[0] is ing2 + assert moved_ingredients[1] is ing1 + assert moved_ingredients[2] is ing3 + + def test_move_ingredient_from_bad_position_wait_error(self): + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + + with pytest.raises(IndexError): + burger.move_ingredient(5,0) + + def test_get_price_includes_bun_twice_and_ingredients(self): + burger = Burger() + bun =Bun("Origin Bun", 40) + burger.set_buns(bun) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + + expected_price = (bun.get_price() * 2) + ing1.get_price() + ing2.get_price() + + assert burger.get_price() == expected_price + + def test_get_receipt_full_content(self): + burger = Burger() + bun =Bun("Origin Bun", 40) + burger.set_buns(bun) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + + receipt = burger.get_receipt() + + expected_lines: List[str] = [ + f'(==== {bun.get_name()} ====)', + f'= {str(ing1.get_type()).lower()} {ing1.get_name()} =', + f'= {str(ing2.get_type().lower())} {ing2.get_name()} =', # исправлено: .lower() после get_type() + f'(==== {bun.get_name()} ====)', + "", + f'Price: {burger.get_price()}', + ] + expected = '\n'.join(expected_lines) + assert receipt == expected \ No newline at end of file diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..f902ce961 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,42 @@ +from database import Database + +from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestDatabase: + + def test_available_buns_init_buns_in_database(self): + + db = Database() + buns = db.available_buns() + + + actual_pairs = [(bun.get_name(), bun.get_price()) for bun in buns] + + expected_pairs = [ + ("black bun", 100), + ("white bun", 200), + ("red bun", 300), + ] + + assert actual_pairs == expected_pairs + + def test_available_ingredients_init_in_database(self): + db = Database() + ingredients = db.available_ingredients() + + actual = [ + (ing.get_type(), ing.get_name(), ing.get_price()) + for ing in ingredients + ] + + # Ожидаемый набор — ровно в том порядке, как они добавлены в __init__ + expected = [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100), + (INGREDIENT_TYPE_SAUCE, "sour cream", 200), + (INGREDIENT_TYPE_SAUCE, "chili sauce", 300), + (INGREDIENT_TYPE_FILLING, "cutlet", 100), + (INGREDIENT_TYPE_FILLING, "dinosaur", 200), + (INGREDIENT_TYPE_FILLING, "sausage", 300), + ] + + assert actual == expected \ No newline at end of file diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..c4b97e1cf --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,27 @@ +from ingredient import Ingredient + +class TestIngredient: + + def test_get_price_sucsess(self): + ingredient_type = "INGREDIENT_TYPE_FILLING" + name = "chicken" + price = 100.0 + + ing = Ingredient(ingredient_type, name, price) + assert ing.get_price() == price + + def test_get_name_sucsess(self): + ingredient_type = "INGREDIENT_TYPE_FILLING" + name = "chicken" + price = 100.0 + + ing = Ingredient(ingredient_type, name, price) + assert ing.get_name() == name + + def test_get_type_sucsess(self): + ingredient_type = "INGREDIENT_TYPE_FILLING" + name = "chicken" + price = 100.0 + + ing = Ingredient(ingredient_type, name, price) + assert ing.get_type() == ingredient_type \ No newline at end of file