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
5 changes: 5 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,11 @@
# qa_python
# qa_python
# реализованы
# add_new_book — добавляет новую книгу в словарь без указания жанра. Название книги может содержать максимум 40 символов. Одну и ту же книгу можно добавить только один раз.
# set_book_genre — устанавливает жанр книги, если книга есть в books_genreи её жанр входит в списокgenre.
# get_book_genre— выводит жанр книги по её имени.
# get_books_with_specific_genre— выводит список книг с определённым жанром.
# get_books_genre— выводит текущий словарь books_genre.
# get_books_for_children — возвращает книги, которые подходят детям. У жанра книги не должно быть возрастного рейтинга.
# add_book_in_favorites — добавляет книгу в избранное. Книга должна находиться в словаре books_genre. Повторно добавить книгу в избранное нельзя.
# delete_book_from_favorites — удаляет книгу из избранного, если она там есть.
# get_list_of_favorites_books — получает список избранных книг.
Binary file added __pycache__/main.cpython-314.pyc
Binary file not shown.
Binary file added __pycache__/tests.cpython-314-pytest-9.0.2.pyc
Binary file not shown.
229 changes: 224 additions & 5 deletions tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import pytest
from main import BooksCollector

# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector
Expand All @@ -16,9 +17,227 @@ def test_add_new_book_add_two_books(self):
collector.add_new_book('Гордость и предубеждение и зомби')
collector.add_new_book('Что делать, если ваш кот хочет вас убить')

# проверяем, что добавилось именно две
# словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
assert len(collector.get_books_rating()) == 2
# проверяем, что добавилось именно две книги
# словарь books_genre, который нам возвращает метод get_books_genre, имеет длину 2
assert len(collector.get_books_genre()) == 2

# напиши свои тесты ниже
# чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
# добавление книг с разной длиной названия
@pytest.mark.parametrize('name, expected_in_books', [
('Нормальная книга', True), # корректное название
('', False), # пустое название
('а' * 41, False), # 41 символ (больше 40)
('а' * 40, True), # 40 символов (граничное значение)
('а' * 1, True), # 1 символ (граничное значение)
('Книга с очень длинным названием которое почти сорок', False) # больше 40
])
def test_add_new_book_different_lengths(self, name, expected_in_books):
collector = BooksCollector()
collector.add_new_book(name)
assert (name in collector.books_genre) == expected_in_books

# (отдельный тест, так как параметризация здесь неудобна)
def test_add_new_book_duplicate(self):
collector = BooksCollector()
book_name = 'Дублирующая книга'

# добавляем первый раз
collector.add_new_book(book_name)
assert book_name in collector.books_genre
assert len(collector.books_genre) == 1

# добавляем второй раз (дубликат)
collector.add_new_book(book_name)
assert book_name in collector.books_genre
assert len(collector.books_genre) == 1 # количество не должно увеличиться

# установка валидных жанров
@pytest.mark.parametrize('genre', ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'])
def test_set_book_genre_valid_genres(self, genre):
collector = BooksCollector()
book_name = 'Тестовая книга'
collector.add_new_book(book_name)
collector.set_book_genre(book_name, genre)
assert collector.get_book_genre(book_name) == genre

# установка невалидных жанров
@pytest.mark.parametrize('invalid_genre', ['Роман', 'Поэзия', 'Драма', 'Триллер', ''])
def test_set_book_genre_invalid_genres(self, invalid_genre):
collector = BooksCollector()
book_name = 'Тестовая книга'
collector.add_new_book(book_name)
collector.set_book_genre(book_name, invalid_genre)
assert collector.get_book_genre(book_name) == '' # жанр должен остаться пустым

# получение жанра для разных книг
@pytest.mark.parametrize('book_name, genre, expected_genre', [
('Фантастическая книга', 'Фантастика', 'Фантастика'),
('Страшная книга', 'Ужасы', 'Ужасы'),
('Детективная книга', 'Детективы', 'Детективы'),
('Мультик', 'Мультфильмы', 'Мультфильмы'),
('Смешная книга', 'Комедии', 'Комедии'),
('Книга без жанра', '', ''),
])
def test_get_book_genre_different_books(self, book_name, genre, expected_genre):
collector = BooksCollector()

# добавляем книгу
collector.add_new_book(book_name)

# устанавливаем жанр, если он указан
if genre:
collector.set_book_genre(book_name, genre)

# проверяем, что метод возвращает правильный жанр
assert collector.get_book_genre(book_name) == expected_genre
# получение списка книг с определённым жанром
@pytest.mark.parametrize('genre, expected_books', [
('Фантастика', ['Фантастика 1', 'Фантастика 2']),
('Детективы', ['Детектив 1']),
('Ужасы', []),
('Мультфильмы', ['Мультфильм 1']),
('Комедии', ['Комедия 1', 'Комедия 2']),
])
def test_get_books_with_specific_genre(self, genre, expected_books):
collector = BooksCollector()

# добавляем книги с разными жанрами
books_data = [
('Фантастика 1', 'Фантастика'),
('Фантастика 2', 'Фантастика'),
('Детектив 1', 'Детективы'),
('Мультфильм 1', 'Мультфильмы'),
('Комедия 1', 'Комедии'),
('Комедия 2', 'Комедии'),
]
for book_name, book_genre in books_data:
collector.add_new_book(book_name)
collector.set_book_genre(book_name, book_genre)
# получаем список книг с указанным жанром
books = collector.get_books_with_specific_genre(genre)
# проверяем, что получили ожидаемый список
assert books == expected_books
# проверка книг для детей
@pytest.mark.parametrize('book_name, genre, should_be_for_children', [
('Мультфильм для детей', 'Мультфильмы', True),
('Смешная комедия', 'Комедии', True),
('Космическая фантастика', 'Фантастика', True),
('Страшный ужастик', 'Ужасы', False),
('Загадочный детектив', 'Детективы', False),
('Книга без жанра', '', False),
])
def test_get_books_for_children(self, book_name, genre, should_be_for_children):
collector = BooksCollector()

# добавляем книгу
collector.add_new_book(book_name)

# устанавливаем жанр, если он указан
if genre:
collector.set_book_genre(book_name, genre)

# получаем список книг для детей
children_books = collector.get_books_for_children()

# проверяем, есть ли книга в списке для детей
if should_be_for_children:
assert book_name in children_books
else:
assert book_name not in children_books

# добавление книг в избранное
@pytest.mark.parametrize('book_name, book_exists, should_be_added', [
('Существующая книга', True, True),
('Несуществующая книга', False, False),
('', False, False),
])
def test_add_book_in_favorites(self, book_name, book_exists, should_be_added):
collector = BooksCollector()

# если книга должна существовать, добавляем её в books_genre
if book_exists:
collector.add_new_book(book_name)

# добавляем книгу в избранное
collector.add_book_in_favorites(book_name)

# проверяем результат
if should_be_added:
assert book_name in collector.get_list_of_favorites_books()
else:
assert book_name not in collector.get_list_of_favorites_books()

# удаление книг из избранного
@pytest.mark.parametrize('book_to_delete, expected_favorites', [
('Книга 1', ['Книга 2', 'Книга 3']),
('Книга 2', ['Книга 1', 'Книга 3']),
('Книга 3', ['Книга 1', 'Книга 2']),
('Несуществующая книга', ['Книга 1', 'Книга 2', 'Книга 3']),
])
def test_delete_book_from_favorites(self, book_to_delete, expected_favorites):
collector = BooksCollector()

# добавляем три книги в books_genre
collector.add_new_book('Книга 1')
collector.add_new_book('Книга 2')
collector.add_new_book('Книга 3')

# добавляем все книги в избранное
collector.add_book_in_favorites('Книга 1')
collector.add_book_in_favorites('Книга 2')
collector.add_book_in_favorites('Книга 3')

# удаляем указанную книгу
collector.delete_book_from_favorites(book_to_delete)

# проверяем, что в избранном остались только ожидаемые книги
assert collector.get_list_of_favorites_books() == expected_favorites

# добавление одной и той же книги в избранное дважды
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.get_list_of_favorites_books()) == 1
assert collector.get_list_of_favorites_books() == [book_name]

# получение словаря books_genre
def test_get_books_genre(self):
collector = BooksCollector()
collector.add_new_book('Книга 1')
collector.add_new_book('Книга 2')
collector.set_book_genre('Книга 1', 'Фантастика')
books_genre = collector.get_books_genre()
assert len(books_genre) == 2
assert books_genre['Книга 1'] == 'Фантастика'
assert books_genre['Книга 2'] == ''

# получение пустого списка избранного
def test_get_list_of_favorites_books_empty(self):
collector = BooksCollector()
assert collector.get_list_of_favorites_books() == []

# удаление книги, которой нет в избранном
def test_delete_book_from_favorites_nonexistent(self):
collector = BooksCollector()
collector.add_new_book('Книга 1')
collector.add_book_in_favorites('Книга 1')
collector.delete_book_from_favorites('Несуществующая книга')
assert collector.get_list_of_favorites_books() == ['Книга 1']

# установка жанра для несуществующей книги
def test_set_book_genre_for_nonexistent_book(self):
collector = BooksCollector()
collector.set_book_genre('Несуществующая книга', 'Фантастика')
assert collector.get_book_genre('Несуществующая книга') is None

# изменение жанра у существующей книги
def test_set_book_genre_change_genre(self):
collector = BooksCollector()
book_name = 'Книга для смены жанра'
collector.add_new_book(book_name)
collector.set_book_genre(book_name, 'Ужасы')
assert collector.get_book_genre(book_name) == 'Ужасы'
collector.set_book_genre(book_name, 'Комедии')
assert collector.get_book_genre(book_name) == 'Комедии'