diff --git a/README.md b/README.md index 1cc701d..1a77140 100644 --- a/README.md +++ b/README.md @@ -1 +1,31 @@ -# qa_python \ No newline at end of file +# qa_python + +## Тестовое покрытие BooksCollector + +Проект содержит набор юнит-тестов для проверки функциональности приложения BooksCollector — системы управления коллекцией книг с возможностью установки жанра и добавления в избранное. + +### Список реализованных тестов + +**test_initial_state** — проверяет, что только что созданный объект BooksCollector содержит пустой словарь книг и пустой список избранного. Убеждаемся, что начальное состояние класса корректно. + +**test_add_new_book_correct_add_book_successful_add** — добавляет книгу с корректным названием и проверяет, что она появляется в словаре books_genre с пустым жанром (по умолчанию жанр не указан). + +**test_add_new_book_incorrect_add_book_unsuccessful_add** — параметризованный тест, проверяющий граничные случаи: нельзя добавить книгу с пустой строкой (0 символов) или названием длиннее 40 символов. Валидное название успешно добавляется. + +**test_set_book_genre_correct_genre_success** — добавляет книгу и устанавливает ей жанр из допустимого списка. Проверяет, что жанр успешно присвоен книге. + +**test_set_book_genre_incorrect_genre_unsuccess** — пытается установить книге жанр, которого нет в списке разрешённых. Проверяет, что жанр не изменился (остался пустым), а метод отработал без ошибок. + +**test_get_book_genre** — добавляет книгу, задаёт ей конкретный жанр и проверяет, что метод get_book_genre возвращает именно тот жанр, который был установлен ранее. + +**test_get_books_with_specific_genre** — создаёт несколько книг, присваивает им одинаковый жанр «Ужасы» и одну книгу с другим жанром. Убеждаемся, что фильтрация по жанру возвращает только книги с искомым жанром. + +**test_get_books_genre** — проверяет, что метод get_books_genre возвращает актуальный словарь со всеми добавленными книгами и их жанрами. + +**test_get_books_for_children** — добавляет две книги: одну с жанром без возрастного рейтинга («Фантастика»), другую — с возрастным рейтингом («Ужасы»). Проверяет, что в список для детей попадает только книга, не имеющая возрастных ограничений. + +**test_add_book_in_favorites** — добавляет книгу в словарь, затем в избранное. Проверяет, что она появляется в списке избранных книг. + +**test_delete_book_from_favorites** — добавляет книгу в избранное, затем удаляет её оттуда. Убеждаемся, что список избранного становится пустым. + +**test_get_list_of_favorites_books** — добавляет две книги в избранное и проверяет, что метод возвращает корректный список, содержащий обе добавленные книги. diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000..7881fc7 Binary files /dev/null and b/__pycache__/main.cpython-313.pyc differ diff --git a/__pycache__/tests.cpython-313-pytest-7.4.3.pyc b/__pycache__/tests.cpython-313-pytest-7.4.3.pyc new file mode 100644 index 0000000..fa6f422 Binary files /dev/null and b/__pycache__/tests.cpython-313-pytest-7.4.3.pyc differ diff --git a/tests.py b/tests.py index 383385e..6a7c012 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,98 @@ +import pytest from main import BooksCollector -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test + class TestBooksCollector: - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector + def test_initial_state_books_genre_empty(self): + collector = BooksCollector() + assert collector.get_books_genre() == {} + + def test_initial_state_favorites_empty(self): + collector = BooksCollector() + assert collector.get_list_of_favorites_books() == [] + + def test_add_new_book_added_book_has_empty_genre(self): + collector = BooksCollector() + collector.add_new_book('Азбука') + assert collector.get_book_genre('Азбука') == '' + + def test_add_new_book_valid_name_added(self): + collector = BooksCollector() + collector.add_new_book('Азбука') + assert len(collector.get_books_genre()) == 1 + + def test_add_new_book_empty_name_not_added(self): + collector = BooksCollector() + collector.add_new_book('') + assert len(collector.get_books_genre()) == 0 + + def test_add_new_book_too_long_name_not_added(self): + collector = BooksCollector() + collector.add_new_book('Азбука' * 10) + assert len(collector.get_books_genre()) == 0 + + def test_set_book_genre_valid_genre_set(self): + collector = BooksCollector() + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'Ужасы') + assert collector.get_book_genre('Азбука') == 'Ужасы' + + def test_set_book_genre_invalid_genre_not_set(self): + collector = BooksCollector() + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'FFFFFF') + assert collector.get_book_genre('Азбука') == '' + + def test_get_book_genre_returns_correct_genre(self): + collector = BooksCollector() + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'Ужасы') + assert collector.get_book_genre('Азбука') == 'Ужасы' + + def test_get_books_with_specific_genre_returns_correct_books(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_returns_dict_with_added_book(self): + collector = BooksCollector() + collector.add_new_book('Азбука') + assert collector.get_books_genre() == {'Азбука': ''} + + def test_get_books_for_children_excludes_age_rated_genres(self): collector = BooksCollector() + collector.add_new_book('Детская') + collector.add_new_book('Взрослая') + collector.set_book_genre('Детская', 'Фантастика') + collector.set_book_genre('Взрослая', 'Ужасы') - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + assert collector.get_books_for_children() == ['Детская'] - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + def test_add_book_in_favorites_adds_to_list(self): + collector = BooksCollector() + collector.add_new_book('Азбука') + collector.add_book_in_favorites('Азбука') + assert collector.get_list_of_favorites_books() == ['Азбука'] - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_delete_book_from_favorites_removes_from_list(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_returns_all_favorites(self): + 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() == ['Азбука', 'Алгебра'] \ No newline at end of file