From 324091b9e7e24aa922444a13fd604ef5dcbb1911 Mon Sep 17 00:00:00 2001 From: Heavy Date: Sun, 26 Oct 2025 23:05:42 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B5?= =?UTF-8?q?=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/main.cpython-313.pyc | Bin 0 -> 3596 bytes tests.py | 90 ++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 __pycache__/main.cpython-313.pyc diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e179ef17c3ca4f943687a10c1bccd5a62b9c48c GIT binary patch literal 3596 zcmbVPTTdHD6rNpsiLs4$1>|PqV6aJ8NFXSrjYxuWp;Fo^wDkrFwMd(dy%?*;CbK3{ zA~kB$sv=6HG*VI1s#1~KhwxO|CTW_cm!Gg(3byvOPkBp?(!NzaXV*83L23s$J2U6Z z?K|I`Gpsc=xe1iN&i^yj)=0=7*eDfev9h)cD)VF)=_C^I6Nx#@+8Rm{tmuf9?D5MK z8*8saWu8nB%1DH=5nGGHIY4rf6J&$Lf!roFfOJXQKsHJ)kZ!3Fq(^dt^hzF( zO_G=T5>2Ad^qtCN-qucMQYkf-&CsW~UaYhzu8muBz~9;khDVkJjE3q3f4RT4yWj*8rDE41{l^dJP2X zo6noE`LX^0^bhpMmese$&DkB;{kieJ{-bfrxNdv^gQ2EB0hJF`pXopAPhiA-P&}dy z&_%a_Sah163wU5Tp{A*7Hcl#+GBlZ0HIuV@1nVO!300;_HknQ=GNw~gQF^7vD>n?W2d%#o7TU^PeVxh6e*&%R&0tiZWt%Z=+*bqq&$x(mJF=ii3 zl(2rl*H3ZQry>ZGhz<&Of|!nknl&9MHND7EbeHK&E7Pim#|wohk3C)`9+%VVWf|RN z25L~ORw7}vQy>6Iz9q-E8+?0?4;y@VVI;?k1~1-I?uVD+--#=ICmvl`?K_e0+BY|n z^R^k@w!7zk^L9RSkp7d5&WjY;7OTb#>-e{J9>hEu7wVyW6m&{EA>*NFwTGY=i=~A# zf!6L=C#%s~WJX2SLWp|62+%@ss2>G(Xte`cP#+j=)_1k9HA4_rT!NQFlU}?gp{W z|309|R;OF9#%QA99CbLb%!|6K=-TR&lrPY)Fm9golQaaXdM+wm6Xg|fqOhrp!O!)_ zN6Qxr7Als*#cvBa6C`97_BAs&esXA>kT}%OdSNa$iV>@(j5$h|H$=_?<%-wjWH2HEeJ0)u~YAiXKjM*fzxMsRhZ+B?8cc5H} zbioqtb%&e#YdE;2HD*B#0SBi=_Uf(oS0w@tXmfuZ_{SH zE#b)6I5vT)9ro>*#8-}ECyPCs9@o-$;CQ^kRjkxq?He~&rs6|ub3jGNqV=d)FP>LX z3GSptrSSN{D9%|^jsgf4y&!vn1!l#Xg0af7fDk^$L@`*`lrgr7fI~$BG9}n?vj(4GtQ8iC$iV893rtOgFJSCl!IlP7uso+xtV{S&DHwXPK=5N!|yU|N+$An$%L{OK@6+Pu*EiSLdtCv+J? z*Ft4T54eP<1+UN!^HxKdz?KtZG9u zNi)+`;D|NgY;Jl8*3iNrEQCH8zB9b+>BxJ9+oLx|bKVZa+p!Q?@$N%FIyVM_{}`n# zFV{w?0N$EZQp?Jj$;uI|V`*kj%|W)X#RRY6CAOm1?Q1u#>8_x)W$J?7QIW@IE|niUz}A^MGY^@lS!&&Q^~ZN&d4$qU@#4!fc!;hCklKXQn($29z=m4 z(ic%cgdyg3S=O@f7>~(HHcOKiX5qaq%ZtR`48CkAhIUIJf*OXz4@tr4 Date: Thu, 6 Nov 2025 19:51:25 +0300 Subject: [PATCH 2/3] second repair --- main.py | 2 +- tests.py | 163 +++++++++++++++++++------------------------------------ 2 files changed, 58 insertions(+), 107 deletions(-) diff --git a/main.py b/main.py index d3e0a17..8286cdf 100644 --- a/main.py +++ b/main.py @@ -54,4 +54,4 @@ def delete_book_from_favorites(self, name): # получаем список Избранных книг def get_list_of_favorites_books(self): - return self.favorites + return self.favorites \ No newline at end of file diff --git a/tests.py b/tests.py index 3c0d356..1d23d32 100644 --- a/tests.py +++ b/tests.py @@ -1,112 +1,63 @@ +# -*- coding: utf-8 -*- from main import BooksCollector +import pytest -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test -class TestBooksCollector: - - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() - - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') - - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 - - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() - # Тестирование добавления одной книги - def test_add_new_book_single_book(self): - collector = BooksCollector() - collector.add_new_book('Война и мир') - assert 'Война и мир' in collector.books_genre - # Тестирование установки жанра книги - @pytest.mark.parametrize("book_name, genre", - [("Гарри Поттер", "Фантастика"), - ("Оно", "Ужасы"), - ("Шерлок Холмс", "Детективы")]) - def test_set_book_genre(self, book_name, genre): - collector = BooksCollector() - collector.add_new_book(book_name) - collector.set_book_genre(book_name, genre) - assert collector.get_book_genre(book_name) == genre +@pytest.fixture +def books(): + return BooksCollector() - # Тестирование получения жанра книги - @pytest.mark.parametrize("book_name, genre", - [("Алиса в стране чудес", "Мультфильмы"), - ("Франкенштейн", "Ужасы"), - ("Код да Винчи", "Детективы")]) - def test_get_book_genre(self, book_name, genre): - collector = BooksCollector() - collector.add_new_book(book_name) - collector.set_book_genre(book_name, genre) - assert collector.get_book_genre(book_name) == genre - # Тестирование фильтрации по жанру - @pytest.mark.parametrize("genre, books", - [("Ужасы", ["Оно", "Франкенштейн"]), - ("Детективы", ["Шерлок Холмс", "Код да Винчи"])]) - def test_get_books_with_specific_genre(self, genre, books): - collector = BooksCollector() - for book in books: - collector.add_new_book(book) - collector.set_book_genre(book, genre) - result = collector.get_books_with_specific_genre(genre) - assert set(result) == set(books) - - # Тестирование получения всех книг - def test_get_books_genre(self): - collector = BooksCollector() - books = ["Война и мир", "Гарри Поттер", "Маленький принц"] - for book in books: - collector.add_new_book(book) - books_dict = collector.get_books_genre() - for book in books: - assert book in books_dict - - # Тестирование детских книг - @pytest.mark.parametrize("book_name, genre", - [("Колобок", "Мультфильмы"), - ("Теремок", "Мультфильмы"), - ("Дюймовочка", "Мультфильмы")]) - def test_get_books_for_children(self, book_name, genre): - collector = BooksCollector() - collector.add_new_book(book_name) - collector.set_book_genre(book_name, genre) - children_books = collector.get_books_for_children() - assert book_name in children_books - - # Тестирование избранного - @pytest.mark.parametrize("book_name", - ["Властелин колец", - "Гарри Поттер", - "Маленький принц"]) - def test_favorites_functionality(self, book_name): - collector = BooksCollector() - collector.add_new_book(book_name) - collector.add_book_in_favorites(book_name) - assert book_name in collector.favorites +class TestBooksCollector: - -# Тестирование удаления из избранного -@pytest.mark.parametrize("book_name", -["Властелин колец", "Гарри Поттер", "Маленький принц"]) -def test_delete_from_favorites(self, book_name): - collector = BooksCollector() - collector.add_new_book(book_name) - collector.add_book_in_favorites(book_name) - - # Проверяем добавление в избранное - assert book_name in collector.favorites - - # Удаляем и проверяем удаление - collector.delete_book_from_favorites(book_name) - assert book_name not in collector.favorites \ No newline at end of file + @pytest.mark.parametrize('name', ['The Witcher', 'The Witcher 2', 'Sherlock']) + def test_add_new_book(self, books, name): + check = len(books.books_genre) + books.add_new_book(name) + assert check + 1 == len(books.books_genre) + + @pytest.mark.parametrize('name,genre', [['The Witcher', 'Фантастика'], ['The Witcher 2', 'Фантастика'], + ['Sherlock', 'Детективы']]) + def test_set_book_genre(self, books, name, genre): + if name not in books.books_genre: + books.add_new_book(name) + books.set_book_genre(name, genre) + print(books.books_genre) + assert books.books_genre[name] == genre + + def test_get_book_genre(self, books): + books.add_new_book('The Witcher') + books.set_book_genre('The Witcher', 'Фантастика') + assert books.get_book_genre('The Witcher') == 'Фантастика' + + def test_get_books_with_specific_genre(self, books): + books.books_genre = {'Sherlock': 'Детективы', 'The Witcher 2': 'Фантастика', 'The Witcher': 'Фантастика'} + result = len(books.get_books_with_specific_genre('Фантастика')) + assert result == 2 + + def test_get_books_genre(self, books): + books.books_genre = {'Sherlock': 'Детективы', 'The Witcher 2': 'Фантастика', 'The Witcher': 'Фантастика'} + assert books.get_books_genre() == books.books_genre + + def test_get_books_for_children(self, books): + books.books_genre = {'Sherlock': 'Детективы', 'The Witcher 2': 'Фантастика', 'The Witcher': 'Фантастика'} + children_books = {'The Witcher', 'The Witcher 2'} + result = books.get_books_for_children() + assert set(result) == children_books + + def test_add_book_in_favorites(self, books): + books.books_genre = {'Sherlock': 'Детективы', 'The Witcher 2': 'Фантастика', 'The Witcher': 'Фантастика'} + books.add_book_in_favorites('The Witcher 2') + assert 'The Witcher 2' in books.favorites + + def test_delete_book_from_favorites(self, books): + books.books_genre = {'Sherlock': 'Детективы', 'The Witcher 2': 'Фантастика', 'The Witcher': 'Фантастика'} + books.add_book_in_favorites('The Witcher 2') + books.delete_book_from_favorites('The Witcher 2') + assert 'The Witcher 2' not in books.favorites + + def test_get_list_of_favorites_books(self, books): + books.books_genre = {'Sherlock': 'Детективы', 'The Witcher 2': 'Фантастика', 'The Witcher': 'Фантастика'} + books.add_book_in_favorites('The Witcher 2') + books.add_book_in_favorites('The Witcher') + assert books.get_list_of_favorites_books() == ['The Witcher 2', 'The Witcher'] From baeaa6d49d565a5b97d852304ac812bede5f4e9e Mon Sep 17 00:00:00 2001 From: Heavy Date: Sat, 8 Nov 2025 12:02:00 +0300 Subject: [PATCH 3/3] last --- __pycache__/tests.cpython-313-pytest-8.4.2.pyc | Bin 0 -> 14201 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 __pycache__/tests.cpython-313-pytest-8.4.2.pyc 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..22093bd86c320af9c534e8352e425d64cad1c646 GIT binary patch literal 14201 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 b