From d492f3f65750bddd139c3054d4432d6b54430c97 Mon Sep 17 00:00:00 2001 From: "Elizaveta Tsh." Date: Tue, 19 May 2026 14:59:23 +0300 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:=20=D1=8E=D0=BD=D0=B8=D1=82-=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coverage | Bin 0 -> 53248 bytes README.md | 18 +++- ingredient_types.py | 7 -- __init__.py => praktikum/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 148 bytes praktikum/__pycache__/bun.cpython-313.pyc | Bin 0 -> 914 bytes praktikum/__pycache__/burger.cpython-313.pyc | Bin 0 -> 2912 bytes .../__pycache__/database.cpython-313.pyc | Bin 0 -> 2339 bytes .../__pycache__/ingredient.cpython-313.pyc | Bin 0 -> 1174 bytes .../ingredient_types.cpython-313.pyc | Bin 0 -> 239 bytes bun.py => praktikum/bun.py | 8 +- burger.py => praktikum/burger.py | 12 ++- database.py => praktikum/database.py | 6 +- ingredient.py => praktikum/ingredient.py | 10 +-- praktikum/ingredient_types.py | 6 ++ requirements.txt | 2 + .../conftest.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 1137 bytes .../test_bun.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 4377 bytes .../test_burger.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 8795 bytes ...test_database.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 10031 bytes ...st_ingredient.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 6034 bytes tests/conftest.py | 18 ++++ tests/test_bun.py | 19 ++++ tests/test_burger.py | 84 ++++++++++++++++++ tests/test_database.py | 39 ++++++++ tests/test_ingredient.py | 21 +++++ 26 files changed, 217 insertions(+), 33 deletions(-) create mode 100644 .coverage delete mode 100644 ingredient_types.py rename __init__.py => praktikum/__init__.py (100%) 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 rename bun.py => praktikum/bun.py (58%) rename burger.py => praktikum/burger.py (78%) rename database.py => praktikum/database.py (91%) rename ingredient.py => praktikum/ingredient.py (60%) create mode 100644 praktikum/ingredient_types.py create mode 100644 requirements.txt create mode 100644 tests/__pycache__/conftest.cpython-313-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/test_bun.cpython-313-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/test_burger.cpython-313-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/test_database.cpython-313-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/test_ingredient.cpython-313-pytest-8.3.5.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_database.py create mode 100644 tests/test_ingredient.py diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..c3a8328e04b85e19cbc1086a2153b558361275cb GIT binary patch literal 53248 zcmeI)&2QUe90zbaPMju9`xLe*lxpfD0qUx?-2!889JVqlF)@h^I)tZjRU{OFLBZ(Q#f_2zE)oR_Ivz1 zpXbGK()#@i=PY0Fn&UQ1pTDL|D5|QQ=3G&f96iVA8BbZ7NyiKHu6E52n$0N-pYI)G zA1DR=Lxp`b_9B}vtQP(p{km{GcX8Cp&gB+p111PS00I!$H3IDmg=}$hQoa7MZ1$!`HDh?=3AZFY)EYH_t8ca2-F8=QPdF^F{7D8@wr8UbE_gTXxl|n7(DNa(_+4 zd$&AMmFFy4M`ta$<3bQG=M1Y#QNCEEB$}?(Fx@S_F1F@^9ipT8V$%;-P$I%wwdEfC zKoma9T~QORuq(m~b8*0`&gN%7{Uo0)?%AW>6hWCxw?dE6p3=~Yq$p==lu*TSt1|ax z*R(5Z!kgn}r-T)U^111UrFEUgA>ZM3%MOZZdzNoGHW!mH5*438iRQ?=KBIkl)*v=f6g`gJj%BWsEu}4*?Rfb;l^_#+2ZuHdh=?~P$Z90wtTNMlj~_Toz(-Hj@&-D-N;_j z+el2#WaQR>X*+mm{>I5nkS z&jrmWs;%fP+tY;Nn(Q--#+w?#^jdB_kUVLSj3bg!GVUYM7AnqsRxd724JuBwpHYft zM%vkQwzzMf+75e!9GB!X(^Ck!Cg}p(P6WeeziIkw{PDcY)s*p>j9z?W-=K`kEEpyE zs^6GM1zG+~3-lW_=*y?plV!Ok$?`j5YyO&9r_rQoS}t{28iT_#0GB&fP1@NkJ1swG zzj85Xp7Pw2#ui0RC>fYxa&$H;XDo^OB{+Tpo@ zBF=hrOv~dz9v(j{ol4U1wqzQs*Jgq|#U~dz%r8@?i~ASNG#aK|jm}r{G#sW%W54X2 z@;KojLV_DG=zCI~>>O6nJgeO4FL#100Izz00bZa0SG_<0uX>eN1&kXSL3e%Qh9AE7kvvLfB)CVzfssv z>!@OW3~QZ#9KS2^>vp ziZ^V$yi-8g^aRBn*ED5g*tq1l6j@4XiZyIxxn;{ts{bRChGE&3Zx|FOfB)CVZz=3& z_T~63_A*-;f3Sm9j6*{J0uX=z1Rwwb2tWV=5P$##6ybi``|v z(l-FVJ%t5CmLLED2tWV=5P$##AOHafKmY;|=p!J%5KuG0_X4Vx36|37;7!+pw^S-k zUjPKZ|0@%H62K}5KmY;|fB*y_009U<00Izz00ef8fc*U**Z;ewI#Cb^KmY;|fB*y_ t009U<00IzzKwkm*|NprD?@NP~5P$##AOHafKmY;|fB*y_0D)a2@E_eaN+bXP literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 272081708..aa88c1975 100644 --- a/README.md +++ b/README.md @@ -11,14 +11,24 @@ ### Структура проекта - `praktikum` - пакет, содержащий код программы -- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. +- `tests` - пакет, содержащий тесты, разделенные по классам: +- Для `Bun` и `Ingredient` использована параметризация +- Для `Burger` использованы моки +- Для `Database` проверяются типы и контрольные значения ### Запуск автотестов **Установка зависимостей** -> `$ pip install -r requirements.txt` +> `pip install -r requirements.txt` **Запуск автотестов и создание HTML-отчета о покрытии** - -> `$ pytest --cov=praktikum --cov-report=html` +python -m pytest -v +python -m pytest --cov=praktikum --cov-report=html + +## Покрытие +```bash +python -m pytest -v +python -m pytest --cov=praktikum --cov-report=term-missing +python -m pytest --cov=praktikum --cov-report=html +``` \ No newline at end of file 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/__init__.py b/praktikum/__init__.py similarity index 100% rename from __init__.py rename to praktikum/__init__.py diff --git a/praktikum/__pycache__/__init__.cpython-313.pyc b/praktikum/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80ed887ca335a29eae27c49cadbcaf2ae6103fc6 GIT binary patch literal 148 zcmey&%ge<81j|#ovq1D?5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~icvsFxJacWU< zOi5~SNqI~_QGQlxa!E``VsUo7VN5|$Vs=Spc4=-*e0*kJW=VX!UP0w84x8Nkl+v73 XyCPPg86Z1~L5z>gjEsy$%s>_ZNi-u$ 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..05886017fdebdd52ab245c0e6d40077bd849cd75 GIT binary patch literal 914 zcmbtRJ8u&~5T3nx}5iL`EGvDm)%(pYkN~Hv3U&g!ra{=&^$;Pa8u&h%s zg*rR|4_xrXfw4M4=owA3v$@ZH`{t0y6nsG80UDk_(=&X_GktsC@+=qn78X3)xAqOM zpxF*Fo7j$Kj^|*pS8SGY^Ds+(ku=DyBp8OdJ;taLc1-TJHkQMD`H)}=$G7A40l;x1 z=C|5?r?zkPhSv ze~iIEMT2bUpJYjEJjop?qa;#N=4H~`+AwaFmI*$?<^B43@v`QAD=mpbUcgXgm~^)C zD9N$@h)cl~j^G{nf9)BdL%F8VvgZPMgDF34;4WeA^g<=|thAO5EAq9qmg>Flle5W% zQ^#AB{T~fHN4&$OZzw2oPrawS!sFOdZhu3=>DlRpv!^v6%WKoVX_Bm+CRvhlIQo#q z9G9j1m<93rq$*`M!c@gk5+)-$HdBSU-Hk_qLhgZg8EOQ1P0CaSD(c8UDU41sTBwwB zSas!rA&*=Ge<6KN@D&!0VLzC83n2HScExVt2zzh#^a{u=3c_}02iFw4t4ds?O-s?m j9&tq;?Rq1xRv&qdk140SR4G`PLWpalEZpBfpdb7JrklE! 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..217cda5ec500e5a6f3b0c644f9b67927cb6de106 GIT binary patch literal 2912 zcmbVOL2naB6rSDnuGfweJ0yF}rQVMQYCRw5l$=b}W z3(2Wcr7ECSsD}t2jZ}$pvNL3HqQi8;(Qs3M4+KCBB?UOw7-kW(d z-+c4tdAFLIg9PNeT+`w|JRyIg;fb%RY@G&WoybIH&XZ||G7{?Sd3KtkoTGE+ebYSU zCDKWHiR|klGC#t)(NtIv;{NAo#2MT7xn`KqbK`j(y5MK}0#)ZVRX69{>26!wnS#Ae z(u6WHp{&eMPG-9Z^~qeCA7*iwrvqS#juk{p4uHoe2OUq7+>{Q% zc*wDu!D<1k*|EZM3ymy<;}KgJ&(j5!KKBEFIc6I+JQfGPEeRSVB}JA%b7cUn+Uy1L zfJr`JZSG25x0|%uQ4J)*P?xS6I90L-Cq~mLL#0OAR1Nb+`XbFPs&i)gi;Qti8BFJB z=9;Np%P*&|IGB#-R%}sGG+i?l#SXhbk9&@0Skh>P=3BDS7F+ZEAZ{ERSo1v*JGT%c z4M8(ky&H6p+JPcqtdrSD{WuGRVs^wCCo0a;7O))Mz$i(gVd!kpP)!BSXw<-X4#Z&~ zg$SnON0IKq`N29BJCGo)4z;78tOJ!Z&^O8q&S;PnGg2j8A|7UzA``Zd$>mgi-oxGj zz8%I17e@9&^ZFGADv488;#4JZ)=Hdx#FrDFJP|*2SrVvf=Bd7; z0{CDNhoak{{1=KwU_Oe>90OW(1`-_CYLGTE6@^iDcF%4!dutqn?ADnJaLG+XA}OYi z#M$I?%s1c*-?$xEfLEEL+MMdj zLW=hm0+Bl{w^|AvMc;k#o>-9vEorbU4V8L^A5N8GV~@o%8)Dd*5-Yaf@4nYvJ}_94 z-Y><59*e`z!fkg}Zmkqzl0dg9F#OS9 zx==rgdSB5%y$|&%rYLWMF~vNT(K*Fz3IZQ3jJzb!ZAJooZ$W-VpmTS{eUfp%EkO3* zKRZ51ySeribsWA_oCDkKbzl7pz-7PzJqCgGgV^F}m(w#8>migZVqm&%aty;fC9%KA S{--4IO6X^LUl3@V$bSK+J~EO3 literal 0 HcmV?d00001 diff --git a/praktikum/__pycache__/database.cpython-313.pyc b/praktikum/__pycache__/database.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ed27949b0d03d60277c4b15e71dd3122d5f2630 GIT binary patch literal 2339 zcmb_d&1)M+6rYt=tC8dnQpc67HqrJ2g76om4TVxltHf<38{vATLa<<1tv2@B@=Bdq zHCTtzQ%RtZlc9$mT{2*wZf*v1nTp}&OE8=%Y4S%PH;8OTr;QBI+XF66*sAQz-TDF+wTT!@CGtS)M~ zFb(H0#X3r$caafFB15|w@WE(gEu6-uLP;xJU2>QQYcSJrVToqlHELHJ+x5}`KAFvb zwX$$KyO1xC!ky&>Vti4&wZP*qo4?F1ErHGQ5Af$;SLtLx*g+*k6$8?Uq#m>41+HYOCskT6Gjw_rqv7JDBvHniCLm?MK?Uqk89 zd^1w6n%1UXZn&ovh^ra7x9)hh)DMInhSnCEGXq83jI7r@otX{GZbn(HL3NAT=2kOi ztvgl6cW}*WcvaiuxZ=1q_?Gf8%*~KqnN3;Avzd3Vv`lLow&j%yCfg(*lfYy!Z4L?@|t?yEmXPG;xtt8JWkf=3=k9z>3D;s_^xo%m&S z@4eR4TpQ1y{9nhNyBTnwb^vx}|LX&*rLVNHF<^6MKlfkQnf;BFAtsO>eVd+FsA z$&fE+5`>+9dDGs9+R)^ZhZV447!gZ0P^W5*Szhzh+L52qvyRg2MLti_|?9xe?yWi zPY!Ys0JK@Z*?p=v0KQM3<4^sY`i#ziLsT9UMR68X6y-6B|BbFaM$>GP8a~5nV>Q+4;WRo5#-VXlcmmhCgd9APEg69QsAN2D*KDtdz-Z|K1kwB{Sg#KSCSbaRlgf+JByBE z?Q}6|#?5INoEax>(Kp&6HGuv5DXnAKUr*VYk^Lv>q(p!goQsBUX`4MG*M|$Fd|TUj zoF1aX%#6-C+B%8edGjLN%VW$#73b$(KoehRfBBucgb?Dyg;lH*Z8F=px3dhgox036X4@n(Jf?U=QBY zdRsODOT_uY6n8GLOep7H*Kv`wF12DM&4udK8;Q+WbDmF9W|fuiC#NSDZVf9$+$9-v zuMfz{%~V_tYC3%Lil*c}Iz5^v(m(BAxYau+!mkAXn}`{>+lesAZ9;xJCb)0ShXmPM z!!L8QxejW!C*^VHpqH|}DCNgqlumXkQXVFlt2D{ttV7#Yu24INX(v*+#O_yEJ!Hil z)@xGcDpE;PMoMAwp-1y4<@q=b(@f-XFp3+Tzb5qshMwg-`e6-$mY>he@~d~nXy^&2 zeztQ3vFshw@GU7Og~Y?~U5%LdJm@xQ@AcmT!&^MJV3@&hG2#whG51b#&jl4=3A`6j-k%3x7gi0 zeSAFq-2F6}ZixcvAXgVpSHF<>kjMbnc!&~lbYZBLl?9Z zDUS&#%FjwoE{O?AEY6NMj43Ee%r42yF3pX}%u6pyP038nD~T_uEJ!WZE2zB1VUwGm qQks)$SHuZ43*_KpVIc8=nURt40~dp&!UYD=8&b*_8N`d&f#LuwuR&7) literal 0 HcmV?d00001 diff --git a/bun.py b/praktikum/bun.py similarity index 58% rename from bun.py rename to praktikum/bun.py index 5504bc1f4..e4e844322 100644 --- a/bun.py +++ b/praktikum/bun.py @@ -1,9 +1,7 @@ class Bun: - """ - Модель булочки для бургера. - Булочке можно дать название и назначить цену. - """ - + # Модель булочки для бургера. + #Булочке можно дать название и назначить цену. + def __init__(self, name: str, price: float): self.name = name self.price = price diff --git a/burger.py b/praktikum/burger.py similarity index 78% rename from burger.py rename to praktikum/burger.py index 2b3b6a88b..863ca17a7 100644 --- a/burger.py +++ b/praktikum/burger.py @@ -5,13 +5,11 @@ class Burger: - """ - Модель бургера. - Бургер состоит из булочек и ингредиентов (начинка или соус). - Ингредиенты можно перемещать и удалять. - Можно распечать чек с информацией о бургере. - """ - + # Модель бургера. + # Бургер состоит из булочек и ингредиентов (начинка или соус). + # Ингредиенты можно перемещать и удалять. + # Можно распечать чек с информацией о бургере. + def __init__(self): self.bun = None self.ingredients: List[Ingredient] = [] diff --git a/database.py b/praktikum/database.py similarity index 91% rename from database.py rename to praktikum/database.py index 4c75baf71..08cd18182 100644 --- a/database.py +++ b/praktikum/database.py @@ -6,10 +6,8 @@ class Database: - """ - Класс с методами по работе с базой данных. - """ - + # Класс с методами по работе с базой данных. + def __init__(self): self.buns: List[Bun] = [] self.ingredients: List[Ingredient] = [] diff --git a/ingredient.py b/praktikum/ingredient.py similarity index 60% rename from ingredient.py rename to praktikum/ingredient.py index 0e50db8a2..9e9102267 100644 --- a/ingredient.py +++ b/praktikum/ingredient.py @@ -1,10 +1,8 @@ class Ingredient: - """ - Модель ингредиента. - Ингредиент: начинка или соус. - У ингредиента есть тип (начинка или соус), название и цена. - """ - + # Модель ингредиента. + #Ингредиент: начинка или соус. + #У ингредиента есть тип (начинка или соус), название и цена. + def __init__(self, ingredient_type: str, name: str, price: float): self.type = ingredient_type self.name = name diff --git a/praktikum/ingredient_types.py b/praktikum/ingredient_types.py new file mode 100644 index 000000000..df7117902 --- /dev/null +++ b/praktikum/ingredient_types.py @@ -0,0 +1,6 @@ +#Перечисление с типами ингредиентов. +#SAUCE – соус +#FILLING – начинка + +INGREDIENT_TYPE_SAUCE = 'SAUCE' +INGREDIENT_TYPE_FILLING = 'FILLING' 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/__pycache__/conftest.cpython-313-pytest-8.3.5.pyc b/tests/__pycache__/conftest.cpython-313-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f62802a6138a5fe36c174d0768ec3fc6f956c758 GIT binary patch literal 1137 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 b5mi<7Z;JABWm(zvuf$1J9lxufWPbh!PL^&F literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_database.cpython-313-pytest-8.3.5.pyc b/tests/__pycache__/test_database.cpython-313-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48320403603786c53704733770e641d91793ff69 GIT binary patch literal 10031 zcmeHN-ESMm5#QtIk(6|)SUav#TeMPJI@_T|iTa3Zxp8dAvgA00FHB>|#oWgGzvk^Fdi;9dGJ}>6ls%Kn7_iJIoaYUifd^hf>}pGxfL;jD;&Nq=d_u zqUEZ`ds3bOJ1$cs&}NE9@ymaC6A+TVtl%nO9fh)$BrR{uC5{_G1bwe#)p_ayHgd`nt=Ay$n~6F) zDW8+BkaEhI`8BkOUkN-@i}W_tZOay!>2|C-HXVyvPm}hREwfo0S}5RZk1e$t_1iI} z-zk+6jC-wi4?IJ=2OMqZ3GGfMgyOk*B8!(EcWH*9Q!{pGpm=joHkcP4%s0E3H=5pU z7~fmG>2{ZNxCBzx4H^^NW=dV9cNCfoe$(VOeSP?GC z9v03T*}P$D`Ls^)B?plwKFGXi9kYqWSn|w?t0^d;an*#ew{-QpwD69eHm|;^8Q0Z> zCFD_R#-0M=#hWa2a$e8tKPb{u><#yrjbkRNc0E(>vmITWge zS+rurPv#0~EoYpH*E7V*PaH?jHX*SvvE}6Cb7T57(mo*412U*6~X5 zCKNTBGocAtfR~enLCWh$**?{{R#?nspn^rJ&gTlVT29St3pxv_hBl|8n01}Dx<6aU zpQE%uSyY`X&;`v@q4jcFUNa$vLe~*F$b5#Ln`5HW&=i}3MX(%PC&2@}&P{<~cd`*9 z2#PU&Q5<^g_%rqkJGq-)Mf1jQfP6^)6n)_rCzi#B((^Uxa78*?l?Il5Ur5oPMV#MH zBFiS{@68$ zH=vm9Ri?elkpJmbhT^izC$>no?w9>XR~Xs_CS?!BSBK*21w1+?%$GIw1$%k1W*>?^ z2mAhZGm5Lso0f}4+%~HQnsBWelb=lg_AIO#nfp_<=<#y&_$Sj}Qdmj}1y77v^DW&6 zoHP0FX-xhNa|Zn;Cf<+a021(Y2#p~*h@=k*pStOb$bSpTOGpkOIgF$q33@x5C*_Hj zN!exjDH?%I{regeyVCeQkj8|)_dsoLva&Z>-8;G*`9kWciB0#a*t7gzT~=udadBDf z`LuiT57X7|$+9?!6Zm9RLiT|)SreP?3dYxEuFwN<64ZE175Gh>Af!j3+)b_&E@7V_k#<4BL%q8?uRWvPfI_DyXuEfyB~NbJ)s}M zPdy$YyXuGbc(6AQcIbzl$3w@i`k_4@w&@3e_MMj~Lg-te*_@WX9s^LjB0Tm?OsojE z&Lid=ao{L0HXI#xM8Mdhglxp;b<={4;r9msrN$;Wb{&_E6(1th1d?GSBS^*{OD@ox zz%2zIBpO`LKxx4E1^q z7`T?&co-fW5+AU)}-Ew)C){m>a9u#fw?zhk%}}}gJ|ns#pr{aUlRwHmpEIsv|PNM1myQ- zxVVKrbnMDCDOQnUWl=6mv8vPu%)PWlDw13i?RyoY`*?6ol+iB6R4pwRZzloyy)+lM z(7N6KllnqSZsUet3$@+QCUQGlt}zFOcwcvtREqzwmn zvp&HM?RaW9(7CIAXv2Z+$Ai-kJHvslUG+nIUV6HI*m+)(cGVBDBr1te2Qrjc9(vL*I8WMLooe)E zq*!DV@&n9;KoF51*hSVte*G@qP6G0h!o@8V?GD|!T^2_jyQ5`^+Z`=k0deU{MH;O^ zv~{nF5Dl4Pa7`RtzRlSxioq_5E#6K7eCY}ox6uE(-9$|qs7M24F##P|m5u;Y0;CJ1 zA|+~~eXnBl5guF<6Ifr2sajet-cADY5+L1%ew~M$E#$WXpGk$7s9GC2s>;Hux=_e0 z!Y2?a>rmBq7quLI82}+kRp+wQFmu_wo-e2>m2s#JA$c813JBYys_@x{nN6#jY0~WM zA`Dna`aMj5=N%`D1drPI5c#=2VDT*6fIN2L`0{1tsAP9dZHm!E|BM{{ ON8q3^^oRhl>h~{giq{SR literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_ingredient.cpython-313-pytest-8.3.5.pyc b/tests/__pycache__/test_ingredient.cpython-313-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02869b31aa058ff72c3db4ed3a39688b56f5e1e3 GIT binary patch literal 6034 zcmd@YU2GIZc=m4hI=ySVr2+wL!lgiatL>FSi-^={jDnE()8)*CHrZ_Nw)Nn8ch2qw zTVwb$f=@gc9(*vVZ}kmHFldxl-^?!8dd((A5}$ZO&&0$hzuDQptHq`bO$bc(X21XW zzL{_5yO~CNdmKUg`Ap)>PZ5NEr-;{h7ihczz;z@enLCLH=e#2)qIx8WPVhuXGER)d zfD<{{asm^aL_1IqlB2tj%#VOw+DPj(Ckgi{_?E=k@i$A;M9UYnl98h{uL&;Dm;m59 zns7!W5t$>=34YA+))Qs#vG!)1Vsb=|%KTu&8(S83p%GV%w8$}nr&}a!cbw96Bk`X#L3wDdaRMTE)OJzcTMwm#vG{&JdE6D}~(bK=%G=Ac9~A<$Y=1 zu&$W5%^%J0%^TGNl=QiI$GmA>GrtA$cS-XH^OkkVyafg?n76G<$rM1B%x{2s6SQtv z*QCPj1VTA)5x@j$fnOAUjiV6qbu`XVB5m2OOmu{Dpq2OxKjuz3qp-f5$#6%GBUGMB zx#auJ%Vn+M`43A6_O$35q4+N>t9 z^C~xYjOu~MEGz)rupScWv}PzQ+LRPn1n(uD&?6h6hipPi9TA~xit#Xu@i2J1fl*oL zD@Wz#j;}uecRp6y5(zyT+dPfWj=xfwHQ>~*sKnl)d!bxrV3gyuPbUPuRvS|ShR`VtI&Uxx&{k)0sYm9wkPL>g-mVR!K?9m z;?8U5KRa*YzWIHY*jLBya~JnrJ?~=-SOVIdPqPAyGFA#NQj1~X5ayF>xNq5Wpm%<+ zCHB^_``pF7)Mh{ccnN6WfJ?Iij51aVFJiD577k%PxrTeefx5Wc5_g+8H9umBsXBI_ zyEtWvyM2@aOE^V+a7C;D1IB-)7pcv#bO`gwHJoys=&{5e6AzeTPfgqlz=B|j19j{^ zHOhg20t&!Ocz}B2(yRaj2H0VoRW%o>{jg>T^T}W(IQO>HGix}*OHA9$B1}lzddn|E}iPNUIrzY+LU}2jjrt8>!YLo+6 z7*GIS!fEQ6OS1wD7+{BSR@Gdj_QRSX%qRbX(+&9A(ARK3+iGLQ+2It$jw{McIbSVm z0Jka12UWF5cPqd|1wL}38^uCNE0uu|W1FkZ_Aoq#PB1PxM{(?}m!wznyYZop2M zQ&a=UlU3LN6ootoJR;Gqmv;0T*6Apq4?*`SS{4#l#xIW7g>FmeUdG+`+V(HEoqixh zTjLEO7K{DSfrY__2vCDU%o^2~;x_g+bVBbu?41hpGR?M7*p|~oJ4XrzZ0A17ZgFXZ z-kgy^s<^d6)U!t6Y;`6bY;#U=VJN}x(5al@TH-tVxm)n0u Q&;K3k Date: Mon, 25 May 2026 20:01:53 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=8E=D0=BD=D0=B8=D1=82-=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D1=8E=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B0:=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coverage | Bin 53248 -> 53248 bytes .../test_bun.cpython-313-pytest-8.3.5.pyc | Bin 4377 -> 5082 bytes .../test_burger.cpython-313-pytest-8.3.5.pyc | Bin 8795 -> 8693 bytes ...test_database.cpython-313-pytest-8.3.5.pyc | Bin 10031 -> 11710 bytes ...st_ingredient.cpython-313-pytest-8.3.5.pyc | Bin 6034 -> 8118 bytes tests/test_bun.py | 22 ++++++- tests/test_burger.py | 20 +++--- tests/test_database.py | 55 +++++++++++++++-- tests/test_ingredient.py | 57 +++++++++++++++++- 9 files changed, 134 insertions(+), 20 deletions(-) diff --git a/.coverage b/.coverage index c3a8328e04b85e19cbc1086a2153b558361275cb..38fbb04753ebd3b866250a30197e09378a9aa073 100644 GIT binary patch delta 223 zcmZozz}&Eac>})#t191HzBQW#1!nNE*|V`QG%`=#=%+DRz+Z%gm6@R!%n9)4W-?)! zyw1;r)q kmj4<54WKng_@&u^qKs^8V2YU)OtG?nDVEKj=kpo>07f-86aWAK delta 192 zcmZozz}&Eac>})#t1{mszBQW#1!nNEny@i55)beoNn1;`R%vD&%&Ha9bnDZw`RRlh3hGyWU=Z-E9M;g@Cu YiZZgYfhlHIFvY?Grr0)rp3iFl0N!~s?f?J) diff --git a/tests/__pycache__/test_bun.cpython-313-pytest-8.3.5.pyc b/tests/__pycache__/test_bun.cpython-313-pytest-8.3.5.pyc index 7622a7ac8393449bc32fb2aac8a322aacff23750..c10854a75e7a2b701b8697a7ede0bb660175f940 100644 GIT binary patch delta 1079 zcmb7?&1(}u7{+%t`!U(gek5&eo6t0^t!=7?Xf4{-2Js{)ff^M&g??;mrA@f+x+n7yl2%!yDEeT02 zTO$o|W+q8)AA^^A44!FssLleohz=k1hdnm8N$N?ivr=F>=9n-I9*0iLF6ACRho;h2 z*>TJH`ARWgSawzxU9bBJ56)MLsXqz|f5WxOcEPYn;yoRx^SQ8q8@7hZ4bJN~L;!LU zzQ`S<06*muvT};##O-lqlXS}|={R4isOFTMdR0vme@0-Y;~?Y=>~a{Xbl#}de}#a zogioI#_QcjxxIwlxv#j~7k=1+6;Zc_-kI@70k~yuB|gw$Ho$9t;clqn)CECUYoiYj z=q`+@m!D`sn3gAdrQH90i4FZylZ5{p9p+82A(UY*E!sgmNQo^k{4;Jg!e2j#S!5qG zf6Z|(dLT8wh@jiCwW#S9Xg;!FqCD!yb(1?b0LylkOu$>aFS>s#kDgs! XTdb@&8J2->cAqgwM!ySO{BC{$w4v`* delta 584 zcmaiw&1(}u7>9TEV|I2oJDYaJilLgeq-Kp(Bej0eN(Dg>iL@b*LSaqKCRCDbnAsju zFM?nNFP0Yy`XBTb$X_BN$lkrHIS8WQOk+V$&f%Hg`_9WV%%m6I&eDBwPt9utyu5M=Z$~ioO2LfTx<+ zU@QC33S6eiDI2KyV!;zJCG98)<3=}1Etz_3`$-hosm`NLi^+dua*SDUWZsxboz-4H z9NVvti`EY7Hj-Ohj^^|5*}Q!&mqa`Xw|3*OwHQ`FYV}1&LV+;{-DBvcOB_ zli|S6$@3mIiX#tWJfb480$lVfs04j~`s}}wlq`35n!BCo4qJqQKkZUf{H6#T-}4(u C?~pbC diff --git a/tests/__pycache__/test_burger.cpython-313-pytest-8.3.5.pyc b/tests/__pycache__/test_burger.cpython-313-pytest-8.3.5.pyc index c013396e59fd60cf8429395d46f2b98eba82a139..c9c2ba4cac32e43f76b7c5872f403937565e62db 100644 GIT binary patch literal 8693 zcmds-TW=f36@YiSybP%eEjvzpi%iKDD%K8lu`ae7_2M*bAUAHnHB$jJu%*eBN}D2? zS<<&4fZY_0jI=ch!-avOfb-}+<)H!66i)v@f$myVBrH%gK=V+)1v1(KdFnZ{yE98> zW!jCOI*`xK%$}J&yWIKCIkSG)*O!o>48Qrzxml?F0~=lmyOoFYP`M?kk}98+sLYO` zdBq5&r1>z7r0`7WWOP18W2~;6B=d0^Pf5F^VMz_|k<`d^$eD{KmgIEw0X9yhWjp+8 zt#}@e(GyL&q|>6Kg$Oz6)qiO_XOpSshY7Ast zC2*~HI$qf(w{{h}n(KUrl9|NhtzlT47-dj@MyQnnHPD@fXlnZ51qod^HX;(KT zfrj^}d|I_5Ir;c2l2rTdsM}lmT$1upPbEvdnmEGal5^oHSq&{rOogW1Syd&^ek9b( z_6lvUHq5R426UD7wq2#)(-OyFu-LQSv#s!K+o)|q+pGCU{ZIy*#GM3dE8aEK@Kd*+ zKm8}NpN|6j!)hd>ya4x5ji^yImWzzbtQF1g@b1`mhtGI@;t0

fNDt)M0VV$@Qrv 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 b5mi<7Z;JABWm(zvuf$1J9lxufWPbh!PL^&F diff --git a/tests/__pycache__/test_database.cpython-313-pytest-8.3.5.pyc b/tests/__pycache__/test_database.cpython-313-pytest-8.3.5.pyc index 48320403603786c53704733770e641d91793ff69..4bf647a077cffe2b33319f498bb162a2a189a99b 100644 GIT binary patch literal 11710 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 delta 1973 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 HDR=%KLs+0} delta 887 zcmb7>%WD%+7{%|MS8irHN%~0J=_6^SuW4=5NYz>zZA-y|rBFj5i`p2?Bqla#xHE#O zxDdsKf>1vYx^XM66bgcWfVe2?LWD3N#s5GIQV<01O=?A5h_m={?w#|U^9}Rj%)^MU zs_QCZ&)d9~e=ThJ9tf*w>v4j_6-u%mlR!pzDNO4-z2cZ4tw`rvU{(x5j7(ty*U1~~ zg^L}_u+}=qlsF3q>;W74RCP?5xaasLV#$F-9Rd-@1gA*8mdMLC8`Iab+mm?->_7)V@# zyz%wdo`yI6AHiJ*!Ogg~q|BFWge%5={hJK!-(ijQEwjjMS~BrBAr^xfH4J6BugMf$ zu~Z)CIL0xt3D4vp%&HN^m5Ql?1*5*G$CXPociDmqP3J~Ti8ipmMRg7zho527m$Ge( zIz9bErSha{^Q=kcKLN9CL0Ict6ih$7lJCvY03T^&a7os3l1{l~)fI1Zz5K3LW@@fv zTk9FB@qxoBs=`&}WUs5ul*-9^=kfX>vq1|f=akL;Jw5P5nd?8|ShkbQ6|>Yz=d7ZW z%;c=~w4F>9(@9q3Sk!i-(B=snf4^Y=9od!$z3o9Lcy37V$zTN%+D#?~DzM4mZGWjqMm-JJu&?2eio103>CaA8Lo?xKpU z!Mjk{Pvl6|uP92@#}qZ;duRzqU@_b`|9gl_rVAVCYwOl&I>`bsPcj%jix}fQgzli* R`bRXfuLN-93u37C{{S|P