From 0afe90ef11db09519ad82b066e35477498188e85 Mon Sep 17 00:00:00 2001 From: Anastasiya Luhavets Date: Fri, 19 Dec 2025 23:39:07 +0300 Subject: [PATCH 1/3] new_commit --- tests.py | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 154 insertions(+), 1 deletion(-) diff --git a/tests.py b/tests.py index 383385e..a9a4d3f 100644 --- a/tests.py +++ b/tests.py @@ -1,5 +1,8 @@ +import pytest + from main import BooksCollector + # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector # обязательно указывать префикс Test class TestBooksCollector: @@ -21,4 +24,154 @@ def test_add_new_book_add_two_books(self): assert len(collector.get_books_rating()) == 2 # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() + + + # 1) Добавление книги: валидное имя и затем отсутствие жанра + def test_add_new_book_valid_and_no_genre_after_add(self): + c = BooksCollector() + c.add_new_book("БезЖанра") + assert "БезЖанра" in c.get_books_genre() + assert c.get_books_genre()["БезЖанра"] == "" + + # 2) Проверка, что книги с возрастным рейтингом не попадают в список для детей + def test_books_with_age_rating_not_in_children_list(self): + c = BooksCollector() + c.add_new_book("КнигаСВозрастнымРейтингом") + c.set_book_genre("КнигаСВозрастнымРейтингом", "Ужасы") # возрастной рейтинг присутствует в жанрах + children = c.get_books_for_children() + assert "КнигаСВозрастнымРейтингом" not in children + + # 3) Добавление новой книги и проверка, что жанр пустой по умолчанию + def test_add_book_and_check_no_genre_initially(self): + c = BooksCollector() + c.add_new_book("НовинкаБезЖанра") + assert c.get_book_genre("НовинкаБезЖанра") == "" + assert "НовинкаБезЖанра" in c.get_books_genre() + + # 4) Установка валидных жанров для партий книг (параметризовано) + @pytest.mark.parametrize("name,genre", [ + ("Neuromancer", "Фантастика"), + ("It", "Ужасы"), + ]) + def test_set_book_genre_valid(self, name, genre): + self.add_new_book(name) + self.set_book_genre(name, genre) + assert self.get_book_genre(name) == genre + + # 5) Неправильные случаи для жанров: несуществующая книга и неверный жанр + def test_set_book_genre_invalid_book_and_genre(self): + c = BooksCollector() + c.set_book_genre("NonExistent", "Фантастика") + assert c.get_book_genre("NonExistent") is None + + c.add_new_book("I, Robot") + c.set_book_genre("I, Robot", "Научная фантастика") + assert c.get_book_genre("I, Robot") == "" + + # 6) Получение списка книг по конкретному жанру (параметризовано) + @pytest.mark.parametrize("genre, expected", [ + ("Фантастика", ["Book1"]), + ("Ужасы", ["Book2"]), + ]) + def test_get_books_with_specific_genre(self, expected, collector, genre=None): + c = collector + c.add_new_book("Book1") + c.add_new_book("Book2") + c.add_new_book("Book3") + if genre == "Фантастика": + c.set_book_genre("Book1", "Фантастика") + c.set_book_genre("Book2", "Ужасы") + c.set_book_genre("Book3", "Детективы") + else: + c.set_book_genre("Book2", "Ужасы") + + books = c.get_books_with_specific_genre(genre) + assert books == expected + + # 7) Получение списка книг по неверному/несуществующему жанру + def test_get_books_with_specific_genre_invalid(self): + c = BooksCollector() + c.add_new_book("BookX") + c.set_book_genre("BookX", "Фантастика") + assert c.get_books_with_specific_genre("Мультфильмы") == [] + + # 8) Проверка списка жанров текущего состояния (сниппет) + def test_get_books_genre_snapshot(self): + c = BooksCollector() + c.add_new_book("Alpha") + c.set_book_genre("Alpha", "Комедии") + snapshot = c.get_books_genre() + assert snapshot == {"Alpha": "Комедии"} + + # 9) Проверка списка детей под условия: Kid1 допустим, Kid2 возрастное, Adult1 взрослый + def test_get_books_for_children(self): + c = BooksCollector() + c.add_new_book("Kid1") + c.add_new_book("Kid2") + c.add_new_book("Adult1") + + c.set_book_genre("Kid1", "Комедии") # допустим для детей + c.set_book_genre("Kid2", "Ужасы") # ограничение по возрасту + c.set_book_genre("Adult1", "Фантастика") + + children = c.get_books_for_children() + assert "Kid1" in children + assert "Kid2" not in children + assert "Adult1" in children + + # 10) Работа со Избранным: добавление, дубликаты, удаление, единичные тесты + @pytest.mark.parametrize("name", ["FavoriteBook", "NiceBook"]) + def test_add_book_in_favorites_valid(self, name): + c = self + c.add_new_book(name) + c.add_book_in_favorites(name) + assert name in c.get_list_of_favorites_books() + + def test_add_book_in_favorites_duplicate_and_invalid(self): + c = BooksCollector() + c.add_new_book("NiceBook") + c.add_book_in_favorites("NiceBook") + c.add_book_in_favorites("NiceBook") # дубликат не добавится + assert c.get_list_of_favorites_books().count("NiceBook") == 1 + + c.add_book_in_favorites("NonExist") + assert "NonExist" not in c.get_list_of_favorites_books() + + def test_delete_book_from_favorites_and_empty(self): + c = BooksCollector() + c.add_new_book("ToRemove") + c.add_book_in_favorites("ToRemove") + c.delete_book_from_favorites("ToRemove") + assert c.get_list_of_favorites_books() == [] + + def test_full_workflow_minimal(self): + c = BooksCollector() + c.add_new_book("The Hobbit") + c.add_new_book("It") + c.set_book_genre("The Hobbit", "Комедии") + c.set_book_genre("It", "Ужасы") + c.add_book_in_favorites("The Hobbit") + c.add_book_in_favorites("It") + + assert c.get_book_genre("The Hobbit") == "Комедии" + assert set(c.get_list_of_favorites_books()) == {"The Hobbit", "It"} + + c.delete_book_from_favorites("It") + assert c.get_list_of_favorites_books() == ["The Hobbit"] + + def add_new_book(self, name): + pass + + def set_book_genre(self, name, genre): + pass + + def get_book_genre(self, name): + pass + + def add_book_in_favorites(self, name): + pass + + def get_list_of_favorites_books(self): + pass + From da6ff5cb34ca771699ef49836fbdc6644fecf44c Mon Sep 17 00:00:00 2001 From: Anastasiya Luhavets Date: Wed, 24 Dec 2025 23:27:48 +0300 Subject: [PATCH 2/3] new_commit --- tests.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests.py b/tests.py index a9a4d3f..437fb9a 100644 --- a/tests.py +++ b/tests.py @@ -15,14 +15,6 @@ 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() From 9b718c1487c2d51b7ca9717535d46145870c2440 Mon Sep 17 00:00:00 2001 From: Anastasiya Luhavets Date: Thu, 25 Dec 2025 14:33:03 +0300 Subject: [PATCH 3/3] new_commit --- main.py | 3 + tests.py | 226 +++++++++++++++++++++++-------------------------------- 2 files changed, 99 insertions(+), 130 deletions(-) diff --git a/main.py b/main.py index d3e0a17..2f621a8 100644 --- a/main.py +++ b/main.py @@ -55,3 +55,6 @@ def delete_book_from_favorites(self, name): # получаем список Избранных книг def get_list_of_favorites_books(self): return self.favorites + + def get_books_rating(self): + pass diff --git a/tests.py b/tests.py index 437fb9a..311b34a 100644 --- a/tests.py +++ b/tests.py @@ -1,169 +1,135 @@ import pytest - from main import BooksCollector +@pytest.fixture +def collector(): + return BooksCollector() -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test class TestBooksCollector: - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() - - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() - + @pytest.mark.parametrize("name", ["Some Book", "Another Book"]) + def test_add_new_book_adds_books(self, collector, name): + collector.add_new_book(name) + # Проверяем, что книга добавилась в список + books_genre = collector.get_books_genre() + assert name in books_genre # 1) Добавление книги: валидное имя и затем отсутствие жанра - def test_add_new_book_valid_and_no_genre_after_add(self): - c = BooksCollector() - c.add_new_book("БезЖанра") - assert "БезЖанра" in c.get_books_genre() - assert c.get_books_genre()["БезЖанра"] == "" + def test_add_new_book_valid_and_no_genre_after_add(self, collector): + collector.add_new_book("БезЖанра") + books_genre = collector.get_books_genre() + assert "БезЖанра" in books_genre + assert collector.get_book_genre("БезЖанра") == "" # 2) Проверка, что книги с возрастным рейтингом не попадают в список для детей - def test_books_with_age_rating_not_in_children_list(self): - c = BooksCollector() - c.add_new_book("КнигаСВозрастнымРейтингом") - c.set_book_genre("КнигаСВозрастнымРейтингом", "Ужасы") # возрастной рейтинг присутствует в жанрах - children = c.get_books_for_children() - assert "КнигаСВозрастнымРейтингом" not in children + def test_books_with_age_rating_not_in_children_list(self, collector): + name = "КнигаСВозрастнымРейтингом" + collector.add_new_book(name) + collector.set_book_genre(name, "Ужасы") # допустим, жанр не для детей + children = collector.get_books_for_children() + assert name not in children # 3) Добавление новой книги и проверка, что жанр пустой по умолчанию - def test_add_book_and_check_no_genre_initially(self): - c = BooksCollector() - c.add_new_book("НовинкаБезЖанра") - assert c.get_book_genre("НовинкаБезЖанра") == "" - assert "НовинкаБезЖанра" in c.get_books_genre() + def test_add_book_and_check_no_genre_initially(self, collector): + collector.add_new_book("НовинкаБезЖанра") + assert collector.get_book_genre("НовинкаБезЖанра") == "" + assert "НовинкаБезЖанра" in collector.get_books_genre() # 4) Установка валидных жанров для партий книг (параметризовано) @pytest.mark.parametrize("name,genre", [ ("Neuromancer", "Фантастика"), ("It", "Ужасы"), ]) - def test_set_book_genre_valid(self, name, genre): - self.add_new_book(name) - self.set_book_genre(name, genre) - assert self.get_book_genre(name) == genre + def test_set_book_genre_valid(self, collector, name, genre): + collector.add_new_book(name) + collector.set_book_genre(name, genre) + assert collector.get_book_genre(name) == genre # 5) Неправильные случаи для жанров: несуществующая книга и неверный жанр - def test_set_book_genre_invalid_book_and_genre(self): - c = BooksCollector() - c.set_book_genre("NonExistent", "Фантастика") - assert c.get_book_genre("NonExistent") is None + def test_set_book_genre_invalid_book_and_genre(self, collector): + collector.set_book_genre("NonExistent", "Фантастика") + assert collector.get_book_genre("NonExistent") is None - c.add_new_book("I, Robot") - c.set_book_genre("I, Robot", "Научная фантастика") - assert c.get_book_genre("I, Robot") == "" + collector.add_new_book("I, Robot") + collector.set_book_genre("I, Robot", "Научная фантастика") + assert collector.get_book_genre("I, Robot") == "" # 6) Получение списка книг по конкретному жанру (параметризовано) @pytest.mark.parametrize("genre, expected", [ ("Фантастика", ["Book1"]), ("Ужасы", ["Book2"]), ]) - def test_get_books_with_specific_genre(self, expected, collector, genre=None): - c = collector - c.add_new_book("Book1") - c.add_new_book("Book2") - c.add_new_book("Book3") + def test_get_books_with_specific_genre(self, collector, genre, expected): + # подготовим книги и установим жанры + collector.add_new_book("Book1") + collector.set_book_genre("Book1", "Фантастика") + collector.add_new_book("Book2") + collector.set_book_genre("Book2", "Ужасы") + collector.add_new_book("Book3") + # для каждого жанра устанавливаем только нужную книгу if genre == "Фантастика": - c.set_book_genre("Book1", "Фантастика") - c.set_book_genre("Book2", "Ужасы") - c.set_book_genre("Book3", "Детективы") - else: - c.set_book_genre("Book2", "Ужасы") - - books = c.get_books_with_specific_genre(genre) + # Book3 не меняем, оставляем без жанра или в другом жанре + pass + elif genre == "Ужасы": + # Book3 не меняем + pass + # вызываем функцию + books = collector.get_books_with_specific_genre(genre) assert books == expected - - # 7) Получение списка книг по неверному/несуществующему жанру - def test_get_books_with_specific_genre_invalid(self): - c = BooksCollector() - c.add_new_book("BookX") - c.set_book_genre("BookX", "Фантастика") - assert c.get_books_with_specific_genre("Мультфильмы") == [] - - # 8) Проверка списка жанров текущего состояния (сниппет) - def test_get_books_genre_snapshot(self): - c = BooksCollector() - c.add_new_book("Alpha") - c.set_book_genre("Alpha", "Комедии") - snapshot = c.get_books_genre() + # 8) Проверка списка жанров текущего состояния + def test_get_books_genre_snapshot(self, collector): + collector.add_new_book("Alpha") + collector.set_book_genre("Alpha", "Комедии") + snapshot = collector.get_books_genre() assert snapshot == {"Alpha": "Комедии"} - # 9) Проверка списка детей под условия: Kid1 допустим, Kid2 возрастное, Adult1 взрослый - def test_get_books_for_children(self): - c = BooksCollector() - c.add_new_book("Kid1") - c.add_new_book("Kid2") - c.add_new_book("Adult1") + # 9) Проверка списка детей + def test_get_books_for_children(self, collector): + collector.add_new_book("Kid1") + collector.add_new_book("Kid2") + collector.add_new_book("Adult1") - c.set_book_genre("Kid1", "Комедии") # допустим для детей - c.set_book_genre("Kid2", "Ужасы") # ограничение по возрасту - c.set_book_genre("Adult1", "Фантастика") + collector.set_book_genre("Kid1", "Комедии") # допустим для детей + collector.set_book_genre("Kid2", "Ужасы") # ограничение по возрасту + collector.set_book_genre("Adult1", "Фантастика") - children = c.get_books_for_children() + children = collector.get_books_for_children() assert "Kid1" in children assert "Kid2" not in children assert "Adult1" in children # 10) Работа со Избранным: добавление, дубликаты, удаление, единичные тесты @pytest.mark.parametrize("name", ["FavoriteBook", "NiceBook"]) - def test_add_book_in_favorites_valid(self, name): - c = self - c.add_new_book(name) - c.add_book_in_favorites(name) - assert name in c.get_list_of_favorites_books() - - def test_add_book_in_favorites_duplicate_and_invalid(self): - c = BooksCollector() - c.add_new_book("NiceBook") - c.add_book_in_favorites("NiceBook") - c.add_book_in_favorites("NiceBook") # дубликат не добавится - assert c.get_list_of_favorites_books().count("NiceBook") == 1 - - c.add_book_in_favorites("NonExist") - assert "NonExist" not in c.get_list_of_favorites_books() - - def test_delete_book_from_favorites_and_empty(self): - c = BooksCollector() - c.add_new_book("ToRemove") - c.add_book_in_favorites("ToRemove") - c.delete_book_from_favorites("ToRemove") - assert c.get_list_of_favorites_books() == [] - - def test_full_workflow_minimal(self): - c = BooksCollector() - c.add_new_book("The Hobbit") - c.add_new_book("It") - c.set_book_genre("The Hobbit", "Комедии") - c.set_book_genre("It", "Ужасы") - c.add_book_in_favorites("The Hobbit") - c.add_book_in_favorites("It") - - assert c.get_book_genre("The Hobbit") == "Комедии" - assert set(c.get_list_of_favorites_books()) == {"The Hobbit", "It"} - - c.delete_book_from_favorites("It") - assert c.get_list_of_favorites_books() == ["The Hobbit"] - - def add_new_book(self, name): - pass - - def set_book_genre(self, name, genre): - pass - - def get_book_genre(self, name): - pass - - def add_book_in_favorites(self, name): - pass - - def get_list_of_favorites_books(self): - pass - + def test_add_book_in_favorites_valid(self, collector, name): + collector.add_new_book(name) + collector.add_book_in_favorites(name) + assert name in collector.get_list_of_favorites_books() + + def test_add_book_in_favorites_duplicate_and_invalid(self, collector): + collector.add_new_book("NiceBook") + collector.add_book_in_favorites("NiceBook") + collector.add_book_in_favorites("NiceBook") # дубликат не добавится + assert collector.get_list_of_favorites_books().count("NiceBook") == 1 + + collector.add_book_in_favorites("NonExist") + assert "NonExist" not in collector.get_list_of_favorites_books() + + def test_delete_book_from_favorites_and_empty(self, collector): + collector.add_new_book("ToRemove") + collector.add_book_in_favorites("ToRemove") + collector.delete_book_from_favorites("ToRemove") + assert collector.get_list_of_favorites_books() == [] + + def test_full_workflow_minimal(self, collector): + collector.add_new_book("The Hobbit") + collector.add_new_book("It") + collector.set_book_genre("The Hobbit", "Комедии") + collector.set_book_genre("It", "Ужасы") + collector.add_book_in_favorites("The Hobbit") + collector.add_book_in_favorites("It") + + assert collector.get_book_genre("The Hobbit") == "Комедии" + assert set(collector.get_list_of_favorites_books()) == {"The Hobbit", "It"} + + collector.delete_book_from_favorites("It") + assert collector.get_list_of_favorites_books() == ["The Hobbit"] \ No newline at end of file