Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,31 @@
# qa_python
# 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** — добавляет две книги в избранное и проверяет, что метод возвращает корректный список, содержащий обе добавленные книги.
Binary file added __pycache__/main.cpython-313.pyc
Binary file not shown.
Binary file added __pycache__/tests.cpython-313-pytest-7.4.3.pyc
Binary file not shown.
106 changes: 90 additions & 16 deletions tests.py
Original file line number Diff line number Diff line change
@@ -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()
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() == ['Азбука', 'Алгебра']