diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1a1a737..0000000 --- a/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# Python -__pycache__/ -*.py[cod] -*.class -*.so -.Python - -# pytest -.pytest_cache/ -.coverage -htmlcov/ - -# OS -.DS_Store -Thumbs.db - -# IDE -.vscode/ -.idea/ -*.swp -*.swo diff --git a/__pycache__/main.cpython-38.pyc b/__pycache__/main.cpython-38.pyc new file mode 100644 index 0000000..5786eeb Binary files /dev/null and b/__pycache__/main.cpython-38.pyc differ 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 0000000..b2898a8 Binary files /dev/null and b/__pycache__/test.cpython-38-pytest-7.1.2.pyc differ diff --git a/tests.py b/tests.py index 383385e..dc86ab8 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,226 @@ -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 + # Тест 1: Проверка инициализации коллектора + def test_init_books_collector(self): + collector = BooksCollector() + assert collector.books_genre == {} + assert collector.favorites == [] + 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 символ) + ]) + def test_add_new_book(self, book_name, expected): + 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 = 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] + + # Тест 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): + collector = BooksCollector() + collector.add_new_book('Книга') + collector.set_book_genre('Книга', 'Несуществующий жанр') + + assert collector.get_book_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): 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 - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + # Тест 8: Получение всех книг + def test_get_books_genre(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 = BooksCollector() + + # Книги с разными жанрами + children_books = [ + ('Гарри Поттер', 'Фантастика'), + ('Ну погоди!', 'Мультфильмы'), + ('Маска', 'Комедии') + ] + + adult_books = [ + ('Сияние', 'Ужасы'), + ('Десять негритят', 'Детективы') + ] + + # Добавляем все книги + 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 - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + # Тест 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 - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + # Тест 11: Нельзя добавить книгу в избранное дважды + def test_add_book_in_favorites_twice(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(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 == [] + + # Тест 13: Удаление несуществующей книги из избранного + def test_delete_nonexistent_book_from_favorites(self): + collector = BooksCollector() + + # Попытка удалить несуществующую книгу не должна вызывать ошибку + collector.delete_book_from_favorites('Несуществующая книга') + assert collector.favorites == [] + + # Тест 14: Получение списка избранных книг + def test_get_list_of_favorites_books(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_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() == ['Властелин колец']