From f6654b90159e0642028453d43d1e2ab08e8e9a5e Mon Sep 17 00:00:00 2001 From: Polina Pavlitskaya Date: Tue, 23 Sep 2025 00:51:04 +0500 Subject: [PATCH 1/2] =?UTF-8?q?BooksCollector=20=D0=B8=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- books_collector.py | 58 ++++++++++++++++++++++++++ test_books_collector.py | 90 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 books_collector.py create mode 100644 test_books_collector.py diff --git a/books_collector.py b/books_collector.py new file mode 100644 index 0000000..b23253d --- /dev/null +++ b/books_collector.py @@ -0,0 +1,58 @@ +class BooksCollector: + + def __init__(self): + self.books_genre = {} + self.favorites = [] + self.genre = ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] + self.genre_age_rating = ['Ужасы', 'Детективы'] + + # добавляем новую книгу + def add_new_book(self, name): + if not self.books_genre.get(name) and 0 < len(name) < 41: + self.books_genre[name] = '' + + # устанавливаем книге жанр + def set_book_genre(self, name, genre): + if name in self.books_genre and genre in self.genre: + self.books_genre[name] = genre + + # получаем жанр книги по её имени + def get_book_genre(self, name): + return self.books_genre.get(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 + + # возвращаем книги, подходящие детям + def get_books_for_children(self): + books_for_children = [] + 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 + + # добавляем книгу в Избранное + def add_book_in_favorites(self, name): + if name in self.books_genre: + if 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 + \ No newline at end of file diff --git a/test_books_collector.py b/test_books_collector.py new file mode 100644 index 0000000..5ef505c --- /dev/null +++ b/test_books_collector.py @@ -0,0 +1,90 @@ +import pytest +from books_collector import BooksCollector + + +@pytest.fixture +def collector(): + return BooksCollector() + + +@pytest.mark.parametrize( + "name,should_add", + [ + ("Короткое имя", True), + ("А"*40, True), + ("А"*41, False), + ("", False), + ] +) +def test_add_new_book_various_lengths(collector, name, should_add): + collector.add_new_book(name) + assert (name in collector.get_books_genre()) is should_add + + +def test_add_new_book_duplicate_not_added(collector): + collector.add_new_book("Гарри Поттер") + collector.add_new_book("Гарри Поттер") + assert len(collector.get_books_genre()) == 1 + + +@pytest.mark.parametrize( + "genre,should_set", + [ + ("Фантастика", True), + ("Ужасы", True), + ("Романтика", False), + ] +) +def test_set_book_genre_valid_and_invalid(collector, genre, should_set): + collector.add_new_book("Книга") + collector.set_book_genre("Книга", genre) + expected = genre if should_set else "" + assert collector.get_book_genre("Книга") == expected + + +def test_get_books_with_specific_genre_returns_only_matching(collector): + collector.add_new_book("Гарри Поттер") + collector.set_book_genre("Гарри Поттер", "Фантастика") + collector.add_new_book("Оно") + collector.set_book_genre("Оно", "Ужасы") + assert collector.get_books_with_specific_genre("Фантастика") == ["Гарри Поттер"] + + +def test_get_books_genre_returns_dict(collector): + collector.add_new_book("Гарри Поттер") + assert isinstance(collector.get_books_genre(), dict) + assert "Гарри Поттер" in collector.get_books_genre() + + +def test_get_books_for_children_filters_out_age_restricted(collector): + collector.add_new_book("Оно") + collector.set_book_genre("Оно", "Ужасы") + collector.add_new_book("Мадагаскар") + collector.set_book_genre("Мадагаскар", "Мультфильмы") + result = collector.get_books_for_children() + assert "Мадагаскар" in result + assert "Оно" not in result + + +def test_add_book_in_favorites_adds_once(collector): + collector.add_new_book("Гарри Поттер") + collector.add_book_in_favorites("Гарри Поттер") + collector.add_book_in_favorites("Гарри Поттер") + favorites = collector.get_list_of_favorites_books() + assert favorites == ["Гарри Поттер"] + + +def test_delete_book_from_favorites_removes_book(collector): + collector.add_new_book("Гарри Поттер") + collector.add_book_in_favorites("Гарри Поттер") + collector.delete_book_from_favorites("Гарри Поттер") + assert "Гарри Поттер" not in collector.get_list_of_favorites_books() + + +def test_get_list_of_favorites_books_returns_list(collector): + collector.add_new_book("Гарри Поттер") + collector.add_book_in_favorites("Гарри Поттер") + result = collector.get_list_of_favorites_books() + assert isinstance(result, list) + assert result == ["Гарри Поттер"] + \ No newline at end of file From 273177af74fa344b01972856c9c6ff0b52191d11 Mon Sep 17 00:00:00 2001 From: Polina Pavlitskaya Date: Wed, 24 Sep 2025 00:13:09 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?:=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=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 --- books_collector.py | 1 - test_books_collector.py | 63 +++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/books_collector.py b/books_collector.py index b23253d..97b2567 100644 --- a/books_collector.py +++ b/books_collector.py @@ -55,4 +55,3 @@ def delete_book_from_favorites(self, name): # получаем список Избранных книг def get_list_of_favorites_books(self): return self.favorites - \ No newline at end of file diff --git a/test_books_collector.py b/test_books_collector.py index 5ef505c..e238ec4 100644 --- a/test_books_collector.py +++ b/test_books_collector.py @@ -7,13 +7,14 @@ def collector(): return BooksCollector() + @pytest.mark.parametrize( "name,should_add", [ - ("Короткое имя", True), - ("А"*40, True), - ("А"*41, False), - ("", False), + ("Короткое имя", True), + ("А" * 40, True), + ("А" * 41, False), + ("", False), ] ) def test_add_new_book_various_lengths(collector, name, should_add): @@ -27,64 +28,72 @@ def test_add_new_book_duplicate_not_added(collector): assert len(collector.get_books_genre()) == 1 + @pytest.mark.parametrize( - "genre,should_set", + "genre,expected", [ - ("Фантастика", True), - ("Ужасы", True), - ("Романтика", False), - ] + ("Фантастика", "Фантастика"), + ("Ужасы", "Ужасы"), + ("Романтика", ""), ) -def test_set_book_genre_valid_and_invalid(collector, genre, should_set): +def test_set_book_genre_sets_only_when_valid(collector, genre, expected): collector.add_new_book("Книга") collector.set_book_genre("Книга", genre) - expected = genre if should_set else "" - assert collector.get_book_genre("Книга") == expected + assert collector.books_genre["Книга"] == expected + + +def test_get_book_genre_returns_value_when_present(collector): + collector.books_genre["Книга"] = "Комедии" + assert collector.get_book_genre("Книга") == "Комедии" + + +def test_get_book_genre_returns_none_for_unknown(collector): + assert collector.get_book_genre("Несуществующая") is None + def test_get_books_with_specific_genre_returns_only_matching(collector): collector.add_new_book("Гарри Поттер") - collector.set_book_genre("Гарри Поттер", "Фантастика") collector.add_new_book("Оно") + collector.set_book_genre("Гарри Поттер", "Фантастика") collector.set_book_genre("Оно", "Ужасы") assert collector.get_books_with_specific_genre("Фантастика") == ["Гарри Поттер"] def test_get_books_genre_returns_dict(collector): collector.add_new_book("Гарри Поттер") - assert isinstance(collector.get_books_genre(), dict) - assert "Гарри Поттер" in collector.get_books_genre() + result = collector.get_books_genre() + assert isinstance(result, dict) + assert "Гарри Поттер" in result def test_get_books_for_children_filters_out_age_restricted(collector): collector.add_new_book("Оно") - collector.set_book_genre("Оно", "Ужасы") collector.add_new_book("Мадагаскар") + collector.set_book_genre("Оно", "Ужасы") collector.set_book_genre("Мадагаскар", "Мультфильмы") - result = collector.get_books_for_children() - assert "Мадагаскар" in result - assert "Оно" not in result + assert collector.get_books_for_children() == ["Мадагаскар"] + def test_add_book_in_favorites_adds_once(collector): collector.add_new_book("Гарри Поттер") + collector.set_book_genre("Гарри Поттер", "Фантастика") collector.add_book_in_favorites("Гарри Поттер") collector.add_book_in_favorites("Гарри Поттер") - favorites = collector.get_list_of_favorites_books() - assert favorites == ["Гарри Поттер"] + assert collector.favorites == ["Гарри Поттер"] + def test_delete_book_from_favorites_removes_book(collector): collector.add_new_book("Гарри Поттер") collector.add_book_in_favorites("Гарри Поттер") collector.delete_book_from_favorites("Гарри Поттер") - assert "Гарри Поттер" not in collector.get_list_of_favorites_books() - + assert "Гарри Поттер" not in collector.favorites +--------- def test_get_list_of_favorites_books_returns_list(collector): - collector.add_new_book("Гарри Поттер") - collector.add_book_in_favorites("Гарри Поттер") + collector.favorites = ["Гарри Поттер"] result = collector.get_list_of_favorites_books() assert isinstance(result, list) - assert result == ["Гарри Поттер"] - \ No newline at end of file + assert result == ["Гарри Поттер"] \ No newline at end of file