From 923b44ae463932aa5cd560b1c32c66b4cbe4695b Mon Sep 17 00:00:00 2001 From: Ivan Nosovets Date: Fri, 30 Jan 2026 10:50:32 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=A1=D0=BF=D1=80=D0=B8=D0=BD=D1=82=204:?= =?UTF-8?q?=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D1=8B=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | Bin 161 -> 76 bytes __pycache__/main.cpython-38.pyc | Bin 0 -> 2030 bytes __pycache__/test.cpython-38-pytest-7.1.2.pyc | Bin 0 -> 8183 bytes tests.py | 236 +++++++++++++++++-- 4 files changed, 219 insertions(+), 17 deletions(-) create mode 100644 __pycache__/main.cpython-38.pyc create mode 100644 __pycache__/test.cpython-38-pytest-7.1.2.pyc diff --git a/.gitignore b/.gitignore index 1a1a7376f027a16eb5176a99803b73eb88d1caf5..aac0cbd117f68a36651045de2325d53bf49d538c 100644 GIT binary patch literal 76 zcmezWFPcf&6#|eFk0zE(R?IJ*XUr2Vs{0RTMLn0M#ILKvV+& DX_5`d literal 161 zcmXYqF%H5o3`KXJqEa`8XGr3*@$E&6=c@cGCFn<>MF4sa*K)L3)H7%IHD=q#;kjgyiVL{oW k12Z^ug%^Tzdd{PmIJVDW*n?R`mq^R^NWN{$D{sp115E=n!2kdN diff --git a/__pycache__/main.cpython-38.pyc b/__pycache__/main.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5786eeb8eea4dc1762353e0d9309eb8d1407edbf GIT binary patch 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@`> literal 0 HcmV?d00001 diff --git a/__pycache__/test.cpython-38-pytest-7.1.2.pyc b/__pycache__/test.cpython-38-pytest-7.1.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2898a8a207c1ae4014c5ac436acbbfebcdd6cd4 GIT binary patch literal 8183 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 Date: Fri, 30 Jan 2026 16:34:34 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D1=82=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=B2=D1=81=D0=B5=20=D0=BF=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=8F=D1=82=D1=8C=20tests.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 449 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 368 insertions(+), 81 deletions(-) diff --git a/tests.py b/tests.py index dc86ab8..1eb88f7 100644 --- a/tests.py +++ b/tests.py @@ -3,21 +3,81 @@ class TestBooksCollector: - # Тест 1: Проверка инициализации коллектора - def test_init_books_collector(self): - collector = BooksCollector() - assert collector.books_genre == {} - assert collector.favorites == [] + # Тест 1: Проверка инициализации и базовых методов коллектора +def test_init_and_basic_methods(self): + """Проверяем что коллектор инициализируется и базовые методы работают""" + collector = BooksCollector() + + # Проверяем через методы, а не через атрибуты + assert collector.get_books_genre() == {} # через метод get_books_genre() + assert collector.get_list_of_favorites_books() == [] # через метод get_list_of_favorites_books() + + # Проверяем что можем добавить книгу + collector.add_new_book('Тестовая книга') + assert len(collector.get_books_genre()) == 1 # через метод + + # Проверяем что можем добавить в избранное + collector.add_book_in_favorites('Тестовая книга') + assert len(collector.get_list_of_favorites_books()) == 1 # через метод assert collector.genre == ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] assert collector.genre_age_rating == ['Ужасы', 'Детективы'] # Тест 2: Параметризованный тест для добавления новой книги - @pytest.mark.parametrize('book_name, expected', [ - ('Война и мир', True), # валидное название - ('A' * 40, True), # граничное значение (40 символов) - ('Книга', True), # обычное название - ('', False), # пустая строка - ('A' * 41, False), # слишком длинное название (41 символ) + @pytest.mark.parametrize('valid_book_name', [ + 'Война и мир', # валидное название + 'A' * 40, # граничное значение (40 символов) + 'Книга', # обычное название + '1984', # название с цифрами + 'Book Name', # название с пробелом + 'Книга с запятой, и точкой.', # название со знаками препинания +]) +def test_add_new_book_success(self, valid_book_name): + """Проверяем успешное добавление книги с валидными названиями""" + collector = BooksCollector() + collector.add_new_book(valid_book_name) + + # Проверяем что книга добавилась + assert valid_book_name in collector.get_books_genre() + # Проверяем что жанр не установлен (пустая строка) + assert collector.get_book_genre(valid_book_name) == '' + + +# Тест 2.2: Неуспешное добавление книги (невалидные данные) +@pytest.mark.parametrize('invalid_book_name', [ + '', # пустая строка + 'A' * 41, # слишком длинное название (41 символ) + ' ', # только пробелы + '\n', # только перенос строки + '\t', # только табуляция +]) +def test_add_new_book_failure(self, invalid_book_name): + """Проверяем что книга с невалидным названием не добавляется""" + collector = BooksCollector() + collector.add_new_book(invalid_book_name) + + # Проверяем что книга НЕ добавилась + assert invalid_book_name not in collector.get_books_genre() + # Проверяем что коллекция осталась пустой + assert len(collector.get_books_genre()) == 0 + + +# Тест 2.3: Добавление дубликата книги +def test_add_new_book_duplicate(self): + """Проверяем что книгу нельзя добавить дважды""" + collector = BooksCollector() + book_name = 'Дубликат' + + # Первое добавление + collector.add_new_book(book_name) + assert book_name in collector.get_books_genre() + assert len(collector.get_books_genre()) == 1 + + # Второе добавление той же книги + collector.add_new_book(book_name) + + # Проверяем что книга осталась одна + assert book_name in collector.get_books_genre() + assert len(collector.get_books_genre()) == 1 ]) def test_add_new_book(self, book_name, expected): collector = BooksCollector() @@ -113,38 +173,142 @@ def test_get_books_for_children(self): ] # Добавляем все книги - for name, genre in children_books + adult_books: - collector.add_new_book(name) - collector.set_book_genre(name, genre) - - children_only = collector.get_books_for_children() - - # Проверяем, что только детские книги - assert len(children_only) == 3 - for name, _ in children_books: - assert name in children_only - - for name, _ in adult_books: - assert name not in children_only + def test_get_books_for_children_includes_children_books(self): + """Детские книги включаются в результат""" + collector = BooksCollector() + + # Только детские книги + children_books = [ + ('Мультфильм 1', 'Мультфильмы'), + ('Фантастика 1', 'Фантастика'), + ('Комедия 1', 'Комедии'), + ] + + for name, genre in children_books: + collector.add_new_book(name) + collector.set_book_genre(name, genre) + + result = collector.get_books_for_children() + + # Проверяем что все детские книги в результате + assert len(result) == 3 + for name, _ in children_books: + assert name in result + + +# Тест 2: Проверка что взрослые книги НЕ возвращаются +def test_get_books_for_children_excludes_adult_books(self): + """Взрослые книги не включаются в результат""" + collector = BooksCollector() + + # Только взрослые книги + adult_books = [ + ('Ужасы 1', 'Ужасы'), + ('Детектив 1', 'Детективы'), + ] + + for name, genre in adult_books: + collector.add_new_book(name) + collector.set_book_genre(name, genre) + + result = collector.get_books_for_children() + + # Проверяем что результат пуст + assert len(result) == 0 + for name, _ in adult_books: + assert name not in result + + +# Тест 3: Проверка смешанного списка +def test_get_books_for_children_mixed_books(self): + """При смешанном списке возвращаются только детские книги""" + collector = BooksCollector() + + children_books = [('Мультфильм', 'Мультфильмы')] + adult_books = [('Ужасы', 'Ужасы')] + + # Добавляем все книги + all_books = children_books + adult_books + for name, genre in all_books: + collector.add_new_book(name) + collector.set_book_genre(name, genre) + + result = collector.get_books_for_children() + + # Проверяем что только детская книга в результате + assert len(result) == 1 + assert children_books[0][0] in result + assert adult_books[0][0] not in result + + +# Тест 4: Проверка пустого результата +def test_get_books_for_children_empty(self): + """Если нет подходящих книг, возвращается пустой список""" + collector = BooksCollector() + + # Не добавляем книги вообще + result = collector.get_books_for_children() + + assert isinstance(result, list) + assert len(result) == 0 # Тест 10: Параметризованный тест для добавления в избранное - @pytest.mark.parametrize('book_in_dict, expected_in_favorites', [ - (True, True), # книга в словаре → добавляется в избранное - (False, False), # книги нет в словаре → не добавляется - ]) - def test_add_book_in_favorites(self, book_in_dict, expected_in_favorites): - collector = BooksCollector() - book_name = 'Избранная книга' - - if book_in_dict: - collector.add_new_book(book_name) - - collector.add_book_in_favorites(book_name) - - if expected_in_favorites: - assert book_name in collector.favorites - else: - assert book_name not in collector.favorites + def test_add_book_in_favorites_success(self): + """Книга из словаря успешно добавляется в избранное""" + collector = BooksCollector() + book_name = 'Избранная книга' + + # 1. Добавляем книгу в словарь + collector.add_new_book(book_name) + + # 2. Добавляем в избранное + collector.add_book_in_favorites(book_name) + + # 3. Проверяем через метод (не через атрибут!) + favorites = collector.get_list_of_favorites_books() + assert book_name in favorites + assert len(favorites) == 1 + + +# Тест 2: Попытка добавить несуществующую книгу в избранное +def test_add_book_in_favorites_failure(self): + """Несуществующая книга не добавляется в избранное""" + collector = BooksCollector() + book_name = 'Несуществующая книга' + + # Книгу НЕ добавляем в словарь + + # Пытаемся добавить в избранное + collector.add_book_in_favorites(book_name) + + # Проверяем что избранное осталось пустым + favorites = collector.get_list_of_favorites_books() + assert book_name not in favorites + assert len(favorites) == 0 + + +# Тест 3: Нельзя добавить одну книгу в избранное дважды +def test_add_book_in_favorites_duplicate(self): + """Книгу нельзя добавить в избранное дважды""" + collector = BooksCollector() + book_name = 'Дубликат в избранном' + + # Добавляем книгу в словарь + collector.add_new_book(book_name) + + # Первое добавление в избранное + collector.add_book_in_favorites(book_name) + favorites = collector.get_list_of_favorites_books() + assert book_name in favorites + assert len(favorites) == 1 + + # Второе добавление в избранное + collector.add_book_in_favorites(book_name) + + # Проверяем что книга не добавилась второй раз + favorites = collector.get_list_of_favorites_books() + assert book_name in favorites + assert len(favorites) == 1 # Тест 11: Нельзя добавить книгу в избранное дважды def test_add_book_in_favorites_twice(self): @@ -159,22 +323,86 @@ def test_add_book_in_favorites_twice(self): assert collector.favorites == [book_name] # Тест 12: Удаление книги из избранного - def test_delete_book_from_favorites(self): - collector = BooksCollector() - book_name = 'Удаляемая книга' - - 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 - assert collector.favorites == [] + def test_delete_book_from_favorites_success(self): + """Книга успешно удаляется из избранного""" + collector = BooksCollector() + book_name = 'Удаляемая книга' + + # Подготовка: добавляем книгу в избранное + collector.add_new_book(book_name) + collector.add_book_in_favorites(book_name) + + # Действие: удаляем книгу из избранного + collector.delete_book_from_favorites(book_name) + + # Проверка: книги нет в избранном + favorites = collector.get_list_of_favorites_books() + assert book_name not in favorites - # Тест 13: Удаление несуществующей книги из избранного + +# Тест 2: Удаление несуществующей книги из избранного +def test_delete_nonexistent_book_from_favorites(self): + """Попытка удалить несуществующую книгу не вызывает ошибок""" + collector = BooksCollector() + book_name = 'Несуществующая книга' + + # Книгу НЕ добавляем в избранное + + # Действие: пытаемся удалить несуществующую книгу + # (не должно вызывать ошибку) + collector.delete_book_from_favorites(book_name) + + # Проверка: избранное осталось пустым + favorites = collector.get_list_of_favorites_books() + assert len(favorites) == 0 + + +# Тест 3: Избранное пусто после удаления +def test_favorites_empty_after_deletion(self): + """После удаления книги из избранное становится пустым""" + collector = BooksCollector() + book_name = 'Единственная книга' + + # Подготовка: добавляем одну книгу в избранное + collector.add_new_book(book_name) + collector.add_book_in_favorites(book_name) + + # Проверяем что книга добавилась (отдельный тест!) + # Но в этом тесте мы проверяем только удаление, + # поэтому не проверяем добавление + + # Действие: удаляем книгу + collector.delete_book_from_favorites(book_name) + + # Проверка: избранное пустое + favorites = collector.get_list_of_favorites_books() + assert len(favorites) == 0 + assert favorites == [] + + +# Тест 4: Проверка что удаляется только нужная книга +def test_delete_specific_book_from_favorites(self): + """Удаляется только указанная книга, другие остаются""" + collector = BooksCollector() + book_to_delete = 'Удаляемая' + book_to_keep = 'Оставляемая' + + # Подготовка: добавляем две книги в избранное + collector.add_new_book(book_to_delete) + collector.add_new_book(book_to_keep) + collector.add_book_in_favorites(book_to_delete) + collector.add_book_in_favorites(book_to_keep) + + # Действие: удаляем только одну книгу + collector.delete_book_from_favorites(book_to_delete) + + # Проверка: одна книга удалена, вторая осталась + favorites = collector.get_list_of_favorites_books() + assert book_to_delete not in favorites + assert book_to_keep in favorites + assert len(favorites) == 1 + + # Тест 13: Удаление несуществующей книги из избранногоо def test_delete_nonexistent_book_from_favorites(self): collector = BooksCollector() @@ -199,28 +427,87 @@ def test_get_list_of_favorites_books(self): assert favorites == books # Тест 15: Комплексный тест - несколько операций - def test_complex_scenario(self): - collector = BooksCollector() - - # Добавляем книги - collector.add_new_book('Властелин колец') - collector.add_new_book('Оно') - collector.add_new_book('Том и Джерри') - - # Устанавливаем жанры - collector.set_book_genre('Властелин колец', 'Фантастика') - collector.set_book_genre('Оно', 'Ужасы') - collector.set_book_genre('Том и Джерри', 'Мультфильмы') - - # Добавляем в избранное - collector.add_book_in_favorites('Властелин колец') - collector.add_book_in_favorites('Том и Джерри') - - # Проверяем - assert collector.get_book_genre('Властелин колец') == 'Фантастика' - assert len(collector.get_books_for_children()) == 2 # Фантастика и Мультфильмы - assert len(collector.get_list_of_favorites_books()) == 2 - - # Удаляем из избранного - collector.delete_book_from_favorites('Том и Джерри') - assert collector.get_list_of_favorites_books() == ['Властелин колец'] + def test_set_and_get_book_genre(self): + """Устанавливаем и получаем жанр книги""" + collector = BooksCollector() + collector.add_new_book('Властелин колец') + + # Устанавливаем жанр + collector.set_book_genre('Властелин колец', 'Фантастика') + + # Получаем жанр + genre = collector.get_book_genre('Властелин колец') + assert genre == 'Фантастика' + + +# Тест 2: Тестируем get_books_for_children +def test_get_books_for_children_returns_correct_count(self): + """get_books_for_children возвращает правильное количество детских книг""" + collector = BooksCollector() + + # Добавляем детские книги + collector.add_new_book('Фантастика') + collector.add_new_book('Мультфильм') + collector.set_book_genre('Фантастика', 'Фантастика') + collector.set_book_genre('Мультфильм', 'Мультфильмы') + + # Добавляем взрослую книгу (не должна войти в результат) + collector.add_new_book('Ужасы') + collector.set_book_genre('Ужасы', 'Ужасы') + + # Проверяем метод get_books_for_children + children_books = collector.get_books_for_children() + assert len(children_books) == 2 + + +# Тест 3: Тестируем get_list_of_favorites_books +def test_get_list_of_favorites_books_returns_correct_count(self): + """get_list_of_favorites_books возвращает правильное количество избранных книг""" + collector = BooksCollector() + + # Добавляем книги в избранное + collector.add_new_book('Книга 1') + collector.add_new_book('Книга 2') + collector.add_book_in_favorites('Книга 1') + collector.add_book_in_favorites('Книга 2') + + # Проверяем метод get_list_of_favorites_books + favorites = collector.get_list_of_favorites_books() + assert len(favorites) == 2 + + +# Тест 4: Тестируем delete_book_from_favorites +def test_delete_book_from_favorites_removes_specific_book(self): + """delete_book_from_favorites удаляет конкретную книгу из избранного""" + collector = BooksCollector() + + # Добавляем две книги в избранное + collector.add_new_book('Книга 1') + collector.add_new_book('Книга 2') + collector.add_book_in_favorites('Книга 1') + collector.add_book_in_favorites('Книга 2') + + # Удаляем одну книгу + collector.delete_book_from_favorites('Книга 1') + + # Проверяем метод get_list_of_favorites_books + favorites = collector.get_list_of_favorites_books() + assert favorites == ['Книга 2'] + + +# Тест 5: Тестируем взаимодействие методов (но все еще один основной метод) +def test_books_genre_updated_after_setting_genre(self): + """Словарь books_genre обновляется после установки жанра""" + collector = BooksCollector() + collector.add_new_book('Книга') + + # Проверяем начальное состояние + books = collector.get_books_genre() + assert books['Книга'] == '' + + # Устанавливаем жанр + collector.set_book_genre('Книга', 'Фантастика') + + # Проверяем обновленное состояние + books = collector.get_books_genre() + assert books['Книга'] == 'Фантастика' From c95fbf5ded0649e460adbcf038e42d4caa9ce0c3 Mon Sep 17 00:00:00 2001 From: ivannosovec Date: Sat, 31 Jan 2026 14:51:05 +0300 Subject: [PATCH 3/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=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= =?UTF-8?q?=20Tests.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 554 ++++++------------------------------------------------- 1 file changed, 58 insertions(+), 496 deletions(-) diff --git a/tests.py b/tests.py index 1eb88f7..b0e2222 100644 --- a/tests.py +++ b/tests.py @@ -1,513 +1,75 @@ import pytest +from main import BooksCollector class TestBooksCollector: - - # Тест 1: Проверка инициализации и базовых методов коллектора -def test_init_and_basic_methods(self): - """Проверяем что коллектор инициализируется и базовые методы работают""" - collector = BooksCollector() - - # Проверяем через методы, а не через атрибуты - assert collector.get_books_genre() == {} # через метод get_books_genre() - assert collector.get_list_of_favorites_books() == [] # через метод get_list_of_favorites_books() - - # Проверяем что можем добавить книгу - collector.add_new_book('Тестовая книга') - assert len(collector.get_books_genre()) == 1 # через метод - - # Проверяем что можем добавить в избранное - collector.add_book_in_favorites('Тестовая книга') - assert len(collector.get_list_of_favorites_books()) == 1 # через метод - assert collector.genre == ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] - assert collector.genre_age_rating == ['Ужасы', 'Детективы'] - - # Тест 2: Параметризованный тест для добавления новой книги - @pytest.mark.parametrize('valid_book_name', [ - 'Война и мир', # валидное название - 'A' * 40, # граничное значение (40 символов) - 'Книга', # обычное название - '1984', # название с цифрами - 'Book Name', # название с пробелом - 'Книга с запятой, и точкой.', # название со знаками препинания -]) -def test_add_new_book_success(self, valid_book_name): - """Проверяем успешное добавление книги с валидными названиями""" - collector = BooksCollector() - collector.add_new_book(valid_book_name) - - # Проверяем что книга добавилась - assert valid_book_name in collector.get_books_genre() - # Проверяем что жанр не установлен (пустая строка) - assert collector.get_book_genre(valid_book_name) == '' - - -# Тест 2.2: Неуспешное добавление книги (невалидные данные) -@pytest.mark.parametrize('invalid_book_name', [ - '', # пустая строка - 'A' * 41, # слишком длинное название (41 символ) - ' ', # только пробелы - '\n', # только перенос строки - '\t', # только табуляция -]) -def test_add_new_book_failure(self, invalid_book_name): - """Проверяем что книга с невалидным названием не добавляется""" - collector = BooksCollector() - collector.add_new_book(invalid_book_name) - - # Проверяем что книга НЕ добавилась - assert invalid_book_name not in collector.get_books_genre() - # Проверяем что коллекция осталась пустой - assert len(collector.get_books_genre()) == 0 - - -# Тест 2.3: Добавление дубликата книги -def test_add_new_book_duplicate(self): - """Проверяем что книгу нельзя добавить дважды""" - collector = BooksCollector() - book_name = 'Дубликат' - - # Первое добавление - collector.add_new_book(book_name) - assert book_name in collector.get_books_genre() - assert len(collector.get_books_genre()) == 1 - - # Второе добавление той же книги - collector.add_new_book(book_name) - - # Проверяем что книга осталась одна - assert book_name in collector.get_books_genre() - assert len(collector.get_books_genre()) == 1 - ]) - def test_add_new_book(self, book_name, expected): + #Исправленные тесты +# добавление 2-ух книг + def test_add_new_book_add_two_books(self): collector = BooksCollector() - collector.add_new_book(book_name) - - if expected: - assert book_name in collector.books_genre - assert collector.books_genre[book_name] == '' - else: - assert book_name not in collector.books_genre - - # Тест 3: Нельзя добавить одну книгу дважды - def test_add_new_book_twice(self): + collector.add_new_book('Гордость и предубеждение и зомби') + collector.add_new_book('Что делать, если ваш кот хочет вас убить') + assert len(collector.get_books_genre() + #Неправильное назваеие + @pytest.mark.parametrize('name', ['', 'a'*41]) + def test_add_new_book_invalid_name_lenght(self, name): collector = BooksCollector() - book_name = 'Мастер и Маргарита' - - collector.add_new_book(book_name) - collector.add_new_book(book_name) # повторная попытка - - assert len(collector.books_genre) == 1 - assert list(collector.books_genre.keys()) == [book_name] + collector.add_new_book(name) + assert name not in collector.books_genre - # Тест 4: Установка жанра для книги - def test_set_book_genre_valid(self): - collector = BooksCollector() - collector.add_new_book('1984') - collector.set_book_genre('1984', 'Фантастика') - - assert collector.get_book_genre('1984') == 'Фантастика' + # - # Тест 5: Нельзя установить несуществующий жанр - def test_set_book_genre_invalid_genre(self): + def test_set_book_genre_add_one_genre(self): collector = BooksCollector() - collector.add_new_book('Книга') - collector.set_book_genre('Книга', 'Несуществующий жанр') - - assert collector.get_book_genre('Книга') == '' + collector.add_new_book('Голова профессора Доуэля') + collector.set_book_genre('Голова профессора Доуэля', 'Фантастика') + assert collector.books_genre['Голова профессора Доуэля'] == 'Фантастика' - # Тест 6: Получение жанра книги - def test_get_book_genre(self): - collector = BooksCollector() - collector.add_new_book('Преступление и наказание') - collector.set_book_genre('Преступление и наказание', 'Детективы') - - assert collector.get_book_genre('Преступление и наказание') == 'Детективы' - assert collector.get_book_genre('Несуществующая книга') is None + #возврат жанра по названию - # Тест 7: Получение книг с определенным жанром - def test_get_books_with_specific_genre(self): + def test_get_book_genre_positive(self) collector = BooksCollector() - - # Добавляем книги разных жанров - books = [ - ('Солярис', 'Фантастика'), - ('Оно', 'Ужасы'), - ('Шерлок Холмс', 'Детективы'), - ('Зеленая миля', 'Фантастика') - ] - - for name, genre in books: - collector.add_new_book(name) - collector.set_book_genre(name, genre) - - fantasy_books = collector.get_books_with_specific_genre('Фантастика') - assert len(fantasy_books) == 2 - assert 'Солярис' in fantasy_books - assert 'Зеленая миля' in fantasy_books - - # Тест 8: Получение всех книг - def test_get_books_genre(self): + collector.add_new_book('Оно') + collector.books_genre['Оно'] = 'Ужасы' + assert collector.get_book_genre('Оно') == 'Ужасы' + #вывод списка по жанру + def test_get_books_with_specific_genre_positive(self): collector = BooksCollector() - collector.add_new_book('Книга 1') - collector.add_new_book('Книга 2') - - books = collector.get_books_genre() - assert isinstance(books, dict) - assert len(books) == 2 - - # Тест 9: Получение книг для детей - def test_get_books_for_children(self): + collector.books_genre.update({'Убийство на улице Морг': 'Детективы', 'Рассказы о Шерлоке Холмсе': 'Детективы'}) + result = collector.get_books_with_specific_genre('Детективы') + assert result == ['Убийство на улице Морг', 'Рассказы о Шерлоке Холмсе'] +#вывод словаря + def test_get_books_genre_positive(self): collector = BooksCollector() - - # Книги с разными жанрами - children_books = [ - ('Гарри Поттер', 'Фантастика'), - ('Ну погоди!', 'Мультфильмы'), - ('Маска', 'Комедии') - ] - - adult_books = [ - ('Сияние', 'Ужасы'), - ('Десять негритят', 'Детективы') - ] - - # Добавляем все книги - def test_get_books_for_children_includes_children_books(self): - """Детские книги включаются в результат""" - collector = BooksCollector() - - # Только детские книги - children_books = [ - ('Мультфильм 1', 'Мультфильмы'), - ('Фантастика 1', 'Фантастика'), - ('Комедия 1', 'Комедии'), - ] - - for name, genre in children_books: - collector.add_new_book(name) - collector.set_book_genre(name, genre) - - result = collector.get_books_for_children() - - # Проверяем что все детские книги в результате - assert len(result) == 3 - for name, _ in children_books: - assert name in result - - -# Тест 2: Проверка что взрослые книги НЕ возвращаются -def test_get_books_for_children_excludes_adult_books(self): - """Взрослые книги не включаются в результат""" - collector = BooksCollector() - - # Только взрослые книги - adult_books = [ - ('Ужасы 1', 'Ужасы'), - ('Детектив 1', 'Детективы'), - ] - - for name, genre in adult_books: - collector.add_new_book(name) - collector.set_book_genre(name, genre) - - result = collector.get_books_for_children() - - # Проверяем что результат пуст - assert len(result) == 0 - for name, _ in adult_books: - assert name not in result - - -# Тест 3: Проверка смешанного списка -def test_get_books_for_children_mixed_books(self): - """При смешанном списке возвращаются только детские книги""" - collector = BooksCollector() - - children_books = [('Мультфильм', 'Мультфильмы')] - adult_books = [('Ужасы', 'Ужасы')] - - # Добавляем все книги - all_books = children_books + adult_books - for name, genre in all_books: - collector.add_new_book(name) - collector.set_book_genre(name, genre) - - result = collector.get_books_for_children() - - # Проверяем что только детская книга в результате - assert len(result) == 1 - assert children_books[0][0] in result - assert adult_books[0][0] not in result - - -# Тест 4: Проверка пустого результата -def test_get_books_for_children_empty(self): - """Если нет подходящих книг, возвращается пустой список""" - collector = BooksCollector() - - # Не добавляем книги вообще - result = collector.get_books_for_children() - - assert isinstance(result, list) - assert len(result) == 0 - - # Тест 10: Параметризованный тест для добавления в избранное - def test_add_book_in_favorites_success(self): - """Книга из словаря успешно добавляется в избранное""" - collector = BooksCollector() - book_name = 'Избранная книга' - - # 1. Добавляем книгу в словарь - collector.add_new_book(book_name) - - # 2. Добавляем в избранное - collector.add_book_in_favorites(book_name) - - # 3. Проверяем через метод (не через атрибут!) - favorites = collector.get_list_of_favorites_books() - assert book_name in favorites - assert len(favorites) == 1 - - -# Тест 2: Попытка добавить несуществующую книгу в избранное -def test_add_book_in_favorites_failure(self): - """Несуществующая книга не добавляется в избранное""" - collector = BooksCollector() - book_name = 'Несуществующая книга' - - # Книгу НЕ добавляем в словарь - - # Пытаемся добавить в избранное - collector.add_book_in_favorites(book_name) - - # Проверяем что избранное осталось пустым - favorites = collector.get_list_of_favorites_books() - assert book_name not in favorites - assert len(favorites) == 0 - - -# Тест 3: Нельзя добавить одну книгу в избранное дважды -def test_add_book_in_favorites_duplicate(self): - """Книгу нельзя добавить в избранное дважды""" - collector = BooksCollector() - book_name = 'Дубликат в избранном' - - # Добавляем книгу в словарь - collector.add_new_book(book_name) - - # Первое добавление в избранное - collector.add_book_in_favorites(book_name) - favorites = collector.get_list_of_favorites_books() - assert book_name in favorites - assert len(favorites) == 1 - - # Второе добавление в избранное - collector.add_book_in_favorites(book_name) - - # Проверяем что книга не добавилась второй раз - favorites = collector.get_list_of_favorites_books() - assert book_name in favorites - assert len(favorites) == 1 - - # Тест 11: Нельзя добавить книгу в избранное дважды - def test_add_book_in_favorites_twice(self): + collector.books_genre = {'Оно': 'Ужасы'} + assert collector.get_books_genre() == {'Оно': 'Ужасы'} +#возврат книги жанрам для детей + def test_get_books_for_children_positive(self): collector = BooksCollector() - book_name = 'Двойное избранное' - - collector.add_new_book(book_name) - collector.add_book_in_favorites(book_name) - collector.add_book_in_favorites(book_name) # повторная попытка - - assert len(collector.favorites) == 1 - assert collector.favorites == [book_name] - - # Тест 12: Удаление книги из избранного - def test_delete_book_from_favorites_success(self): - """Книга успешно удаляется из избранного""" - collector = BooksCollector() - book_name = 'Удаляемая книга' - - # Подготовка: добавляем книгу в избранное - collector.add_new_book(book_name) - collector.add_book_in_favorites(book_name) - - # Действие: удаляем книгу из избранного - collector.delete_book_from_favorites(book_name) - - # Проверка: книги нет в избранном - favorites = collector.get_list_of_favorites_books() - assert book_name not in favorites - - -# Тест 2: Удаление несуществующей книги из избранного -def test_delete_nonexistent_book_from_favorites(self): - """Попытка удалить несуществующую книгу не вызывает ошибок""" - collector = BooksCollector() - book_name = 'Несуществующая книга' - - # Книгу НЕ добавляем в избранное - - # Действие: пытаемся удалить несуществующую книгу - # (не должно вызывать ошибку) - collector.delete_book_from_favorites(book_name) - - # Проверка: избранное осталось пустым - favorites = collector.get_list_of_favorites_books() - assert len(favorites) == 0 - - -# Тест 3: Избранное пусто после удаления -def test_favorites_empty_after_deletion(self): - """После удаления книги из избранное становится пустым""" - collector = BooksCollector() - book_name = 'Единственная книга' - - # Подготовка: добавляем одну книгу в избранное - collector.add_new_book(book_name) - collector.add_book_in_favorites(book_name) - - # Проверяем что книга добавилась (отдельный тест!) - # Но в этом тесте мы проверяем только удаление, - # поэтому не проверяем добавление - - # Действие: удаляем книгу - collector.delete_book_from_favorites(book_name) - - # Проверка: избранное пустое - favorites = collector.get_list_of_favorites_books() - assert len(favorites) == 0 - assert favorites == [] - - -# Тест 4: Проверка что удаляется только нужная книга -def test_delete_specific_book_from_favorites(self): - """Удаляется только указанная книга, другие остаются""" - collector = BooksCollector() - book_to_delete = 'Удаляемая' - book_to_keep = 'Оставляемая' - - # Подготовка: добавляем две книги в избранное - collector.add_new_book(book_to_delete) - collector.add_new_book(book_to_keep) - collector.add_book_in_favorites(book_to_delete) - collector.add_book_in_favorites(book_to_keep) - - # Действие: удаляем только одну книгу - collector.delete_book_from_favorites(book_to_delete) - - # Проверка: одна книга удалена, вторая осталась - favorites = collector.get_list_of_favorites_books() - assert book_to_delete not in favorites - assert book_to_keep in favorites - assert len(favorites) == 1 - - # Тест 13: Удаление несуществующей книги из избранногоо - def test_delete_nonexistent_book_from_favorites(self): + collector.books_genre = {'Голова профессора Доуэля': 'Фантастика'} + result = collector.get_books_for_children() + assert 'Голова профессора Доуэля' in result +# не добавление книги в словарь для детей + def test_get_books_for_children_negative(self): collector = BooksCollector() - - # Попытка удалить несуществующую книгу не должна вызывать ошибку - collector.delete_book_from_favorites('Несуществующая книга') - assert collector.favorites == [] - - # Тест 14: Получение списка избранных книг - def test_get_list_of_favorites_books(self): + collector.books_genre = {'Оно': 'Ужасы'} + result = collector.get_books_for_children() + assert 'Оно' not in result +#добавление избранную кингу + def test_add_book_in_favorites_positive(self): collector = BooksCollector() - - # Добавляем несколько книг в избранное - books = ['Книга 1', 'Книга 2', 'Книга 3'] - for book in books: - collector.add_new_book(book) - collector.add_book_in_favorites(book) - - favorites = collector.get_list_of_favorites_books() - - assert isinstance(favorites, list) - assert len(favorites) == 3 - assert favorites == books - - # Тест 15: Комплексный тест - несколько операций - def test_set_and_get_book_genre(self): - """Устанавливаем и получаем жанр книги""" - collector = BooksCollector() - collector.add_new_book('Властелин колец') - - # Устанавливаем жанр - collector.set_book_genre('Властелин колец', 'Фантастика') - - # Получаем жанр - genre = collector.get_book_genre('Властелин колец') - assert genre == 'Фантастика' - - -# Тест 2: Тестируем get_books_for_children -def test_get_books_for_children_returns_correct_count(self): - """get_books_for_children возвращает правильное количество детских книг""" - collector = BooksCollector() - - # Добавляем детские книги - collector.add_new_book('Фантастика') - collector.add_new_book('Мультфильм') - collector.set_book_genre('Фантастика', 'Фантастика') - collector.set_book_genre('Мультфильм', 'Мультфильмы') - - # Добавляем взрослую книгу (не должна войти в результат) - collector.add_new_book('Ужасы') - collector.set_book_genre('Ужасы', 'Ужасы') - - # Проверяем метод get_books_for_children - children_books = collector.get_books_for_children() - assert len(children_books) == 2 - - -# Тест 3: Тестируем get_list_of_favorites_books -def test_get_list_of_favorites_books_returns_correct_count(self): - """get_list_of_favorites_books возвращает правильное количество избранных книг""" - collector = BooksCollector() - - # Добавляем книги в избранное - collector.add_new_book('Книга 1') - collector.add_new_book('Книга 2') - collector.add_book_in_favorites('Книга 1') - collector.add_book_in_favorites('Книга 2') - - # Проверяем метод get_list_of_favorites_books - favorites = collector.get_list_of_favorites_books() - assert len(favorites) == 2 - - -# Тест 4: Тестируем delete_book_from_favorites -def test_delete_book_from_favorites_removes_specific_book(self): - """delete_book_from_favorites удаляет конкретную книгу из избранного""" - collector = BooksCollector() - - # Добавляем две книги в избранное - collector.add_new_book('Книга 1') - collector.add_new_book('Книга 2') - collector.add_book_in_favorites('Книга 1') - collector.add_book_in_favorites('Книга 2') - - # Удаляем одну книгу - collector.delete_book_from_favorites('Книга 1') - - # Проверяем метод get_list_of_favorites_books - favorites = collector.get_list_of_favorites_books() - assert favorites == ['Книга 2'] - - -# Тест 5: Тестируем взаимодействие методов (но все еще один основной метод) -def test_books_genre_updated_after_setting_genre(self): - """Словарь books_genre обновляется после установки жанра""" - collector = BooksCollector() - collector.add_new_book('Книга') - - # Проверяем начальное состояние - books = collector.get_books_genre() - assert books['Книга'] == '' - - # Устанавливаем жанр - collector.set_book_genre('Книга', 'Фантастика') - - # Проверяем обновленное состояние - books = collector.get_books_genre() - assert books['Книга'] == 'Фантастика' + collector.add_new_book('Трое в лодке, не считая собаки') + collector.add_book_in_favorites('Трое в лодке, не считая собаки') + assert 'Трое в лодке, не считая собаки' in collector.favorites + #удаление книги из избранного + def test_delete_book_from_favorites_positive(self): + collector = BooksCollector() + collector.favorites = ['Убийство на улице Морг'] + collector.delete_book_from_favorites('Убийство на улице Морг') + assert 'Убийство на улице Морг' not in collector.favorites + assert +#вывод списка избранного + def test_get_list_of_favorites_books_positive(self) + collector = BooksCollector( + collector.favorites = ['Гордость и предубеждение и зомби', 'Что делать, если ваш кот хочет вас убить'] + assert collector.get_list_of_favorites_books() == ['Гордость и предубеждение и зомби', 'Что делать, если ваш кот хочет вас убить'] From fd0d8e538b2033889419a12406d50d107ab0121c Mon Sep 17 00:00:00 2001 From: ivannosovec Date: Sat, 31 Jan 2026 14:55:08 +0300 Subject: [PATCH 4/6] Update tests.py --- tests.py | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/tests.py b/tests.py index b0e2222..3157048 100644 --- a/tests.py +++ b/tests.py @@ -3,73 +3,67 @@ from main import BooksCollector class TestBooksCollector: - #Исправленные тесты -# добавление 2-ух книг + def test_add_new_book_add_two_books(self): - collector = BooksCollector() + collector = BooksCollector()Expand commentComment on line R8 collector.add_new_book('Гордость и предубеждение и зомби') collector.add_new_book('Что делать, если ваш кот хочет вас убить') - assert len(collector.get_books_genre() - #Неправильное назваеие + assert len(collector.get_books_genre()) == 2Expand commentComment on line R11 + @pytest.mark.parametrize('name', ['', 'a'*41]) def test_add_new_book_invalid_name_lenght(self, name): collector = BooksCollector() collector.add_new_book(name) assert name not in collector.books_genre - # - def test_set_book_genre_add_one_genre(self): collector = BooksCollector() collector.add_new_book('Голова профессора Доуэля') collector.set_book_genre('Голова профессора Доуэля', 'Фантастика') assert collector.books_genre['Голова профессора Доуэля'] == 'Фантастика' - #возврат жанра по названию - - def test_get_book_genre_positive(self) + def test_get_book_genre_positive(self): collector = BooksCollector() collector.add_new_book('Оно') collector.books_genre['Оно'] = 'Ужасы' assert collector.get_book_genre('Оно') == 'Ужасы' - #вывод списка по жанру + def test_get_books_with_specific_genre_positive(self): collector = BooksCollector() collector.books_genre.update({'Убийство на улице Морг': 'Детективы', 'Рассказы о Шерлоке Холмсе': 'Детективы'}) result = collector.get_books_with_specific_genre('Детективы') assert result == ['Убийство на улице Морг', 'Рассказы о Шерлоке Холмсе'] -#вывод словаря + def test_get_books_genre_positive(self): collector = BooksCollector() collector.books_genre = {'Оно': 'Ужасы'} assert collector.get_books_genre() == {'Оно': 'Ужасы'} -#возврат книги жанрам для детей + def test_get_books_for_children_positive(self): collector = BooksCollector() collector.books_genre = {'Голова профессора Доуэля': 'Фантастика'} result = collector.get_books_for_children() assert 'Голова профессора Доуэля' in result -# не добавление книги в словарь для детей + def test_get_books_for_children_negative(self): collector = BooksCollector() collector.books_genre = {'Оно': 'Ужасы'} result = collector.get_books_for_children() assert 'Оно' not in result -#добавление избранную кингу + def test_add_book_in_favorites_positive(self): collector = BooksCollector() collector.add_new_book('Трое в лодке, не считая собаки') collector.add_book_in_favorites('Трое в лодке, не считая собаки') assert 'Трое в лодке, не считая собаки' in collector.favorites - #удаление книги из избранного + def test_delete_book_from_favorites_positive(self): collector = BooksCollector() collector.favorites = ['Убийство на улице Морг'] collector.delete_book_from_favorites('Убийство на улице Морг') assert 'Убийство на улице Морг' not in collector.favorites - assert -#вывод списка избранного - def test_get_list_of_favorites_books_positive(self) - collector = BooksCollector( + + def test_get_list_of_favorites_books_positive(self): + collector = BooksCollector() collector.favorites = ['Гордость и предубеждение и зомби', 'Что делать, если ваш кот хочет вас убить'] assert collector.get_list_of_favorites_books() == ['Гордость и предубеждение и зомби', 'Что делать, если ваш кот хочет вас убить'] From a351b07f38252f8231a4a8a3b811441ccf56fda8 Mon Sep 17 00:00:00 2001 From: ivannosovec Date: Sat, 31 Jan 2026 15:01:23 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20tests.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests.py b/tests.py index 3157048..b4cff9d 100644 --- a/tests.py +++ b/tests.py @@ -5,10 +5,10 @@ class TestBooksCollector: def test_add_new_book_add_two_books(self): - collector = BooksCollector()Expand commentComment on line R8 + collector = BooksCollector() collector.add_new_book('Гордость и предубеждение и зомби') collector.add_new_book('Что делать, если ваш кот хочет вас убить') - assert len(collector.get_books_genre()) == 2Expand commentComment on line R11 + assert len(collector.get_books_genre()) == 2 @pytest.mark.parametrize('name', ['', 'a'*41]) def test_add_new_book_invalid_name_lenght(self, name): From acbc13f916478a857595e9409e7f2f116381fb61 Mon Sep 17 00:00:00 2001 From: Ivan Nosovets Date: Sun, 1 Feb 2026 10:50:58 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=A1=D0=BF=D1=80=D0=B8=D0=BD=D1=824.=20?= =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=9F=D1=83=D1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/main.cpython-314.pyc | Bin 0 -> 3698 bytes __pycache__/tests.cpython-314-pytest-9.0.2.pyc | Bin 0 -> 2432 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 __pycache__/main.cpython-314.pyc create mode 100644 __pycache__/tests.cpython-314-pytest-9.0.2.pyc diff --git a/__pycache__/main.cpython-314.pyc b/__pycache__/main.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40fee2c50765deb001314e2e33c005ec7ce69675 GIT binary patch literal 3698 zcmb7GZ){Ul6u+;1Z**(d_h18L?Y3_1${vG`Nkeerg7POZgt@%H@WbR;+P6{d+Iim_ z1dIm%B#uCWCMKvckwjzIC#QlUqJH!9d$P36`|2mZK^KA_J?FmHwJY5cZ?@C>?m73* z`JLZA=MDwi+X%E$=Iv~_m5{&jquO}4v(g2f%VaC*BMRA06fWs;GzL*TQ6hWO)fxE9 zxgRT2&`H6(*NDL>#PFQq4DU8lfce{r!7Cn+g5m|)qVOO$DFR5J(gLzo*#xpp@qzR! ztsnzR8_0IWZv-caAu0jbx7`lDR4BZuA1>r_TG}Ykbaih$0-n)Jh;QW>bS{%&GD-3{ z&RPP$R;?36;a}lk#Py5785K{$10%44(-bf4C_L_jFY_C7$^6ZF-(0fZ19{iHXD&TP z7|pNEpV;8l$6N68Q}Yh!@0jRkQi5p{n-wwcsYI z3WP+DgSbq}q3#8K+4oF&M`(e+7PPm%13zu$zCGsfVKZ`MfiL>HSHO~_SCNGe9{yQm zzJ<r#m>amyj?yL#7Z_)@nBMp65LWAPyNHvyoXJ;0}`$ z-d@IB1!CT8?@12bLvC09W$!<@x=qGqFNJ$TZ10R_*xsC$U-VE6l+EW;vzm^6#^Y4P zkw7YwQS;gb6+>o+8sMx~B6;+qAOKRaqa^lPVsA-|T4MC(k&-C?CCax_x1&p$ALU}= z(A~48#33_rs64Q9;YcYEwgTbLPCf|qKk|~{7dcCmDUvT;k016K;%~4$PD{`@4J=l_s2E-aN1c5IbdAC-LX+}q!nh@fFD4RYv$n~D^V9tX4C!3cb zbCAHA1-g29GACFtrFDb-0_vNuF|m5#U^BNR-Cv0u>mlR8)PuUUED_NGs_9%POvXjY75n$!=D+TT*j#T0R5mlraj)WbeRhrmGjS z#yM4=)6&`LY}%m`W1QWFdS^h#)5qhHNW{6R-Bt9PPPcbAFmXd`7Wq@KK7=k7H+_9b zPk#vhOn>O6@Lktp*K%ZEIW|~|C9PPp6dSc-qs7=kONxBVmpi(P9r1GKo>FJh>P#-3 zEOw4Q63D;{4_k-?VIOn|yjrxy^1^9iK*BK1EOOoxn94+H(Mc%dzc*fK5w-0eoWm za&2VbAvb|(yrE5c>Uen28z*ajHB&X(K&!zxB# z*VvlfkY*TFYY{?Yw@_`ia9(>Fovw_Q(+tf4Xqpyg>mZUFAX?vaAMBw=K`@+djD0e; z?C&cFr0e5X#!G=dE6{f{Rt)S!So)t%4*xTAu~;`|t`Od$Tvj*K!gS3A=9X^nYH(x& zTde*%UTT)nuD^TbUDMaij!fbC2+uwVU&i>vgO_oes?HWN^EvDXRQ0X-RL<3isydye zx{=G~wR}NUsRWZLW@ZYZB@`1U9YisNVi?73nPX7G}e5>%haFnYAJ;Gq6 z%_9s|+BjiX#n&Rpl`WhQsrUq;zan{s-IV~CJOORbLjuA<0v8>ZIkxU1amLt7*LTpt bV~idK6SgIeKlE}O_r!C6>scWn*o6N8<68|8 literal 0 HcmV?d00001 diff --git a/__pycache__/tests.cpython-314-pytest-9.0.2.pyc b/__pycache__/tests.cpython-314-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfbbbd76a5202bea293aa932f8941b663506ad82 GIT binary patch literal 2432 zcmb7G-A^M`6u;A%w$oB5P*^m&+ktgg8kg^nUEIZh8xnZXkjYwKy4(!y0M%ip+?fX1 z%_e}F-3J~_{3DESXci^AivPk?P|SVt#TVa5NL=;Fb7y*|rDBLToqNy6?|k&!GxyFL zEzNNRJCO5SwTLslps`1aA$^iseum%}P!<%`~C8$ZXV!rco#A zMyl9_RB1Hi+dHx~a?6sm5L&yJ4d0qYXl?2BDqu!foLb2c&}s4ef$jD$w3@zszj<`Nt^-@>WdTFYqygv;Fxky>j=PIaSP zgws58o@?Qi2K#o7tgYwSzayxkDyiZBmFwk(Sm)-N4fZ9-v8%!E+#G9mkXu-d)K&j{ ze2CXVjb4Zic3hPcqR*oD|I#|}hp1bYNs9aZCMQ#LvvoRP}8PQEL3o-c7(ZS6)` znS18zil8QL3#AY|B0SP!o;_fT%4A}(C)e4yZi2*r~TGFaK8i1ei_;yxnESa-2=tLJa>1Qj~j}+SJ`r(Ggn`O=!xP! z1OMAf6lfx%+1BJ=iqcn{#U#hBB;JW{%au?k{c7v|p9F5@J?Q zXWjC5fDZrr;^@D?rU`Pe|A1)|{npWQ*zwwv*hvJ%+K=Tc75R#rzJDYy{35q;ws<6e za3Z6Q%g3p{N~+J5$J|ukVQK(~9otO}93}^W+@1EON^p{mQd}%U%>mqoao&L5DHQWg zUWYEm@U_rfCj>Kg9Z!)Sm