From 6d3fa699e6edb0893393c9eb5f012870b92b4a2d Mon Sep 17 00:00:00 2001 From: Mukhadim Date: Mon, 20 Apr 2026 23:24:22 +0500 Subject: [PATCH 1/2] New tests and file README updated --- README.md | 41 +++++- __pycache__/main.cpython-314.pyc | Bin 0 -> 3710 bytes __pycache__/main.cpython-38.pyc | Bin 2030 -> 0 bytes __pycache__/test.cpython-38-pytest-7.1.2.pyc | Bin 8183 -> 0 bytes .../tests.cpython-314-pytest-9.0.3.pyc | Bin 0 -> 25677 bytes tests.py | 123 +++++++++++++++--- 6 files changed, 146 insertions(+), 18 deletions(-) create mode 100644 __pycache__/main.cpython-314.pyc delete mode 100644 __pycache__/main.cpython-38.pyc delete mode 100644 __pycache__/test.cpython-38-pytest-7.1.2.pyc create mode 100644 __pycache__/tests.cpython-314-pytest-9.0.3.pyc diff --git a/README.md b/README.md index 1cc701d..e24af0c 100644 --- a/README.md +++ b/README.md @@ -1 +1,40 @@ -# qa_python \ No newline at end of file +# qa_python + + +Тесты для BooksCollector + +add_new_book +test_add_new_book_added_successfully — книга добавляется успешно +test_add_new_book_parametrized — граничные значения (40 символов, 41 символ, обычное название, пустая строка) +test_add_new_book_duplicate_not_added_twice — дубликат не добавляется +test_add_new_book_default_genre_is_empty_string — жанр по умолчанию пустая строка + +set_book_genre +test_set_book_genre_sets_correctly — жанр устанавливается успешно +test_set_book_genre_not_set_if_book_missing — книги нет в словаре +test_set_book_genre_not_set_if_genre_not_in_list — жанр не из списка + +get_book_genre +test_get_book_genre_returns_genre — возвращает установленный жанр +test_get_book_genre_returns_empty_string_if_genre_not_set — возвращает пустую строку если жанр не задан + +get_books_with_specific_genre +test_get_books_with_specific_genre_returns_correct_books — возвращает правильные книги +test_get_books_with_specific_genre_returns_empty_list_if_no_books — возвращает пустой список + +get_books_for_children +test_get_books_for_children_returns_books_without_age_rating — книга без возрастного рейтинга попадает в список +test_get_books_for_children_excludes_books_with_age_rating — книга с возрастным рейтингом не попадает +test_get_books_for_children_excludes_books_without_genre — книга без жанра не попадает в список + +add_book_in_favorites +test_add_book_in_favorites_added_successfully — книга добавляется в избранное +test_add_book_in_favorites_not_added_if_book_not_in_books_genre — книги нет в словаре +test_add_book_in_favorites_not_added_twice — дубликат не добавляется + +delete_book_from_favorites +test_delete_book_from_favorites_deleted_successfully — книга удаляется из избранного +test_delete_book_from_favorites_no_error_if_book_not_in_favorites — нет ошибки если книги нет в избранном + +get_list_of_favorites_books +test_get_list_of_favorites_books_returns_correct_list — возвращает корректный список \ No newline at end of file diff --git a/__pycache__/main.cpython-314.pyc b/__pycache__/main.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75d5288824fdc9a55be554ef77df0ab274db6fab GIT binary patch literal 3710 zcmb7GU2Gdg5Z<%zQYUtN*Cy#toF6B4++0I#LanMTZB%Gl2~~vX1St=|;o6tP)UngO zORH9*Do}}3tyGYZ_z@D3K&W{lKntZ5c;opFBHOxGBqZL7qY56G**nLM>qKIejQ4hC zf99KSXLcmm-bSE(o&PiYhmVjy@T1yzx3ks_ovWma3=oCvA_|xEI2wZ}o(Pe>>FNyp z<=l_8SD=%Ed9M;C~Y9y6~7UjB8I30VBdB-_-vtYPCrq|<+QX>py}$~cmzD7mk{6DDd=1!2{J|U zIL=xezt*keMB!iHV8r!{z!?=!+yf)9g3}Z)>?l0ygfH_8bH)70dfQyF-U4~gyl<{N zLKw}@&F|RYjYm81^8@oP=l!Qv zJ@bKeVfHQ zKeNo)ysqV@b@Vo7k0f5wHL54(7S7G4GTFJrxTc>o3iFBcDRusmFm zeZ6a7Nz&^m!v_!lEJ|NO=PE>H5`G)on#&54XIP)YSJ>)g=3L?x}&1S*# zwC51SBm*1=8=3V1`X2JUx1X_Cf%rGudx}H%kmuEZ+4~o+Zj%YwOIxw$ozV>2o73{k z9*RM;`Fv_l)6vgZjEXoCNM$l=Uc0Db`0P*vob^g1l712dKq_{W#C}WcFNqOLj4X|p zMEN&SzMZ-gS;>4W7vsn8oh`+WoAKl2p}mXar9h7r==tcy-vfhxdr9IM&JtycL`>J? zhkb_l8*Gm=QZug)gDw+6e9nX?>*EFE*qDC1t9OPrNEbB%sJZ{k+=T35a8W;)0(6KJ z-Gc%LbUatA3Rh6q3si(9AaxVC&bodj1bxjldG=c?WVgyY#>7r__CFE8`YR{bi}C%A$}KS z)8_`c-V+|oS&)Ba^WtP4l3BArS1(WIc@|7*(_kM%ee*RY*DoAw=C-8!E0I%ugj|HP z(d3zD4!ums44kWnoNgy%$}@>6u%S(Ps~5YUoDLJxO8UUEiYs5EkS##so73%<)cm}b z&p>Krj6yQmd+?g+>cy-vtLpPwIy;?BJ5*wfv)fSb4Cr|JSS%b4J2$nrihk4S_7e?E z+|rsw{v}u+LKlshz5%4CKLmfKKeQx#)xF%k8a_~t4ws@yE1E1tk66(o#pqE>3ctsf zJ9>*9v2y4BQfJcYOs>3G>^$N$K0vW2PU#`G|ZSJxyQ#xk*gp4Q6#17E#2PN;K&xXSp9Xp)GVXjx^n%B>FZ@jrto}(XP<;GV|?Pl%eYNd=L(sH z9QFgMdVV35b2Xx>PG_lZ@HQ+ z4S2?<)s$h-?AZl)>BBzTRW+SU>3SxcHqu%yr>Zh%x7Q8AGz9cG%jgs;0$~EjbSUKH z-*>^c3eO8Cxk}I@3|HDb!bqi!6ZTbnErMLx!3p7tPY?zxl2>@55&)BbK->3_fN+q& pMJHsAt-DN|G4|5+9d+;+qbI5aB literal 0 HcmV?d00001 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 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 literal 0 HcmV?d00001 diff --git a/tests.py b/tests.py index 383385e..c066ccf 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,113 @@ +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 - collector = BooksCollector() + @pytest.fixture + def collector(self): + return BooksCollector() + + def test_add_new_book_added_successfully(self, collector): + collector.add_new_book('Властелин колец') + assert 'Властелин колец' in collector.get_books_genre() + + @pytest.mark.parametrize('name, expected', [ + ('А' * 40, True), # граница — должна добавиться + ('А' * 41, False), # за границей — не должна + ('Властелин колец', True), # обычное название + ('', False), # пустое — не должна +]) + def test_add_new_book_parametrized(self, collector, name, expected): + collector.add_new_book(name) + assert (name in collector.get_books_genre()) == expected + + def test_add_new_book_empty_name_not_added(self, collector): + collector.add_new_book('') + assert '' not in collector.get_books_genre() + + def test_add_new_book_duplicate_not_added_twice(self, collector): + collector.add_new_book('Властелин колец') + collector.add_new_book('Властелин колец') + assert len(collector.get_books_genre()) == 1 + + def test_add_new_book_default_genre_is_empty_string(self, collector): + collector.add_new_book('Властелин колец') + assert collector.get_book_genre('Властелин колец') == '' + + def test_set_book_genre_sets_correctly(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert collector.get_book_genre('Властелин колец') == 'Фантастика' + + def test_set_book_genre_not_set_if_book_missing(self, collector): + collector.set_book_genre('Несуществующая книга', 'Фантастика') + assert collector.get_book_genre('Несуществующая книга') is None + + def test_set_book_genre_not_set_if_genre_not_in_list(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Романтика') + assert collector.get_book_genre('Властелин колец') == '' + + def test_get_book_genre_returns_empty_string_if_genre_not_set(self, collector): + collector.add_new_book('Властелин колец') + assert collector.get_book_genre('Властелин колец') == '' + + def test_get_books_with_specific_genre_returns_correct_books(self, collector): + collector.add_new_book('Властелин колец') + collector.add_new_book('Мартин Иден') + collector.set_book_genre('Властелин колец', 'Фантастика') + collector.set_book_genre('Мартин Иден', 'Комедии') + assert collector.get_books_with_specific_genre('Фантастика') == ['Властелин колец'] + + def test_get_books_with_specific_genre_returns_empty_list_if_no_books(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert collector.get_books_with_specific_genre('Комедии') == [] + + def test_get_books_for_children_returns_books_without_age_rating(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert 'Властелин колец' in collector.get_books_for_children() + + def test_get_books_for_children_excludes_books_with_age_rating(self, collector): + collector.add_new_book('Оно') + collector.set_book_genre('Оно', 'Ужасы') + assert 'Оно' not in collector.get_books_for_children() + + def test_get_books_for_children_excludes_books_without_genre(self, collector): + collector.add_new_book('Властелин колец') + assert 'Властелин колец' not in collector.get_books_for_children() + + def test_add_book_in_favorites_added_successfully(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_added_if_book_not_in_books_genre(self, collector): + collector.add_book_in_favorites('Властелин колец') + assert 'Властелин колец' not in collector.get_list_of_favorites_books() + + def test_add_book_in_favorites_not_added_twice(self, collector): + collector.add_new_book('Властелин колец') + collector.add_book_in_favorites('Властелин колец') + collector.add_book_in_favorites('Властелин колец') + assert len(collector.get_list_of_favorites_books()) == 1 - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_delete_book_from_favorites_deleted_successfully(self, collector): + collector.add_new_book('Властелин колец') + collector.add_book_in_favorites('Властелин колец') + collector.delete_book_from_favorites('Властелин колец') + assert 'Властелин колец' not in collector.get_list_of_favorites_books() - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + def test_delete_book_from_favorites_no_error_if_book_not_in_favorites(self, collector): + collector.add_new_book('Властелин колец') + collector.delete_book_from_favorites('Властелин колец') + assert 'Властелин колец' not in collector.get_list_of_favorites_books() - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_get_list_of_favorites_books_returns_correct_list(self, collector): + collector.add_new_book('Властелин колец') + collector.add_new_book('Оно') + collector.add_book_in_favorites('Властелин колец') + collector.add_book_in_favorites('Оно') + assert collector.get_list_of_favorites_books() == ['Властелин колец', 'Оно'] \ No newline at end of file From 5d3a9e4c86a84e49549c66a76e37bf346f53e5e1 Mon Sep 17 00:00:00 2001 From: Mukhadim Date: Tue, 21 Apr 2026 22:05:36 +0500 Subject: [PATCH 2/2] Added conftest.py and add new test and updated README --- __pycache__/main.cpython-314.pyc | Bin 3710 -> 0 bytes .../tests.cpython-314-pytest-9.0.3.pyc | Bin 25677 -> 0 bytes conftest.py | 8 +++ tests.py | 53 +++++++++--------- 4 files changed, 35 insertions(+), 26 deletions(-) delete mode 100644 __pycache__/main.cpython-314.pyc delete mode 100644 __pycache__/tests.cpython-314-pytest-9.0.3.pyc create mode 100644 conftest.py diff --git a/__pycache__/main.cpython-314.pyc b/__pycache__/main.cpython-314.pyc deleted file mode 100644 index 75d5288824fdc9a55be554ef77df0ab274db6fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3710 zcmb7GU2Gdg5Z<%zQYUtN*Cy#toF6B4++0I#LanMTZB%Gl2~~vX1St=|;o6tP)UngO zORH9*Do}}3tyGYZ_z@D3K&W{lKntZ5c;opFBHOxGBqZL7qY56G**nLM>qKIejQ4hC zf99KSXLcmm-bSE(o&PiYhmVjy@T1yzx3ks_ovWma3=oCvA_|xEI2wZ}o(Pe>>FNyp z<=l_8SD=%Ed9M;C~Y9y6~7UjB8I30VBdB-_-vtYPCrq|<+QX>py}$~cmzD7mk{6DDd=1!2{J|U zIL=xezt*keMB!iHV8r!{z!?=!+yf)9g3}Z)>?l0ygfH_8bH)70dfQyF-U4~gyl<{N zLKw}@&F|RYjYm81^8@oP=l!Qv zJ@bKeVfHQ zKeNo)ysqV@b@Vo7k0f5wHL54(7S7G4GTFJrxTc>o3iFBcDRusmFm zeZ6a7Nz&^m!v_!lEJ|NO=PE>H5`G)on#&54XIP)YSJ>)g=3L?x}&1S*# zwC51SBm*1=8=3V1`X2JUx1X_Cf%rGudx}H%kmuEZ+4~o+Zj%YwOIxw$ozV>2o73{k z9*RM;`Fv_l)6vgZjEXoCNM$l=Uc0Db`0P*vob^g1l712dKq_{W#C}WcFNqOLj4X|p zMEN&SzMZ-gS;>4W7vsn8oh`+WoAKl2p}mXar9h7r==tcy-vfhxdr9IM&JtycL`>J? zhkb_l8*Gm=QZug)gDw+6e9nX?>*EFE*qDC1t9OPrNEbB%sJZ{k+=T35a8W;)0(6KJ z-Gc%LbUatA3Rh6q3si(9AaxVC&bodj1bxjldG=c?WVgyY#>7r__CFE8`YR{bi}C%A$}KS z)8_`c-V+|oS&)Ba^WtP4l3BArS1(WIc@|7*(_kM%ee*RY*DoAw=C-8!E0I%ugj|HP z(d3zD4!ums44kWnoNgy%$}@>6u%S(Ps~5YUoDLJxO8UUEiYs5EkS##so73%<)cm}b z&p>Krj6yQmd+?g+>cy-vtLpPwIy;?BJ5*wfv)fSb4Cr|JSS%b4J2$nrihk4S_7e?E z+|rsw{v}u+LKlshz5%4CKLmfKKeQx#)xF%k8a_~t4ws@yE1E1tk66(o#pqE>3ctsf zJ9>*9v2y4BQfJcYOs>3G>^$N$K0vW2PU#`G|ZSJxyQ#xk*gp4Q6#17E#2PN;K&xXSp9Xp)GVXjx^n%B>FZ@jrto}(XP<;GV|?Pl%eYNd=L(sH z9QFgMdVV35b2Xx>PG_lZ@HQ+ z4S2?<)s$h-?AZl)>BBzTRW+SU>3SxcHqu%yr>Zh%x7Q8AGz9cG%jgs;0$~EjbSUKH z-*>^c3eO8Cxk}I@3|HDb!bqi!6ZTbnErMLx!3p7tPY?zxl2>@55&)BbK->3_fN+q& pMJHsAt-DN|G4|5+9d+;+qbI5aB diff --git a/__pycache__/tests.cpython-314-pytest-9.0.3.pyc b/__pycache__/tests.cpython-314-pytest-9.0.3.pyc deleted file mode 100644 index 8a1f9f5eb69d23b233228f9cfd84e48816f7fb82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25677 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 diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..1da9604 --- /dev/null +++ b/conftest.py @@ -0,0 +1,8 @@ +import pytest + +from main import BooksCollector + +@pytest.fixture +def collector(): + return BooksCollector() + \ No newline at end of file diff --git a/tests.py b/tests.py index c066ccf..97613bd 100644 --- a/tests.py +++ b/tests.py @@ -4,110 +4,111 @@ class TestBooksCollector: - @pytest.fixture - def collector(self): - return BooksCollector() - - def test_add_new_book_added_successfully(self, collector): + def test_add_new_book_added_successfully(self, collector): collector.add_new_book('Властелин колец') assert 'Властелин колец' in collector.get_books_genre() - @pytest.mark.parametrize('name, expected', [ + @pytest.mark.parametrize('name, expected', [ ('А' * 40, True), # граница — должна добавиться ('А' * 41, False), # за границей — не должна ('Властелин колец', True), # обычное название ('', False), # пустое — не должна ]) - def test_add_new_book_parametrized(self, collector, name, expected): + def test_add_new_book_parametrized(self, collector, name, expected): collector.add_new_book(name) assert (name in collector.get_books_genre()) == expected - def test_add_new_book_empty_name_not_added(self, collector): + def test_add_new_book_empty_name_not_added(self, collector): collector.add_new_book('') assert '' not in collector.get_books_genre() - def test_add_new_book_duplicate_not_added_twice(self, collector): + def test_add_new_book_duplicate_not_added_twice(self, collector): collector.add_new_book('Властелин колец') collector.add_new_book('Властелин колец') assert len(collector.get_books_genre()) == 1 - def test_add_new_book_default_genre_is_empty_string(self, collector): + def test_get_book_genre_returns_genre(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert collector.get_book_genre('Властелин колец') == 'Фантастика' + + def test_add_new_book_default_genre_is_empty_string(self, collector): collector.add_new_book('Властелин колец') assert collector.get_book_genre('Властелин колец') == '' - def test_set_book_genre_sets_correctly(self, collector): + def test_set_book_genre_sets_correctly(self, collector): collector.add_new_book('Властелин колец') collector.set_book_genre('Властелин колец', 'Фантастика') assert collector.get_book_genre('Властелин колец') == 'Фантастика' - def test_set_book_genre_not_set_if_book_missing(self, collector): + def test_set_book_genre_not_set_if_book_missing(self, collector): collector.set_book_genre('Несуществующая книга', 'Фантастика') assert collector.get_book_genre('Несуществующая книга') is None - def test_set_book_genre_not_set_if_genre_not_in_list(self, collector): + def test_set_book_genre_not_set_if_genre_not_in_list(self, collector): collector.add_new_book('Властелин колец') collector.set_book_genre('Властелин колец', 'Романтика') assert collector.get_book_genre('Властелин колец') == '' - def test_get_book_genre_returns_empty_string_if_genre_not_set(self, collector): + def test_get_book_genre_returns_empty_string_if_genre_not_set(self, collector): collector.add_new_book('Властелин колец') assert collector.get_book_genre('Властелин колец') == '' - def test_get_books_with_specific_genre_returns_correct_books(self, collector): + def test_get_books_with_specific_genre_returns_correct_books(self, collector): collector.add_new_book('Властелин колец') collector.add_new_book('Мартин Иден') collector.set_book_genre('Властелин колец', 'Фантастика') collector.set_book_genre('Мартин Иден', 'Комедии') assert collector.get_books_with_specific_genre('Фантастика') == ['Властелин колец'] - def test_get_books_with_specific_genre_returns_empty_list_if_no_books(self, collector): + def test_get_books_with_specific_genre_returns_empty_list_if_no_books(self, collector): collector.add_new_book('Властелин колец') collector.set_book_genre('Властелин колец', 'Фантастика') assert collector.get_books_with_specific_genre('Комедии') == [] - def test_get_books_for_children_returns_books_without_age_rating(self, collector): + def test_get_books_for_children_returns_books_without_age_rating(self, collector): collector.add_new_book('Властелин колец') collector.set_book_genre('Властелин колец', 'Фантастика') assert 'Властелин колец' in collector.get_books_for_children() - def test_get_books_for_children_excludes_books_with_age_rating(self, collector): + def test_get_books_for_children_excludes_books_with_age_rating(self, collector): collector.add_new_book('Оно') collector.set_book_genre('Оно', 'Ужасы') assert 'Оно' not in collector.get_books_for_children() - def test_get_books_for_children_excludes_books_without_genre(self, collector): + def test_get_books_for_children_excludes_books_without_genre(self, collector): collector.add_new_book('Властелин колец') assert 'Властелин колец' not in collector.get_books_for_children() - def test_add_book_in_favorites_added_successfully(self, collector): + def test_add_book_in_favorites_added_successfully(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_added_if_book_not_in_books_genre(self, collector): + def test_add_book_in_favorites_not_added_if_book_not_in_books_genre(self, collector): collector.add_book_in_favorites('Властелин колец') assert 'Властелин колец' not in collector.get_list_of_favorites_books() - def test_add_book_in_favorites_not_added_twice(self, collector): + def test_add_book_in_favorites_not_added_twice(self, collector): collector.add_new_book('Властелин колец') collector.add_book_in_favorites('Властелин колец') collector.add_book_in_favorites('Властелин колец') assert len(collector.get_list_of_favorites_books()) == 1 - def test_delete_book_from_favorites_deleted_successfully(self, collector): + def test_delete_book_from_favorites_deleted_successfully(self, collector): collector.add_new_book('Властелин колец') collector.add_book_in_favorites('Властелин колец') collector.delete_book_from_favorites('Властелин колец') assert 'Властелин колец' not in collector.get_list_of_favorites_books() - def test_delete_book_from_favorites_no_error_if_book_not_in_favorites(self, collector): + def test_delete_book_from_favorites_no_error_if_book_not_in_favorites(self, collector): collector.add_new_book('Властелин колец') collector.delete_book_from_favorites('Властелин колец') assert 'Властелин колец' not in collector.get_list_of_favorites_books() - def test_get_list_of_favorites_books_returns_correct_list(self, collector): + def test_get_list_of_favorites_books_returns_correct_list(self, collector): collector.add_new_book('Властелин колец') collector.add_new_book('Оно') collector.add_book_in_favorites('Властелин колец') collector.add_book_in_favorites('Оно') - assert collector.get_list_of_favorites_books() == ['Властелин колец', 'Оно'] \ No newline at end of file + assert collector.get_list_of_favorites_books() == ['Властелин колец', 'Оно']