From e3719c7f29a3f5818ad776e2c4b2c973ae8c6026 Mon Sep 17 00:00:00 2001 From: alekseimakhalin Date: Wed, 17 Jun 2026 16:57:15 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D0=B5=20=D1=8E?= =?UTF-8?q?=D0=BD=D0=B8=D1=82-=D1=82=D0=B5=D1=81=D1=82=D1=8B=20(17=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2)=20=D0=B4=D0=BB=D1=8F=20Bo?= =?UTF-8?q?oksCollector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 147 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 131 insertions(+), 16 deletions(-) diff --git a/tests.py b/tests.py index 383385e..64f132c 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,139 @@ +import pytest from main import BooksCollector -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test + class TestBooksCollector: - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector + + def test_add_new_book_with_max_length(self): + collector = BooksCollector() + collector.add_new_book("Книга с очень длинным названием, которое точно длиннее сорока символов") + assert len(collector.books_genre) == 0 + + + def test_add_new_book_success(self): + collector = BooksCollector() + collector.add_new_book("Гарри Поттер") + assert "Гарри Поттер" in collector.books_genre + assert collector.books_genre["Гарри Поттер"] == "" + + + def test_add_new_book_duplicate(self): + collector = BooksCollector() + collector.add_new_book("Властелин Колец") + collector.add_new_book("Властелин Колец") + assert len(collector.books_genre) == 1 + + + def test_set_book_genre_success(self): + collector = BooksCollector() + collector.add_new_book("Шерлок Холмс") + collector.set_book_genre("Шерлок Холмс", "Детективы") + assert collector.get_book_genre("Шерлок Холмс") == "Детективы" + + + def test_set_book_genre_for_nonexistent_book(self): + collector = BooksCollector() + collector.set_book_genre("Несуществующая книга", "Фантастика") + assert collector.get_book_genre("Несуществующая книга") is None + + + def test_set_book_genre_with_age_rating(self): + collector = BooksCollector() + collector.add_new_book("Оно") + collector.set_book_genre("Оно", "Ужасы") + assert collector.get_book_genre("Оно") == "Ужасы" + + + @pytest.mark.parametrize("genre, expected_books", [ + ("Фантастика", ["Дюна"]), + ("Комедии", []), + ("Детективы", ["Шерлок Холмс"]) + ]) + def test_get_books_with_specific_genre(self, genre, expected_books): + collector = BooksCollector() + collector.add_new_book("Дюна") + collector.set_book_genre("Дюна", "Фантастика") + collector.add_new_book("Шерлок Холмс") + collector.set_book_genre("Шерлок Холмс", "Детективы") + assert collector.get_books_with_specific_genre(genre) == expected_books + + + def test_get_books_for_children(self): + collector = BooksCollector() + collector.add_new_book("Мой сосед Тоторо") + collector.set_book_genre("Мой сосед Тоторо", "Мультфильмы") + collector.add_new_book("Оно") + collector.set_book_genre("Оно", "Ужасы") + collector.add_new_book("Кошмары") + collector.set_book_genre("Кошмары", "Детективы") + + children_books = collector.get_books_for_children() + assert "Мой сосед Тоторо" in children_books + assert "Оно" not in children_books + assert "Кошмары" not in children_books + + + def test_add_book_in_favorites_success(self): + collector = BooksCollector() + collector.add_new_book("Три товарища") + collector.add_book_in_favorites("Три товарища") + assert "Три товарища" in collector.get_list_of_favorites_books() + + + def test_add_book_in_favorites_not_in_books(self): + collector = BooksCollector() + collector.add_book_in_favorites("Отсутствующая книга") + assert "Отсутствующая книга" not in collector.get_list_of_favorites_books() + + + def test_delete_book_from_favorites(self): + collector = BooksCollector() + collector.add_new_book("1984") + collector.add_book_in_favorites("1984") + collector.delete_book_from_favorites("1984") + assert "1984" not in collector.get_list_of_favorites_books() + + + def test_delete_book_from_favorites_nonexistent(self): collector = BooksCollector() + collector.add_new_book("Собачье сердце") + collector.add_book_in_favorites("Собачье сердце") + collector.delete_book_from_favorites("Отсутствующая книга") + assert "Собачье сердце" in collector.get_list_of_favorites_books() - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + + def test_get_books_genre(self): + collector = BooksCollector() + collector.add_new_book("Мастер и Маргарита") + collector.set_book_genre("Мастер и Маргарита", "Фантастика") + collector.add_new_book("12 стульев") + collector.set_book_genre("12 стульев", "Комедии") + + books_genre = collector.get_books_genre() + assert books_genre["Мастер и Маргарита"] == "Фантастика" + assert books_genre["12 стульев"] == "Комедии" + assert len(books_genre) == 2 + + + def test_get_book_genre_nonexistent(self): + collector = BooksCollector() + assert collector.get_book_genre("Неизвестная книга") is None - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + + def test_get_list_of_favorites_books_empty(self): + collector = BooksCollector() + assert collector.get_list_of_favorites_books() == [] - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + + def test_add_new_book_exactly_40_chars(self): + collector = BooksCollector() + name = "A" * 40 + collector.add_new_book(name) + assert name in collector.books_genre + + + def test_add_new_book_empty_name(self): + collector = BooksCollector() + collector.add_new_book("") + assert len(collector.books_genre) == 0 \ No newline at end of file From 278ac1771da2de8fe2f90119986087cb7a43ce16 Mon Sep 17 00:00:00 2001 From: alekseimakhalin Date: Fri, 19 Jun 2026 15:56:41 +0300 Subject: [PATCH 2/6] =?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=82=D0=B5=D1=81=D1=82=D1=8B:=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D1=83=D1=80=D0=B0,=20=D1=83=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D1=88=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conftest.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 conftest.py diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..a9a7390 --- /dev/null +++ b/conftest.py @@ -0,0 +1,8 @@ +import pytest +from main import BooksCollector + + +@pytest.fixture +def collector(): + """Фикстура для создания экземпляра BooksCollector""" + return BooksCollector() \ No newline at end of file From 1a3a9d5e329eb4a7ab0e1044de26589eb774e889 Mon Sep 17 00:00:00 2001 From: alekseimakhalin Date: Fri, 19 Jun 2026 16:12:47 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BA=D1=8D=D1=88=D0=B0=20?= =?UTF-8?q?Python=20=D0=B8=D0=B7=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/main.cpython-38.pyc | Bin 2030 -> 0 bytes __pycache__/test.cpython-38-pytest-7.1.2.pyc | Bin 8183 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/main.cpython-38.pyc delete mode 100644 __pycache__/test.cpython-38-pytest-7.1.2.pyc diff --git a/__pycache__/main.cpython-38.pyc b/__pycache__/main.cpython-38.pyc deleted file mode 100644 index 5786eeb8eea4dc1762353e0d9309eb8d1407edbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2030 zcmb7FO>Y}F5GA=Qc`dI$>NrlLq-jwYMHQgYy$FmT3DBD^PA)W9_a&t`k^T zpOPOEAN7~^nq1OrZ#{J$SBj*y9H1099CC-`n>RDm%kAw3qxSjlt5^3o82g0Da`R~N zgu2})@dr~(@ekDBi!M{*gtfdrt*&*HfPIY4lZ1)oHA$ z4HeK>SDUIq7jh68o5}G-cA6$~Y|_^Rs2%sB;-B@R_4r zWG>|I#aSJ*WwcYTV~}%Swn(%*2ib(A7d6vMhMJau-0WbfUdE^Dz^>Jq13!!3HrdX6 zX!6N}iVqdzn`s7$g&QZ#AP5FH4Q{xGf_Pp=ffBJUhSxDvOjj_}Xx~>VpVDN=E*)j& zIOiEh?KmQj9X4^rp0mH2e~L@*($D>zp9%AGEcf~n-LpmWx;b>z;C#qE|Nxns&x=o~kmG7eLRNArbM}w$8Bi2Qsy9I;!3aVl$mmbVLTYtbISzGYR zxX%yxJ`Z>(Ccjl8^zAdQl{b>zL3v#T{i%{X|CdX#IF2p3-(D zTq~9N%M3wTnG^_Ara0RmjYbLz)hl;Z>XK<55-?&Ab8`n`U3T3@={e$~M1Fmqj>z1? zZN@|1;FF^Y^0k|8hVLF0_n1(j9=iN;Ps}o8;eb*p>NtI?*J5odJ<^#j;SNk1F91IT zV0g*^w^f0A^S=KRbVua6px;B#M-jcy>0klL!L)4vn^o(>3aoEz>$F0=>v&eBEE-bA zsX8A)52bu_-W!!)%qAUgb|DTRZbN(zaTfx-oBI$yKrCv?X?T(ik{sRr^9CZQxt||2 c0zaq+HTS(k84sIv2Nc2M6525={-MtP1Ay7ZO8@`> diff --git a/__pycache__/test.cpython-38-pytest-7.1.2.pyc b/__pycache__/test.cpython-38-pytest-7.1.2.pyc deleted file mode 100644 index b2898a8a207c1ae4014c5ac436acbbfebcdd6cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8183 zcmeHMOK==l744o+ch6{KJB}0bBbh(~9!O-%mVY4*`I1niTojN+R4KZ~>XALkXhyv5 ziDT1KC0qFcDaRGENTm!&SpeFA2vV%rv9e)J_3WrFc2KD@D;8ms1;shHd%m8rrN9!| z^ZwnhKlh$UXu39& znoR4QNmPs(bJEncCp9POq+ZsX)O=#na`f+Oh4d91tsN=o;g&~hwHMsSYL!Z9%B!g< zj(7hh(0Ld?_c;_L*=sW4=uYBgZ8901cQWOq9RvNeV>%XU!^t>V)TT4yWpw2lr;hJs^xBsBzdVSZUW82nW1`Ylm!_WOE3QwEY8oIA9 z=#IXq>zcF@QS13cBjG17pY)P`a$awwoMa>Ir~LE_iH6}D?q9srLfT3B#5RTh)YPIA(jrPr1U!&gyNhU<)fuY2zxS#!*tI;yS&k zJJxyQX02iJDfwnuN89qUST*8Xi~78N2JbVaH4^wG@k`-nG}4ZSXEbu8{vhr<_<6A2 zoC{V^o^GCLzL5{s^1;U#Sq)a2^T8ibe}LK5;Bv4Qtjg?#U_JNTXY$QgP`!r9GttE9ylkghvoIQD<;AVduH}Z$`Z0#<%J6Z2*O`#D_?QIRA5f6c3_SfzHfSh1_cnNpas-QskKX9%}EA{SS#Ri99* zrotQT>6)4;dUolh*-EjB=TNIIWx|wOs!S`oK{&$AqFdV2-I?g_?Ch2tjt~T0b ze7vW(cS%!U!5*JIu1E9MGva$soH$R-iccDat&7KB!0&(?Dd0xhAzq|?1Gr)Oru$cT zYT8NqCU6620{kFuq}!-a!F+@pFVgd4+yFwhSDfVv!HsvgBE}6v+5_-H#tq)^H(>p z*v{fc6iZokC);AfDY}8Wi~T%{yIFjR#g|#!!{S~Rw8p6TDq3M-uo1X8n;4f^nOB}E zxm&Q@y#ocUETs>zvj;b9X9KqAu{hoq?_XHzcX%*^EiSS%Fcg_7(ZfuC@{$W+D`BP- z87sE1^nxMG^c?0*v7c$Q#FD@}X=%fLU}>$DugXf;xH>1ZXpzIDO-AC;WF+%^S{R9z z)nX)A?n1VQky@4oHiGYrI9X?8F+tWHelO>A_g$Rl8h3*gV^|^gb52(W<(eWU9dJij z9o;?d1goR_|DWBJ_)6|b{Z_ob?+T{D@_!#(X#R{|a{&ap8hoe3s!8WgTXpP5%`?{#@V8M-C=j+&KDXm6Ok;L{W=s``Sh*SU~vlz-nk+qtJ_)7ZNjZ?%*OG7OPP-UDqdtasf>#o zcaIzppPm%5in!)b;&Z!?H_FAa2epcke?HJ2xn#MIbK; zfox0U+G9qGRGu8>?3>(uxZnRBS2Wn~7obX=MC><7a!rf@z3Mao>R(r#3I>Qe?dOm# zmHHOWWRd68d0~>sTOyU(t4bpbxV9?o!hl$j{)<2toCmXf1V(^1{5V*mlN-9> z|LqQuka~bGQG`buk*{quim}tccYknm@4ix+j$b{Y=X$UHJOA~o@9fv}<_Ym_rSUd8 zt$6r(s9PvpAWIba`l*}-&Q80&lW>w=Vj(Fy;sIiervVurN6TOf>LAHB@kDB%h18KQ zHGCk3lM=OHc*GFPhca!)tU5GjJ8q3**7TA3L%23-PdNXjJfQ-Oi_OyrIVHrT?gYht zm`BvQ29+tH=4GPBMNUAauAZvIp&J-L!Z)yFM6hVY1Uu0hLL(j;Ov8*Nhfwi;p<;;# z3la6IUAXv35bgwv{c1P5g^a9-FsDPFf<6Nnv|vVrd4Ol?3flH|clIe}bVT}2N)#E# zWxM-vD&omLGPl`}c@h|P6;Bc(T`F+!B!Vo4SS+7rh&7ZAH@QcTZRW5QwZEv~dxomu z4jUpnlaz=ImL{1T*lrh3wly;JG9o44Ky5myhUJ^Sg~%-9XP^x&Dqm!CGKkF#&WLh0 zJ#)bli$90?j0YQ5@1ljAOO&y3toDlcxk7mLBd&;fmFLaU_N9hmmKv5XwHepQ-Z+`_ zCX{rR+St!Zj5gwpU{%f^>GBiibQqr*jM4DRG_02PB$frg1Z~1K$fy_K5bMH_%)f}o zfHl`;`qCAKT=fYa@*aF@oj$|h4y_feScQj?TYn-fyUavT%*hA?gEf`Hfudv!`l)#; z(L*g4LZc&FC3!O-uXEkx&55#i+;(S6Q|0OMRBWC|<;0q~FQWrr?Zl068Ic1tqmJ%X zThXN(9+GJCR8Kw!UO&lv&O~7}^3EMRmWDrhXUmdZd(b6C+ip-hKvQ?3SA)^3Jsw8& zp8hzN!XR?y2))L~dwRPivhDHqef{2kn=n(~^+%3Qyl@#Hw*uRogtrtQ^zTRq8`|qp zBIW*JEHv=kJ-*C0K_Mo-oV%tk({~ZgUggOgN1T{!Af82TB@GWw)05%#rVmer2V1`7 zehN=9kX5lHCyVhoC)@JhmoXpt?^(23{>z+fYsIg*Li~4`D`NjOrF{+mjdQXY$;oEK zZ?m!AW{3E#1^kI~vU~}_FQ9-|qBQI}H1Kkinr)uVBWz^07Ti{EaABN;0l~q!p_*d} zjC3qhxN9-#Nm_RW>^Ik(7pLZAl<%FxQI{oQ1FnRFUk=vq58lW0szj(VAYz=rAu{_i zvOV*h?6^FF*OPR_0e=1Y^0gI&Wz@&h#TRR;46~I0%^jG!?Kpa0f~ebf!<(2bWE$8m zS39Q-Z>Pl$*==*KJkoJx^$1>#dX&ZHlTkaxNe5nSZ^rWpoZn@3tL3uU;TfrK40G5G z?9=1EbltZ5eu7R*CU!oX4ER{mo09r7q#l!={8-YRl4^Y{`5~pCd@SK-lR-((IT4He zSi;XHy-CkVWM=#U$9EJ4zfiYItW*pMy=_dyu?Miewiw(@Z-7;cPl z`h;&yeXG54gG8ae$RqlKOv#OlOUqF}_vks7CD*#$(sEa_~ zi_lR3)>Zk`28*JsTBT|6iyDEr`R0a=Y)h9~p`}gU=9DTWFHU1mtJ+Kl`#y&iehsJW zx5DVd% Date: Sat, 20 Jun 2026 14:51:50 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE:=20=D0=B2=D1=81=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83?= =?UTF-8?q?=D1=8E=D1=82=20=D1=84=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80=D1=83?= =?UTF-8?q?=20collector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 74 +++++++++++++++----------------------------------------- 1 file changed, 20 insertions(+), 54 deletions(-) diff --git a/tests.py b/tests.py index 64f132c..9707ca5 100644 --- a/tests.py +++ b/tests.py @@ -4,63 +4,47 @@ class TestBooksCollector: - - def test_add_new_book_with_max_length(self): - collector = BooksCollector() + def test_add_new_book_with_max_length(self, collector): collector.add_new_book("Книга с очень длинным названием, которое точно длиннее сорока символов") assert len(collector.books_genre) == 0 - - - def test_add_new_book_success(self): - collector = BooksCollector() + + def test_add_new_book_success(self, collector): collector.add_new_book("Гарри Поттер") assert "Гарри Поттер" in collector.books_genre assert collector.books_genre["Гарри Поттер"] == "" - - - def test_add_new_book_duplicate(self): - collector = BooksCollector() + + def test_add_new_book_duplicate(self, collector): collector.add_new_book("Властелин Колец") collector.add_new_book("Властелин Колец") assert len(collector.books_genre) == 1 - - def test_set_book_genre_success(self): - collector = BooksCollector() + def test_set_book_genre_success(self, collector): collector.add_new_book("Шерлок Холмс") collector.set_book_genre("Шерлок Холмс", "Детективы") assert collector.get_book_genre("Шерлок Холмс") == "Детективы" - - def test_set_book_genre_for_nonexistent_book(self): - collector = BooksCollector() + def test_set_book_genre_for_nonexistent_book(self, collector): collector.set_book_genre("Несуществующая книга", "Фантастика") assert collector.get_book_genre("Несуществующая книга") is None - - def test_set_book_genre_with_age_rating(self): - collector = BooksCollector() + def test_set_book_genre_with_age_rating(self, collector): collector.add_new_book("Оно") collector.set_book_genre("Оно", "Ужасы") assert collector.get_book_genre("Оно") == "Ужасы" - @pytest.mark.parametrize("genre, expected_books", [ ("Фантастика", ["Дюна"]), ("Комедии", []), ("Детективы", ["Шерлок Холмс"]) ]) - def test_get_books_with_specific_genre(self, genre, expected_books): - collector = BooksCollector() + def test_get_books_with_specific_genre(self, genre, expected_books, collector): collector.add_new_book("Дюна") collector.set_book_genre("Дюна", "Фантастика") collector.add_new_book("Шерлок Холмс") collector.set_book_genre("Шерлок Холмс", "Детективы") assert collector.get_books_with_specific_genre(genre) == expected_books - - def test_get_books_for_children(self): - collector = BooksCollector() + def test_get_books_for_children(self, collector): collector.add_new_book("Мой сосед Тоторо") collector.set_book_genre("Мой сосед Тоторо", "Мультфильмы") collector.add_new_book("Оно") @@ -73,38 +57,28 @@ def test_get_books_for_children(self): assert "Оно" not in children_books assert "Кошмары" not in children_books - - def test_add_book_in_favorites_success(self): - collector = BooksCollector() + def test_add_book_in_favorites_success(self, collector): collector.add_new_book("Три товарища") collector.add_book_in_favorites("Три товарища") assert "Три товарища" in collector.get_list_of_favorites_books() - - def test_add_book_in_favorites_not_in_books(self): - collector = BooksCollector() + def test_add_book_in_favorites_not_in_books(self, collector): collector.add_book_in_favorites("Отсутствующая книга") assert "Отсутствующая книга" not in collector.get_list_of_favorites_books() - - def test_delete_book_from_favorites(self): - collector = BooksCollector() + def test_delete_book_from_favorites(self, collector): collector.add_new_book("1984") collector.add_book_in_favorites("1984") collector.delete_book_from_favorites("1984") assert "1984" not in collector.get_list_of_favorites_books() - - def test_delete_book_from_favorites_nonexistent(self): - collector = BooksCollector() + def test_delete_book_from_favorites_nonexistent(self, collector): collector.add_new_book("Собачье сердце") collector.add_book_in_favorites("Собачье сердце") collector.delete_book_from_favorites("Отсутствующая книга") assert "Собачье сердце" in collector.get_list_of_favorites_books() - - def test_get_books_genre(self): - collector = BooksCollector() + def test_get_books_genre(self, collector): collector.add_new_book("Мастер и Маргарита") collector.set_book_genre("Мастер и Маргарита", "Фантастика") collector.add_new_book("12 стульев") @@ -115,25 +89,17 @@ def test_get_books_genre(self): assert books_genre["12 стульев"] == "Комедии" assert len(books_genre) == 2 - - def test_get_book_genre_nonexistent(self): - collector = BooksCollector() + def test_get_book_genre_nonexistent(self, collector): assert collector.get_book_genre("Неизвестная книга") is None - - def test_get_list_of_favorites_books_empty(self): - collector = BooksCollector() + def test_get_list_of_favorites_books_empty(self, collector): assert collector.get_list_of_favorites_books() == [] - - def test_add_new_book_exactly_40_chars(self): - collector = BooksCollector() + def test_add_new_book_exactly_40_chars(self, collector): name = "A" * 40 collector.add_new_book(name) assert name in collector.books_genre - - def test_add_new_book_empty_name(self): - collector = BooksCollector() + def test_add_new_book_empty_name(self, collector): collector.add_new_book("") - assert len(collector.books_genre) == 0 \ No newline at end of file + assert len(collector.books_genre) == 0 From 7e84642d744103a49afcdd86980b09097be0b200 Mon Sep 17 00:00:00 2001 From: alekseimakhalin Date: Sun, 21 Jun 2026 11:31:54 +0300 Subject: [PATCH 5/6] =?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=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=D0=B5=D1=80=D0=B0?= =?UTF-8?q?:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20get=5Fboo?= =?UTF-8?q?ks=5Fgenre=20=D0=B8=20get=5Fbook=5Fgenre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/tests.py b/tests.py index 9707ca5..5026448 100644 --- a/tests.py +++ b/tests.py @@ -78,19 +78,49 @@ def test_delete_book_from_favorites_nonexistent(self, collector): collector.delete_book_from_favorites("Отсутствующая книга") assert "Собачье сердце" in collector.get_list_of_favorites_books() - def test_get_books_genre(self, collector): + # ============ ТЕСТЫ ДЛЯ get_books_genre ============ + + def test_get_books_genre_returns_full_dict(self, collector): + """Проверяет, что get_books_genre возвращает полный словарь книг и жанров""" collector.add_new_book("Мастер и Маргарита") collector.set_book_genre("Мастер и Маргарита", "Фантастика") collector.add_new_book("12 стульев") collector.set_book_genre("12 стульев", "Комедии") + collector.add_new_book("Война и мир") + collector.set_book_genre("Война и мир", "Роман") books_genre = collector.get_books_genre() + assert books_genre["Мастер и Маргарита"] == "Фантастика" assert books_genre["12 стульев"] == "Комедии" - assert len(books_genre) == 2 + assert books_genre["Война и мир"] == "Роман" + assert len(books_genre) == 3 + + def test_get_books_genre_empty(self, collector): + """Проверяет, что get_books_genre возвращает пустой словарь, если книг нет""" + assert collector.get_books_genre() == {} + + # ============ ТЕСТЫ ДЛЯ get_book_genre ============ + + def test_get_book_genre_returns_genre_for_existing_book(self, collector): + """Проверяет, что get_book_genre возвращает жанр для существующей книги""" + collector.add_new_book("Мастер и Маргарита") + collector.set_book_genre("Мастер и Маргарита", "Мистика") + + genre = collector.get_book_genre("Мастер и Маргарита") + + assert genre == "Мистика" - def test_get_book_genre_nonexistent(self, collector): - assert collector.get_book_genre("Неизвестная книга") is None + def test_get_book_genre_returns_none_for_nonexistent_book(self, collector): + """Проверяет, что get_book_genre возвращает None для несуществующей книги""" + genre = collector.get_book_genre("Несуществующая книга") + assert genre is None + + def test_get_book_genre_returns_empty_string_for_book_without_genre(self, collector): + """Проверяет, что get_book_genre возвращает пустую строку для книги без жанра""" + collector.add_new_book("Новая книга") + genre = collector.get_book_genre("Новая книга") + assert genre == "" def test_get_list_of_favorites_books_empty(self, collector): assert collector.get_list_of_favorites_books() == [] @@ -102,4 +132,4 @@ def test_add_new_book_exactly_40_chars(self, collector): def test_add_new_book_empty_name(self, collector): collector.add_new_book("") - assert len(collector.books_genre) == 0 + assert len(collector.books_genre) == 0 \ No newline at end of file From 39652d1d1b6b3bdc0663d35b7cbb2dc07ecacb62 Mon Sep 17 00:00:00 2001 From: alekseimakhalin Date: Mon, 22 Jun 2026 14:19:29 +0300 Subject: [PATCH 6/6] =?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=82=D0=B5=D1=81=D1=82=D1=8B:=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D0=B6=D0=B0=D0=BD=D1=80=D1=8B=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=20=D1=81?= =?UTF-8?q?=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D1=83=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=D0=B7=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?genre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 152 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 93 insertions(+), 59 deletions(-) diff --git a/tests.py b/tests.py index 5026448..35454e7 100644 --- a/tests.py +++ b/tests.py @@ -2,49 +2,125 @@ from main import BooksCollector -class TestBooksCollector: +@pytest.fixture +def collector(): + """Фикстура создает новый экземпляр BooksCollector для каждого теста""" + return BooksCollector() - def test_add_new_book_with_max_length(self, collector): - collector.add_new_book("Книга с очень длинным названием, которое точно длиннее сорока символов") - assert len(collector.books_genre) == 0 +class TestBooksCollector: + + # ========== ТЕСТЫ ДЛЯ add_new_book() ========== + def test_add_new_book_success(self, collector): + """Тест: книга успешно добавляется""" collector.add_new_book("Гарри Поттер") assert "Гарри Поттер" in collector.books_genre assert collector.books_genre["Гарри Поттер"] == "" def test_add_new_book_duplicate(self, collector): + """Тест: дубликат книги НЕ добавляется""" collector.add_new_book("Властелин Колец") collector.add_new_book("Властелин Колец") assert len(collector.books_genre) == 1 + def test_add_new_book_with_name_longer_than_40_chars(self, collector): + """Тест: книга с названием длиннее 40 символов НЕ добавляется""" + long_name = "Книга с очень длинным названием, которое точно длиннее сорока символов" + collector.add_new_book(long_name) + assert len(collector.books_genre) == 0 + + def test_add_new_book_exactly_40_chars(self, collector): + """Тест: книга с названием ровно 40 символов успешно добавляется""" + name = "A" * 40 + collector.add_new_book(name) + assert name in collector.books_genre + + def test_add_new_book_empty_name(self, collector): + """Тест: книга с пустым названием НЕ добавляется""" + collector.add_new_book("") + assert len(collector.books_genre) == 0 + + # ========== ТЕСТЫ ДЛЯ set_book_genre() ========== + def test_set_book_genre_success(self, collector): + """Тест: жанр успешно устанавливается для существующей книги""" collector.add_new_book("Шерлок Холмс") collector.set_book_genre("Шерлок Холмс", "Детективы") assert collector.get_book_genre("Шерлок Холмс") == "Детективы" def test_set_book_genre_for_nonexistent_book(self, collector): + """Тест: жанр НЕ устанавливается для несуществующей книги""" collector.set_book_genre("Несуществующая книга", "Фантастика") assert collector.get_book_genre("Несуществующая книга") is None def test_set_book_genre_with_age_rating(self, collector): + """Тест: установка жанра с возрастным рейтингом (Ужасы)""" collector.add_new_book("Оно") collector.set_book_genre("Оно", "Ужасы") assert collector.get_book_genre("Оно") == "Ужасы" + # ========== ТЕСТЫ ДЛЯ get_book_genre() ========== + + def test_get_book_genre_returns_genre_for_existing_book(self, collector): + """Тест: get_book_genre возвращает жанр для существующей книги""" + collector.add_new_book("Мастер и Маргарита") + collector.set_book_genre("Мастер и Маргарита", "Фантастика") + genre = collector.get_book_genre("Мастер и Маргарита") + assert genre == "Фантастика" + + def test_get_book_genre_returns_none_for_nonexistent_book(self, collector): + """Тест: get_book_genre возвращает None для несуществующей книги""" + genre = collector.get_book_genre("Несуществующая книга") + assert genre is None + + def test_get_book_genre_returns_empty_string_for_book_without_genre(self, collector): + """Тест: get_book_genre возвращает пустую строку для книги без жанра""" + collector.add_new_book("Новая книга") + genre = collector.get_book_genre("Новая книга") + assert genre == "" + + # ========== ТЕСТЫ ДЛЯ get_books_genre() ========== + + def test_get_books_genre_returns_full_dict(self, collector): + """Тест: get_books_genre возвращает полный словарь книг и жанров""" + collector.add_new_book("Мастер и Маргарита") + collector.set_book_genre("Мастер и Маргарита", "Фантастика") + collector.add_new_book("12 стульев") + collector.set_book_genre("12 стульев", "Комедии") + collector.add_new_book("Война и мир") + collector.set_book_genre("Война и мир", "Фантастика") + + books_genre = collector.get_books_genre() + + assert books_genre["Мастер и Маргарита"] == "Фантастика" + assert books_genre["12 стульев"] == "Комедии" + assert books_genre["Война и мир"] == "Фантастика" + assert len(books_genre) == 3 + + def test_get_books_genre_empty(self, collector): + """Тест: get_books_genre возвращает пустой словарь, если книг нет""" + assert collector.get_books_genre() == {} + + # ========== ТЕСТЫ ДЛЯ get_books_with_specific_genre() ========== + @pytest.mark.parametrize("genre, expected_books", [ ("Фантастика", ["Дюна"]), ("Комедии", []), ("Детективы", ["Шерлок Холмс"]) ]) def test_get_books_with_specific_genre(self, genre, expected_books, collector): + """Тест: получение книг по жанру (параметризованный)""" collector.add_new_book("Дюна") collector.set_book_genre("Дюна", "Фантастика") collector.add_new_book("Шерлок Холмс") collector.set_book_genre("Шерлок Холмс", "Детективы") assert collector.get_books_with_specific_genre(genre) == expected_books - def test_get_books_for_children(self, collector): + # ========== ТЕСТЫ ДЛЯ get_books_for_children() ========== + + def test_get_books_for_children_excludes_age_rating_genres(self, collector): + """Тест: get_books_for_children исключает книги с возрастными жанрами""" collector.add_new_book("Мой сосед Тоторо") collector.set_book_genre("Мой сосед Тоторо", "Мультфильмы") collector.add_new_book("Оно") @@ -57,79 +133,37 @@ def test_get_books_for_children(self, collector): assert "Оно" not in children_books assert "Кошмары" not in children_books + # ========== ТЕСТЫ ДЛЯ add_book_in_favorites() ========== + def test_add_book_in_favorites_success(self, collector): + """Тест: книга успешно добавляется в избранное""" collector.add_new_book("Три товарища") collector.add_book_in_favorites("Три товарища") assert "Три товарища" in collector.get_list_of_favorites_books() def test_add_book_in_favorites_not_in_books(self, collector): + """Тест: несуществующая книга НЕ добавляется в избранное""" collector.add_book_in_favorites("Отсутствующая книга") assert "Отсутствующая книга" not in collector.get_list_of_favorites_books() - def test_delete_book_from_favorites(self, collector): + # ========== ТЕСТЫ ДЛЯ delete_book_from_favorites() ========== + + def test_delete_book_from_favorites_success(self, collector): + """Тест: книга успешно удаляется из избранного""" collector.add_new_book("1984") collector.add_book_in_favorites("1984") collector.delete_book_from_favorites("1984") assert "1984" not in collector.get_list_of_favorites_books() def test_delete_book_from_favorites_nonexistent(self, collector): + """Тест: удаление несуществующей книги не влияет на избранное""" collector.add_new_book("Собачье сердце") collector.add_book_in_favorites("Собачье сердце") collector.delete_book_from_favorites("Отсутствующая книга") assert "Собачье сердце" in collector.get_list_of_favorites_books() - # ============ ТЕСТЫ ДЛЯ get_books_genre ============ - - def test_get_books_genre_returns_full_dict(self, collector): - """Проверяет, что get_books_genre возвращает полный словарь книг и жанров""" - collector.add_new_book("Мастер и Маргарита") - collector.set_book_genre("Мастер и Маргарита", "Фантастика") - collector.add_new_book("12 стульев") - collector.set_book_genre("12 стульев", "Комедии") - collector.add_new_book("Война и мир") - collector.set_book_genre("Война и мир", "Роман") - - books_genre = collector.get_books_genre() - - assert books_genre["Мастер и Маргарита"] == "Фантастика" - assert books_genre["12 стульев"] == "Комедии" - assert books_genre["Война и мир"] == "Роман" - assert len(books_genre) == 3 - - def test_get_books_genre_empty(self, collector): - """Проверяет, что get_books_genre возвращает пустой словарь, если книг нет""" - assert collector.get_books_genre() == {} - - # ============ ТЕСТЫ ДЛЯ get_book_genre ============ + # ========== ТЕСТЫ ДЛЯ get_list_of_favorites_books() ========== - def test_get_book_genre_returns_genre_for_existing_book(self, collector): - """Проверяет, что get_book_genre возвращает жанр для существующей книги""" - collector.add_new_book("Мастер и Маргарита") - collector.set_book_genre("Мастер и Маргарита", "Мистика") - - genre = collector.get_book_genre("Мастер и Маргарита") - - assert genre == "Мистика" - - def test_get_book_genre_returns_none_for_nonexistent_book(self, collector): - """Проверяет, что get_book_genre возвращает None для несуществующей книги""" - genre = collector.get_book_genre("Несуществующая книга") - assert genre is None - - def test_get_book_genre_returns_empty_string_for_book_without_genre(self, collector): - """Проверяет, что get_book_genre возвращает пустую строку для книги без жанра""" - collector.add_new_book("Новая книга") - genre = collector.get_book_genre("Новая книга") - assert genre == "" - def test_get_list_of_favorites_books_empty(self, collector): - assert collector.get_list_of_favorites_books() == [] - - def test_add_new_book_exactly_40_chars(self, collector): - name = "A" * 40 - collector.add_new_book(name) - assert name in collector.books_genre - - def test_add_new_book_empty_name(self, collector): - collector.add_new_book("") - assert len(collector.books_genre) == 0 \ No newline at end of file + """Тест: get_list_of_favorites_books возвращает пустой список, если избранное пусто""" + assert collector.get_list_of_favorites_books() == [] \ No newline at end of file