From 43bd0a12eae247f1c73463d9a5697aaf0c077695 Mon Sep 17 00:00:00 2001 From: lubava Date: Thu, 5 Mar 2026 01:41:53 -0800 Subject: [PATCH 1/3] Revert "first commit" This reverts commit 1163c346e88cfc047ef52225816a7c6a433e19e0. --- .DS_Store | Bin 0 -> 6148 bytes README.md | 24 ------------------------ 2 files changed, 24 deletions(-) create mode 100644 .DS_Store delete mode 100644 README.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..61033ae8a2ad3f99755e6ce1bdacca4668f70ba1 GIT binary patch literal 6148 zcmeHKyG{c!5S)b+k!V6k=^vor4^C0|0)7BUkPwQv5JEwB72n0DG5csv2USE9%}VRB z*E_a6#qBKsTYhYAfCYd#-4S0tOwIS*Cw5j5Bhq=sCk}WakPy4k8jvACV* zw@8O|i5jJV6c{UTp38;T|6BSW{r{Mxl@yQyC#8VRR(Go `$ pip install -r requirements.txt` - -**Запуск автотестов и создание HTML-отчета о покрытии** - -> `$ pytest --cov=praktikum --cov-report=html` From 3d1fd2a74e0096d560380a09d9c066b34ba1694d Mon Sep 17 00:00:00 2001 From: lubava Date: Thu, 5 Mar 2026 02:09:19 -0800 Subject: [PATCH 2/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes README.md | 24 ++++ __pycache__/__init__.cpython-313.pyc | Bin 0 -> 140 bytes __init__.py => praktikum/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 149 bytes praktikum/__pycache__/bun.cpython-313.pyc | Bin 0 -> 1075 bytes praktikum/__pycache__/burger.cpython-313.pyc | Bin 0 -> 3232 bytes .../__pycache__/database.cpython-313.pyc | Bin 0 -> 2442 bytes .../__pycache__/ingredient.cpython-313.pyc | Bin 0 -> 1397 bytes .../ingredient_types.cpython-313.pyc | Bin 0 -> 378 bytes bun.py => praktikum/bun.py | 0 burger.py => praktikum/burger.py | 0 database.py => praktikum/database.py | 0 ingredient.py => praktikum/ingredient.py | 0 .../ingredient_types.py | 0 praktikum.py => praktikum/praktikum.py | 0 requirements.txt | 35 ++++++ tests/__init__.py | 0 tests/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 146 bytes .../test_bun.cpython-313-pytest-8.4.1.pyc | Bin 0 -> 7430 bytes .../test_burger.cpython-313-pytest-8.4.1.pyc | Bin 0 -> 18814 bytes ...test_database.cpython-313-pytest-8.4.1.pyc | Bin 0 -> 24405 bytes ...st_ingredient.cpython-313-pytest-8.4.1.pyc | Bin 0 -> 11161 bytes tests/test_bun.py | 43 +++++++ tests/test_burger.py | 112 ++++++++++++++++++ tests/test_database.py | 80 +++++++++++++ tests/test_ingredient.py | 55 +++++++++ 27 files changed, 349 insertions(+) create mode 100644 README.md create mode 100644 __pycache__/__init__.cpython-313.pyc 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 (100%) rename burger.py => praktikum/burger.py (100%) rename database.py => praktikum/database.py (100%) rename ingredient.py => praktikum/ingredient.py (100%) rename ingredient_types.py => praktikum/ingredient_types.py (100%) rename praktikum.py => praktikum/praktikum.py (100%) create mode 100644 requirements.txt create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-313.pyc create mode 100644 tests/__pycache__/test_bun.cpython-313-pytest-8.4.1.pyc create mode 100644 tests/__pycache__/test_burger.cpython-313-pytest-8.4.1.pyc create mode 100644 tests/__pycache__/test_database.cpython-313-pytest-8.4.1.pyc create mode 100644 tests/__pycache__/test_ingredient.cpython-313-pytest-8.4.1.pyc 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/.DS_Store b/.DS_Store index 61033ae8a2ad3f99755e6ce1bdacca4668f70ba1..0b9a44bd2ada453415acdcb4f1a3b8e052beac74 100644 GIT binary patch delta 112 zcmZoMXfc=|&Zs)EP}qWzfq{XQp@boop%_ROrxYjWB<1JlfP@*CKm-tgI6y4GfF!^1 tpd0(d3vrv-IRrQuRW}~|&ODi4M3EDuGy#YiCY$gmZ%zhv>fq{WzVxfpE6OaJ{j1Vlqz);Ch!jQp`&ydHUJF!rGvVjPT zvLHhtLn4DNLjkfRkXHm$mc@|DkjzlBF)EZDq;@km2M-5h+s4B0%#-;=6h%SiD*$l< R5QFSE0K^QN9Yyvt0{}el8Xo`v diff --git a/README.md b/README.md new file mode 100644 index 000000000..272081708 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +## Задание 1: Юнит-тесты + +### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers + +### Реализованные сценарии + +Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` + +Процент покрытия 100% (отчет: `htmlcov/index.html`) + +### Структура проекта + +- `praktikum` - пакет, содержащий код программы +- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. + +### Запуск автотестов + +**Установка зависимостей** + +> `$ pip install -r requirements.txt` + +**Запуск автотестов и создание HTML-отчета о покрытии** + +> `$ pytest --cov=praktikum --cov-report=html` diff --git a/__pycache__/__init__.cpython-313.pyc b/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa47d1ce382e0ed7b9ee331fdf22ac7b0cbb6728 GIT binary patch literal 140 zcmey&%ge<81e<0r$^_AmK?DpiLK&Y~fQ+dO=?t2Tek&P@n1H;`AgNp0`k}?CMaB9# zrAhf^`jPPgMTyBJnaQQO`XPzM+3|+@@$s2?nI-Y@dIgoYIBatBQ%ZAE?TT1|dO>Cv PgBTx~85tRin1L(+Ip81x literal 0 HcmV?d00001 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..fdbb589cf4d49d3ff02a976676a3a0c2c96dc9fc GIT binary patch literal 149 zcmey&%ge<81e<0r$^_AmK?DpiLK&Y~fQ+dO=?t2Tek&P@n1H;`AgNm>`k}?CMaB9# zrAhf^`jPPgMTyBJnaQQO`XPzM+3|+@$vKI|#i_-``tk9Zd6^~g@p=W7w>WHa^HWN5 YQtgUZfrfxADF!hyl$NaiccZ+^K=iSXfvR<4S_bC6i@YE-T9(&hDB(MI=E< zFvQ{#60NMf4pEed$KNp9k!`K)PLG7v_vTn6wodWQ``(-R=9@Ru9~m(SjGedd{WXb@ zA4u|{o&^001Z`3w*NII`VoMY9pu$K~t}1T69_Q0N4}i2ugD}Y^OtvMa*fLXXrJ>ns zqcE=8nn|9jtY{Y++PG{N1=E2Qfa!vj>=HAYMs+At?kC|-ut$-ge{*KluEoED!WZ7<2e@H7eStz6|GBxsoxxbkRWh~3eZq=tEk45z$nQ1+*KcNqq4XZGS|n12Udd8Bz!;UBzlKV z8k8=yW|IKpVM?DRPH<8grF70`Q5^W87q*~Wq;$6BLZC!3%e1+m<-`p8&MqR90kSfs zQS87oQYVg?Ka<2>L}`Z%j>qmW?7aZIOLPZdjr@`oP45}9c4f=%5tu%dk8tYgk~X$= zL>4WcW|wH%z~UaY7~N=B1zJ*d`>cd69BQ{ E56eCsp8x;= 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..29e4e3c9255a7734af802f9d557d526c866dea6b GIT binary patch literal 3232 zcmbVO-EY%Y6u-7($4S#BrIdCBT2m@$$Y@pygYmhQv2|rss9vQGI;@bI%8)wY+To*5 zd`wUn6WRk>rR||ilNfIutQ+HN{0X)K3$iq6(zFNOx-p5@onyyI8$P7%NV)f%bMHC# zcYpWX8$YeB4HJ+XUwxxJ;tBZ!4POE!<>^*Xt`M2X%x==pP)0(X-OcuMlyh}%cc7oA zyhNHwJCOq|MCLcJUNjZPgm~}?8ga%6e5e^F^jvRVhc5hqK1S71P1Vh`H{EN?D<1>< z3K=1kkqKpGhH^4X12We_C@%*_g!Qb&Ig8dPnHZ(=nAk2?B_GCqqcs`r5j0{b0>nckD}& z^}T)8K4smsW}%(w3R_=PY{@=t-M3HMXJGy<`;27WvVL*{tUKU84;gNQ58d~yn-D$= zS#Lpm&yBbtb%K8e=Hd8lYX&FYf%$IMv-asYtTy$0sQsB_-Gvo@grWPA^^1#a7F@IT z1xR-WK|_+Wu-FW2;WBz46K={2!HvKg7F#?xZ6sil%F(qBv3S zSi5{j6mlB%(3~QV8=58qm&C_wlaql*V)Ii3Nh8ptOVx}HQr=Mvj4Na~R@u)Op?II- zj2jhaX&qRuZeWxoQC!Ut4b@a&lSUbg?`VKw0}BqpEcsldi*SCp!o>n4$g9ikW>BsG zmxIt(%OK9Ek|Ab8iFJwim|0p2vm7Cn%c=UPk9`UF7GSSSjgA79{=Ib?OLQ)DyJ6VC zKEy~-Y_`SbqS$7OZPVdLV#3=Nuj!-ei3K|;GO|i!OIZ8=nRIX z7oHZp!qrkaE&o-moEld;HBE;rVLDtcn~QT^*&!LU4H^USNq+G~s|i_BBBaW{3?o-V z^ZXHpiis_DVoNcx!%pmYz!wtlJrdvdSQ4me=Bd8m2?#(Em!gZH{1=KgzO5*cDTNSqybg7pS`;T?BEV{j{TR7t>gdIs--1QenmL}!|5^J1{xP&esQiQZFk$2(t!dr@jfU8Yx74g%BobXQ3QXAfJ+A&Z0fe^MotTMVTa8ki6| zw}D6#f`om1g54%Lj5NVY+a`jZD?Ab0i{-c(2Ey@>SEV9Wnw}c>ij+3PDh_9u)Nu#Q zlR4GlGuh)R_3ATlIIHQU7r_ZqHLYqnlRj6>P7S6l4LghG6?Msn4}ozX8YpXN)wFr- z#MKkU)tl_qn+mHpTdTI*deds{wU+Ok3@#||hRXvN2BrqT<)-_K9UJYAjfIZ43ex7H z^tLU%U66XMww({UAM7jc8n$;07k2Hl-raBQ|HN8);Ma)a--S@@a@~cxsU_2aYvNV0 zD0SOXcR}j0+SbqXSxws>irXKHQFlty^x|u+S6d4!x-Ds))ztG)T>pEt;qu7~C#RYU z(G`}s!o5=z>vkZ%2tNvtN%$xTE6R9wG@n5|q9{l6sZ41kswjsvYM2>KSM@9m2Nh*B zn^qKxe-#wpBf1zHe7Gt8hd7+3n{+vvE79Z+WwI&LJr0^g?|Sq$DvDvI;Ilf5Qiq2j*Yqy8j~p 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..7d8ae93a0059dd17fb2738e028b89ee54e93ea8d GIT binary patch literal 2442 zcmb_dO>7%Q6rNqLcW0eHl{DlBinj#`tR%LOh`1mGp((_PtdO;lqC^_4?QOEeS%=x( zqU6*ffm(soQzQf&0^*R~T0{j18gk5WEgK~osR9Xc$SpL8UU{=?$4zSxsywpZyubPO zy*F>3kGi^I2-Y{Be`W1T2>s55#sWE5N7JxvARXz#6iN$J&^RwniRlQ91bk#lN=Iol z;H4=!txzS6Db~;cI*0V=5Ypu_F$AOPqLRP|Tu2B^nzkGl_Q<$r!xo#g7pYmaOxsO} ztZy>&=Iq4z$%#ysWanlki2i!+jS1HOu=>K}^fc%S;Riw*sS8IJfZ0F`hzdHQqAt*g zE>cO43?UlTr3HCGiGs&VB9HQ2iQ+(~)^&2Ai|GpOSi}jH;q!)Tz;MXR0EzjZ z`9JzMD_1I4H2C>H`L`<{_}l)s{!QS&*ZiOTZLM+{q+9+rSZ)Viw?O_5ynfIE$2z0jb+zb21T(xN|LK<3=?A6mP-gb)tE5JhN=sIonC;yjP~PauS%b&`=hC= zQVkFMhC8pT*VH{cP{9LV^nNHoqW z-o`vqr@pf-rf)O0;+pO~HeI)d3b1kA?2Ott6W`Z5WDo&q0w8c2AH^hsb@w{gj^ zN=Ck9lAt5{k8kFr;S4{=8yW7Wr}z5WwKX3P&_PfVvLZLa?ykA3F{=}Jw5a2jEZelpU{(kzmJ5W?en6qT>fuY_l?k7V1{~`n#BmLH4a9I=YUMrGbO^bD zflH-IhFX~j0Gdwo@rUug0PxKm7=9(J n+pBaG47?AWr+^$r1VOlq`u{*@?xNveQSQDxC}{T(kl^q?@Gbii literal 0 HcmV?d00001 diff --git a/praktikum/__pycache__/ingredient.cpython-313.pyc b/praktikum/__pycache__/ingredient.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4242bed9af9b7f82fd97badc7d21f97f589ac694 GIT binary patch literal 1397 zcmbtUO=uHA6rRoQCYx@Cz5gQfN6dG=QJ>d9L)glB5r4RPad*96ae@QDI*9p+h+xPbU z5Fy`D>5|eBT1gOUBuTCilcb3$O~OkgMv9?~Txct89_}cu90)ZsLzrX|7BVF!n<1u{ z@{DRK@ToK5TVXStCeIWWF(aUbOigGSXeww?p+!5IE;QX7U<1WiCLZVyOGReQ*;dK> zAwj6hH()w{#}D}~-{brKrokKhfPeB=K-~p-k01DJygs4xtv~TQ24Hpnm9Y83>u9{s z8-~Bi5B-<^Dp-B^heLz!`K$gK1O)dD{?!=&zpKnO5sQE3JG>50Av5r7`0JP<<`*RF zUTxH?E?I$6$}d`hy2R{)Rp?Fy8;x_2;cJZptC8HG1819ZhJ$?(l)LV9CPqk+Y)exa zIZ)6u!*Q_)u#6HYuI0=#6_Fn7Vl)FNxSgGLE#_vO%53>X_9=bD@&(T>R2H*O^6mn? zkzHc>1*hwM(`~X)x5E*+duAz`uI|*a|rs9^H%{4JUz(q+jbT07(#L zmRDh=La!D8Q5IFFL8y^w@)*vuG)7nyu#6XfB!>ECxJ?7A=p8mIlM866>LH ze2*_7v&7Jw<&9;orC0)h^CTlWdl6lqN=3tgc6QA7@^el^00L@?|ICgt$3D8>2^CGF;#|p zAsDvTeE@8o{0u3o){M#O<&Sccz)`;`jz;AewWcnq>8;6Q0!K3}sj00|lv5q~1Z7dN q@H+(?C4!7$BwUB~I%#*?<=$gg0Ta>jvMEcFbP^hpQojf=VelKKbbk>5 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..28765cbcd0eeb00138c123df7f47a29b5020328f GIT binary patch literal 378 zcmey&%ge<81e<0r%G?X2AA>kBzzAi0763A)G6XXeF$6OfF$OagF{LwWvXmA9g}E-w zzp(XU0}!`g*m1G(!tM)OFYLXr;+2iyRb=*E7&pA*;V0D!(^bI3;QlMUu@)Z^YroY^m7Lb0<~=bnGU3PUD&{NixsT? z7CTgppC2KczG$)vgE>n4n-QmH-kTm>C%vKQgf}vV7oTkW{$9AbLYe`67dO5eHBb E0CG`}4FCWD literal 0 HcmV?d00001 diff --git a/bun.py b/praktikum/bun.py similarity index 100% rename from bun.py rename to praktikum/bun.py diff --git a/burger.py b/praktikum/burger.py similarity index 100% rename from burger.py rename to praktikum/burger.py diff --git a/database.py b/praktikum/database.py similarity index 100% rename from database.py rename to praktikum/database.py diff --git a/ingredient.py b/praktikum/ingredient.py similarity index 100% rename from ingredient.py rename to praktikum/ingredient.py diff --git a/ingredient_types.py b/praktikum/ingredient_types.py similarity index 100% rename from ingredient_types.py rename to praktikum/ingredient_types.py diff --git a/praktikum.py b/praktikum/praktikum.py similarity index 100% rename from praktikum.py rename to praktikum/praktikum.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..0983bfd90 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,35 @@ +allure-pytest==2.15.3 +allure-python-commons==2.15.3 +attrs==25.4.0 +certifi==2025.11.12 +charset-normalizer==3.4.4 +coverage==7.10.7 +execnet==2.1.2 +h11==0.16.0 +idna==3.11 +iniconfig==2.1.0 +Jinja2==3.1.6 +MarkupSafe==3.0.3 +outcome==1.3.0.post0 +packaging==25.0 +pluggy==1.6.0 +Pygments==2.19.2 +PySocks==1.7.1 +pytest==8.4.1 +pytest-cov==7.0.0 +pytest-html==4.1.1 +pytest-metadata==3.1.1 +pytest-xdist==3.8.0 +python-dotenv==1.2.1 +python-mock==0.0.3 +requests==2.32.5 +selenium==4.39.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +trio==0.32.0 +trio-websocket==0.12.2 +typing_extensions==4.15.0 +urllib3==2.6.1 +webdriver-manager==4.0.2 +websocket-client==1.9.0 +wsproto==1.3.2 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..9aa2f0bfd8960b19ca9561a68b252c5123a3bbe0 GIT binary patch literal 146 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_database.cpython-313-pytest-8.4.1.pyc b/tests/__pycache__/test_database.cpython-313-pytest-8.4.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e70cdea7cf33135ade353b54e20e712df0da39aa GIT binary patch literal 24405 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 AJOBUy literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_ingredient.cpython-313-pytest-8.4.1.pyc b/tests/__pycache__/test_ingredient.cpython-313-pytest-8.4.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dc00080e502d639baee83063ffac30ca6b552dc GIT binary patch literal 11161 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 X&$s+ldhin|^WQ+9-215ngiY>$xU(28 literal 0 HcmV?d00001 diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..d2d4569ac --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,43 @@ +import pytest +from praktikum.bun import Bun + +class TestBun: + + @pytest.mark.parametrize("name, price", [ + ("black bun", 100), + ("white bun", 200), + ("red bun", 300), + ("", 0), + ("Very long bun name with many characters", 999.99) + ]) + def test_bun_initialization(self, name, price): + #Проверка инициализации булочки с разными параметрами + bun = Bun(name, price) + assert bun.get_name() == name + assert bun.get_price() == price + + def test_bun_name_getter(self): + #Проверка получения имени булочки + bun = Bun("test bun", 150) + assert bun.get_name() == "test bun" + + def test_bun_price_getter(self): + #Проверка получения цены булочки + bun = Bun("test bun", 150) + assert bun.get_price() == 150 + + @pytest.mark.parametrize("name, price", [ + (None, 100), + (123, 100), + ("bun", None), + ("bun", "100"), + (None, None), + (123, "456") + ]) + def test_bun_accepts_any_types(self, name, price): + #Проверка, что класс принимает любые типы данных + bun = Bun(name, price) + + assert bun is not None + assert bun.get_name() == name + assert bun.get_price() == price \ No newline at end of file diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..c54e85dd4 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,112 @@ +import pytest +from unittest.mock import Mock, patch +from praktikum.burger import Burger +from praktikum.burger import Burger +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestBurger: + + def setup_method(self): + #Подготовка данных перед каждым тестом + self.burger = Burger() + self.mock_bun = Mock(spec=Bun) + self.mock_bun.get_name.return_value = "mock bun" + self.mock_bun.get_price.return_value = 100 + + self.mock_sauce = Mock(spec=Ingredient) + self.mock_sauce.get_type.return_value = INGREDIENT_TYPE_SAUCE + self.mock_sauce.get_name.return_value = "mock sauce" + self.mock_sauce.get_price.return_value = 50 + + self.mock_filling = Mock(spec=Ingredient) + self.mock_filling.get_type.return_value = INGREDIENT_TYPE_FILLING + self.mock_filling.get_name.return_value = "mock filling" + self.mock_filling.get_price.return_value = 75 + + def test_burger_initialization(self): + #Проверка инициализации пустого бургера + assert self.burger.bun is None + assert len(self.burger.ingredients) == 0 + + def test_set_buns(self): + #Проверка установки булочек + self.burger.set_buns(self.mock_bun) + assert self.burger.bun == self.mock_bun + + def test_add_ingredient(self): + #Проверка добавления ингредиента + self.burger.add_ingredient(self.mock_sauce) + assert len(self.burger.ingredients) == 1 + assert self.burger.ingredients[0] == self.mock_sauce + + def test_remove_ingredient(self): + #Проверка удаления ингредиента + self.burger.add_ingredient(self.mock_sauce) + self.burger.add_ingredient(self.mock_filling) + self.burger.remove_ingredient(0) + + assert len(self.burger.ingredients) == 1 + assert self.burger.ingredients[0] == self.mock_filling + + def test_move_ingredient(self): + #Проверка перемещения ингредиента + self.burger.add_ingredient(self.mock_sauce) + self.burger.add_ingredient(self.mock_filling) + self.burger.move_ingredient(1, 0) + + assert self.burger.ingredients[0] == self.mock_filling + assert self.burger.ingredients[1] == self.mock_sauce + + def test_get_price_with_bun_only(self): + #Проверка расчета цены только с булочкой + self.burger.set_buns(self.mock_bun) + expected_price = self.mock_bun.get_price() * 2 + + assert self.burger.get_price() == expected_price + + def test_get_price_with_ingredients(self): + #Проверка расчета цены с ингредиентами + self.burger.set_buns(self.mock_bun) + self.burger.add_ingredient(self.mock_sauce) + self.burger.add_ingredient(self.mock_filling) + + expected_price = (self.mock_bun.get_price() * 2 + + self.mock_sauce.get_price() + + self.mock_filling.get_price()) + + assert self.burger.get_price() == expected_price + + def test_get_receipt_with_bun_only(self): + #Проверка формирования чека только с булочкой + self.burger.set_buns(self.mock_bun) + + receipt = self.burger.get_receipt() + expected_lines = [ + f"(==== {self.mock_bun.get_name()} ====)", + f"(==== {self.mock_bun.get_name()} ====)", + "", + f"Price: {self.burger.get_price()}" + ] + + assert receipt == "\n".join(expected_lines) + + def test_get_receipt_with_ingredients(self): + #Проверка формирования чека с ингредиентами + self.burger.set_buns(self.mock_bun) + self.burger.add_ingredient(self.mock_sauce) + self.burger.add_ingredient(self.mock_filling) + + receipt = self.burger.get_receipt() + + receipt_lines = [line for line in receipt.split('\n') if line != ""] + expected_order = [ + f"(==== {self.mock_bun.get_name()} ====)", + f"= sauce {self.mock_sauce.get_name()} =", + f"= filling {self.mock_filling.get_name()} =", + f"(==== {self.mock_bun.get_name()} ====)", + f"Price: {self.burger.get_price()}" + ] + assert receipt_lines == expected_order + \ No newline at end of file diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..35ed02b16 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,80 @@ +import pytest +from unittest.mock import Mock, patch, MagicMock +from praktikum.database import Database +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestDatabase: + + def setup_method(self): + #Подготовка данных перед каждым тестом + self.db = Database() + + def test_database_initialization(self): + #Проверка инициализации базы данных + assert hasattr(self.db, 'buns') + assert hasattr(self.db, 'ingredients') + assert len(self.db.buns) > 0 + assert len(self.db.ingredients) > 0 + + def test_available_buns(self): + #Проверка получения списка булочек + buns = self.db.available_buns() + assert isinstance(buns, list) + assert len(buns) == len(self.db.buns) + for bun in buns: + assert isinstance(bun, Bun) + + def test_available_ingredients(self): + #Проверка получения списка ингредиентов + ingredients = self.db.available_ingredients() + assert isinstance(ingredients, list) + assert len(ingredients) == len(self.db.ingredients) + for ingredient in ingredients: + assert isinstance(ingredient, Ingredient) + + def test_available_ingredients_invalid_type(self): + #Проверка получения всех ингредиентов (метод не фильтрует по типу) + ingredients = self.db.available_ingredients() + + # Проверяем, что возвращаются все ингредиенты + assert isinstance(ingredients, list) + assert len(ingredients) == len(self.db.ingredients) + + # Проверяем, что среди ингредиентов есть и соусы, и начинки + has_sauce = False + has_filling = False + + for ingredient in ingredients: + if ingredient.get_type() == INGREDIENT_TYPE_SAUCE: + has_sauce = True + elif ingredient.get_type() == INGREDIENT_TYPE_FILLING: + has_filling = True + + assert has_sauce and has_filling + + @patch('praktikum.database.Database.available_buns') + def test_database_methods_callable(self, mock_available_buns): + #Проверка, что методы базы данных вызываются корректно + mock_available_buns.return_value = ["mock_bun1", "mock_bun2"] + + result = self.db.available_buns() + + mock_available_buns.assert_called_once() + assert result == ["mock_bun1", "mock_bun2"] + + def test_database_data_integrity(self): + #Проверка целостности данных в базе + # Проверяем булочки + for bun in self.db.buns: + assert isinstance(bun.get_name(), str) + assert isinstance(bun.get_price(), (int, float)) + assert bun.get_price() > 0 + + # Проверяем ингредиенты + for ingredient in self.db.ingredients: + assert ingredient.get_type() in [INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING] + assert isinstance(ingredient.get_name(), str) + assert isinstance(ingredient.get_price(), (int, float)) + assert ingredient.get_price() > 0 \ No newline at end of file diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..76ff76816 --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,55 @@ +import pytest +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestIngredient: + + @pytest.mark.parametrize("ingredient_type, name, price", [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100), + (INGREDIENT_TYPE_FILLING, "cutlet", 200), + (INGREDIENT_TYPE_SAUCE, "", 0), + (INGREDIENT_TYPE_FILLING, "Very long ingredient name", 999.99) + ]) + def test_ingredient_initialization(self, ingredient_type, name, price): + #Проверка инициализации ингредиента с разными параметрами + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_type() == ingredient_type + assert ingredient.get_name() == name + assert ingredient.get_price() == price + + def test_ingredient_price_getter(self): + #Проверка получения цены ингредиента + ingredient = Ingredient(INGREDIENT_TYPE_SAUCE, "sauce", 150) + assert ingredient.get_price() == 150 + + def test_ingredient_name_getter(self): + #Проверка получения названия ингредиента + ingredient = Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 200) + assert ingredient.get_name() == "cutlet" + + def test_ingredient_type_getter(self): + #Проверка получения типа ингредиента + ingredient = Ingredient(INGREDIENT_TYPE_SAUCE, "sauce", 150) + assert ingredient.get_type() == INGREDIENT_TYPE_SAUCE + + @pytest.mark.parametrize("ingredient_type, name, price", [ + ("invalid_type", "sauce", 100), + (None, "sauce", 100), + (INGREDIENT_TYPE_SAUCE, None, 100), + (INGREDIENT_TYPE_SAUCE, "sauce", None), + (INGREDIENT_TYPE_SAUCE, "sauce", "100"), + (123, "sauce", 100), + (INGREDIENT_TYPE_SAUCE, 456, 100), + (INGREDIENT_TYPE_SAUCE, "sauce", "not a number") + ]) + def test_ingredient_accepts_any_types(self, ingredient_type, name, price): + #Проверка, что класс принимает любые типы данных + ingredient = Ingredient(ingredient_type, name, price) + + # Проверяем, что объект создался + assert ingredient is not None + + # Проверяем, что значения сохранились + assert ingredient.get_type() == ingredient_type + assert ingredient.get_name() == name + assert ingredient.get_price() == price \ No newline at end of file From 9ee15aad170cec2cb9bbeb34516c0914783362e0 Mon Sep 17 00:00:00 2001 From: lubava Date: Thu, 5 Mar 2026 02:15:03 -0800 Subject: [PATCH 3/3] =?UTF-8?q?=D0=BE=D1=82=D1=87=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coverage | Bin 0 -> 53248 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 149 -> 158 bytes praktikum/__pycache__/bun.cpython-313.pyc | Bin 1075 -> 1083 bytes praktikum/__pycache__/burger.cpython-313.pyc | Bin 3232 -> 3241 bytes .../__pycache__/database.cpython-313.pyc | Bin 2442 -> 2450 bytes .../__pycache__/ingredient.cpython-313.pyc | Bin 1397 -> 1405 bytes .../ingredient_types.cpython-313.pyc | Bin 378 -> 386 bytes tests/__pycache__/__init__.cpython-313.pyc | Bin 146 -> 154 bytes .../test_bun.cpython-313-pytest-8.4.1.pyc | Bin 7430 -> 7438 bytes .../test_burger.cpython-313-pytest-8.4.1.pyc | Bin 18814 -> 18274 bytes ...test_database.cpython-313-pytest-8.4.1.pyc | Bin 24405 -> 23764 bytes ...st_ingredient.cpython-313-pytest-8.4.1.pyc | Bin 11161 -> 10679 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .coverage diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..576a7b9c2750aef80faedb58ddf31ba8a136b194 GIT binary patch literal 53248 zcmeI)&2QUe90zbacI+li;=&kFsir;`Xsfl&A`TN9($;M~3?^-Zf`pLpoaAZiHMTR` z>Dt2t*$|T^@ed%xe}Le`4GxGS7cOYh4j?9>U6?q)0mgyfKWsK9&EI&T zXuK;Gv`;1DgW_3ZuJC#BmC>IHPVUC&7rK?J(*{fsfB*y_u(t&|=L>pyd|bYICA4Zy z9{N_D`|)e>sDyHD=b{) z>E7*tH^e|k>u9JGJI+Vx#hht3C{@T;C`8M*9n0TjYkYGy+95ew$Tz}x1qI>uiYxYD z(@F9f=JRFlbGOceI2Y4)V0GWdUaeS~?M4e`zSz z1yP_2amwUaeLB6wTck{OPZBRv=3Fmj?Ije4ro>U6-L_LB@{4V!B~A{dhz}fk!%_}Q z8+u7$ANkyDaV~r19XOpSxj3V7sNpJlz2vr#czZPnM`w z@{Qn9lRj^mRy*{fWs^?6S*4f4$Ip%E<;h9;`lYC%2p+R$he3BHH&AK1tA|t_v3+>G z5v^pfl89E+Y%*^-YBC}@t?>C|Yuqh7>54>Er<&8si<85uPPYn})$VM*Gp_07 zi3#~?E~-Y!*-GB@fhv@q$t}9kbd$rapzWs}$-_FyG)1qMOxsAZg^Dw$YvqNBVZ}-I zGpotWNJm%o^8WpDCvFj)yhZr56ig7 zf>{->+O_vHQI@ZdNBRzR`r@e!WLd1~W%*6MIk#>#sW)j^wogr#`rvp3U}DFHMLSzH zuN_A9S1d-=Q;a>m{Kf%#%c(u>H52Vl&HJ1e1U3z;V%Q3fq-)vKsuhS{D41e3&uena zjmHK`aXO%5+5wC5@ZhL)tQRBL6fsuTr=mQigNx|qm#ERD?Tcm{$8sCVcqNA6I4br1 zqH&7j#GMEwWK+~A18So8#Y}@HTSbqR#-DGIiHPc0jkvjslhPOQ@+yBITs#_`vO*r( z4rgMQC^J#Tx@-lk?sM8mW9iJ4@~~W-CWJ6X&ORFeBP_Ug-7>Tv1PPJcZSc6}UTF+PIm+~PA>ixtwnlFvH%8F7Ix8}}r7 zV1fVyAOHafKmY;|fB*y_009UbPG>1ZdHW&g$8_jdENt$EX1Lkn z0fjoLQmE0#2}MDUDHKH6evn$*r=J?407o;5bY&;$T}r$l?+ny5ZPyM>lR}95|9WXg zGQKl9#_^Ix#|7BN8p0uX=z1Rwwb2tWV=5P-m56*#GOa`N^sRQs?0^%H7G-$9JN z>woPHwNu_fh%K)Fv!~R~=wpSV%V+ht+EI28qu2M{eJBm4ZU^FDajOZhiBmBkLJj8q0igD=VwHTuB!9 z|25;LWZX0UGX5}rF>V^aKXnB}h9Cd|2tWV=5P$##AOHafKmY;|*it}zB_L;`Zw6#F z8!c&S^rk4$TPCB@7XZ=ye`##X5LgKT2tWV=5P$##AOHafKmY;|fWR&h5cmIa{l802 zCW-+82tWV=5P$##AOHafKmY;|7$PA4{~y=?LvXMf0uX=z1Rwwb2tWV=5P$##Ah1gW F{s&8nl#BoX literal 0 HcmV?d00001 diff --git a/praktikum/__pycache__/__init__.cpython-313.pyc b/praktikum/__pycache__/__init__.cpython-313.pyc index fdbb589cf4d49d3ff02a976676a3a0c2c96dc9fc..6c0fba2f365267552c3a6f8f973464fe16691e9a 100644 GIT binary patch delta 52 zcmbQrIFFJ0GcPX}0}yb!ubjwj%xF8&UQ!~UC_gJTxkNuCu{b;4P`{ukF}ox)yEJ!V Gx*h;%<`1<1 delta 43 xcmbQoIF*t6GcPX}0}yPQy=Wr0F{8;udrAI~#NzCDL;d8O#Ny)A;^K(~dH@7G4J7~o diff --git a/praktikum/__pycache__/bun.cpython-313.pyc b/praktikum/__pycache__/bun.cpython-313.pyc index 26a31b89858f22276f9f0b0de568d3c4af7c701b..089e77f25ccc2a77dad7751f35890a3b57f0e112 100644 GIT binary patch delta 39 tcmdnYv73YYGcPX}0}yb!uiVHzpOMjG@@hs&_JE@NtkmR^&4(Eam;leO3r+w4 delta 31 mcmdnZv6+MWGcPX}0}yPQy=Wu%d`3ot$*UP9H=kk5X956{xd~b=9KP0g@JKj*gpeQlBBs04-ck_LwgPZ`9{2EaJ delta 67 zcmZ1}xj>TpGcPX}0}yPQy=Wu%Y9>u1{m|mnqGJ7=(xm({{mA%$qQvBq%;eHs{gA}s W?07@{b=fvon(sGXT$o3L^jj delta 31 lcmey%^_7eJGcPX}0}yPQy=Wu1JQJh&WNjwN%|1+q%m9`K2s;1( diff --git a/praktikum/__pycache__/ingredient_types.cpython-313.pyc b/praktikum/__pycache__/ingredient_types.cpython-313.pyc index 28765cbcd0eeb00138c123df7f47a29b5020328f..5421e92c79492bc6278024baf603087750edbcdf 100644 GIT binary patch delta 57 zcmeyx)WppFnU|M~0SGwVS5D;qqv)z1TAW%`te;bwlwYPF86QxTm|T*XT$-yNP?VpQ Lnp`qjfiVgI|40(n delta 49 zcmZo-{>8-onU|M~0SGqDUNn*WkEE@BXmM&$v3^czQhu3!WPCtTVsc4la%t{l4aO({ DkTej! diff --git a/tests/__pycache__/__init__.cpython-313.pyc b/tests/__pycache__/__init__.cpython-313.pyc index 9aa2f0bfd8960b19ca9561a68b252c5123a3bbe0..16d43006a981e223fc556eb021284c2cdd2f460a 100644 GIT binary patch delta 35 pcmbQlIE#_{GcPX}0}yb!ubjwj%xF2$UXneaC_gJTxnyFvH2{+82|WM+ delta 27 hcmbQmIEj(_GcPX}0}!m5zi1-2F{9x`d&!9jRsdo92T=e3 diff --git a/tests/__pycache__/test_bun.cpython-313-pytest-8.4.1.pyc b/tests/__pycache__/test_bun.cpython-313-pytest-8.4.1.pyc index acac61c07c51ea90db78a9a38a103e073587ebc9..60743242bd2242af7e9502b6ac2d3f636fecff0e 100644 GIT binary patch delta 59 zcmZp(>a*hh%*)Hg00f-wD>ri2awuBrhZd(673=4eCgqpuN5%&fB_@|-CYR>w2NdOJ Nr6!kbUdWLu0ssqc6F~p~ delta 51 zcmeCPYO~`0%*)Hg00gxw7j5LO<&ZSg4=qkDD%Q^_P0BCRkBko}N=z=vOfJpcypkhT F1OS;Y5dr`J diff --git a/tests/__pycache__/test_burger.cpython-313-pytest-8.4.1.pyc b/tests/__pycache__/test_burger.cpython-313-pytest-8.4.1.pyc index 26d4f1223aa864f372ba98c609963c8af1d55992..3bc0f89701727c5b6ceb816ecf95b641b15e391e 100644 GIT binary patch delta 222 zcmex2iSbb%Bj0CUUM>b8;B;S^sUWnGPnwa75yS_A&jFK-8GSi|d5ZYbc{TYqFJZK2 zRe*3T(T$}iK8j1MSEOfJbxF3r^sD9X=DO)lB|hvl>#W98&~rd}dKV$-!J zYF`)9yeOo3SxCEs{ehO@W(^m8MoCSUA|ap^MZzFL5=4jt2|rE#$wBVvlMlNaF`7*N z=5ECLRYrhSf3myBBdKnXA~_Ht4J2-H*yQG?l;)(`6-}G$?5V?_#>lAui2+1{6#)R` CCp>Hb delta 578 zcmaFV$M|m&Bj0CUUM>b8;9I#U(^7OJpEM&EGl&lapK~S~Gy1B;@F_6_^O!P11cP~{ z7)&8dh9dr8z9NBieocYR9gOzOk|z40#i>Qb`Z=XZ`DOZ%@c~7N$t9V|rMa75u$;DI zte$+z)NArTXF=8vLJZnQn}uBT83U^n3yKo6OER-dbM=x+i_%kz^qe46dTL30K~ZLM zYBCelJ`e?R90-5j03@a|1T%&*<^Wj`5Xun5G?|fEn2~j|gSqHr2~`C~Fn{uXb7?jO zhET>J?#UbNrRo(J(it?F{EGO2+BDgUM1fS15Qy*t5yBv%5=h(TBAa!RoskZ54|z{a4i)xmd#L;1$!24PXf2OK>8+@0LlIpi;L$Y0@5yul%M zokQ~?hvrod?IJm#mdTE;5{!bAqg>P3i&%jCqRz?tTumAMCVz1?lK&(l&Z_^>gn^Cw y0=M2}Ad`uWRp&D^1DnBT5Noow+atyallj~w7-vsbch})BXJpj*!~i0}W&;2ntDGnR diff --git a/tests/__pycache__/test_database.cpython-313-pytest-8.4.1.pyc b/tests/__pycache__/test_database.cpython-313-pytest-8.4.1.pyc index e70cdea7cf33135ade353b54e20e712df0da39aa..ab2f5b80fbb6c9353fdefc7ab8d8daccd564a01c 100644 GIT binary patch delta 1375 zcmd5*OK($G5I%G5_`ZCvZIT zoNs2n`Q;Wo_zBEshM_T9YUbO@cg7E96j~?fc!up}4shm392^gqA`C|%lHRSp%eb5b z*Ml*xL|C%1Wsb(x2y=9VM>)DA(pcD9xAlmTKiE3Yp;p81S$tU{PAxHIyjS z%1$k@|KQ%)FA^V5jX9<1`O5Uc1Bo$b_S5q8JT6EX(8NROO9>cWl2>`FzV7er{k)8=;Vgw8ASP z%(o2D%F<8;5{blV2;&C?Q?;%4w<6aDn-dkdDYpb$)XGP4Y(g88<~ zpkU{kMbeG^Z)*}5RJ}OY--&^46`v<+shHVO#&p)n8ZdXZ?-MuL{{*na)sF7}1F{gts#>)bfYLt;`V6a4e2z=y7-@w_Rt9=*7=?zr z#Gc_DK=D2wdj;2W6WlYr0Y4jeXSe}VHuFMOtryrj7;?gJ_3mU#a!*Qkl_nmibv4^ delta 2138 zcmdT_TTEO<7(V~mvzN1XC|fS2^gv8tWuXweEQkm#rCToD&>bYAp}GSi3CDABGPkEP(_Rd zLP+j4mk7k<1@0vXL@p4#nWYf25Hng>i6vwkvAS(^84h{ErKn}MSyY?Ru4xMjTVru; zNnz_O&La42hDDUq{geFz{S(9V1E_x<++z3)_qoLqXsoh?b`4jn=n>)G5w^)TwFT|E z!nQE#G>ft|9xlQ@V{6(1+fdLxeHwag1l(fCfYFlT(106~(!}tUOA|bIC0RosLOwkv zo&k$`NqkuZ1N~kq2BW$rmS;9aw8MBDO!QS_olEXAoB(3(_MQ;E68hsH7CLUKpyOo{ zb?6jzCxOrHbvIcvGiT4|`jlShrjM(lK5ZpHYLxob~2$G-^IV`zX;z$xO?HNg1r zh{5d)pTxx2Erf+b#^FiB7DLct+8m1^OmUQV5PQChDQpEl-N{_c4z%<)>+29u!?r~c z9IE7;*JJWGT+1$FmkCiYb^CXrAk(`g=P7$EsFR5f*A?^&KO&MdNU!9U!)~p4M?01` z0A{*eQcRmlFWM}XrZiMCu@W1-n9rg5IR62yK2o_IOQGX#nf}ybqn&P#&Q2VeGu=UO zq@z?d%WoC7b{R%RKb&h91dE^uX*e1WgkuZQiEFdkJQfcJW=X+1+``372Cfxt7GX-H z_3N~!a0tQJD!dPHSdA2w{Xf8%+7CwSKLUf-j+*H+tQZ6=(~qGVj27~7ag>W%F6vMO zLQkRmME&yd2tbi~)pPtm1}v9%hJ@3EQ;(f7LhPd!Y{I0s0qZ5NrXJ-pHPw12$s*Z1 zHR;INQ)Q4%i+pwZLnMc|_Sk&tI|VL!-`DOs>=p4(aa0NE`pqJ_B#(C1woYLN;}5X_ z^TStBy}uv#7a&{3;)`-tdj#G}8QVYu&V|T#n=GnmZ=h{lyMeqqjRlK3PKgQRzhYEu zX|wJ}-;uge`y)W9`u>wQr70P+Z61-`=J4PF*?JUho*%3Hbv~zygLp&1zgXaGg4`3) z7BR7z4A&D^ zKhDNojztl|>snC}h$8wyA^sRA0LhP@OUQ;Z(6&)!YFX?_^+KZoAEBRr3?H zzLPV3Ce?eL+o`&?Q~f(x(7VChvj%r|xaokaQIN!=X{N%*l>^HkSx)MEp2^ki%VJUb zZSY;BvX{s^BDAQ^XJZoB=~oxL#-y>YZ)j|g{(hnNSOXq3C)|^&QI@x0Zc!f^)=D{4j+3Rt%0aT_0E<-u!`zNPF7Z?Bl diff --git a/tests/__pycache__/test_ingredient.cpython-313-pytest-8.4.1.pyc b/tests/__pycache__/test_ingredient.cpython-313-pytest-8.4.1.pyc index 8dc00080e502d639baee83063ffac30ca6b552dc..04df9e6b25b55de7b978483387cfb9fd31e52190 100644 GIT binary patch delta 894 zcmaJnD_@UF`Nl5hB!Ky=!l7viP6CXWx&C~*P{}R4d3M6H{bXD{CMB@Zewv9t$oWf z1YY{gW@CKadLR46ho?eS@Bjr*MDV1lOs}=r)p@Ip`*)#ORZ&9Om8u$sP~lxg6}8~3 zqv1;9azQ-gU^pcdI&@D*GbMNiS{%b@b2JZa?svDr2==hF6IiJjMJKR|Vy`Pxw^|G{3U-B~R)>t5|zqt;yg8sfU{4Kz66=fzzS1X4o{(CBvP z0CYMl&C#BsQ+n812PF5Zh^NJue)%K+6ZMvj$jjdW)o{!R!+Di|zHWf3I zakXr)qE=b&u1Li}ms<$wIeOlgpyE)LcRhL;kbjslIj{(07)?rMOI+kqcDW;IRh}Fp zX$O*rb2=BXyJ~F>|Ivz6=oqaYaz-f9^S_4G9*e@ye#R|z{MxC904Mz~r!R>Rp~>7N k-OYK*8*bQ|;P2&<0E?uJF2fSt9L-u2F#bc};7u^#Hw=lrrvLx| delta 1383 zcma)6-)qxQ6wXP~E=ilV=~`#2&dgu4=q6|@Dh?45k>UJtEvqn`Zj&;EI^+7LxK-T1 zp+gTM3L^L*2tHJ^VRf7P2Sjcj#fQx&9|dLjs3++h(`~RoZ|;wCzVACX-|1WSxLyCL z>zY7M|BL6n*YE4jS^)&%q0k{%zywQVU`b50jRn%uE;%Dsb67AbWaiT?jp<3j3a}83K^CS_uhR4^Ps1Y2An2$^rLbBS z^{8rDEG@A(ovc|nsUuQlfpqO6(hy5n;e0fe#94?p7gHpLKj-7lpi^>2Og_dZoKcg% z=M%h4dxN}e9xvprOFg}p3jOvR%!sPe0tH_S^yTq;eI33KLn!(Vf{KTHzd*y^;%Vfj zisz&zdIxFehTN_%N`YKA9`?;a(94R%RGd-v(~2@~E@b4DlwQ2- z%6#Sw@DKbAi5(z;Ws_I<6t6f#^e&U$3V%zQ-BqP}WK-NYRaBvI$|+HXGicIYnF6Pr z5kBb#PE(G%HA%3g`B~*9;DGu_YlfpAX9NIhC$Kq@P4r zaW=1}wBnIvMNX6E3FnqG?5ZHSqb6x|1<`H01uRjC{gJ!ShG2Y#xc$YL7B4QPYF#B2 z;k(top|Q%n0_Ce%fhd#l$B?wg;;m9vt5(;S&TFZ_>MJV|KHca_mFbBlqB)SL_%~7k z*IwhSk+6;A4gkQGb(y%B^{0VJxua<@BU1!DOh#h^f{YjI$ux=@V!mdv$u9_n8n@Yy ztv^o5PuF+Gm8?d|YVQ6r$%i*($%)2>)7U4gI8v))*)(Y$3{!(P%N|~U1(}Xd>s`EW z_1*J$q1=NN@WLLR>-BdVJ+Ftu%VK33{$fRPxB`~pVO2Yzs*UE+lfaCnki9_P#!s$$ zl802Z*iM)9e{1YConbQkheeG{PA7MJ9YbC(yKXnhm-qN<>V$EVqUp<3{{dXDkUgE- z_UPskz!p2Y^@Io!ywJGUU(?yybEO-xv8a9|;vwO)yvGi0uLH>8wp2HC;hmJJ?}1%E K1RAW}6!QnaF8cHU