From 5c5d661b1dca42a10c3ed62d281b41c47d583fb9 Mon Sep 17 00:00:00 2001 From: Mefite Date: Mon, 1 Dec 2025 11:17:50 +0300 Subject: [PATCH] 1st --- README.md | 33 +++++++++++++++++ main.py | 57 ++++++++++++++++++++++++++++++ tests.py | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 README.md create mode 100644 main.py create mode 100644 tests.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..163e192 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# BooksCollector + +### Тесты: + +1. **test_add_new_book_title_length_limit** + Проверка допустимого количества символов в названии книги. + +2. **test_set_book_genre_set_invalid_genre** + Проверка, что нельзя установить недопустимый жанр + +3. **test_add_book_empty_genre** + Проверка, что у добавленной книги отсутсвует жанр + +4. **test_get_books_with_specific_genre** + Проверка, что можно вывести книги выбранного жанра + +5. **test_get_books_genre** + Проверка, что можно вывести текущий словарь + +6. **test_get_books_for_children** + Проверка, что можно вывести список детских книг + +7. **test_get_books_for_children_except_adult** + Проверка, что в списке детских книг отсутствуют жанры с возрастным рейтингом + +8. **test_add_book_in_favorites** + Проверка, что можно добавить книгу в список избранного + +9. **test_delete_book_from_favorites** + Проверка, что можно удалить книгу из списка избранного + +10. **test_get_list_of_favorites_books** + Проверка, что можно вывести список избранных книг \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..d3e0a17 --- /dev/null +++ b/main.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/tests.py b/tests.py new file mode 100644 index 0000000..f633980 --- /dev/null +++ b/tests.py @@ -0,0 +1,103 @@ +from main import BooksCollector +import pytest + +# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector +# обязательно указывать префикс Test +class TestBooksCollector: + + # пример теста: + # обязательно указывать префикс test_ + # дальше идет название метода, который тестируем add_new_book_ + # затем, что тестируем add_two_books - добавление двух книг + def test_add_new_book_add_two_books(self): + # создаем экземпляр (объект) класса BooksCollector + collector = BooksCollector() + + # добавляем две книги + collector.add_new_book('Гордость и предубеждение и зомби') + collector.add_new_book('Что делать, если ваш кот хочет вас убить') + + # проверяем, что добавилось именно две + # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 + assert len(collector.get_books_rating()) == 2 + + # напиши свои тесты ниже + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() + + # Параметризованный тест на проверку допустимого количества символов в названии + @pytest.mark.parametrize('name, approve', [ + ('A', True), + ('B' * 40, True), + ('', False), + ('C' * 41, False) + ]) + def test_add_new_book_title_length_limit(self, name, approve): + collector = BooksCollector() + collector.add_new_book(name) + + assert (name in collector.get_books_genre()) == approve + + # Нельзя установить недопустимый жанр + def test_set_book_genre_set_invalid_genre(self): + collector = BooksCollector() + collector.add_new_book('Остров сокровищ') + collector.set_book_genre('Остров сокровищ', 'Приключения') + assert collector.get_book_genre('Остров сокровищ') == '' + + # У добавленной книги отсутсвует жанр + def test_add_book_empty_genre(self): + collector = BooksCollector() + collector.add_new_book('Остров сокровищ') + assert collector.get_book_genre('Остров сокровищ') == '' + + # Можно вывести книги выбранного жанра + def test_get_books_with_specific_genre(self): + collector = BooksCollector() + collector.add_new_book('Остров сокровищ') + collector.set_book_genre('Остров сокровищ', 'Мультфильмы') + assert collector.get_books_with_specific_genre('Мультфильмы') == ['Остров сокровищ'] + + # Можно вывести текущий словарь + 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.set_book_genre('Остров сокровищ', 'Мультфильмы') + assert 'Остров сокровищ' in collector.get_books_for_children() + + #В списке детских книг отсутствуют жанры с возрастным рейтингом + def test_get_books_for_children_except_adult(self): + collector = BooksCollector() + collector.add_new_book('Оно') + collector.set_book_genre('Оно', 'Ужасы') + assert 'Оно' not in collector.get_books_for_children() + + #Можно добавить книгу в избранное + def test_add_book_in_favorites(self): + collector = BooksCollector() + collector.add_new_book('Остров сокровищ') + collector.add_book_in_favorites('Остров сокровищ') + assert 'Остров сокровищ' in collector.get_list_of_favorites_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 'Остров сокровищ' not in collector.get_list_of_favorites_books() + + #Можно вывести список избранных книг + def test_get_list_of_favorites_books(self): + collector = BooksCollector() + collector.add_new_book('Остров сокровищ') + collector.add_book_in_favorites('Остров сокровищ') + assert collector.get_list_of_favorites_books() == ['Остров сокровищ'] + + + \ No newline at end of file