From b1bdae3a58d231339671607afadc7874b49fd8e5 Mon Sep 17 00:00:00 2001 From: Elena Dyshpan Date: Sun, 14 Sep 2025 17:25:27 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=20=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D1=82=D0=BE=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=204=20=D1=81=D0=BF=D1=80=D0=B8=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 64 ++++- __pycache__/main.cpython-313.pyc | Bin 0 -> 3599 bytes .../tests.cpython-313-pytest-8.4.2.pyc | Bin 0 -> 25428 bytes tests.py | 225 +++++++++++++++++- 4 files changed, 285 insertions(+), 4 deletions(-) create mode 100644 __pycache__/main.cpython-313.pyc create mode 100644 __pycache__/tests.cpython-313-pytest-8.4.2.pyc diff --git a/README.md b/README.md index 1cc701d..9d944f1 100644 --- a/README.md +++ b/README.md @@ -1 +1,63 @@ -# qa_python \ No newline at end of file +# TestBooksCollector + +Тестовый класс TestBooksCollector для тестирования класса BooksCollector содержит следующие тестовые методы: + +## 1. test_add_new_book_add_two_books + +Метод для тестирования метода add_new_book. Проверяет возможность добавления нескольких книг. + +## 2. test_init_favorites_len_is_zero + +Проверяет, что при создании объекта класса BooksCollector, он создается с полем favorites, содержащим пустой список. + +## 3. test_init_all_genre_exist + +Проверяет, что при создании объекта класса BooksCollector, он создается с полем genre, содержащим список со следующими жанрами: `'Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'`. Принимает параметр genre - название жанраб наличие которого проверяем. Вызывается для всех вышеперечисленных жанров. + +## 4. test_add_new_book_add_book_one_more_time_not_possible + +Метод для тестирования метода add_new_book. Проверяет, что невозможно добавить одну и ту же книгу несколько раз. + +## 5. test_add_new_book_name_more_then0_and_less_then41_true + +Метод для тестирования метода add_new_book. Проверяет, что можно добавить книгу, если длина её названия в диапозоне 1-40 символов. Принимает параметр name - название книги. Вызывается для следующего набора данных: `['Я', 'Мы', 'Гордость и предубеждение', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']` + +## 6. test_add_new_book_name_more_then40_false + +Метод для тестирования метода add_new_book. Проверяет, что нельзя добавить книгу, если в ее названии более 40 символов. Принимает параметр name - название книги. Вызывается для следующего набора данных: `['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaи еще немного символов']` + +## 7. test_set_book_genre_true + +Метод для тестирования метода set_book_genre. Проверяет, что книге устанавливается жанр из жанров, перечисленных в списке в поле genre. + +## 8. test_set_book_genre_genre_is_not_exist_in_genre_list_false + +Метод для тестирования метода set_book_genre. Проверяет, что невозможно установить книге жанр, если его нет в списке жанров в поле genre. + +## 9. test_get_book_genre_true + +Метод для тестирования метода get_book_genre. Проверяет, что можно получить жанр книги по ее названию. + +## 10. test_get_books_with_specific_genre_true + +Метод для тестирования метода get_books_with_specific_genre. Проверяет, что можно получить список книг, с определенным жанром. + +## 11. test_get_books_genre_return_all_books_with_genres + +Метод для тестирования метода get_books_genre. Проверяет, что можно получить содержимое поля books_genre, в котором будут названия добавленных книг и их жанры. + +## 12. test_get_books_for_children_return_all_books_for_children + +Метод для тестирования метода get_books_for_children. Проверяет, что можно получить список книг, жанр которых не содержится в списке genre_age_rating. + +## 13. test_add_books_in_favorite_true + +Метод для тестирования метода add_book_in_favorites. Проверяем, что ранее добавленную книгу можно добавить в список избранных книг. + +## 14. test_delete_book_from_favorites_true + +Метод для тестирования метода delete_book_from_favorites. Проверяет, что из списка избранных книг можно удалить книгу. + +## 15. test_get_list_of_favorites_books_return_list_of_favorite_books + +Метод для тестирования метода get_list_of_favorites_books. Проверяет, что можно получить список всех добавленных в избранное книг. diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8a2223ab6cc973fa67e1e7cf64739a3f4db7207 GIT binary patch literal 3599 zcmbVP-A@}w5Z^oB5n~(Q3CNd?gTW?nkU&tJHX;ei2bKDv(3T4lYLTvveHg38CVM7P zA~kB$sv=6Nv{F&hs#1~KhwxO|CTW_cZT^J2Qm}Qeeac&E6!o<;cmBc{q;`S1y`9;; zo!|U+W?64)auH~KpFEjvYb4|^d?_`q*je8LodvRobP}2Ph|C;eZ4D&}R&vBj_V{Fq zFY9kWXMs!-%E*MWGD96Q>m!tt9Uys`1KA++Aa}?OAf56Kkd3kvq)ToD>6Tp}J+d2Q zlkB11M3dw-y{9voceOK_R7#CyGxRBbFIM^}ejB&ufWP$-5DVlG87C>|*=+#d%GLwm z%9{*~6x|_2W@X0!3nRFK)e=PFMkRi(72fo3^=186h6`={TJh=an1M$CPPnu3@R_GzSMuyAH$4$pm<0d zV2JJjvBa6~^XRaWP}5X38>gZdGc=i1HIuhTMC+kM6RJX^*rlvG>GiY{? z3{B2n&Q532lNX|j-BTi!{^U$FneLyxY&sPsnNDUE#oWCS;{K8XG12yec%S6`fqCvv z=brpt|2%ioYwmmx9 z+#jCKXAUxOiqQp$BH?1ym|-9P*53iKKqka`C?5k|w4IQN;8=BpU=*9B1)o4`4{VUt zXe}|L5^Etu-CzW0Avn~B0tYnQNw9>FS5vbVIz>7MYB1WUMo_hbAOIz|kZTDUEuj^6 z=q~@0?|a`$&#`=0??yzV`?11o~0JBy*M_N07(p1`~XGCm+N>H&P9Ha zrgrAHbCOVT$F3LqwshChci?UH4Sr>WdSLCoEgJpUDL+dDgq7_3CNUy<89!&U=jrm+i8np znUgp>(>L4Po61lnHl0kxDU{+$g2PQ$$hND3ceTCQwI%G;X1ED$6a=6jXxE*-yuUr? z?=$>;Isc&HA6)YvzW&<$NM2~owGA3=gR8>evikd#pRcUG@Je3n%!!gAN_WF+;s8*q zErQhQ1d?u(60g9=wyhBdwoD)pnP{7pK&n#|tcR^$0;$w!ti||aCsn(`QY?xV?wd2~ zPAr}n1-POpl`BxV2GqJ%SU|K02*9+eia_1{diaZB$h3K}^|tpjZ%*to#ID8os@Mm` zRqO@f32%ekTd?G|$l2I{Rc)(xB5JWIl^X=bY@q5)=Ayb87hhaWsae&AW{PHJs=$$I zz}edLFnmJ`fv^y|J^b15in}B45pRuNAI*6>3{S^mc-7O5fOKw71phHhSy8UdQhq!& zsic-wGE)^7EVneXx5kleY_Y&=c!;g+b?fT&tGY8_ZJ9b@bW{@Xnu`}VxaPVPWhN7! zOJU!mC>Q3UsiHga7~l literal 0 HcmV?d00001 diff --git a/__pycache__/tests.cpython-313-pytest-8.4.2.pyc b/__pycache__/tests.cpython-313-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e45f8009c3748fe5db26e4c7bf1641745127967f GIT binary patch literal 25428 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 literal 0 HcmV?d00001 diff --git a/tests.py b/tests.py index 383385e..274a328 100644 --- a/tests.py +++ b/tests.py @@ -1,3 +1,4 @@ +import pytest from main import BooksCollector # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector @@ -17,8 +18,226 @@ def test_add_new_book_add_two_books(self): collector.add_new_book('Что делать, если ваш кот хочет вас убить') # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + # словарь books_genre, который нам возвращает метод get_books_genre, имеет длину 2 + assert len(collector.get_books_genre()) == 2 # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() + + def test_init_favorites_len_is_zero(self): + collector = BooksCollector() + + assert len(collector.favorites) == 0 + + @pytest.mark.parametrize('genre', ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии']) + def test_init_all_genre_exist(self, genre): + collector = BooksCollector() + assert genre in collector.genre + + def test_add_new_book_add_book_one_more_time_not_possible(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector() + + # добавляем книгу + collector.add_new_book('Гордость и предубеждение и зомби') + # добавляем эту же книгу повторно + collector.add_new_book('Гордость и предубеждение и зомби') + + # проверяем, что книга не добавилась второй раз + # словарь books_genre, который нам возвращает метод get_books_genre, имеет длину 1 + assert len(collector.get_books_genre()) == 1 + + # проверяем добавление книги, если длина названия книги в диапозоне 1-40 + @pytest.mark.parametrize('name', ['Я', 'Мы', 'Гордость и предубеждение', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']) + def test_add_new_book_name_more_then0_and_less_then41_true(self, name): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector() + + # добавляем книгу в словарь books_genre + collector.add_new_book(name) + + # проверяем добавилась ли книга в словарь books_genre + assert len(collector.get_books_genre()) == 1 + + # проверяем, что книга не добавляется, если длина названия больше 40 символов + @pytest.mark.parametrize('name', ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaи еще немного символов']) + def test_add_new_book_name_more_then40_false(self, name): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector() + + # добавляем книгу в словарь books_genre + collector.add_new_book(name) + + # проверяем, что книга не добавилась в словарь books_genre + assert len(collector.get_books_genre()) == 0 + + # проверяем, что жанр устанавливается книге + def test_set_book_genre_true(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # создаем переменные с названием книги и жанром + book_name = 'Властелин колец' + genre = 'Фантастика' + + # добавляем книгу в словарь books_genre + collector.add_new_book(book_name) + + # устанавливаем жанр к книге + collector.set_book_genre(book_name,genre) + + # проверяем, что нужный жанр установлен к книге + assert collector.get_book_genre(book_name) == genre + + # проверяем, что жанр, которого нет в списке, не устанавливается + def test_set_book_genre_genre_is_not_exist_in_genre_list_false(self): + + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + #создаем переменные с названием книги и жанра, которого нет в списке + genre = 'Аниме' + book_name = 'Селойрмун' + + # добавляем книгу в словарь books_genre + collector.add_new_book(book_name) + + # устанавливаем жанр к книге + collector.set_book_genre(book_name, genre) + + # проверяем, что жанр, которого нет в списке, не установился и остался пустым + assert collector.get_book_genre(book_name) == '' + + # проверяем, что по имени книги получаем жанр + def test_get_book_genre_true(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # добавляем книгу в словарь books_genre + collector.add_new_book('Властелин колец') + + # устанавливаем книге жанр + collector.set_book_genre('Властелин колец', 'Фантастика') + + # проверяем, что метод get_book_genre возвращает жанр книги + assert collector.get_book_genre('Властелин колец') != None + + # проверяем, что мы можем получить список книг с определенным жанром + def test_get_books_with_specific_genre_true(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # создаем переменную со списом книг и переменную с жанром + books_list = ['Братство кольца', 'Две крепости', 'Возвращение короля'] + genre = 'Фантастика' + + # добавляем книги из списка в словарь books_genre и устанавливаем им жанр + for book in books_list: + collector.add_new_book(book) + collector.set_book_genre(book, genre) + + # проверяем, что при список получаемый по жанру в переменной genre соответтствует списку books_list + assert collector.get_books_with_specific_genre(genre) == books_list + + # проверяем, что метод get_books_genre возвращает список books_genre + def test_get_books_genre_return_all_books_with_genres(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # объявляем переменные books_list и genres_list со списками книг и жанров + + books_list = ['Братство кольца', 'Две крепости', 'Возвращение короля'] + genres_list = ['Фантастика', 'Ужасы', 'Детективы'] + + # добавляем книги из списка в словарь books_genre и устанавливаем им жанр + for index, book in enumerate(books_list): + collector.add_new_book(book) + collector.set_book_genre(book, genres_list[index]) + + # получаем словарь books_genre + books_genre = collector.get_books_genre() + + # проверяем что books_genre содержит все книги с их жанрами + assert len(books_genre) == len(books_list) + + for index, book in enumerate(books_list): + assert book in books_genre and books_genre[book] == genres_list[index] + + # проверяем, что метод get_books_for_children возвращает все книги подходящие детям + def test_get_books_for_children_return_all_books_for_children(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # добавляем книгу для взрослях и устанавливаем ей жанр из списка genre_age_rating + adult_book = 'Книга для взрослых' + adult_genre = 'Ужасы' + + collector.add_new_book(adult_book) + collector.set_book_genre(adult_book, adult_genre) + + # добавляем книгу для детей и устанавливаем ей жанр не входящий в список genre_age_rating + children_book = 'Книга для детей' + children_genre = 'Фантастика' + + collector.add_new_book(children_book) + collector.set_book_genre(children_book, children_genre) + + # проверяем, что метод get_books_for_children возвращает только книги подходящие детям + child_books_list = collector.get_books_for_children() + + assert len(child_books_list) == 1 and children_book in child_books_list + + # проверяем, что книгу можно добавить в избранное + def test_add_books_in_favorite_true(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # создаем переменную с названием книги + book_name = 'Властелин колец' + + # добавляем книгу в словарь books_genre + collector.add_new_book(book_name) + + # добавляем книгу в избранное + collector.add_book_in_favorites(book_name) + + # проворяем, что книга добавилась в избранное + # список favorites, который нам возвращает метод get_list_of_favorites_books имеет длинну 1 + assert len(collector.get_list_of_favorites_books()) == 1 + + # проверяем, что книга удаляется из избранного + def test_delete_book_from_favorites_true(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # добавляем 3 книги в избранное + books_list = ['Братство кольца', 'Две крепости', 'Возвращение короля'] + for book in books_list: + collector.add_new_book(book) + collector.add_book_in_favorites(book) + + # удаляем одну книгу из избранного + collector.delete_book_from_favorites('Возвращение короля') + + # проверяем, что в избранном только 2 книги + # список favorites, который нам возвращает метод get_list_of_favorites_books имеет длинну 2 + assert len(collector.get_list_of_favorites_books()) == 2 + + # проверяем, что метод get_list_of_favorites_books возвращает список избранных книг + def test_get_list_of_favorites_books_return_list_of_favorite_books(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector () + + # создаем переменную с названием книги + book_name = 'Властелин колец' + + # добавляем книгу в словарь books_genre + collector.add_new_book(book_name) + + # добавляем книгу в избранное + collector.add_book_in_favorites(book_name) + + # проверяем, что метод get_list_of_favorites_books возвращает список ибранных книг + assert book_name in collector.get_list_of_favorites_books() + + From ab2fd393095e71afa3cf14b39627def30adcca1e Mon Sep 17 00:00:00 2001 From: Elena Dyshpan Date: Wed, 17 Sep 2025 21:22:51 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D1=8C=D1=8E=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conftest.cpython-313-pytest-8.4.2.pyc | Bin 0 -> 514 bytes .../tests.cpython-313-pytest-8.4.2.pyc | Bin 25428 -> 20996 bytes conftest.py | 9 + tests.py | 169 ++++++------------ 4 files changed, 65 insertions(+), 113 deletions(-) create mode 100644 __pycache__/conftest.cpython-313-pytest-8.4.2.pyc create mode 100644 conftest.py diff --git a/__pycache__/conftest.cpython-313-pytest-8.4.2.pyc b/__pycache__/conftest.cpython-313-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42e4d5d8090948b7e1a15f882c4d133706874e99 GIT binary patch literal 514 zcmYLEzfZzY5Wd%zwtyI-ILLqEa2Vv$B@@m`6tVKi}c;*a28 zaWZjxizMn`Tr~X$yjLh(^6tLxetdT?NTm`$ru@9Lo+*Av5}7gu!5M)eRG`92fGmtk zQRRvSMGa%tq@trv6{TbpO*Ad2>L*K)&^%VuENo9HCazds`Y^RD@!*KXSl z-^0dyh|VLT(hIWWhH%cJVx;B5DXc@Dl~K0knTR(cAugLOv3ayp?e_ha=T>j(wF#`z)iMF)AfFWGMbBybj?2Zuez#wn zu~oT3s?|BS(RVzzfc7mqzAfUjlrW-Pf`(;#t&T#UK%sT&j*A-Y5k}Lw^LuEAH;n*I zN}?ev=5EKk?6vJZTqY{N$~VaUs*JIBfJb;peZkt88Be+U+@GSdl|Th09imX?A7O2K A5&!@I literal 0 HcmV?d00001 diff --git a/__pycache__/tests.cpython-313-pytest-8.4.2.pyc b/__pycache__/tests.cpython-313-pytest-8.4.2.pyc index e45f8009c3748fe5db26e4c7bf1641745127967f..b043c53180763056bffc0d3b8b55eec75562916c 100644 GIT binary patch literal 20996 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 diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..30a6a33 --- /dev/null +++ b/conftest.py @@ -0,0 +1,9 @@ +import pytest + +from main import BooksCollector + +@pytest.fixture +def collector(): + collector = BooksCollector() + + return collector \ No newline at end of file diff --git a/tests.py b/tests.py index 274a328..3c482b7 100644 --- a/tests.py +++ b/tests.py @@ -9,35 +9,26 @@ class TestBooksCollector: # обязательно указывать префикс test_ # дальше идет название метода, который тестируем add_new_book_ # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() - + def test_add_new_book_add_two_books(self, collector): # добавляем две книги collector.add_new_book('Гордость и предубеждение и зомби') collector.add_new_book('Что делать, если ваш кот хочет вас убить') # проверяем, что добавилось именно две - # словарь books_genre, который нам возвращает метод get_books_genre, имеет длину 2 - assert len(collector.get_books_genre()) == 2 + # словарь books_genre имеет длину 2 + assert len(collector.books_genre) == 2 # напиши свои тесты ниже # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() - def test_init_favorites_len_is_zero(self): - collector = BooksCollector() - + def test_init_favorites_len_is_zero(self, collector): assert len(collector.favorites) == 0 @pytest.mark.parametrize('genre', ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии']) - def test_init_all_genre_exist(self, genre): - collector = BooksCollector() + def test_init_all_genre_exist(self, genre, collector): assert genre in collector.genre - def test_add_new_book_add_book_one_more_time_not_possible(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() - + def test_add_new_book_add_book_one_more_time_not_possible(self, collector): # добавляем книгу collector.add_new_book('Гордость и предубеждение и зомби') # добавляем эту же книгу повторно @@ -45,142 +36,109 @@ def test_add_new_book_add_book_one_more_time_not_possible(self): # проверяем, что книга не добавилась второй раз # словарь books_genre, который нам возвращает метод get_books_genre, имеет длину 1 - assert len(collector.get_books_genre()) == 1 + assert len(collector.books_genre) == 1 # проверяем добавление книги, если длина названия книги в диапозоне 1-40 @pytest.mark.parametrize('name', ['Я', 'Мы', 'Гордость и предубеждение', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']) - def test_add_new_book_name_more_then0_and_less_then41_true(self, name): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() - + def test_add_new_book_name_more_then0_and_less_then41_true(self, name, collector): # добавляем книгу в словарь books_genre collector.add_new_book(name) # проверяем добавилась ли книга в словарь books_genre - assert len(collector.get_books_genre()) == 1 + assert len(collector.books_genre) == 1 # проверяем, что книга не добавляется, если длина названия больше 40 символов @pytest.mark.parametrize('name', ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaи еще немного символов']) - def test_add_new_book_name_more_then40_false(self, name): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() - + def test_add_new_book_name_more_then40_false(self, name, collector): # добавляем книгу в словарь books_genre collector.add_new_book(name) # проверяем, что книга не добавилась в словарь books_genre - assert len(collector.get_books_genre()) == 0 + assert len(collector.books_genre) == 0 # проверяем, что жанр устанавливается книге - def test_set_book_genre_true(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - + def test_set_book_genre_true(self, collector): # создаем переменные с названием книги и жанром book_name = 'Властелин колец' genre = 'Фантастика' # добавляем книгу в словарь books_genre - collector.add_new_book(book_name) + collector.books_genre[book_name] = '' # устанавливаем жанр к книге collector.set_book_genre(book_name,genre) # проверяем, что нужный жанр установлен к книге - assert collector.get_book_genre(book_name) == genre + assert collector.books_genre[book_name] == genre # проверяем, что жанр, которого нет в списке, не устанавливается - def test_set_book_genre_genre_is_not_exist_in_genre_list_false(self): - - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - + def test_set_book_genre_genre_is_not_exist_in_genre_list_false(self, collector): #создаем переменные с названием книги и жанра, которого нет в списке genre = 'Аниме' book_name = 'Селойрмун' # добавляем книгу в словарь books_genre - collector.add_new_book(book_name) + collector.books_genre[book_name] = '' # устанавливаем жанр к книге collector.set_book_genre(book_name, genre) # проверяем, что жанр, которого нет в списке, не установился и остался пустым - assert collector.get_book_genre(book_name) == '' + assert collector.books_genre[book_name] == '' # проверяем, что по имени книги получаем жанр - def test_get_book_genre_true(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - - # добавляем книгу в словарь books_genre - collector.add_new_book('Властелин колец') - - # устанавливаем книге жанр - collector.set_book_genre('Властелин колец', 'Фантастика') + def test_get_book_genre_true(self, collector): + # добавляем книгу в словарь books_genre с жанром 'Фантастика' + collector.books_genre['Властелин колец'] = 'Фантастика' # проверяем, что метод get_book_genre возвращает жанр книги - assert collector.get_book_genre('Властелин колец') != None + assert collector.get_book_genre('Властелин колец') == 'Фантастика' # проверяем, что мы можем получить список книг с определенным жанром - def test_get_books_with_specific_genre_true(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - + def test_get_books_with_specific_genre_true(self, collector): # создаем переменную со списом книг и переменную с жанром - books_list = ['Братство кольца', 'Две крепости', 'Возвращение короля'] + fantastic_books_list = ['Братство кольца', 'Две крепости', 'Возвращение короля'] genre = 'Фантастика' # добавляем книги из списка в словарь books_genre и устанавливаем им жанр - for book in books_list: - collector.add_new_book(book) - collector.set_book_genre(book, genre) - - # проверяем, что при список получаемый по жанру в переменной genre соответтствует списку books_list - assert collector.get_books_with_specific_genre(genre) == books_list + for book in fantastic_books_list: + collector.books_genre[book] = genre - # проверяем, что метод get_books_genre возвращает список books_genre - def test_get_books_genre_return_all_books_with_genres(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () + # добавляем книгу с другим жанром + collector.books_genre['Винни-пух'] = 'Ужасы' - # объявляем переменные books_list и genres_list со списками книг и жанров + # проверяем, что при список получаемый по жанру в переменной genre соответтствует списку fantastic_books_list + assert collector.get_books_with_specific_genre(genre) == fantastic_books_list - books_list = ['Братство кольца', 'Две крепости', 'Возвращение короля'] - genres_list = ['Фантастика', 'Ужасы', 'Детективы'] + # проверяем, что метод get_books_genre возвращает список books_genre + def test_get_books_genre_return_all_books_with_genres(self, collector): + # объявляем словарь books_list c книгами и их жанрами + books_list = { + 'Братство кольца': 'Фантастика', + 'Две крепости': 'Ужасы', + 'Возвращение короля': 'Детективы' + } # добавляем книги из списка в словарь books_genre и устанавливаем им жанр - for index, book in enumerate(books_list): - collector.add_new_book(book) - collector.set_book_genre(book, genres_list[index]) - - # получаем словарь books_genre - books_genre = collector.get_books_genre() + for book, genre in books_list.items(): + collector.books_genre[book] = genre - # проверяем что books_genre содержит все книги с их жанрами - assert len(books_genre) == len(books_list) - - for index, book in enumerate(books_list): - assert book in books_genre and books_genre[book] == genres_list[index] + # проверяем что словарь books_genre содержит все книги с их жанрами + assert collector.get_books_genre() == books_list # проверяем, что метод get_books_for_children возвращает все книги подходящие детям - def test_get_books_for_children_return_all_books_for_children(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - + def test_get_books_for_children_return_all_books_for_children(self, collector): # добавляем книгу для взрослях и устанавливаем ей жанр из списка genre_age_rating adult_book = 'Книга для взрослых' adult_genre = 'Ужасы' - collector.add_new_book(adult_book) - collector.set_book_genre(adult_book, adult_genre) + collector.books_genre[adult_book] = adult_genre # добавляем книгу для детей и устанавливаем ей жанр не входящий в список genre_age_rating children_book = 'Книга для детей' children_genre = 'Фантастика' - collector.add_new_book(children_book) - collector.set_book_genre(children_book, children_genre) + collector.books_genre[children_book] = children_genre # проверяем, что метод get_books_for_children возвращает только книги подходящие детям child_books_list = collector.get_books_for_children() @@ -188,54 +146,39 @@ def test_get_books_for_children_return_all_books_for_children(self): assert len(child_books_list) == 1 and children_book in child_books_list # проверяем, что книгу можно добавить в избранное - def test_add_books_in_favorite_true(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - + def test_add_books_in_favorite_true(self, collector): # создаем переменную с названием книги book_name = 'Властелин колец' # добавляем книгу в словарь books_genre - collector.add_new_book(book_name) + collector.books_genre[book_name] = '' # добавляем книгу в избранное collector.add_book_in_favorites(book_name) # проворяем, что книга добавилась в избранное - # список favorites, который нам возвращает метод get_list_of_favorites_books имеет длинну 1 - assert len(collector.get_list_of_favorites_books()) == 1 + # список favorites имеет длинну 1 + assert len(collector.favorites) == 1 # проверяем, что книга удаляется из избранного - def test_delete_book_from_favorites_true(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - - # добавляем 3 книги в избранное - books_list = ['Братство кольца', 'Две крепости', 'Возвращение короля'] - for book in books_list: - collector.add_new_book(book) - collector.add_book_in_favorites(book) - + def test_delete_book_from_favorites_true(self, collector): + # добавляем список из 3-х книг в избранное + collector.favorites = ['Братство кольца', 'Две крепости', 'Возвращение короля'] + # удаляем одну книгу из избранного collector.delete_book_from_favorites('Возвращение короля') # проверяем, что в избранном только 2 книги # список favorites, который нам возвращает метод get_list_of_favorites_books имеет длинну 2 - assert len(collector.get_list_of_favorites_books()) == 2 + assert len(collector.favorites) == 2 # проверяем, что метод get_list_of_favorites_books возвращает список избранных книг - def test_get_list_of_favorites_books_return_list_of_favorite_books(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector () - + def test_get_list_of_favorites_books_return_list_of_favorite_books(self, collector): # создаем переменную с названием книги book_name = 'Властелин колец' - # добавляем книгу в словарь books_genre - collector.add_new_book(book_name) - - # добавляем книгу в избранное - collector.add_book_in_favorites(book_name) + # добавляем книгу в список избранное + collector.favorites.append(book_name) # проверяем, что метод get_list_of_favorites_books возвращает список ибранных книг assert book_name in collector.get_list_of_favorites_books()