diff --git a/books_collector.py b/books_collector.py new file mode 100644 index 0000000..97b2567 --- /dev/null +++ b/books_collector.py @@ -0,0 +1,57 @@ +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 diff --git a/test_books_collector.py b/test_books_collector.py new file mode 100644 index 0000000..e238ec4 --- /dev/null +++ b/test_books_collector.py @@ -0,0 +1,99 @@ +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,expected", + [ + ("Фантастика", "Фантастика"), + ("Ужасы", "Ужасы"), + ("Романтика", ""), +) +def test_set_book_genre_sets_only_when_valid(collector, genre, expected): + collector.add_new_book("Книга") + collector.set_book_genre("Книга", genre) + 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.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("Гарри Поттер") + 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.add_new_book("Мадагаскар") + collector.set_book_genre("Оно", "Ужасы") + collector.set_book_genre("Мадагаскар", "Мультфильмы") + 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("Гарри Поттер") + 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.favorites + +--------- +def test_get_list_of_favorites_books_returns_list(collector): + collector.favorites = ["Гарри Поттер"] + result = collector.get_list_of_favorites_books() + assert isinstance(result, list) + assert result == ["Гарри Поттер"] \ No newline at end of file