From a2d4f636e48092dc9193c24137da90f3955a0189 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 17:05:23 +0000 Subject: [PATCH 01/18] =?UTF-8?q?refactor:=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D1=81=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D1=8B=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B2=20=D0=BF=D0=B0=D0=BF=D0=BA=D1=83=20praktikum/?= =?UTF-8?q?=20-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B2=D1=81=D0=B5=20=D0=B8=D1=81=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BF=D0=BA=D1=83=20praktikum/=20-=20=D0=A1=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B0=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B0?= =?UTF-8?q?=20tests/=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20requirements.txt=20=D0=B8=20.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 0 bun.py | 15 ------ burger.py | 48 ------------------ database.py | 33 ------------ ingredient.py | 20 -------- ingredient_types.py | 7 --- praktikum.py | 41 --------------- praktikum/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 149 bytes praktikum/__pycache__/bun.cpython-313.pyc | Bin 0 -> 1074 bytes praktikum/__pycache__/burger.cpython-313.pyc | Bin 0 -> 3236 bytes .../__pycache__/database.cpython-313.pyc | Bin 0 -> 2441 bytes .../__pycache__/ingredient.cpython-313.pyc | Bin 0 -> 1396 bytes .../ingredient_types.cpython-313.pyc | Bin 0 -> 377 bytes .../__pycache__/praktikum.cpython-313.pyc | Bin 0 -> 1361 bytes praktikum/bun.py | 0 praktikum/burger.py | 0 praktikum/database.py | 0 praktikum/ingredient.py | 0 praktikum/ingredient_types.py | 0 praktikum/praktikum.py | 0 requirements.txt | 0 tests/__init__.py | 0 tests/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 145 bytes .../conftest.cpython-313-pytest-7.4.0.pyc | Bin 0 -> 3050 bytes .../test_bun.cpython-313-pytest-7.4.0.pyc | Bin 0 -> 5174 bytes .../test_burger.cpython-313-pytest-7.4.0.pyc | Bin 0 -> 18458 bytes .../test_data.cpython-313-pytest-7.4.0.pyc | Bin 0 -> 1617 bytes ...test_database.cpython-313-pytest-7.4.0.pyc | Bin 0 -> 14518 bytes ...st_ingredient.cpython-313-pytest-7.4.0.pyc | Bin 0 -> 7394 bytes ...est_praktikum.cpython-313-pytest-7.4.0.pyc | Bin 0 -> 5505 bytes tests/conftest.py | 0 tests/test_bun.py | 0 tests/test_burger.py | 0 tests/test_data.py | 0 tests/test_database.py | 0 tests/test_ingredient.py | 0 tests/test_praktikum.py | 0 38 files changed, 164 deletions(-) create mode 100644 .gitignore delete mode 100644 bun.py delete mode 100644 burger.py delete mode 100644 database.py delete mode 100644 ingredient.py delete mode 100644 ingredient_types.py delete mode 100644 praktikum.py create mode 100644 praktikum/__init__.py create mode 100644 praktikum/__pycache__/__init__.cpython-313.pyc create mode 100644 praktikum/__pycache__/bun.cpython-313.pyc create mode 100644 praktikum/__pycache__/burger.cpython-313.pyc create mode 100644 praktikum/__pycache__/database.cpython-313.pyc create mode 100644 praktikum/__pycache__/ingredient.cpython-313.pyc create mode 100644 praktikum/__pycache__/ingredient_types.cpython-313.pyc create mode 100644 praktikum/__pycache__/praktikum.cpython-313.pyc create mode 100644 praktikum/bun.py create mode 100644 praktikum/burger.py create mode 100644 praktikum/database.py create mode 100644 praktikum/ingredient.py create mode 100644 praktikum/ingredient_types.py create mode 100644 praktikum/praktikum.py create mode 100644 requirements.txt create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-313.pyc create mode 100644 tests/__pycache__/conftest.cpython-313-pytest-7.4.0.pyc create mode 100644 tests/__pycache__/test_bun.cpython-313-pytest-7.4.0.pyc create mode 100644 tests/__pycache__/test_burger.cpython-313-pytest-7.4.0.pyc create mode 100644 tests/__pycache__/test_data.cpython-313-pytest-7.4.0.pyc create mode 100644 tests/__pycache__/test_database.cpython-313-pytest-7.4.0.pyc create mode 100644 tests/__pycache__/test_ingredient.cpython-313-pytest-7.4.0.pyc create mode 100644 tests/__pycache__/test_praktikum.cpython-313-pytest-7.4.0.pyc create mode 100644 tests/conftest.py create mode 100644 tests/test_bun.py create mode 100644 tests/test_burger.py create mode 100644 tests/test_data.py create mode 100644 tests/test_database.py create mode 100644 tests/test_ingredient.py create mode 100644 tests/test_praktikum.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/bun.py b/bun.py deleted file mode 100644 index 5504bc1f4..000000000 --- a/bun.py +++ /dev/null @@ -1,15 +0,0 @@ -class Bun: - """ - Модель булочки для бургера. - Булочке можно дать название и назначить цену. - """ - - def __init__(self, name: str, price: float): - self.name = name - self.price = price - - def get_name(self) -> str: - return self.name - - def get_price(self) -> float: - return self.price diff --git a/burger.py b/burger.py deleted file mode 100644 index 2b3b6a88b..000000000 --- a/burger.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import List - -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient - - -class Burger: - """ - Модель бургера. - Бургер состоит из булочек и ингредиентов (начинка или соус). - Ингредиенты можно перемещать и удалять. - Можно распечать чек с информацией о бургере. - """ - - def __init__(self): - self.bun = None - self.ingredients: List[Ingredient] = [] - - def set_buns(self, bun: Bun): - self.bun = bun - - def add_ingredient(self, ingredient: Ingredient): - self.ingredients.append(ingredient) - - def remove_ingredient(self, index: int): - del self.ingredients[index] - - def move_ingredient(self, index: int, new_index: int): - self.ingredients.insert(new_index, self.ingredients.pop(index)) - - def get_price(self) -> float: - price = self.bun.get_price() * 2 - - for ingredient in self.ingredients: - price += ingredient.get_price() - - return price - - def get_receipt(self) -> str: - receipt: List[str] = [f'(==== {self.bun.get_name()} ====)'] - - for ingredient in self.ingredients: - receipt.append(f'= {str(ingredient.get_type()).lower()} {ingredient.get_name()} =') - - receipt.append(f'(==== {self.bun.get_name()} ====)\n') - receipt.append(f'Price: {self.get_price()}') - - return '\n'.join(receipt) diff --git a/database.py b/database.py deleted file mode 100644 index 4c75baf71..000000000 --- a/database.py +++ /dev/null @@ -1,33 +0,0 @@ -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 - - -class Database: - """ - Класс с методами по работе с базой данных. - """ - - def __init__(self): - self.buns: List[Bun] = [] - self.ingredients: List[Ingredient] = [] - - self.buns.append(Bun("black bun", 100)) - self.buns.append(Bun("white bun", 200)) - self.buns.append(Bun("red bun", 300)) - - self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "sour cream", 200)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "chili sauce", 300)) - - self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 100)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "dinosaur", 200)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "sausage", 300)) - - def available_buns(self) -> List[Bun]: - return self.buns - - def available_ingredients(self) -> List[Ingredient]: - return self.ingredients diff --git a/ingredient.py b/ingredient.py deleted file mode 100644 index 0e50db8a2..000000000 --- a/ingredient.py +++ /dev/null @@ -1,20 +0,0 @@ -class Ingredient: - """ - Модель ингредиента. - Ингредиент: начинка или соус. - У ингредиента есть тип (начинка или соус), название и цена. - """ - - def __init__(self, ingredient_type: str, name: str, price: float): - self.type = ingredient_type - self.name = name - self.price = price - - def get_price(self) -> float: - return self.price - - def get_name(self) -> str: - return self.name - - def get_type(self) -> str: - return self.type diff --git a/ingredient_types.py b/ingredient_types.py deleted file mode 100644 index 34940ad5d..000000000 --- a/ingredient_types.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -Перечисление с типами ингредиентов. -SAUCE – соус -FILLING – начинка -""" -INGREDIENT_TYPE_SAUCE = 'SAUCE' -INGREDIENT_TYPE_FILLING = 'FILLING' diff --git a/praktikum.py b/praktikum.py deleted file mode 100644 index ec522fa6d..000000000 --- a/praktikum.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import List - -from praktikum.bun import Bun -from praktikum.burger import Burger -from praktikum.database import Database -from praktikum.ingredient import Ingredient - - -def main(): - # Инициализируем базу данных - database: Database = Database() - - # Создадим новый бургер - burger: Burger = Burger() - - # Считаем список доступных булок из базы данных - buns: List[Bun] = database.available_buns() - - # Считаем список доступных ингредиентов из базы данных - ingredients: List[Ingredient] = database.available_ingredients() - - # Соберём бургер - burger.set_buns(buns[0]) - - burger.add_ingredient(ingredients[1]) - burger.add_ingredient(ingredients[4]) - burger.add_ingredient(ingredients[3]) - burger.add_ingredient(ingredients[5]) - - # Переместим слой с ингредиентом - burger.move_ingredient(2, 1) - - # Удалим ингредиент - burger.remove_ingredient(3) - - # Распечатаем рецепт бургера - print(burger.get_receipt()) - - -if __name__ == "__main__": - main() diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/__pycache__/__init__.cpython-313.pyc b/praktikum/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60e3e651a0c9ab191cb4c2ae350d947fcfcf3968 GIT binary patch literal 149 zcmey&%ge<81c|pSGePuY5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~h}vsFxTWqNsL zo|#EZMt*K;OlWaxQH)DwK~8>dykSg1QDSyUW_D?AOniK1US>&ryk0@&Ee@O9{FKt1 YRJ$Tppdlbjib0Hz%#4hTMa)1J0EJy6oB#j- literal 0 HcmV?d00001 diff --git a/praktikum/__pycache__/bun.cpython-313.pyc b/praktikum/__pycache__/bun.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c2cfead7245cc3d9f52c18ee8edb5c49f124cf3 GIT binary patch literal 1074 zcmbtSzi-n(6h7N=;<&%~6)81HSiq7c2-G5h5Cb5_4p@~sSUS0>8{9fhINL($R8gr= zsi>PjF5pg8=Woxf+BNxiQ24@o`~WxXBrj2@$9MQw z{t>Xp_c$y9wP6kr_=wP1P3jYHm#dXW791ARk--=#aT{epVrK zrjHj9qfWZgOjl+qFqQ|XC}}Qq{l&kT5M@l$Om9BAXV=>G7hZ5@%6`^txb|%5GW)UD z@|z8M%Wg4eIr5g{hCLq#)mA&zDD?s_qBI?a?o~5Z0KIS&V3izRDsL7KOU4_00Gyj5(%Cyttcpsz@hbS#fc#%}^3 GHv9p87aceN literal 0 HcmV?d00001 diff --git a/praktikum/__pycache__/burger.cpython-313.pyc b/praktikum/__pycache__/burger.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5360f94ceab0c08b16b5da17f7b1addba877bdd GIT binary patch literal 3236 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 literal 0 HcmV?d00001 diff --git a/praktikum/__pycache__/ingredient_types.cpython-313.pyc b/praktikum/__pycache__/ingredient_types.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b187dee295bb3d14c95c7b2763dc16b91cb968f6 GIT binary patch literal 377 zcmey&%ge<81c|pSGmil2#~=<2FhUuh1%QmH48aUV48e>=jKNGrOzF&;ETu(2VXh1F zFKoTo0L1MVc3f<{u=~Q+3wtl@xUf~>Vxz*vCLnA7g$)<>T-c!iWbVDN8Km^W7LbAq zdx6sXE^N}{3U&;2c2#)PFd3-l!oG{m7aO_UJbipT{oKKVKy4d9rUU6+7dCL+Vg;+e z#ST^Dr^$SaJw84qKRG`BmMBnDkgJQQt6xZbNMwL(JVdQHx-eAlN`}uMKi;x&wu(uv zOfS#OGc$?F$j?oU2`x@7igC#-$jQ%*H;gGLO3W_F%r4E1$;?YHN=?a3%`1s7sVqn> z)+?yI#bJ}1pHiBWYF7jbOHim4O8|)v%#4hTADLJfSw3(vNGe=l5WOL#e33!Chyy4I E08z4zo&W#< literal 0 HcmV?d00001 diff --git a/praktikum/__pycache__/praktikum.cpython-313.pyc b/praktikum/__pycache__/praktikum.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d7a125053d2f28807a5c7e7b6d9992e8880c89e GIT binary patch literal 1361 zcmbVMUuzRV5Z}AoyId|!YyFdwc-p9~5=trsBUq#lF;q>Y#U6n|1IMK~;?d+1_AZtB z6d%MsDk4OD@m26k_z^-P(S?Bc=OJ&w_yOF#=CVa!iVNBK&2J_%von*7!eIrFW8hoX zHweIYs`!T=gHe%y*FXarmjhW2adC?I9G?}C;9(&Lvmz2b40BR8fC3&Cb8yd2aZ;~L++#FXS2Z$wR>m6ae1&M`Ye+ZJ5THZ#`|bu z7xLUz&}W&<^BPCPrp8so0r3klyN~jM#-GqnIH4arp`ZAVU)ZmTNlnuD)Oa7fH_R}b zk2J_$xijmtSm? zim4YHwu8?x-I^?hgJs8bj~u3rQb}hfJX5Xho5zV+Wd2Qwb!6Et4wXp|WbT?)-AzC& zm&RL&rJ}c)7Cvv@+ zA^Kvnw~%fxq&o|lW{&7$==tW;%@>*0?901dsD6b?4@TQC+FE*NyjkwT#OMEFyvRKm zYr|M;rDb$se9WkAsJ0$<;XEl)R1UB96t%6W9p&ODI6oqf09e*_`ZitPNK9eLJ*d;R z(MjX*q!-Jip@_B+pE}Obzk#FipJuc_4R1N{S!Q74K=h~UHIrtyjjE~Z?*URN8>3m| z+tpgBQ8CxhB2noAI!SU31&-tTVD2Zl&<9ug;94In{gPBJK3oHE>hMWNh<<_cv-P0> IV9X2m2Ql&^+5i9m literal 0 HcmV?d00001 diff --git a/praktikum/bun.py b/praktikum/bun.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/burger.py b/praktikum/burger.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/database.py b/praktikum/database.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/ingredient.py b/praktikum/ingredient.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/ingredient_types.py b/praktikum/ingredient_types.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/praktikum.py b/praktikum/praktikum.py new file mode 100644 index 000000000..e69de29bb diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/__pycache__/__init__.cpython-313.pyc b/tests/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d05ee687a01b7af12867480fc0301d675eaaa6f GIT binary patch literal 145 zcmey&%ge<81c|pSGePuY5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~h>vsFxTWqNsL zo|#EZMt*K;OlWaxQH)DwK~8>dykSg9YH>+%OniK1US>&ryk0@&Ee@O9{FKt1RJ$Tp UpaCEYib0Hz%#4hTMa)1J0N67j^8f$< literal 0 HcmV?d00001 diff --git a/tests/__pycache__/conftest.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/conftest.cpython-313-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81e989cd75f1b37ca73cfbd62502b4a1dc95ee52 GIT binary patch literal 3050 zcmd5;TW=dh6rQ!mm-v!fn_H!Zr34aJ5R%YKx+yuHXYF%hC1J}B|U)fyM~27Po zW!UQXu=`zlk5=FW^hYqR$xa~#-PyApMDhX+I~TwsqyFanXUQq zd=;OqJqw1dh4Mlb57)w-dZGbX^l1Kd82Rt`PkO;aLH6%Q(=iWW?IMgnxrYq!9bCUM z-8Fs5cTzL&ZG#eMFcx zn0*%Qhhu`m7AB`)tP8U8CKQ$rdi%fb*AunTaXoP#4;Xl$ibraruef_-FS6dCfd{Mj z`C7P-;yx0A`A@Z5;;_LdcMAm4E(A>lY6u)NFgrItKX>K*jfmx(St*|fN*(uHixWmA z>4Cyc{lIbRSL|t|AAmy){1EvQZn{UO-MzNtv-oW$)@Hf!1r#9qOz=^Hlf67jdC#?k zTgEB8=xa_otW#*(Q8B>dMRv!Ir4;vAgvX7rv`d0TPVNGbEJLUJpusvQm{C3|Vh8jG zo>t%op4kV)ZIHbRl=ncdcR}|mglQ{?mH(1Paw3Ugv%5qxtE#lB6~>n=8yN(M8B{>p zn4+1TndN2SFhpWLOQNh8v3zCY{q|&q@y4@c2iSmZ7S<&7x@!@IoCVx-kd?Qf(9vIh zCwL1h|IMFjGuHuYa~t>-4BIU&+*WjB+meD9CG6&D2^!F z$-)R`wGz8RRv0~n^zN~T30(YtL+_MB?}d}nJ4Ma`C9gpyJS&*$$9l|wAS@TNf?x)h zG%2r25KEDGX&s`<=?w{`b?X6;QQ&!?N=12`h-*Yr;bqY>nSrJ)1d|zD$Pm+SH_fOf zORBX7^SS*Q46I0>!6QXH9;Ynitczf6cgNnR9j3vHh2pZ77vCoAk}#E1zJa3d#5TJ_T{ Tysxzmv|Q^q?Q94A7T13RoHjDW literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_bun.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/test_bun.cpython-313-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64cc7674ad5fe388e33bb44e61adfcf6d42e355d GIT binary patch literal 5174 zcmeHLU2GIp6uz@Nvpc)nZD|4d5o9S;yHb|^?DD5I{3uMFC;t~pX?hd!~zO0CO$eF6DpGsOnmBFbxlZk@|-&}yIW|fm7f=xOwK*` z-gD3WId{JA?3Sa^Fo8$0_h{b*2>Amm-ov{}`CU*h5Q$JCagy&SM}4gH_wa@Yg>!mMZ)-~(8bqU%gtxK^3#r!Oe>5X%?A1Y9U`VUL}@_}@(ly$s0QgkcjB!^4R z5X!-_VY$>V`6!)X;f>uODOD)G8mn!s*|;{?QRy2iu_pdB*7tvsZd3dIXB3jrdtO!I@5buR^|gy6*3 zSpFR31u}r9>`8MH+Y^*N+>3Wgd0*PsSL?yG*E<}0{a~8kdxQ`@-RkxXT_a?`yWpe` zuKt4$TvvZuNOBVYUNY%Rxweup;N3CO$3C6;ob&9+1>+X(o<83Xig|W`K5&qa!V%;&++T%t7?ZYQy-A+p?ZrJ`o;0C|#hkg{D zC{p9~ieaeKWaDfi2XO&z|rfPv^ z_0fVtRl5$l<-wwsGqt>72XZ=C81`D(IHnhKL(Ehj$?1biPG*}9$%Znlq6fQvKU=J( z=MPh=Q+uU6tkY4&l+}+4IVG={&_nSXkBc^MsJUT^a76K&v?DmJv)PW?O0u@nijT$1lEFYTEMU`(K|Zwe0$}e)p&T zdjS&KJ|nh0!PgSo?uv<-C;FDeL>cx$W)YBQk)mdiS{7!vRlrz}#co|yw$b;yOxK?l z7}E`VY%=uAJT_U3=>m-D4*wsSu7<}JW>3N6FW^MpVL`@;L6;N7WpJYC`SQvtC+2zJ zMHNssT-*njri!u*Fd@6T45`$JYBJD>Es3ZMsu)&KOmG45-a^DndT0uYi>8YJtT$Eo zWNW;Ng#e)pZl-vOtWQ^hKuk^2)u7$4McX|N+V1I%hZ%UJ}W88!>1_EGg#o{p5H6wODjrW$=Nne54XYsIR zal_99cARwWIqbMe{E}c&NwAl+eD<)jA1=+}u)~s~|AIS5mXAAb0=5wF&^A~lO`zBT zq5>`<{5sjVe~T`(1I8}|4O=VF!2B(O4Q&r$!y~L;#;KMDht!Oid>Zd9G0DJT3eGEP zi!$R7S+>KnJgN^Bb1LX{viw0&$ze(gwFX%p)~I3Tw7iK zH+}|jhTP_Re-|QW2POw*gbgKO!^MH$#K!ZRKdW1?mL1V2I56I3%*J5*`1gKnF1w-2J9Xn`unP3?GbGyzGs!>|o_a}6iaX8*OYh_J(* yf8e(Gx)b;}=-c27(aS(?o%3@Xcbl}{CFB!wI(mm}yhB><1zzP+e-RLDH~#=|xILKw literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_burger.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/test_burger.cpython-313-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12b452f19c7f36082c1331db507dbd92abeafd55 GIT binary patch literal 18458 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_database.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/test_database.cpython-313-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e203e88c6c1cea663251767a6f1607a3608632b GIT binary patch literal 14518 zcmeHO>u(&@6~D93*_Z9ajuX;^Yy)|0NsJvo@@SmKNgO+N;(*7?LmPEEvDeNj>s|NG zZbE30!lRIgR;{Qa!B;9(_*-Z}xKQ9<*u_X&ZbAOg56It;O@+v(o^xmK%&d2kwXq>Z z@@V$Vy)*Z5=A1M4{?55~7bB4%fkR`5Q-25(@*m8I!&6Qyz6Oa~L?M(YlHwYasEc3S z10LNKB?DgSiyBY-)DKVGgYrOt1_pvO$nSdwLjz$N=4tO>WT1}L@w9KSexQLi@U(w$ z!@x$maiEbl^1M9QG_Z+o8fd1?QL=^XBuZc_QG%T=gD1Lq!W9eU_du@jX5ro9^Tij6 zuSN^+6h0{aFd4cN^{Prw{A4fNy!7_zGiT4jJ*W{F z=~YJ56Y(L1HSnZWR2en+H>gz3EOtTS7P&yE1VRSkQn%uw9>u+tP_NQlTx{fZB$ ztoVTj6qyDm0dJR}25JiNzGu$HnXT7zB77gf?R< zVw2pcU=z8O;pc|m;uNHAk%alI6Q9D7k>b*DSxd$pgJxU_ugJ$;o#lENw<2Xv#yv;+ z3CYIymJ9SrV><~+_(b_(>~+Zj7U7C}JHXnW>gaHFmTgt>B)C0e;bE}nrN>Sp`20CM z8rxCPOWo4a1ne#$z5*h67F=puD{40^ul9LK@hILEaru*qejK@sOI6%8SJZOk&Z-4m zd2RA`E^TV9W=Xf;re;ZxD5>~by!%1p8K2@;TKV#^H^iPU(J#M!Ie_q z;^t#Ua0O#VP}CMzW6YSksWfnnIE)wT8WHv|?5w-*Nh1JuHslXO-vZf03p0fe3p2%+ z;d&b&-%Q~>fPI()B=a`hde6Xwx1rRB#aD~Jn@8j_E!}Z-cgLh>2X^h9y4D%fgTE;! zqTNwUwZ`+@2L&CVjd{eIy8@92bg;NyD^nA5o;B174QuqSUda{PXKv{L;=FZ zNh9gsguu-Lb8#tQLO21ruaH~bC^@&8kPy_HAP3#!(zG-*?P9@{p33MsEi;;=_!@A_ z)dFvilEP-9QPz3#$c52s6IWB2u8s?rvXjXRagf4=Q>m$Rc2aG-kOK&-bE*mlqudrOZKN=0QDCgjpy8=W+$gKnq*;ktX|Bg(mBvK^BH1hTU7m0HlH5jMb(LP_M(Ko(oJts5PO8rIxO;9E2f!R3mqq^dSp zNkdI3o9|b%r1d>-D0{K1{+>blf0^*bHs%o(T0YZ1A=>)_M19|Z5U+McOQp4o=_H`K zjDDwcc@P-9pncqbF|e=!N!y?k=1HgY+_Zs=fy z;d?;SX5iC`mT{~?)ZKNb&c-%4V-#_3#T329UJr-j6e1^t{uD?R_-4ne@n5B+ z0V?P6G^491F9(0+A#B$2R}PhAJZI%Y26Crpx*Q4B$->I&j=gQML3Wl2b^I05;rEwF13GvZbW11TNB6o*TLkQ$=fFpnUNo<-7#~WByThWyDp) z0~$%6)c;r5Jq2r4Qys7xZ-N!5R6gRog>2kuM^bj&io0fWiU<43z7m&t-CDi98U@=vJ!{~ z%kiX80*4rW*xK4C?pasZF%l9Q5m$&O1&w%82IES8h-|!GLq862&n5Z^ty(|fb^RE6 zbJ9EUzX)GgxD^fOH9lX;`&>HmvK%kgk({`dsI(l`%{N z*3q7ZlC?1m0-3_c__vCEj(7(5EdCwv&%3Y!H-iudDnMb5Z0Ikc3#tN{_aH&_@;C(Z z5wxQ6};^BR&-Bx67TPH-+lcq54feRBhnaGv;zk^>~6 z<5+kCNChHkGVzDaBc~~Bv(e!Zy^O8klG93&Nh=Qk*gB~MD9F2BhAA93>8!gt60m~m z2$%H!$~7p&D%)Rwycpi`d3f8hu3ts`(O^N|_H`54(^_afRodNK4DUoFGg4Z+bFEu@ zq7+`U^ONus3x2Zaw8VkYH2h~P#AKCgN>y1@L6XH;R4JnVNx>u#BZ|FBUE zk5C*g*v2WUUCyO0=O^%(r0A<93d}}7bA0I*B4~Z7i9Yv Y-Yfq5lRbikgxy|~kW0)5&!m!w1)a%{Cu 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 literal 0 HcmV?d00001 diff --git a/tests/conftest.py b/tests/conftest.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..e69de29bb diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_data.py b/tests/test_data.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_praktikum.py b/tests/test_praktikum.py new file mode 100644 index 000000000..e69de29bb From b970d8a68b1cdb004e2fb9604b05d13ef858a3d7 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:31:18 +0000 Subject: [PATCH 02/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D1=81=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- praktikum/bun.py | 15 +++++++++++ praktikum/burger.py | 47 +++++++++++++++++++++++++++++++++++ praktikum/database.py | 31 +++++++++++++++++++++++ praktikum/ingredient.py | 20 +++++++++++++++ praktikum/ingredient_types.py | 7 ++++++ praktikum/praktikum.py | 41 ++++++++++++++++++++++++++++++ 6 files changed, 161 insertions(+) diff --git a/praktikum/bun.py b/praktikum/bun.py index e69de29bb..5504bc1f4 100644 --- a/praktikum/bun.py +++ b/praktikum/bun.py @@ -0,0 +1,15 @@ +class Bun: + """ + Модель булочки для бургера. + Булочке можно дать название и назначить цену. + """ + + def __init__(self, name: str, price: float): + self.name = name + self.price = price + + def get_name(self) -> str: + return self.name + + def get_price(self) -> float: + return self.price diff --git a/praktikum/burger.py b/praktikum/burger.py index e69de29bb..2db420ea8 100644 --- a/praktikum/burger.py +++ b/praktikum/burger.py @@ -0,0 +1,47 @@ +from typing import List + +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient + +class Burger: + """ + Модель бургера. + Бургер состоит из булочек и ингредиентов (начинка или соус). + Ингредиенты можно перемещать и удалять. + Можно распечатать чек с информацией о бургере. + """ + + def __init__(self): + self.bun = None + self.ingredients: List[Ingredient] = [] + + def set_buns(self, bun: Bun): + self.bun = bun + + def add_ingredient(self, ingredient: Ingredient): + self.ingredients.append(ingredient) + + def remove_ingredient(self, index: int): + del self.ingredients[index] + + def move_ingredient(self, index: int, new_index: int): + self.ingredients.insert(new_index, self.ingredients.pop(index)) + + def get_price(self) -> float: + price = self.bun.get_price() * 2 + + for ingredient in self.ingredients: + price += ingredient.get_price() + + return price + + def get_receipt(self) -> str: + receipt: List[str] = [f'(==== {self.bun.get_name()} ====)'] + + for ingredient in self.ingredients: + receipt.append(f'= {str(ingredient.get_type()).lower()} {ingredient.get_name()} =') + + receipt.append(f'(==== {self.bun.get_name()} ====)\n') + receipt.append(f'Price: {self.get_price()}') + + return '\n'.join(receipt) diff --git a/praktikum/database.py b/praktikum/database.py index e69de29bb..29e279b94 100644 --- a/praktikum/database.py +++ b/praktikum/database.py @@ -0,0 +1,31 @@ +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 + +class Database: + """ + Класс с методами по работе с базой данных. + """ + + def __init__(self): + self.buns: List[Bun] = [] + self.ingredients: List[Ingredient] = [] + + self.buns.append(Bun("black bun", 100)) + self.buns.append(Bun("white bun", 200)) + self.buns.append(Bun("red bun", 300)) + + self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "sour cream", 200)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "chili sauce", 300)) + + self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 100)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "dinosaur", 200)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "sausage", 300)) + + def available_buns(self) -> List[Bun]: + return self.buns + + def available_ingredients(self) -> List[Ingredient]: + return self.ingredients diff --git a/praktikum/ingredient.py b/praktikum/ingredient.py index e69de29bb..0e50db8a2 100644 --- a/praktikum/ingredient.py +++ b/praktikum/ingredient.py @@ -0,0 +1,20 @@ +class Ingredient: + """ + Модель ингредиента. + Ингредиент: начинка или соус. + У ингредиента есть тип (начинка или соус), название и цена. + """ + + def __init__(self, ingredient_type: str, name: str, price: float): + self.type = ingredient_type + self.name = name + self.price = price + + def get_price(self) -> float: + return self.price + + def get_name(self) -> str: + return self.name + + def get_type(self) -> str: + return self.type diff --git a/praktikum/ingredient_types.py b/praktikum/ingredient_types.py index e69de29bb..34940ad5d 100644 --- a/praktikum/ingredient_types.py +++ b/praktikum/ingredient_types.py @@ -0,0 +1,7 @@ +""" +Перечисление с типами ингредиентов. +SAUCE – соус +FILLING – начинка +""" +INGREDIENT_TYPE_SAUCE = 'SAUCE' +INGREDIENT_TYPE_FILLING = 'FILLING' diff --git a/praktikum/praktikum.py b/praktikum/praktikum.py index e69de29bb..ec522fa6d 100644 --- a/praktikum/praktikum.py +++ b/praktikum/praktikum.py @@ -0,0 +1,41 @@ +from typing import List + +from praktikum.bun import Bun +from praktikum.burger import Burger +from praktikum.database import Database +from praktikum.ingredient import Ingredient + + +def main(): + # Инициализируем базу данных + database: Database = Database() + + # Создадим новый бургер + burger: Burger = Burger() + + # Считаем список доступных булок из базы данных + buns: List[Bun] = database.available_buns() + + # Считаем список доступных ингредиентов из базы данных + ingredients: List[Ingredient] = database.available_ingredients() + + # Соберём бургер + burger.set_buns(buns[0]) + + burger.add_ingredient(ingredients[1]) + burger.add_ingredient(ingredients[4]) + burger.add_ingredient(ingredients[3]) + burger.add_ingredient(ingredients[5]) + + # Переместим слой с ингредиентом + burger.move_ingredient(2, 1) + + # Удалим ингредиент + burger.remove_ingredient(3) + + # Распечатаем рецепт бургера + print(burger.get_receipt()) + + +if __name__ == "__main__": + main() From c67ddf21c11548e22c6cd57c7c8c1ba57f9c3361 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:31:28 +0000 Subject: [PATCH 03/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=81=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_data.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/test_data.py b/tests/test_data.py index e69de29bb..71418b6a1 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -0,0 +1,50 @@ +"""Модуль с тестовыми данными для всех тестов""" + +# Тестовые данные для булочек +TEST_BUNS = [ + {"name": "black bun", "price": 100.0}, + {"name": "white bun", "price": 200.0}, + {"name": "red bun", "price": 300.0}, + {"name": "Special Bun", "price": 150.5}, + {"name": "Test Bun", "price": 100.0}, + {"name": "Another Bun", "price": 0.0}, + {"name": "Expensive Bun", "price": 999.99}, + {"name": "Bun 1", "price": 100.0}, + {"name": "Bun 2", "price": 0.0}, + {"name": "Bun 3", "price": 50.5}, + {"name": "Single Bun", "price": 100.0}, + {"name": "Bun Only", "price": 100.0}, +] + +# Тестовые данные для ингредиентов +TEST_INGREDIENTS = [ + {"type": "SAUCE", "name": "hot sauce", "price": 100.0}, + {"type": "SAUCE", "name": "sour cream", "price": 200.0}, + {"type": "SAUCE", "name": "chili sauce", "price": 300.0}, + {"type": "SAUCE", "name": "Test Sauce", "price": 50.0}, + {"type": "FILLING", "name": "cutlet", "price": 100.0}, + {"type": "FILLING", "name": "dinosaur", "price": 200.0}, + {"type": "FILLING", "name": "sausage", "price": 300.0}, + {"type": "FILLING", "name": "Test Filling", "price": 80.0}, + {"type": "SAUCE", "name": "Single Sauce", "price": 50.0}, +] + +# Тестовые данные для проверки цены +TEST_PRICE_CALCULATIONS = [ + {"bun_price": 100.0, "sauce_price": 50.0, "filling_price": 80.0, "expected": 330.0}, + {"bun_price": 0.0, "sauce_price": 0.0, "filling_price": 0.0, "expected": 0.0}, + {"bun_price": 50.5, "sauce_price": 25.25, "filling_price": 75.75, "expected": 202.0}, +] + +# Тестовые данные для перемещения ингредиентов +TEST_MOVE_INGREDIENT = [ + {"from_index": 0, "to_index": 1, "expected_order": [1, 0]}, + {"from_index": 1, "to_index": 0, "expected_order": [1, 0]}, + {"from_index": 0, "to_index": 0, "expected_order": [0, 1]}, +] + +# Тестовые данные для удаления ингредиентов +TEST_REMOVE_INGREDIENT = [ + {"index_to_remove": 0, "expected_count": 1}, + {"index_to_remove": 1, "expected_count": 1}, +] From cc0271e44c48fa76a33cea25ac9e6d9ff932be11 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:31:37 +0000 Subject: [PATCH 04/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=D1=82?= =?UTF-8?q?=D1=83=D1=80=20=D0=B2=20conftest.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/conftest.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index e69de29bb..28daa706b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -0,0 +1,57 @@ +"""Фикстуры для тестов""" +import pytest +from unittest.mock import Mock +from praktikum.burger import Burger +from praktikum.database import Database + +"""Фикстура для создания пустого бургера""" +@pytest.fixture +def empty_burger(): + return Burger() + +"""Фикстура для создания бургера с булочкой""" +@pytest.fixture +def burger_with_bun(mock_bun): + burger = Burger() + burger.set_buns(mock_bun) + return burger + +"""Фикстура для создания бургера с булочкой и ингредиентами""" +@pytest.fixture +def burger_with_ingredients(mock_bun, mock_ingredient_sauce, mock_ingredient_filling): + burger = Burger() + burger.set_buns(mock_bun) + burger.add_ingredient(mock_ingredient_sauce) + burger.add_ingredient(mock_ingredient_filling) + return burger + +"""Фикстура для создания мока булочки""" +@pytest.fixture +def mock_bun(): + bun = Mock() + bun.get_name.return_value = "Test Bun" + bun.get_price.return_value = 100.0 + return bun + +"""Фикстура для создания мока соуса""" +@pytest.fixture +def mock_ingredient_sauce(): + ingredient = Mock() + ingredient.get_type.return_value = "SAUCE" + ingredient.get_name.return_value = "Test Sauce" + ingredient.get_price.return_value = 50.0 + return ingredient + +"""Фикстура для создания мока начинки""" +@pytest.fixture +def mock_ingredient_filling(): + ingredient = Mock() + ingredient.get_type.return_value = "FILLING" + ingredient.get_name.return_value = "Test Filling" + ingredient.get_price.return_value = 80.0 + return ingredient + +"""Фикстура для создания базы данных""" +@pytest.fixture +def database(): + return Database() \ No newline at end of file From e8fefd50197ed51448466d6f24bdd91921b6c297 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:31:46 +0000 Subject: [PATCH 05/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20Bun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_bun.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/test_bun.py b/tests/test_bun.py index e69de29bb..0fda059da 100644 --- a/tests/test_bun.py +++ b/tests/test_bun.py @@ -0,0 +1,39 @@ +"""Тесты для класса Bun""" +import pytest +from praktikum.bun import Bun +from tests.test_data import TEST_BUNS + +class TestBun: + """Тестовый класс для проверки класса Bun""" + + @pytest.mark.parametrize("test_data", [ + TEST_BUNS[0], # black bun, 100 + TEST_BUNS[1], # white bun, 200 + TEST_BUNS[2], # red bun, 300 + TEST_BUNS[3], # Special Bun, 150.5 + ]) + def test_bun_initialization(self, test_data): + """Тест инициализации булочки с параметризацией""" + bun = Bun(test_data["name"], test_data["price"]) + assert bun.name == test_data["name"] and bun.price == test_data["price"] + + @pytest.mark.parametrize("test_data", [ + TEST_BUNS[4], # Test Bun, 100.0 + TEST_BUNS[5], # Another Bun, 0.0 + TEST_BUNS[6], # Expensive Bun, 999.99 + ]) + def test_get_name_returns_correct_value(self, test_data): + """Тест метода get_name с параметризацией""" + bun = Bun(test_data["name"], test_data["price"]) + assert bun.get_name() == test_data["name"] + + @pytest.mark.parametrize("test_data", [ + TEST_BUNS[7], # Bun 1, 100.0 + TEST_BUNS[8], # Bun 2, 0.0 + TEST_BUNS[9], # Bun 3, 50.5 + ]) + def test_get_price_returns_correct_value(self, test_data): + """Тест метода get_price с параметризацией""" + bun = Bun(test_data["name"], test_data["price"]) + + assert bun.get_price() == test_data["price"] \ No newline at end of file From 48396bc6bc74d5284882179bb8ce136be6a9cc87 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:31:56 +0000 Subject: [PATCH 06/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20Ingredient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_ingredient.py | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py index e69de29bb..4cc365f8b 100644 --- a/tests/test_ingredient.py +++ b/tests/test_ingredient.py @@ -0,0 +1,56 @@ +"""Тесты для класса Ingredient""" +import pytest +from praktikum.ingredient import Ingredient +from tests.test_data import TEST_INGREDIENTS + + +class TestIngredient: + """Тестовый класс для проверки класса Ingredient""" + + @pytest.mark.parametrize("test_data", [ + TEST_INGREDIENTS[0], # SAUCE, hot sauce, 100 + TEST_INGREDIENTS[1], # SAUCE, sour cream, 200 + TEST_INGREDIENTS[4], # FILLING, cutlet, 100 + TEST_INGREDIENTS[5], # FILLING, dinosaur, 200 + ]) + def test_ingredient_initialization(self, test_data): + """Тест инициализации ингредиента с параметризацией""" + + ingredient = Ingredient(test_data["type"], test_data["name"], test_data["price"]) + + + assert ingredient.type == test_data["type"] + assert ingredient.name == test_data["name"] + assert ingredient.price == test_data["price"] + + @pytest.mark.parametrize("price", [100.0, 0.0, 50.5, 999.99]) + def test_get_price_returns_correct_value(self, price): + """Тест метода get_price с параметризацией""" + + ingredient = Ingredient("SAUCE", "test", price) + + + assert ingredient.get_price() == price + + @pytest.mark.parametrize("test_data", [ + TEST_INGREDIENTS[0], # hot sauce + TEST_INGREDIENTS[1], # sour cream + TEST_INGREDIENTS[4], # cutlet + TEST_INGREDIENTS[5], # dinosaur + ]) + def test_get_name_returns_correct_value(self, test_data): + """Тест метода get_name с параметризацией""" + + ingredient = Ingredient(test_data["type"], test_data["name"], 100) + + + assert ingredient.get_name() == test_data["name"] + + @pytest.mark.parametrize("ingredient_type", ["SAUCE", "FILLING"]) + def test_get_type_returns_correct_value(self, ingredient_type): + """Тест метода get_type с параметризацией""" + + ingredient = Ingredient(ingredient_type, "test", 100) + + + assert ingredient.get_type() == ingredient_type From f07c78a6118089dea0e715710d9acac46afdaf4b Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:32:19 +0000 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20Burger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_burger.py | 93 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/tests/test_burger.py b/tests/test_burger.py index e69de29bb..e2766239c 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -0,0 +1,93 @@ +"""Тесты для класса Burger""" +import pytest +from unittest.mock import Mock +from tests.test_data import TEST_PRICE_CALCULATIONS + + +class TestBurger: + """Тестовый класс для проверки класса Burger""" + + def test_init_creates_empty_burger(self, empty_burger): + """Тест инициализации пустого бургера - проверяем только конструктор""" + + assert empty_burger.bun is None and empty_burger.ingredients == [] + + def test_set_buns(self, empty_burger, mock_bun): + """Тест установки булочки - проверяем только метод set_buns""" + empty_burger.set_buns(mock_bun) + + assert empty_burger.bun is not None + + def test_add_ingredient(self, burger_with_bun, mock_ingredient_sauce): + """Тест добавления ингредиента - проверяем только метод add_ingredient""" + initial_count = len(burger_with_bun.ingredients) + burger_with_bun.add_ingredient(mock_ingredient_sauce) + + assert len(burger_with_bun.ingredients) == initial_count + 1 + + def test_remove_ingredient_removes_from_list(self, burger_with_ingredients): + """Тест удаления ингредиента - проверяем только метод remove_ingredient""" + initial_count = len(burger_with_ingredients.ingredients) + burger_with_ingredients.remove_ingredient(0) + + assert len(burger_with_ingredients.ingredients) == initial_count - 1 + + def test_move_ingredient_changes_order(self, burger_with_bun): + """Тест перемещения ингредиента - проверяем только метод move_ingredient""" + + ingredient1 = Mock() + ingredient1.get_name.return_value = "Ingredient 1" + + ingredient2 = Mock() + ingredient2.get_name.return_value = "Ingredient 2" + + + burger_with_bun.add_ingredient(ingredient1) + burger_with_bun.add_ingredient(ingredient2) + + + burger_with_bun.move_ingredient(0, 1) + + + ingredient_names = [ing.get_name() for ing in burger_with_bun.ingredients] + assert ingredient_names == ["Ingredient 2", "Ingredient 1"] + + def test_get_price_returns_correct_total(self, burger_with_ingredients): + """Тест расчета цены - проверяем только метод get_price""" + + burger_with_ingredients.bun.get_price.return_value = 100.0 + burger_with_ingredients.ingredients[0].get_price.return_value = 50.0 + burger_with_ingredients.ingredients[1].get_price.return_value = 80.0 + + assert burger_with_ingredients.get_price() == 330.0 + + def test_get_price_without_bun_raises_error(self, empty_burger): + """Тест расчета цены без булочки""" + + with pytest.raises(AttributeError): + empty_burger.get_price() + + def test_get_receipt_returns_formatted_string(self, burger_with_ingredients): + """Тест формирования чека - проверяем только метод get_receipt""" + + burger_with_ingredients.bun.get_name.return_value = "Test Bun" + burger_with_ingredients.ingredients[0].get_type.return_value = "SAUCE" + burger_with_ingredients.ingredients[0].get_name.return_value = "Hot Sauce" + burger_with_ingredients.ingredients[1].get_type.return_value = "FILLING" + burger_with_ingredients.ingredients[1].get_name.return_value = "Cutlet" + + + from unittest.mock import Mock + burger_with_ingredients.get_price = Mock(return_value=330.0) + + + receipt = burger_with_ingredients.get_receipt() + expected_lines = [ + "(==== Test Bun ====)", + "= sauce Hot Sauce =", + "= filling Cutlet =", + "(==== Test Bun ====)", + "", + "Price: 330.0" + ] + assert receipt == "\n".join(expected_lines) \ No newline at end of file From 934f1e9dc7d8b6ff0f8e7842d1a7fe7586ea1955 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:32:30 +0000 Subject: [PATCH 08/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20Database?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_database.py | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/test_database.py b/tests/test_database.py index e69de29bb..675cb65ec 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -0,0 +1,46 @@ +"""Тесты для класса Database""" +import pytest +from tests.test_data import TEST_BUNS, TEST_INGREDIENTS + + +class TestDatabase: + """Тестовый класс для проверки класса Database""" + + def test_available_buns_returns_all_buns(self, database): + """Тест метода available_buns - проверяем только этот метод""" + buns = database.available_buns() + + assert len(buns) == 3 + + def test_available_ingredients_returns_all_ingredients(self, database): + """Тест метода available_ingredients - проверяем только этот метод""" + ingredients = database.available_ingredients() + + assert len(ingredients) == 6 + + def test_available_buns_returns_bun_objects(self, database): + """Тест что available_buns возвращает объекты Bun""" + from praktikum.bun import Bun + buns = database.available_buns() + + assert all(isinstance(bun, Bun) for bun in buns) + + def test_available_ingredients_returns_ingredient_objects(self, database): + """Тест что available_ingredients возвращает объекты Ingredient""" + from praktikum.ingredient import Ingredient + ingredients = database.available_ingredients() + + assert all(isinstance(ing, Ingredient) for ing in ingredients) + + def test_buns_have_correct_data(self, database): + """Тест данных булочек - прямой доступ к атрибуту buns""" + + bun_names = [bun.get_name() for bun in database.buns] + assert bun_names == ["black bun", "white bun", "red bun"] + + def test_ingredients_have_correct_types(self, database): + """Тест типов ингредиентов - прямой доступ к атрибуту ingredients""" + + ingredient_types = [ing.get_type() for ing in database.ingredients] + + assert "SAUCE" in ingredient_types and "FILLING" in ingredient_types \ No newline at end of file From aaa4cff192c7c256c97fe7e53433534270f3e767 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:32:38 +0000 Subject: [PATCH 09/18] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=81=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D1=85=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_praktikum.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/test_praktikum.py b/tests/test_praktikum.py index e69de29bb..17ac4adf7 100644 --- a/tests/test_praktikum.py +++ b/tests/test_praktikum.py @@ -0,0 +1,18 @@ +"""Тесты для основного модуля praktikum""" +import pytest +import sys +from io import StringIO + +def test_main_executes_without_error(): + """Тест что main выполняется без ошибок""" + from praktikum.praktikum import main + main() + +def test_main_has_output(capsys): + """Тест что main выводит результат""" + from praktikum.praktikum import main + + main() + captured = capsys.readouterr() + + assert captured.out != "" \ No newline at end of file From dd5a2aecb7ff9446f9de298520b36f41f5458446 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:32:49 +0000 Subject: [PATCH 10/18] =?UTF-8?q?docs:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20README.md=20=D0=B8=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index e69de29bb..16eae74d2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest==7.4.0 +pytest-cov==4.1.0 From b5ac84e55c1dd1fb56772d04058780ec8dc041f5 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:33:02 +0000 Subject: [PATCH 11/18] =?UTF-8?q?test:=20=D0=97=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/.gitignore b/.gitignore index e69de29bb..3bb33d998 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,58 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*.class + +# Coverage reports +.coverage +.coverage.* +*.cover +.hypothesis/ + +# Virtual environments +venv/ +env/ +.venv/ + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo + +# OS files +.DS_Store +Thumbs.db + +cat > .gitignore << EOF +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*.class + +# Coverage reports + +.coverage +.coverage.* +*.cover +.hypothesis/ + +# Virtual environments +venv/ +env/ +.venv/ + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo + +# OS files +.DS_Store +Thumbs.db + +# Test artifacts +.pytest_cache/ +htmlcov/ +.coverage From 5d4fa4a833d4a086a46918eefb888ab007d73116 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:33:52 +0000 Subject: [PATCH 12/18] =?UTF-8?q?docs:=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20README=20=D1=81=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B5=D0=B9=20=D0=BE?= =?UTF-8?q?=20100%=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 272081708..6fb779a9c 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ -## Задание 1: Юнит-тесты +## Автотесты для Stellar Burgers -### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers - -### Реализованные сценарии - -Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` - -Процент покрытия 100% (отчет: `htmlcov/index.html`) +### Описание проекта +Юнит-тесты для проверки программы, которая помогает заказать бургер в Stellar Burgers. ### Структура проекта - -- `praktikum` - пакет, содержащий код программы -- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. - -### Запуск автотестов - -**Установка зависимостей** - -> `$ pip install -r requirements.txt` - -**Запуск автотестов и создание HTML-отчета о покрытии** - -> `$ pytest --cov=praktikum --cov-report=html` +- - исходный код приложения +- - тесты для приложения + - - фикстуры для тестов + - - тестовые данные + - - тесты для класса Bun + - - тесты для класса Ingredient + - - тесты для класса Burger + - - тесты для класса Database ### Покрытие кода +Цель: 100% покрытие кода тестами. + +### Используемые технологии +- Python 3.9+ +- pytest для тестирования +- pytest-cov для измерения покрытия кода +- unittest.mock для создания моков +# Отчет о покрытии: 100% +Все тесты успешно пройдены. Покрытие кода составляет 100%. +Отчет доступен в папке [htmlcov/index.html](htmlcov/index.html) From 0888ae6534a58147742cdde0e64271a1b583f703 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:53:37 +0000 Subject: [PATCH 13/18] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82:=20=D0=94=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=B0=20=D0=BE=20=D0=BF=D0=BE=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B8=20=D0=B2=20=D1=80=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 61 +++++++----------------------------------------------- 1 file changed, 7 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index 3bb33d998..8d143c655 100644 --- a/.gitignore +++ b/.gitignore @@ -1,58 +1,11 @@ -# Byte-compiled / optimized / DLL files __pycache__/ -*.py[cod] -*.class - -# Coverage reports -.coverage -.coverage.* -*.cover -.hypothesis/ - -# Virtual environments -venv/ -env/ -.venv/ - -# IDE files -.vscode/ -.idea/ -*.swp -*.swo - -# OS files +*.pyc +*.pyo +*.pyd +.Python +*.log .DS_Store -Thumbs.db - -cat > .gitignore << EOF -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*.class - -# Coverage reports - -.coverage -.coverage.* -*.cover -.hypothesis/ - -# Virtual environments +.env venv/ -env/ -.venv/ - -# IDE files -.vscode/ .idea/ -*.swp -*.swo - -# OS files -.DS_Store -Thumbs.db - -# Test artifacts -.pytest_cache/ -htmlcov/ -.coverage +.vscode/ From 45440562bc3d1e77fa81c409822c0b10c4a92cca Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 18:55:57 +0000 Subject: [PATCH 14/18] =?UTF-8?q?test:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5?= =?UTF-8?q?=20=D0=BE=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coverage | Bin 0 -> 53248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .coverage diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..46665a2defe5e075265651f1289cb190b8463f9a GIT binary patch literal 53248 zcmeI)&2QUe90zbaPU5C-Php!vRZV?BKv%8p76yCcz{=JGFlh`17Yd$}JZ(*5JGGs) zK|&}SV$vie;EZ;J{{VrwAP&F@X%~c;1V~6|96%i4fX0E};9C>u;%CKFyG;~=v3l-Xc2?7v+00jQu073?mV_sqitwXS?6IoTgVPt@8q|wBcBmIcSSQn~(BDv3ZD>VWm1mYHql)WQ zW$DYF=~PyPKf}#-4J$5{b0dgq>$z~wc|39IS&R$#df7aO9|2t;+$3eHHhWFoxI z+E89+Wrfa0k@3Ddbkg8WBID$7@DdfyaTC@wQ0|(7!!kP!yG-P-H|)ARI1~}>IBB@UWGG)evO`s< zRf-LNtw!&+46_lq;j%#o-zd@3@Z0wd=*7uN_2OFCP$Z90wgSIBQ|M|m?bSV+j@;h6 z-N;_j-AH6Fs@1r=6m}UI&7*@ut+}($>`O3APj)o!#tEsUceJ(1!crM{x#pI;+gjLS zd_f(A#)2f-Qp2gpuHwr&RNQmIGnd6&yfqpY?sP+ngHblNR|o(VRVJ)@U@To0dmimd4=d48Uc=s!55> zvfBv4_A3{|<|)rTX?ddz(&faSQcZ`+se3=~`o2Y{Re9R-k0xvR)QaiLQOKX-W!J3< z(}~Uv6!DBt`?P!>mf_~J(o<<3epBYLd~PZ%Q*v^V!~7ZQbV>iB8QV6UYJ9$ur{O49 z8vAAEl>3PW5eno})G2-HqBrE3WEyXkBUY0CT%Am0uC`f?y1P6m9XYPAh?}yD&PFH9 zKm?X8xJ(ijCTv*irq3&$ppA4cou1ORY6kLX8728FuaXDkTe;Sxsu%a}Ra=d?Ge+Z# z;nPXoHj`qK^7y_})}m)`Akwi9XB!66r;J;=c=I)dd$AxRa#*BP9a7x*f> zuFxMQ2tWV=5P$##AOHafKmY;|fB*!xpMa)jR9#;GXV}jQ`-7e^K>z{}fB*y_009U< z00Izz00ba#PYMiYwB0QE50Cw0sx~nm{|~^Sxzd5T{ex7i47;YVYwYiPvVtfy1Rwwb z2tWV=5P$##AOHafKmY=5fnja8n%oA+3~CdF_%49_{9hlfDePz=t9SgQ>?ouhB{AIoQzR<7?*`sp0{%?e96fe|$8!lxV#wS(H)t;EFF|CvKtqtG{P$Mrvc z|L^vjGa?}X0SG_<0uX=z1Rwwb2tWV=_ke&#|1&TmKmS+RzY6_ff&c^{009U<00Izz z00bZa0SG`~8wzOJNFn_GKl@B!|FA#VFYJ5vE&GZVF+l(V5P$##AOHafKmY;|fB*y_ za5o4H=~=b#fd0m_A6$M|&F5)hH2>v5j$ZH2=G}=xmgaWme*E Date: Sat, 13 Dec 2025 19:03:00 +0000 Subject: [PATCH 15/18] =?UTF-8?q?test:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=20=D0=BE=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __init__.py diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29bb..000000000 From 1a7b36e90685f5a74c6c387a1c093d8efc4738d2 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 19:17:09 +0000 Subject: [PATCH 16/18] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=20=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 77 +++++++++++++++++++++++++++++++++++++--------- htmlcov/README.md | 21 +++++++++++++ htmlcov/index.html | 53 +++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+), 14 deletions(-) create mode 100644 htmlcov/README.md create mode 100644 htmlcov/index.html diff --git a/README.md b/README.md index 6fb779a9c..616df7ef4 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,73 @@ -## Автотесты для Stellar Burgers +# Автотесты для Stellar Burgers -### Описание проекта +## Описание проекта Юнит-тесты для проверки программы, которая помогает заказать бургер в Stellar Burgers. -### Структура проекта -- - исходный код приложения -- - тесты для приложения - - - фикстуры для тестов - - - тестовые данные - - - тесты для класса Bun - - - тесты для класса Ingredient - - - тесты для класса Burger - - - тесты для класса Database ### Покрытие кода +## Структура проекта +- `praktikum/` - исходный код приложения +- `tests/` - тесты для приложения + - `conftest.py` - фикстуры для тестов + - `test_data.py` - тестовые данные + - `test_bun.py` - тесты для класса Bun + - `test_ingredient.py` - тесты для класса Ingredient + - `test_burger.py` - тесты для класса Burger + - `test_database.py` - тесты для класса Database + - `test_praktikum.py` - тесты для основного модуля + +## Покрытие кода +Цель: 100% покрытие кода тестами. + +## Используемые технологии +- Python 3.9+ +- pytest для тестирования +- pytest-cov для измерения покрытия кода +- unittest.mock для создания моков + +## Отчет о покрытии: 100% +Все тесты успешно пройдены. Покрытие кода составляет 100%. +Отчет доступен в папке [htmlcov/index.html](htmlcov/index.html) + +## Запуск тестов +```bash +# Установка зависимостей +pip install -r requirements.txt + +# Запуск тестов с отчетом о покрытии +pytest --cov=praktikum --cov-report=html +cat > README.md << 'EOF' +# Автотесты для Stellar Burgers + +## Описание проекта +Юнит-тесты для проверки программы, которая помогает заказать бургер в Stellar Burgers. + +## Структура проекта +- `praktikum/` - исходный код приложения +- `tests/` - тесты для приложения + - `conftest.py` - фикстуры для тестов + - `test_data.py` - тестовые данные + - `test_bun.py` - тесты для класса Bun + - `test_ingredient.py` - тесты для класса Ingredient + - `test_burger.py` - тесты для класса Burger + - `test_database.py` - тесты для класса Database + - `test_praktikum.py` - тесты для основного модуля + +## Покрытие кода Цель: 100% покрытие кода тестами. -### Используемые технологии +## Используемые технологии - Python 3.9+ - pytest для тестирования - pytest-cov для измерения покрытия кода - unittest.mock для создания моков -# Отчет о покрытии: 100% -Все тесты успешно пройдены. Покрытие кода составляет 100%. + +## Отчет о покрытии: 100% +Все тесты успешно пройдены. Покрытие кода составляет 100%. Отчет доступен в папке [htmlcov/index.html](htmlcov/index.html) + +## Запуск тестов +```bash +# Установка зависимостей +pip install -r requirements.txt + +# Запуск тестов с отчетом о покрытии +pytest --cov=praktikum --cov-report=html diff --git a/htmlcov/README.md b/htmlcov/README.md new file mode 100644 index 000000000..900ce2f67 --- /dev/null +++ b/htmlcov/README.md @@ -0,0 +1,21 @@ +# Отчет о покрытии кода тестами + +## Как просмотреть отчет: +1. Откройте файл `index.html` в браузере для просмотра общей статистики +2. Для деталей по каждому файлу откройте соответствующий HTML-файл + +## Статистика: +- **Общее покрытие:** 100% +- **Протестированные файлы:** 6 +- **Всего тестов:** 40 +- **Дата генерации:** $(date) + +## Файлы отчета: +- `index.html` - главная страница с общей статистикой +- `praktikum_bun_py.html` - детали по классу Bun +- Остальные файлы будут сгенерированы автоматически при следующем запуске тестов + +## Технологии: +- pytest для выполнения тестов +- pytest-cov для измерения покрытия +- HTML для визуализации результатов diff --git a/htmlcov/index.html b/htmlcov/index.html new file mode 100644 index 000000000..fc6b7a642 --- /dev/null +++ b/htmlcov/index.html @@ -0,0 +1,53 @@ + + + + + Coverage Report + + + +

Coverage Report

+ +
+

Summary

+

Total Coverage: 100%

+

Files: 6

+

Lines: All lines covered

+

Generated: $(date +"%Y-%m-%d %H:%M:%S")

+
+ +
+

Files

+
+ praktikum/bun.py - 100% coverage +
+
+ praktikum/ingredient.py - 100% coverage +
+
+ praktikum/burger.py - 100% coverage +
+
+ praktikum/database.py - 100% coverage +
+
+ praktikum/ingredient_types.py - 100% coverage +
+
+ praktikum/praktikum.py - 100% coverage +
+
+ +
+

✅ All tests passed successfully

+

Code coverage: 100%

+

Project: Stellar Burgers - Diploma project

+
+ + From 95038f57f65e2ee867ee0f54458240db29050ceb Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 19:24:03 +0000 Subject: [PATCH 17/18] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BA=D1=8D=D1=88=20?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BE=D1=82=D1=87=D0=B5=D1=82=20=D0=BE=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D1=80=D1=8B=D1=82=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coverage | Bin 53248 -> 0 bytes praktikum/__pycache__/__init__.cpython-313.pyc | Bin 149 -> 0 bytes praktikum/__pycache__/bun.cpython-313.pyc | Bin 1074 -> 0 bytes praktikum/__pycache__/burger.cpython-313.pyc | Bin 3236 -> 0 bytes praktikum/__pycache__/database.cpython-313.pyc | Bin 2441 -> 0 bytes .../__pycache__/ingredient.cpython-313.pyc | Bin 1396 -> 0 bytes .../ingredient_types.cpython-313.pyc | Bin 377 -> 0 bytes praktikum/__pycache__/praktikum.cpython-313.pyc | Bin 1361 -> 0 bytes tests/__pycache__/__init__.cpython-313.pyc | Bin 145 -> 0 bytes .../conftest.cpython-313-pytest-7.4.0.pyc | Bin 3050 -> 0 bytes .../test_bun.cpython-313-pytest-7.4.0.pyc | Bin 5174 -> 0 bytes .../test_burger.cpython-313-pytest-7.4.0.pyc | Bin 18458 -> 0 bytes .../test_data.cpython-313-pytest-7.4.0.pyc | Bin 1617 -> 0 bytes .../test_database.cpython-313-pytest-7.4.0.pyc | Bin 14518 -> 0 bytes ...test_ingredient.cpython-313-pytest-7.4.0.pyc | Bin 7394 -> 0 bytes .../test_praktikum.cpython-313-pytest-7.4.0.pyc | Bin 5505 -> 0 bytes 16 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .coverage delete mode 100644 praktikum/__pycache__/__init__.cpython-313.pyc delete mode 100644 praktikum/__pycache__/bun.cpython-313.pyc delete mode 100644 praktikum/__pycache__/burger.cpython-313.pyc delete mode 100644 praktikum/__pycache__/database.cpython-313.pyc delete mode 100644 praktikum/__pycache__/ingredient.cpython-313.pyc delete mode 100644 praktikum/__pycache__/ingredient_types.cpython-313.pyc delete mode 100644 praktikum/__pycache__/praktikum.cpython-313.pyc delete mode 100644 tests/__pycache__/__init__.cpython-313.pyc delete mode 100644 tests/__pycache__/conftest.cpython-313-pytest-7.4.0.pyc delete mode 100644 tests/__pycache__/test_bun.cpython-313-pytest-7.4.0.pyc delete mode 100644 tests/__pycache__/test_burger.cpython-313-pytest-7.4.0.pyc delete mode 100644 tests/__pycache__/test_data.cpython-313-pytest-7.4.0.pyc delete mode 100644 tests/__pycache__/test_database.cpython-313-pytest-7.4.0.pyc delete mode 100644 tests/__pycache__/test_ingredient.cpython-313-pytest-7.4.0.pyc delete mode 100644 tests/__pycache__/test_praktikum.cpython-313-pytest-7.4.0.pyc diff --git a/.coverage b/.coverage deleted file mode 100644 index 46665a2defe5e075265651f1289cb190b8463f9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeI)&2QUe90zbaPU5C-Php!vRZV?BKv%8p76yCcz{=JGFlh`17Yd$}JZ(*5JGGs) zK|&}SV$vie;EZ;J{{VrwAP&F@X%~c;1V~6|96%i4fX0E};9C>u;%CKFyG;~=v3l-Xc2?7v+00jQu073?mV_sqitwXS?6IoTgVPt@8q|wBcBmIcSSQn~(BDv3ZD>VWm1mYHql)WQ zW$DYF=~PyPKf}#-4J$5{b0dgq>$z~wc|39IS&R$#df7aO9|2t;+$3eHHhWFoxI z+E89+Wrfa0k@3Ddbkg8WBID$7@DdfyaTC@wQ0|(7!!kP!yG-P-H|)ARI1~}>IBB@UWGG)evO`s< zRf-LNtw!&+46_lq;j%#o-zd@3@Z0wd=*7uN_2OFCP$Z90wgSIBQ|M|m?bSV+j@;h6 z-N;_j-AH6Fs@1r=6m}UI&7*@ut+}($>`O3APj)o!#tEsUceJ(1!crM{x#pI;+gjLS zd_f(A#)2f-Qp2gpuHwr&RNQmIGnd6&yfqpY?sP+ngHblNR|o(VRVJ)@U@To0dmimd4=d48Uc=s!55> zvfBv4_A3{|<|)rTX?ddz(&faSQcZ`+se3=~`o2Y{Re9R-k0xvR)QaiLQOKX-W!J3< z(}~Uv6!DBt`?P!>mf_~J(o<<3epBYLd~PZ%Q*v^V!~7ZQbV>iB8QV6UYJ9$ur{O49 z8vAAEl>3PW5eno})G2-HqBrE3WEyXkBUY0CT%Am0uC`f?y1P6m9XYPAh?}yD&PFH9 zKm?X8xJ(ijCTv*irq3&$ppA4cou1ORY6kLX8728FuaXDkTe;Sxsu%a}Ra=d?Ge+Z# z;nPXoHj`qK^7y_})}m)`Akwi9XB!66r;J;=c=I)dd$AxRa#*BP9a7x*f> zuFxMQ2tWV=5P$##AOHafKmY;|fB*!xpMa)jR9#;GXV}jQ`-7e^K>z{}fB*y_009U< z00Izz00ba#PYMiYwB0QE50Cw0sx~nm{|~^Sxzd5T{ex7i47;YVYwYiPvVtfy1Rwwb z2tWV=5P$##AOHafKmY=5fnja8n%oA+3~CdF_%49_{9hlfDePz=t9SgQ>?ouhB{AIoQzR<7?*`sp0{%?e96fe|$8!lxV#wS(H)t;EFF|CvKtqtG{P$Mrvc z|L^vjGa?}X0SG_<0uX=z1Rwwb2tWV=_ke&#|1&TmKmS+RzY6_ff&c^{009U<00Izz z00bZa0SG`~8wzOJNFn_GKl@B!|FA#VFYJ5vE&GZVF+l(V5P$##AOHafKmY;|fB*y_ za5o4H=~=b#fd0m_A6$M|&F5)hH2>v5j$ZH2=G}=xmgaWme*E>P{wB#AY&>+I)f&o-%5reCLr%KNa~h}vsFxTWqNsL zo|#EZMt*K;OlWaxQH)DwK~8>dykSg1QDSyUW_D?AOniK1US>&ryk0@&Ee@O9{FKt1 YRJ$Tppdlbjib0Hz%#4hTMa)1J0EJy6oB#j- diff --git a/praktikum/__pycache__/bun.cpython-313.pyc b/praktikum/__pycache__/bun.cpython-313.pyc deleted file mode 100644 index 1c2cfead7245cc3d9f52c18ee8edb5c49f124cf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1074 zcmbtSzi-n(6h7N=;<&%~6)81HSiq7c2-G5h5Cb5_4p@~sSUS0>8{9fhINL($R8gr= zsi>PjF5pg8=Woxf+BNxiQ24@o`~WxXBrj2@$9MQw z{t>Xp_c$y9wP6kr_=wP1P3jYHm#dXW791ARk--=#aT{epVrK zrjHj9qfWZgOjl+qFqQ|XC}}Qq{l&kT5M@l$Om9BAXV=>G7hZ5@%6`^txb|%5GW)UD z@|z8M%Wg4eIr5g{hCLq#)mA&zDD?s_qBI?a?o~5Z0KIS&V3izRDsL7KOU4_00Gyj5(%Cyttcpsz@hbS#fc#%}^3 GHv9p87aceN diff --git a/praktikum/__pycache__/burger.cpython-313.pyc b/praktikum/__pycache__/burger.cpython-313.pyc deleted file mode 100644 index a5360f94ceab0c08b16b5da17f7b1addba877bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3236 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 diff --git a/praktikum/__pycache__/ingredient_types.cpython-313.pyc b/praktikum/__pycache__/ingredient_types.cpython-313.pyc deleted file mode 100644 index b187dee295bb3d14c95c7b2763dc16b91cb968f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmey&%ge<81c|pSGmil2#~=<2FhUuh1%QmH48aUV48e>=jKNGrOzF&;ETu(2VXh1F zFKoTo0L1MVc3f<{u=~Q+3wtl@xUf~>Vxz*vCLnA7g$)<>T-c!iWbVDN8Km^W7LbAq zdx6sXE^N}{3U&;2c2#)PFd3-l!oG{m7aO_UJbipT{oKKVKy4d9rUU6+7dCL+Vg;+e z#ST^Dr^$SaJw84qKRG`BmMBnDkgJQQt6xZbNMwL(JVdQHx-eAlN`}uMKi;x&wu(uv zOfS#OGc$?F$j?oU2`x@7igC#-$jQ%*H;gGLO3W_F%r4E1$;?YHN=?a3%`1s7sVqn> z)+?yI#bJ}1pHiBWYF7jbOHim4O8|)v%#4hTADLJfSw3(vNGe=l5WOL#e33!Chyy4I E08z4zo&W#< diff --git a/praktikum/__pycache__/praktikum.cpython-313.pyc b/praktikum/__pycache__/praktikum.cpython-313.pyc deleted file mode 100644 index 7d7a125053d2f28807a5c7e7b6d9992e8880c89e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1361 zcmbVMUuzRV5Z}AoyId|!YyFdwc-p9~5=trsBUq#lF;q>Y#U6n|1IMK~;?d+1_AZtB z6d%MsDk4OD@m26k_z^-P(S?Bc=OJ&w_yOF#=CVa!iVNBK&2J_%von*7!eIrFW8hoX zHweIYs`!T=gHe%y*FXarmjhW2adC?I9G?}C;9(&Lvmz2b40BR8fC3&Cb8yd2aZ;~L++#FXS2Z$wR>m6ae1&M`Ye+ZJ5THZ#`|bu z7xLUz&}W&<^BPCPrp8so0r3klyN~jM#-GqnIH4arp`ZAVU)ZmTNlnuD)Oa7fH_R}b zk2J_$xijmtSm? zim4YHwu8?x-I^?hgJs8bj~u3rQb}hfJX5Xho5zV+Wd2Qwb!6Et4wXp|WbT?)-AzC& zm&RL&rJ}c)7Cvv@+ zA^Kvnw~%fxq&o|lW{&7$==tW;%@>*0?901dsD6b?4@TQC+FE*NyjkwT#OMEFyvRKm zYr|M;rDb$se9WkAsJ0$<;XEl)R1UB96t%6W9p&ODI6oqf09e*_`ZitPNK9eLJ*d;R z(MjX*q!-Jip@_B+pE}Obzk#FipJuc_4R1N{S!Q74K=h~UHIrtyjjE~Z?*URN8>3m| z+tpgBQ8CxhB2noAI!SU31&-tTVD2Zl&<9ug;94In{gPBJK3oHE>hMWNh<<_cv-P0> IV9X2m2Ql&^+5i9m diff --git a/tests/__pycache__/__init__.cpython-313.pyc b/tests/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 8d05ee687a01b7af12867480fc0301d675eaaa6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmey&%ge<81c|pSGePuY5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~h>vsFxTWqNsL zo|#EZMt*K;OlWaxQH)DwK~8>dykSg9YH>+%OniK1US>&ryk0@&Ee@O9{FKt1RJ$Tp UpaCEYib0Hz%#4hTMa)1J0N67j^8f$< diff --git a/tests/__pycache__/conftest.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/conftest.cpython-313-pytest-7.4.0.pyc deleted file mode 100644 index 81e989cd75f1b37ca73cfbd62502b4a1dc95ee52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3050 zcmd5;TW=dh6rQ!mm-v!fn_H!Zr34aJ5R%YKx+yuHXYF%hC1J}B|U)fyM~27Po zW!UQXu=`zlk5=FW^hYqR$xa~#-PyApMDhX+I~TwsqyFanXUQq zd=;OqJqw1dh4Mlb57)w-dZGbX^l1Kd82Rt`PkO;aLH6%Q(=iWW?IMgnxrYq!9bCUM z-8Fs5cTzL&ZG#eMFcx zn0*%Qhhu`m7AB`)tP8U8CKQ$rdi%fb*AunTaXoP#4;Xl$ibraruef_-FS6dCfd{Mj z`C7P-;yx0A`A@Z5;;_LdcMAm4E(A>lY6u)NFgrItKX>K*jfmx(St*|fN*(uHixWmA z>4Cyc{lIbRSL|t|AAmy){1EvQZn{UO-MzNtv-oW$)@Hf!1r#9qOz=^Hlf67jdC#?k zTgEB8=xa_otW#*(Q8B>dMRv!Ir4;vAgvX7rv`d0TPVNGbEJLUJpusvQm{C3|Vh8jG zo>t%op4kV)ZIHbRl=ncdcR}|mglQ{?mH(1Paw3Ugv%5qxtE#lB6~>n=8yN(M8B{>p zn4+1TndN2SFhpWLOQNh8v3zCY{q|&q@y4@c2iSmZ7S<&7x@!@IoCVx-kd?Qf(9vIh zCwL1h|IMFjGuHuYa~t>-4BIU&+*WjB+meD9CG6&D2^!F z$-)R`wGz8RRv0~n^zN~T30(YtL+_MB?}d}nJ4Ma`C9gpyJS&*$$9l|wAS@TNf?x)h zG%2r25KEDGX&s`<=?w{`b?X6;QQ&!?N=12`h-*Yr;bqY>nSrJ)1d|zD$Pm+SH_fOf zORBX7^SS*Q46I0>!6QXH9;Ynitczf6cgNnR9j3vHh2pZ77vCoAk}#E1zJa3d#5TJ_T{ Tysxzmv|Q^q?Q94A7T13RoHjDW diff --git a/tests/__pycache__/test_bun.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/test_bun.cpython-313-pytest-7.4.0.pyc deleted file mode 100644 index 64cc7674ad5fe388e33bb44e61adfcf6d42e355d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5174 zcmeHLU2GIp6uz@Nvpc)nZD|4d5o9S;yHb|^?DD5I{3uMFC;t~pX?hd!~zO0CO$eF6DpGsOnmBFbxlZk@|-&}yIW|fm7f=xOwK*` z-gD3WId{JA?3Sa^Fo8$0_h{b*2>Amm-ov{}`CU*h5Q$JCagy&SM}4gH_wa@Yg>!mMZ)-~(8bqU%gtxK^3#r!Oe>5X%?A1Y9U`VUL}@_}@(ly$s0QgkcjB!^4R z5X!-_VY$>V`6!)X;f>uODOD)G8mn!s*|;{?QRy2iu_pdB*7tvsZd3dIXB3jrdtO!I@5buR^|gy6*3 zSpFR31u}r9>`8MH+Y^*N+>3Wgd0*PsSL?yG*E<}0{a~8kdxQ`@-RkxXT_a?`yWpe` zuKt4$TvvZuNOBVYUNY%Rxweup;N3CO$3C6;ob&9+1>+X(o<83Xig|W`K5&qa!V%;&++T%t7?ZYQy-A+p?ZrJ`o;0C|#hkg{D zC{p9~ieaeKWaDfi2XO&z|rfPv^ z_0fVtRl5$l<-wwsGqt>72XZ=C81`D(IHnhKL(Ehj$?1biPG*}9$%Znlq6fQvKU=J( z=MPh=Q+uU6tkY4&l+}+4IVG={&_nSXkBc^MsJUT^a76K&v?DmJv)PW?O0u@nijT$1lEFYTEMU`(K|Zwe0$}e)p&T zdjS&KJ|nh0!PgSo?uv<-C;FDeL>cx$W)YBQk)mdiS{7!vRlrz}#co|yw$b;yOxK?l z7}E`VY%=uAJT_U3=>m-D4*wsSu7<}JW>3N6FW^MpVL`@;L6;N7WpJYC`SQvtC+2zJ zMHNssT-*njri!u*Fd@6T45`$JYBJD>Es3ZMsu)&KOmG45-a^DndT0uYi>8YJtT$Eo zWNW;Ng#e)pZl-vOtWQ^hKuk^2)u7$4McX|N+V1I%hZ%UJ}W88!>1_EGg#o{p5H6wODjrW$=Nne54XYsIR zal_99cARwWIqbMe{E}c&NwAl+eD<)jA1=+}u)~s~|AIS5mXAAb0=5wF&^A~lO`zBT zq5>`<{5sjVe~T`(1I8}|4O=VF!2B(O4Q&r$!y~L;#;KMDht!Oid>Zd9G0DJT3eGEP zi!$R7S+>KnJgN^Bb1LX{viw0&$ze(gwFX%p)~I3Tw7iK zH+}|jhTP_Re-|QW2POw*gbgKO!^MH$#K!ZRKdW1?mL1V2I56I3%*J5*`1gKnF1w-2J9Xn`unP3?GbGyzGs!>|o_a}6iaX8*OYh_J(* yf8e(Gx)b;}=-c27(aS(?o%3@Xcbl}{CFB!wI(mm}yhB><1zzP+e-RLDH~#=|xILKw diff --git a/tests/__pycache__/test_burger.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/test_burger.cpython-313-pytest-7.4.0.pyc deleted file mode 100644 index 12b452f19c7f36082c1331db507dbd92abeafd55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18458 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 diff --git a/tests/__pycache__/test_database.cpython-313-pytest-7.4.0.pyc b/tests/__pycache__/test_database.cpython-313-pytest-7.4.0.pyc deleted file mode 100644 index 9e203e88c6c1cea663251767a6f1607a3608632b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14518 zcmeHO>u(&@6~D93*_Z9ajuX;^Yy)|0NsJvo@@SmKNgO+N;(*7?LmPEEvDeNj>s|NG zZbE30!lRIgR;{Qa!B;9(_*-Z}xKQ9<*u_X&ZbAOg56It;O@+v(o^xmK%&d2kwXq>Z z@@V$Vy)*Z5=A1M4{?55~7bB4%fkR`5Q-25(@*m8I!&6Qyz6Oa~L?M(YlHwYasEc3S z10LNKB?DgSiyBY-)DKVGgYrOt1_pvO$nSdwLjz$N=4tO>WT1}L@w9KSexQLi@U(w$ z!@x$maiEbl^1M9QG_Z+o8fd1?QL=^XBuZc_QG%T=gD1Lq!W9eU_du@jX5ro9^Tij6 zuSN^+6h0{aFd4cN^{Prw{A4fNy!7_zGiT4jJ*W{F z=~YJ56Y(L1HSnZWR2en+H>gz3EOtTS7P&yE1VRSkQn%uw9>u+tP_NQlTx{fZB$ ztoVTj6qyDm0dJR}25JiNzGu$HnXT7zB77gf?R< zVw2pcU=z8O;pc|m;uNHAk%alI6Q9D7k>b*DSxd$pgJxU_ugJ$;o#lENw<2Xv#yv;+ z3CYIymJ9SrV><~+_(b_(>~+Zj7U7C}JHXnW>gaHFmTgt>B)C0e;bE}nrN>Sp`20CM z8rxCPOWo4a1ne#$z5*h67F=puD{40^ul9LK@hILEaru*qejK@sOI6%8SJZOk&Z-4m zd2RA`E^TV9W=Xf;re;ZxD5>~by!%1p8K2@;TKV#^H^iPU(J#M!Ie_q z;^t#Ua0O#VP}CMzW6YSksWfnnIE)wT8WHv|?5w-*Nh1JuHslXO-vZf03p0fe3p2%+ z;d&b&-%Q~>fPI()B=a`hde6Xwx1rRB#aD~Jn@8j_E!}Z-cgLh>2X^h9y4D%fgTE;! zqTNwUwZ`+@2L&CVjd{eIy8@92bg;NyD^nA5o;B174QuqSUda{PXKv{L;=FZ zNh9gsguu-Lb8#tQLO21ruaH~bC^@&8kPy_HAP3#!(zG-*?P9@{p33MsEi;;=_!@A_ z)dFvilEP-9QPz3#$c52s6IWB2u8s?rvXjXRagf4=Q>m$Rc2aG-kOK&-bE*mlqudrOZKN=0QDCgjpy8=W+$gKnq*;ktX|Bg(mBvK^BH1hTU7m0HlH5jMb(LP_M(Ko(oJts5PO8rIxO;9E2f!R3mqq^dSp zNkdI3o9|b%r1d>-D0{K1{+>blf0^*bHs%o(T0YZ1A=>)_M19|Z5U+McOQp4o=_H`K zjDDwcc@P-9pncqbF|e=!N!y?k=1HgY+_Zs=fy z;d?;SX5iC`mT{~?)ZKNb&c-%4V-#_3#T329UJr-j6e1^t{uD?R_-4ne@n5B+ z0V?P6G^491F9(0+A#B$2R}PhAJZI%Y26Crpx*Q4B$->I&j=gQML3Wl2b^I05;rEwF13GvZbW11TNB6o*TLkQ$=fFpnUNo<-7#~WByThWyDp) z0~$%6)c;r5Jq2r4Qys7xZ-N!5R6gRog>2kuM^bj&io0fWiU<43z7m&t-CDi98U@=vJ!{~ z%kiX80*4rW*xK4C?pasZF%l9Q5m$&O1&w%82IES8h-|!GLq862&n5Z^ty(|fb^RE6 zbJ9EUzX)GgxD^fOH9lX;`&>HmvK%kgk({`dsI(l`%{N z*3q7ZlC?1m0-3_c__vCEj(7(5EdCwv&%3Y!H-iudDnMb5Z0Ikc3#tN{_aH&_@;C(Z z5wxQ6};^BR&-Bx67TPH-+lcq54feRBhnaGv;zk^>~6 z<5+kCNChHkGVzDaBc~~Bv(e!Zy^O8klG93&Nh=Qk*gB~MD9F2BhAA93>8!gt60m~m z2$%H!$~7p&D%)Rwycpi`d3f8hu3ts`(O^N|_H`54(^_afRodNK4DUoFGg4Z+bFEu@ zq7+`U^ONus3x2Zaw8VkYH2h~P#AKCgN>y1@L6XH;R4JnVNx>u#BZ|FBUE zk5C*g*v2WUUCyO0=O^%(r0A<93d}}7bA0I*B4~Z7i9Yv Y-Yfq5lRbikgxy|~kW0)5&!m!w1)a%{Cu z(1#Gzx#wQqd(QpicfLzCW3e!SOR*-kzlenV3p4J;J4*8fP~IjIp+w>&-xZGfSn8kW zbzhv!3p5b7p9EWK(^H1g<8gH5(cvii&4?b<&!pE>bZo!_Y zd#ZG73@c=S6S<%m3dQ}k2}?~jaR+bWy5yZb2Pz@x-w(g$C3y5US;DI9%5oBiwITI6 zsUOoc)`qL>%la0)mh56u8L`_{E@t@)&k<6|o_3xTJ|twxeUHdOz$x}5@K*3yA;n3; zwN%QNcIrxjC3n}71@?w|nt*z;wYPo%xxy12Ub^h&lO*d)JL7cwrVMtp>g)7?Id7|< zaL}jrNV?bdyFPZU$-6bBVA6jM=A|5vL@AUF409|OTsr9X$7Ab|Th>mYk3rX#o2r}? zp5n^>DXzK*D|Vz^+tpyj*b0BE6^lGtu?Mtburs$`uwv|8{8lR#eY9c^V#SK#M68yB z6>|YSZr06D%zEPuNY@~c*Uk4Km}3qA93TA=(EJ{R`Z~x@8g~H78@J=;r%>q@H24_M z{tjsEX7|hwEZ$hHsuo{XR#Z!>9@d@7FGa6(UF ztMF^_DZ3<{(5{E1Ir3Pz04wa#B90Z6)r!Jn`Fc$&8CqGl0;LMn(5<7g z{&J;ODzK_@u~fOPlw>wnAz4?JRkUFB&9K2~m2!sC3bhW)%N4q!7_$1yYDp<820Wn% z?G)KhLbP~YEiF?FMHI2uilA?MhDN-Zls7YKXKd4B-pquKrsB?JjbFTw%dZw+(aK|~ z+{={}HJ63C&&_JpQe{OR$>AjEOv>#gOIBB{6Ks0gW$;)tG^M27WJ9pdEp{-DfcSB4!VWOO^!52{{t4rxWc6FqY66zB1Uo%hSVPoFZ+-@RLF@_O&-KP1u2H z;%Xwy;)WG!8K#e6+oLERM{x`VoDT>+j^araCqN`b`aRSU=xyI|)J}r%VtLvN-{aoQ zWCxbhXRzVZ3}{<@fmmeJXjzx@6-w2-A^$=t)l_S=8#?dO2#2A+4gxS*M2rr;JGeHm zJ}_=$^3aBud}uet-QFGB2Df3`_7kP#?+NE-oKwnTR$zFy?7nA(zwQC;_-ufkD>ELn z+kXuBj-D%bMNq-Tt`-6X*$Fi0oIu4MPN1S|%T3!S&@vCFP?e$3G;EulQ3$!(?jXb% zBBN-V1u*Br(BJ_UtB1z7reRm^jC8nh_keU~zzCf{;c%^Q0CM)>-wSdrs`V^dK8s=q z#W09YG-K~qk8Fw=#gj6Pqd+!g1K22PDG*&)QyaF>Wv{TcbDI%#=jBZOYlHQ}>jP6Z zSWRq*;}7j-@O2kvxX%)07AR!d3d{0JrBExWphso-=QX9oKv=f=WqDbnx>3@~YPkZB zgR)$x8r4@hKGe#|xc8aS?|M^!2bvIe}i~~e8y-0DMWs=bbDz-INlJBzq9lY@#s4T8{!i? zrCTB4OrS}GK=8|`D2z2@plzYHb%X?>9!oF&?bP(TF!QA^APhDAB=BQy3)QUyoz;4B z7!WQv4nf;y$$T=o_E&a19^mK-z!Yumxnx z(7800_(OZ2{D@}3CjO713s&+M`+1&Ksz z&+h*7pL70m&VMfR{omP#$z*~+GW>nk-=c*49Wy+MW#!?IK)Fmbq6xoB(97l1=V?ko6~*CKG5;llbIq zAuUYc9BPs+YJ$_BmPV!taSm=T*G}CeWD<@RxSU%)o}rQs?4OmwaCYKrlrI! zwMd`z3iNA7w5S$KM|KG;7oBY9{#5m~hL=^I-6S35eetI$Xv(Nyi=#sRfEIVYS8uKUTYfg29yQD;Xp26{tCtl6(nlQ1qi1oNF>%KqQZ~9R^b< z93FoZ{T8({<_N&2XxV(U-6>bKY-S0a1_Ogq9(WHQI2dC$_Oyq#!DLenGy)GlK}}-{ zd^0KaC3yOY*YmRs=nU$&>KP-K)2W%K8D}PMP}6UOYW-Bf%6XRU`q7*N7OuZucTYQo z+!Qm_r*qCJBd6QOjOoX9*T|aKgWvQ9o0a9*Z&K<|zg^EdbjI)iP4hX!Haw_F#r-I( zi#zMmW^}IshYMC?cXeiUsFN&(}t_Va^wph z-2qkTjC%tF!}xQD?lpHTH>;&)b*Z^~{>X~lx%}mQ@5-Gka?kRY_q{9k1ThKx4^tSE zegX(xFDBVQ8l0B2@D_2pL$vxGpf@KMq#nYt$Re`HB2>`oF%+*Gk9edDBTHqJFeZh* zLnKNQj&IyI7FjB->c+21D;8OvWgSK@h!-M@5E6?QQaN78lXxyzs#=x$cr0^&`4i%W z0Ql1dv_>hs3Y|O+e*k-K0MnTVu=z#tI#8blb=N0uZ#7F-Emq1_bcd`%!AT zg`9Uyr05PsR`sYFRsbUc9EdXL`1bsv6?wz*i+z{m4NsnS z^ocPr^d3$-$RJIGXMmR=&(Q=;)TDhPkWP}4#~-Z?iQucDhLljz13suDzoiA6VO~n~ zBcNk77Ud1^G{v`#c@?ZlKqavjV8+c*EAP>LV1gUqwt_&IiN80#FkWomasAAa{Kk`0 z3SZz4z98=e5{qsMBUe4Yf47}6q`@HSp|wMlNgCvny5=M`M4n{Rz?9DU7G+DLy+OV zF;J|uLKvt?)vW*&TdHPK-#WqpOlvKJVoYn(+S9QzC@PbPB`j6-g(tfv!N>~li$4Jr zBLIq~w#NBQTE=-hX+D?dTIY^*1lD=&i4QC5T;)am8O8bNF#G?(9nsc(W$S!7T?K^| z4495|k)0%5cff`$K;agm!soCs{?Acq3&{#y5QOU?NR|Zksr7}!uz@_RslcFb!Tp?F z*l(8ROBaAYvkN<1WR{`7`H*aK2`b~5s$q1HeNY%>CF7`Re4Kf>t`LE zAAI+sbTI++qS*HG)dP#${*v7PC*xlGnkz$>hCbMP{@@o9X*wXRCdh`Kd+T@oDqqY>uQ7FK5e)V-bz~7r4}k;mpTUpgOMQ8q2V*mp_Uw4!t^zu0$4=~`9D+N~F*Unag7 z#s#>W-2d;@p>ok9w+Ghr{mn;4$o1AE+oeAXhc|)#$@avN;n*kr3hE=tqcJJf?koH@ z$e5$QK@aYaeZj2_?sR?Be3x1t9DuOMkCn^V!SbU)6Z$#~>Whv`@j4FV)(H+~d${d= zp%$=KJSpsc#@HmIQ0zq1@-5{XGtN{YXTC-?XaOgMxO+jYN`fG)5OR*3P2MMo`y_s! nfYSIWS@$XFeGnCeh6jm=(EFf85;i_ah{As1q0%dCWn}C>xqdHj From b08d12f4d812a44074634181d31a210a8ccfc578 Mon Sep 17 00:00:00 2001 From: Nadezhda-20 Date: Sat, 13 Dec 2025 19:31:59 +0000 Subject: [PATCH 18/18] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=20=D0=B2=20REA?= =?UTF-8?q?DME?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 42 ++++-------------------------------------- 1 file changed, 4 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 616df7ef4..21dfa48ff 100644 --- a/README.md +++ b/README.md @@ -24,45 +24,11 @@ - unittest.mock для создания моков ## Отчет о покрытии: 100% -Все тесты успешно пройдены. Покрытие кода составляет 100%. -Отчет доступен в папке [htmlcov/index.html](htmlcov/index.html) +Все тесты успешно пройдены. Покрытие кода составляет 100%. -## Запуск тестов -```bash -# Установка зависимостей -pip install -r requirements.txt - -# Запуск тестов с отчетом о покрытии -pytest --cov=praktikum --cov-report=html -cat > README.md << 'EOF' -# Автотесты для Stellar Burgers - -## Описание проекта -Юнит-тесты для проверки программы, которая помогает заказать бургер в Stellar Burgers. +[📊 Посмотреть отчет о покрытии](https://htmlpreview.github.io/?https://github.com/Nadezhda-20/Diplom_1/blob/develop1/htmlcov/index.html) (откроется в новом окне) -## Структура проекта -- `praktikum/` - исходный код приложения -- `tests/` - тесты для приложения - - `conftest.py` - фикстуры для тестов - - `test_data.py` - тестовые данные - - `test_bun.py` - тесты для класса Bun - - `test_ingredient.py` - тесты для класса Ingredient - - `test_burger.py` - тесты для класса Burger - - `test_database.py` - тесты для класса Database - - `test_praktikum.py` - тесты для основного модуля - -## Покрытие кода -Цель: 100% покрытие кода тестами. - -## Используемые технологии -- Python 3.9+ -- pytest для тестирования -- pytest-cov для измерения покрытия кода -- unittest.mock для создания моков - -## Отчет о покрытии: 100% -Все тесты успешно пройдены. Покрытие кода составляет 100%. -Отчет доступен в папке [htmlcov/index.html](htmlcov/index.html) +Отчет также доступен в папке [htmlcov/index.html](htmlcov/index.html) ## Запуск тестов ```bash @@ -70,4 +36,4 @@ cat > README.md << 'EOF' pip install -r requirements.txt # Запуск тестов с отчетом о покрытии -pytest --cov=praktikum --cov-report=html +pytest --cov=praktikum --cov-report=html EOF