From ed908f22bd767803a9d2cbc17f25c8fd0a93d5a1 Mon Sep 17 00:00:00 2001 From: Serg-nt Date: Tue, 6 May 2025 11:53:40 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20tests.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 112 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 15 deletions(-) diff --git a/tests.py b/tests.py index 383385e..2a4f1e3 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,106 @@ 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() + @pytest.fixture + def collector(self): + return BooksCollector() - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_initial_state(self, collector): + assert collector.get_books_genre() == {} + assert collector.get_list_of_favorites_books() == [] - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + def test_add_new_book_correct_add_book_successful_add(self, collector): + collector.add_new_book('Азбука') + assert collector.get_book_genre('Азбука') == '' + assert len(collector.get_books_genre()) == 1 + + def test_add_new_book_incorrect_add_book_unsuccessful_add(self, collector): + collector.add_new_book('Азбука') + assert len(collector.get_books_genre()) == 1 + collector.add_new_book('Азбука') + assert len(collector.get_books_genre()) == 1 + collector.add_new_book('Азбука' * 10) + assert len(collector.get_books_genre()) == 1 - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_set_book_genre_correct_genre_success(self, collector): + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'Ужасы') + assert collector.books_genre['Азбука'] == 'Ужасы' + + def test_set_book_genre_incorrect_genre_unsuccess(self, collector): + collector.set_book_genre('Азбука', 'Ужасы') + assert len(collector.books_genre) == 0 + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'FFFFFF') + assert collector.books_genre['Азбука'] == '' + + def test_get_book_genre(self, collector): + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'Ужасы') + assert collector.get_book_genre('Азбука') == 'Ужасы' + + def test_get_books_with_specific_genre(self, collector): + books = ['Азбука', 'Алгебра', 'Маленький принц'] + for book in books: + collector.add_new_book(book) + collector.set_book_genre(book, 'Ужасы') + + collector.add_new_book('Ну погоди') + collector.set_book_genre('Ну погоди', 'Мультфильмы') + + assert len(collector.get_books_with_specific_genre('Ужасы')) == 3 + assert len(collector.get_books_with_specific_genre('Мультфильмы')) == 1 + + def test_get_books_genre(self, collector): + collector.add_new_book('Азбука') + assert collector.get_books_genre() == {'Азбука': ''} + + def test_get_books_for_children(self, collector): + books = ['детская1', 'детская2', 'детская3', 'взрослая1', 'взрослая2'] + genres = ['Фантастика', 'Мультфильмы', 'Комедии', 'Ужасы', 'Детективы'] + + for i in range(len(books)): + collector.add_new_book(books[i]) + collector.set_book_genre(books[i], genres[i]) + + children_books = collector.get_books_for_children() + assert len(children_books) == 3 + assert 'детская1' in children_books + assert 'детская2' in children_books + assert 'детская3' in children_books + assert 'взрослая1' not in children_books + assert 'взрослая2' not in children_books + + def test_add_book_in_favorites(self, collector): + collector.add_book_in_favorites('Азбука') + assert len(collector.get_books_genre()) == 0 + collector.add_new_book('Азбука') + collector.add_book_in_favorites('Азбука') + assert len(collector.get_books_genre()) == 1 + assert len(collector.favorites) == 1 + assert 'Азбука' in collector.favorites + collector.add_book_in_favorites('Азбука') + assert len(collector.favorites) == 1 + + def test_delete_book_from_favorites(self, collector): + collector.add_new_book('Азбука') + collector.add_book_in_favorites('Азбука') + collector.delete_book_from_favorites('Алгебра') + assert len(collector.favorites) == 1 + assert 'Азбука' in collector.favorites + collector.delete_book_from_favorites('Азбука') + assert len(collector.favorites) == 0 + assert 'Азбука' not in collector.favorites + + def get_list_of_favorites_books(self, collector): + collector.add_new_book('Азбука') + collector.add_book_in_favorites('Азбука') + collector.add_new_book('Алгебра') + collector.add_book_in_favorites('Алгебра') + assert len(collector.get_list_of_favorites_books()) == 2 + assert 'Азбука' in collector.get_list_of_favorites_books() + assert 'Алгебра' in collector.get_list_of_favorites_books() \ No newline at end of file From 94b22430d0351a8570c24d1c808259552e30cc8a Mon Sep 17 00:00:00 2001 From: Serg-nt Date: Wed, 14 May 2025 13:27:21 +0300 Subject: [PATCH 2/8] =?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=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 107 +++++++++++++++++++++++-------------------------------- 1 file changed, 45 insertions(+), 62 deletions(-) diff --git a/tests.py b/tests.py index 2a4f1e3..5484ccc 100644 --- a/tests.py +++ b/tests.py @@ -1,49 +1,48 @@ -from main import BooksCollector import pytest +from main import BooksCollector + -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test class TestBooksCollector: - @pytest.fixture - def collector(self): - return BooksCollector() + def test_initial_state(self): + collector = BooksCollector() + assert collector.get_books_genre() == {} and collector.get_list_of_favorites_books() == [] - def test_initial_state(self, collector): - assert collector.get_books_genre() == {} - assert collector.get_list_of_favorites_books() == [] - - def test_add_new_book_correct_add_book_successful_add(self, collector): + def test_add_new_book_correct_add_book_successful_add(self): + collector = BooksCollector() collector.add_new_book('Азбука') assert collector.get_book_genre('Азбука') == '' - assert len(collector.get_books_genre()) == 1 - - def test_add_new_book_incorrect_add_book_unsuccessful_add(self, collector): - collector.add_new_book('Азбука') - assert len(collector.get_books_genre()) == 1 - collector.add_new_book('Азбука') - assert len(collector.get_books_genre()) == 1 - collector.add_new_book('Азбука' * 10) - assert len(collector.get_books_genre()) == 1 - def test_set_book_genre_correct_genre_success(self, collector): + @pytest.mark.parametrize("name, expected_count", [ + ('Азбука', 1), + ('', 0), + ('Азбука' * 10, 0) + ]) + def test_add_new_book_incorrect_add_book_unsuccessful_add(self, name, expected_count): + collector = BooksCollector() + collector.add_new_book(name) + assert len(collector.get_books_genre()) == expected_count + + def test_set_book_genre_correct_genre_success(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.set_book_genre('Азбука', 'Ужасы') assert collector.books_genre['Азбука'] == 'Ужасы' - def test_set_book_genre_incorrect_genre_unsuccess(self, collector): - collector.set_book_genre('Азбука', 'Ужасы') - assert len(collector.books_genre) == 0 + def test_set_book_genre_incorrect_genre_unsuccess(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.set_book_genre('Азбука', 'FFFFFF') assert collector.books_genre['Азбука'] == '' - def test_get_book_genre(self, collector): + def test_get_book_genre(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.set_book_genre('Азбука', 'Ужасы') assert collector.get_book_genre('Азбука') == 'Ужасы' - def test_get_books_with_specific_genre(self, collector): + def test_get_books_with_specific_genre(self): + collector = BooksCollector() books = ['Азбука', 'Алгебра', 'Маленький принц'] for book in books: collector.add_new_book(book) @@ -52,55 +51,39 @@ def test_get_books_with_specific_genre(self, collector): collector.add_new_book('Ну погоди') collector.set_book_genre('Ну погоди', 'Мультфильмы') - assert len(collector.get_books_with_specific_genre('Ужасы')) == 3 - assert len(collector.get_books_with_specific_genre('Мультфильмы')) == 1 + assert collector.get_books_with_specific_genre('Ужасы') == books - def test_get_books_genre(self, collector): + def test_get_books_genre(self): + collector = BooksCollector() collector.add_new_book('Азбука') assert collector.get_books_genre() == {'Азбука': ''} - def test_get_books_for_children(self, collector): - books = ['детская1', 'детская2', 'детская3', 'взрослая1', 'взрослая2'] - genres = ['Фантастика', 'Мультфильмы', 'Комедии', 'Ужасы', 'Детективы'] - - for i in range(len(books)): - collector.add_new_book(books[i]) - collector.set_book_genre(books[i], genres[i]) + def test_get_books_for_children(self): + collector = BooksCollector() + collector.add_new_book('Детская') + collector.add_new_book('Взрослая') + collector.set_book_genre('Детская', 'Фантастика') + collector.set_book_genre('Взрослая', 'Ужасы') - children_books = collector.get_books_for_children() - assert len(children_books) == 3 - assert 'детская1' in children_books - assert 'детская2' in children_books - assert 'детская3' in children_books - assert 'взрослая1' not in children_books - assert 'взрослая2' not in children_books + assert collector.get_books_for_children() == ['Детская'] - def test_add_book_in_favorites(self, collector): - collector.add_book_in_favorites('Азбука') - assert len(collector.get_books_genre()) == 0 + def test_add_book_in_favorites(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.add_book_in_favorites('Азбука') - assert len(collector.get_books_genre()) == 1 - assert len(collector.favorites) == 1 - assert 'Азбука' in collector.favorites - collector.add_book_in_favorites('Азбука') - assert len(collector.favorites) == 1 + assert collector.get_list_of_favorites_books() == ['Азбука'] - def test_delete_book_from_favorites(self, collector): + def test_delete_book_from_favorites(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.add_book_in_favorites('Азбука') - collector.delete_book_from_favorites('Алгебра') - assert len(collector.favorites) == 1 - assert 'Азбука' in collector.favorites collector.delete_book_from_favorites('Азбука') - assert len(collector.favorites) == 0 - assert 'Азбука' not in collector.favorites + assert collector.get_list_of_favorites_books() == [] - def get_list_of_favorites_books(self, collector): + def test_get_list_of_favorites_books(self): + collector = BooksCollector() collector.add_new_book('Азбука') - collector.add_book_in_favorites('Азбука') collector.add_new_book('Алгебра') + collector.add_book_in_favorites('Азбука') collector.add_book_in_favorites('Алгебра') - assert len(collector.get_list_of_favorites_books()) == 2 - assert 'Азбука' in collector.get_list_of_favorites_books() - assert 'Алгебра' in collector.get_list_of_favorites_books() \ No newline at end of file + assert collector.get_list_of_favorites_books() == ['Азбука', 'Алгебра'] \ No newline at end of file From 102d8895ebc4feb4fa453c83cd6bc477719b86ae Mon Sep 17 00:00:00 2001 From: Serg-nt Date: Wed, 14 May 2025 13:41:37 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20README=20=D1=81=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cc701d..286080d 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ -# qa_python \ No newline at end of file +# qa_python +Тесты для BooksCollector + +test_initial_state - проверка первоначального состояния +test_add_new_book_correct_add_book_successful_add - проверка добавления книги в словарь без жанра +test_add_new_book_incorrect_add_book_unsuccessful_add - проверка добавления книги в словарь +test_set_book_genre_correct_genre_success - проверка на успешную установку жанра из списка +test_set_book_genre_incorrect_genre_unsuccess - проверку жанр не входящий в список не устанавливается +test_get_book_genre - получение книг по жанрам +test_get_books_with_specific_genre - проверка выведения списка книг с определенным жанром +test_get_books_genre - проверка получения списка книг +test_get_books_for_children - проверка возврата детских книг +test_add_book_in_favorites - проверка добавления книги в избранное +test_delete_book_from_favorites - проверка удаления книги из избранного +test_get_list_of_favorites_books - проверка получения списка избранных книг \ No newline at end of file From e588da5f4c62dfeb48792e32fc71e6983df017dd Mon Sep 17 00:00:00 2001 From: hinatakudo5 Date: Sun, 23 Nov 2025 23:53:13 +0500 Subject: [PATCH 4/8] README.md --- README.md | 66 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 286080d..fa85409 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,51 @@ -# qa_python -Тесты для BooksCollector - -test_initial_state - проверка первоначального состояния -test_add_new_book_correct_add_book_successful_add - проверка добавления книги в словарь без жанра -test_add_new_book_incorrect_add_book_unsuccessful_add - проверка добавления книги в словарь -test_set_book_genre_correct_genre_success - проверка на успешную установку жанра из списка -test_set_book_genre_incorrect_genre_unsuccess - проверку жанр не входящий в список не устанавливается -test_get_book_genre - получение книг по жанрам -test_get_books_with_specific_genre - проверка выведения списка книг с определенным жанром -test_get_books_genre - проверка получения списка книг -test_get_books_for_children - проверка возврата детских книг -test_add_book_in_favorites - проверка добавления книги в избранное -test_delete_book_from_favorites - проверка удаления книги из избранного -test_get_list_of_favorites_books - проверка получения списка избранных книг \ No newline at end of file +# Юнит-тестирование BooksCollector + +Проект 4 спринта: покрытие тестами класса `BooksCollector`. + +## Описание реализованных тестов + +Файл `tests.py` содержит 10 тестов. + +### Добавление книг + +1. **test_add_new_book_adds_book_without_genre** + Проверяет, что при добавлении новой книги она появляется в словаре `books_genre`, а её жанр не задан (`None`). Используется параметризация по нескольким названиям. + +2. **test_add_new_book_does_not_add_book_with_name_longer_than_40** + Проверяет, что книга с названием длиннее 40 символов не добавляется в `books_genre`. + +3. **test_add_new_book_does_not_add_duplicate_book** + Проверяет, что одну и ту же книгу нельзя добавить в словарь больше одного раза. + +### Работа с жанрами + +4. **test_set_book_genre_sets_genre_for_existing_book** + Проверяет, что для существующей книги можно установить жанр из списка доступных жанров. + +5. **test_set_book_genre_does_not_set_genre_for_unknown_book** + Проверяет, что для несуществующей книги жанр не устанавливается и она не появляется в словаре. + +6. **test_get_book_genre_returns_none_for_book_without_genre** + Проверяет, что метод возвращает `None`, если жанр книги не установлен. + +7. **test_get_books_with_specific_genre_returns_only_books_with_that_genre** + Проверяет, что метод возвращает только книги с указанным жанром. + +8. **test_get_books_for_children_excludes_books_with_age_rating** + Проверяет, что книги с возрастным рейтингом не попадают в список книг для детей. + +### Избранное + +9. **test_add_book_in_favorites_adds_only_existing_book_and_ignores_duplicates** + Проверяет, что книгу можно добавить в избранное только один раз. + +10. **test_add_book_in_favorites_does_not_add_book_which_is_not_in_books_genre** + Проверяет, что нельзя добавить в избранное книгу, которой нет в `books_genre`. + +11. **test_delete_book_from_favorites_removes_book** + Проверяет, что книга удаляется из избранного. + +## Как запустить тесты + +```bash +pytest -v tests.py From 9fa1b2c3f6c3d6ba33d5c67e26ae3db0a4d8e11e Mon Sep 17 00:00:00 2001 From: hinatakudo5 Date: Sun, 23 Nov 2025 23:54:26 +0500 Subject: [PATCH 5/8] tests.py --- tests.py | 218 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 146 insertions(+), 72 deletions(-) diff --git a/tests.py b/tests.py index 5484ccc..6688c9f 100644 --- a/tests.py +++ b/tests.py @@ -1,89 +1,163 @@ import pytest + from main import BooksCollector -class TestBooksCollector: +# ---------- Тесты для добавления книг ---------- - def test_initial_state(self): - collector = BooksCollector() - assert collector.get_books_genre() == {} and collector.get_list_of_favorites_books() == [] +@pytest.mark.parametrize('book_name', ['Книга 1', 'Очень важная книга']) +def test_add_new_book_adds_book_without_genre(book_name): + collector = BooksCollector() - def test_add_new_book_correct_add_book_successful_add(self): - collector = BooksCollector() - collector.add_new_book('Азбука') - assert collector.get_book_genre('Азбука') == '' - - @pytest.mark.parametrize("name, expected_count", [ - ('Азбука', 1), - ('', 0), - ('Азбука' * 10, 0) - ]) - def test_add_new_book_incorrect_add_book_unsuccessful_add(self, name, expected_count): - collector = BooksCollector() - collector.add_new_book(name) - assert len(collector.get_books_genre()) == expected_count - - def test_set_book_genre_correct_genre_success(self): - collector = BooksCollector() - collector.add_new_book('Азбука') - collector.set_book_genre('Азбука', 'Ужасы') - assert collector.books_genre['Азбука'] == 'Ужасы' + collector.add_new_book(book_name) - def test_set_book_genre_incorrect_genre_unsuccess(self): - collector = BooksCollector() - collector.add_new_book('Азбука') - collector.set_book_genre('Азбука', 'FFFFFF') - assert collector.books_genre['Азбука'] == '' + books = collector.get_books_genre() + assert book_name in books + # у только что добавленной книги жанр не задан + assert books[book_name] is None - def test_get_book_genre(self): - collector = BooksCollector() - collector.add_new_book('Азбука') - collector.set_book_genre('Азбука', 'Ужасы') - assert collector.get_book_genre('Азбука') == 'Ужасы' - - def test_get_books_with_specific_genre(self): - collector = BooksCollector() - books = ['Азбука', 'Алгебра', 'Маленький принц'] - for book in books: - collector.add_new_book(book) - collector.set_book_genre(book, 'Ужасы') - - collector.add_new_book('Ну погоди') - collector.set_book_genre('Ну погоди', 'Мультфильмы') - - assert collector.get_books_with_specific_genre('Ужасы') == books - - def test_get_books_genre(self): - collector = BooksCollector() - collector.add_new_book('Азбука') - assert collector.get_books_genre() == {'Азбука': ''} - def test_get_books_for_children(self): - collector = BooksCollector() - collector.add_new_book('Детская') - collector.add_new_book('Взрослая') - collector.set_book_genre('Детская', 'Фантастика') - collector.set_book_genre('Взрослая', 'Ужасы') +def test_add_new_book_does_not_add_book_with_name_longer_than_40(): + collector = BooksCollector() + long_name = 'А' * 41 # 41 символ - assert collector.get_books_for_children() == ['Детская'] + collector.add_new_book(long_name) - def test_add_book_in_favorites(self): - collector = BooksCollector() - collector.add_new_book('Азбука') - collector.add_book_in_favorites('Азбука') - assert collector.get_list_of_favorites_books() == ['Азбука'] + books = collector.get_books_genre() + assert long_name not in books - def test_delete_book_from_favorites(self): - collector = BooksCollector() - collector.add_new_book('Азбука') - collector.add_book_in_favorites('Азбука') - collector.delete_book_from_favorites('Азбука') - assert collector.get_list_of_favorites_books() == [] - def test_get_list_of_favorites_books(self): - collector = BooksCollector() +def test_add_new_book_does_not_add_duplicate_book(): + collector = BooksCollector() + book_name = 'Гарри Поттер' + + collector.add_new_book(book_name) + collector.add_new_book(book_name) + + books = collector.get_books_genre() + # одна и та же книга должна быть только один раз + assert list(books.keys()).count(book_name) == 1 + + +# ---------- Тесты для установки и получения жанра книги ---------- + +def test_set_book_genre_sets_genre_for_existing_book(): + collector = BooksCollector() + book_name = 'Безобидная книга' + collector.add_new_book(book_name) + + # берём любой допустимый жанр + any_genre = collector.genre[0] + + collector.set_book_genre(book_name, any_genre) + + assert collector.get_book_genre(book_name) == any_genre + + +def test_set_book_genre_does_not_set_genre_for_unknown_book(): + collector = BooksCollector() + unknown_book = 'Неизвестная книга' + any_genre = collector.genre[0] + + collector.set_book_genre(unknown_book, any_genre) + + books = collector.get_books_genre() + # книга так и не появилась в словаре genres + assert unknown_book not in books + + +def test_get_book_genre_returns_none_for_book_without_genre(): + collector = BooksCollector() + book_name = 'Книга без жанра' + collector.add_new_book(book_name) + + assert collector.get_book_genre(book_name) is None + + +# ---------- Тесты для получения книг по жанрам ---------- + +def test_get_books_with_specific_genre_returns_only_books_with_that_genre(): + collector = BooksCollector() + safe_genre = collector.genre[0] + other_genre = collector.genre[1] + + collector.add_new_book('Книга 1') + collector.set_book_genre('Книга 1', safe_genre) + + collector.add_new_book('Книга 2') + collector.set_book_genre('Книга 2', other_genre) + + books = collector.get_books_with_specific_genre(safe_genre) + + assert 'Книга 1' in books + assert 'Книга 2' not in books + + +def test_get_books_for_children_excludes_books_with_age_rating(): + collector = BooksCollector() + + # жанр без возрастного рейтинга + safe_genre = next( + genre for genre in collector.genre + if genre not in collector.genre_age_rating + ) + # жанр с возрастным рейтингом + age_genre = collector.genre_age_rating[0] + + collector.add_new_book('Детская книга') + collector.set_book_genre('Детская книга', safe_genre) + + collector.add_new_book('Взрослая книга') + collector.set_book_genre('Взрослая книга', age_genre) + + children_books = collector.get_books_for_children() + + assert 'Детская книга' in children_books + assert 'Взрослая книга' not in children_books + + +# ---------- Тесты для Избранного ---------- + +def test_add_book_in_favorites_adds_only_existing_book_and_ignores_duplicates(): + collector = BooksCollector() + book_name = 'Любимая книга' + + # сначала добавляем книгу в общий список + collector.add_new_book(book_name) + + collector.add_book_in_favorites(book_name) + collector.add_book_in_favorites(book_name) # в избранном она должна остаться одна + + favorites = collector.get_list_of_favorites_books() + + assert book_name in favorites + assert favorites.count(book_name) == 1 + + +def test_add_book_in_favorites_does_not_add_book_which_is_not_in_books_genre(): + collector = BooksCollector() + unknown_book = 'Неизвестная книга' + + collector.add_book_in_favorites(unknown_book) + + favorites = collector.get_list_of_favorites_books() + assert unknown_book not in favorites + + +def test_delete_book_from_favorites_removes_book(): + 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 + 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() == ['Азбука', 'Алгебра'] From b3d0ff827c3920b1371cd3a857abffa0bac6b2cb Mon Sep 17 00:00:00 2001 From: hinatakudo5 Date: Mon, 24 Nov 2025 20:50:18 +0500 Subject: [PATCH 6/8] README.md --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fa85409..64658fd 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## Описание реализованных тестов -Файл `tests.py` содержит 10 тестов. +Файл `tests.py` содержит 11 тестов. ### Добавление книг @@ -20,19 +20,19 @@ ### Работа с жанрами 4. **test_set_book_genre_sets_genre_for_existing_book** - Проверяет, что для существующей книги можно установить жанр из списка доступных жанров. + Проверяет, что для существующей книги можно установить жанр из списка доступных. 5. **test_set_book_genre_does_not_set_genre_for_unknown_book** - Проверяет, что для несуществующей книги жанр не устанавливается и она не появляется в словаре. + Проверяет, что для несуществующей книги жанр не устанавливается и она не добавляется в словарь. 6. **test_get_book_genre_returns_none_for_book_without_genre** - Проверяет, что метод возвращает `None`, если жанр книги не установлен. + Проверяет, что `get_book_genre` возвращает `None`, если жанр не установлен. 7. **test_get_books_with_specific_genre_returns_only_books_with_that_genre** Проверяет, что метод возвращает только книги с указанным жанром. 8. **test_get_books_for_children_excludes_books_with_age_rating** - Проверяет, что книги с возрастным рейтингом не попадают в список книг для детей. + Проверяет, что книги с возрастным рейтингом не попадают в список доступных детям. ### Избранное @@ -40,12 +40,13 @@ Проверяет, что книгу можно добавить в избранное только один раз. 10. **test_add_book_in_favorites_does_not_add_book_which_is_not_in_books_genre** - Проверяет, что нельзя добавить в избранное книгу, которой нет в `books_genre`. + Проверяет, что нельзя добавить в избранное книгу, которой нет в `books_genre`. 11. **test_delete_book_from_favorites_removes_book** - Проверяет, что книга удаляется из избранного. + Проверяет, что книга удаляется из избранного. ## Как запустить тесты ```bash pytest -v tests.py + From d7b15f7534091e957da79f15586cfcf7c4a5508e Mon Sep 17 00:00:00 2001 From: hinatakudo5 Date: Thu, 27 Nov 2025 19:36:22 +0500 Subject: [PATCH 7/8] main.py --- main.py | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/main.py b/main.py index d3e0a17..dc74a03 100644 --- a/main.py +++ b/main.py @@ -22,36 +22,30 @@ def get_book_genre(self, name): # выводим список книг с определённым жанром def get_books_with_specific_genre(self, genre): - books_with_specific_genre = [] - if self.books_genre and genre in self.genre: - for name, book_genre in self.books_genre.items(): - if book_genre == genre: - books_with_specific_genre.append(name) - return books_with_specific_genre - - # получаем словарь books_genre - def get_books_genre(self): - return self.books_genre - - # возвращаем книги, подходящие детям + result = [] + for key, value in self.books_genre.items(): + if self.books_genre[key] == genre: + result.append(key) + return result + + # метод для детей: исключаем по возрастному рейтингу def get_books_for_children(self): - books_for_children = [] + result = [] for name, genre in self.books_genre.items(): - if genre not in self.genre_age_rating and genre in self.genre: - books_for_children.append(name) - return books_for_children + if genre not in self.genre_age_rating: + result.append(name) + return result - # добавляем книгу в Избранное + # добавляем в избранное def add_book_in_favorites(self, name): - if name in self.books_genre: - if name not in self.favorites: - self.favorites.append(name) + if name in self.books_genre and name not in self.favorites: + self.favorites.append(name) - # удаляем книгу из Избранного + # удаляем из избранного def delete_book_from_favorites(self, name): if name in self.favorites: self.favorites.remove(name) - # получаем список Избранных книг + # получаем список избранных книг def get_list_of_favorites_books(self): return self.favorites From 19a736035326ca22c131b4cb4f51078d28019b16 Mon Sep 17 00:00:00 2001 From: hinatakudo5 Date: Sun, 7 Dec 2025 00:14:15 +0500 Subject: [PATCH 8/8] Update tests.py --- tests.py | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/tests.py b/tests.py index 6688c9f..8bcede6 100644 --- a/tests.py +++ b/tests.py @@ -1,5 +1,4 @@ import pytest - from main import BooksCollector @@ -13,8 +12,8 @@ def test_add_new_book_adds_book_without_genre(book_name): books = collector.get_books_genre() assert book_name in books - # у только что добавленной книги жанр не задан - assert books[book_name] is None + # у только что добавленной книги жанр — пустая строка + assert books[book_name] == '' def test_add_new_book_does_not_add_book_with_name_longer_than_40(): @@ -39,16 +38,14 @@ def test_add_new_book_does_not_add_duplicate_book(): assert list(books.keys()).count(book_name) == 1 -# ---------- Тесты для установки и получения жанра книги ---------- +# ---------- Тесты для установки и получения жанра ---------- def test_set_book_genre_sets_genre_for_existing_book(): collector = BooksCollector() book_name = 'Безобидная книга' collector.add_new_book(book_name) - # берём любой допустимый жанр any_genre = collector.genre[0] - collector.set_book_genre(book_name, any_genre) assert collector.get_book_genre(book_name) == any_genre @@ -62,16 +59,15 @@ def test_set_book_genre_does_not_set_genre_for_unknown_book(): collector.set_book_genre(unknown_book, any_genre) books = collector.get_books_genre() - # книга так и не появилась в словаре genres assert unknown_book not in books -def test_get_book_genre_returns_none_for_book_without_genre(): +def test_get_book_genre_returns_empty_string_for_book_without_genre(): collector = BooksCollector() book_name = 'Книга без жанра' collector.add_new_book(book_name) - assert collector.get_book_genre(book_name) is None + assert collector.get_book_genre(book_name) == '' # ---------- Тесты для получения книг по жанрам ---------- @@ -93,36 +89,39 @@ def test_get_books_with_specific_genre_returns_only_books_with_that_genre(): assert 'Книга 2' not in books -def test_get_books_for_children_excludes_books_with_age_rating(): +def test_get_books_for_children_includes_safe_genre(): collector = BooksCollector() - - # жанр без возрастного рейтинга safe_genre = next( genre for genre in collector.genre if genre not in collector.genre_age_rating ) - # жанр с возрастным рейтингом - age_genre = collector.genre_age_rating[0] collector.add_new_book('Детская книга') collector.set_book_genre('Детская книга', safe_genre) + children_books = collector.get_books_for_children() + + assert 'Детская книга' in children_books + + +def test_get_books_for_children_excludes_age_rating(): + collector = BooksCollector() + age_genre = collector.genre_age_rating[0] + collector.add_new_book('Взрослая книга') collector.set_book_genre('Взрослая книга', age_genre) children_books = collector.get_books_for_children() - assert 'Детская книга' in children_books assert 'Взрослая книга' not in children_books -# ---------- Тесты для Избранного ---------- +# ---------- Тесты для избранного ---------- def test_add_book_in_favorites_adds_only_existing_book_and_ignores_duplicates(): collector = BooksCollector() book_name = 'Любимая книга' - # сначала добавляем книгу в общий список collector.add_new_book(book_name) collector.add_book_in_favorites(book_name) @@ -156,8 +155,15 @@ def test_delete_book_from_favorites_removes_book(): favorites = collector.get_list_of_favorites_books() assert book_name not in favorites - 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() == ['Азбука', 'Алгебра'] + +def test_get_list_of_favorites_books_returns_correct_list(): + collector = BooksCollector() + + 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() == ['Азбука', 'Алгебра'] +