Repository: L1ghTyyyy/Sprint_4
Pull request #3: Sprint_4
Author: login: L1ghTyyyy
Created: 2025-03-19T02:33:48Z | Merged: 2025-03-20T02:46:39Z

Выполнил практическую работу №4

-  Покрыл тестами приложение BooksCollector
-  Описал в README реализованные тесты
-  Добавил файл .gitignore (посчитал нужным добавить т.к в чек-листе указан поинт на отсутствие лишних файлов в PR)


Diff:
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..029eb0b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,243 @@
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Python template
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/latest/usage/project/#working-with-version-control
+.pdm.toml
+.pdm-python
+.pdm-build/
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+.idea/
+
diff --git a/README.md b/README.md
index 1cc701d..24712d8 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,39 @@
-# qa_python
\ No newline at end of file
+# Реализованные тесты  
+
+## Тесты для `add_new_book`  
+- **`test_add_new_book_add_one_book`** – проверяет, что можно добавить одну книгу.  
+- **`test_add_new_book_add_two_books`** – проверяет добавление двух книг.  
+- **`test_add_duplicate_book`** – проверяет, что дубликаты книг не добавляются.  
+- **`test_add_new_book_too_long`** – проверяет, что книга с названием более 40 символов не добавляется.  
+
+## Тесты для `set_book_genre`  
+- **`test_set_book_genre`** – проверяет успешную установку жанра для книги.  
+- **`test_set_invalid_genre`** – проверяет, что нельзя установить несуществующий жанр.  
+
+## Тесты для `get_book_genre`  
+- **`test_get_book_genre_existing_book`** – проверяет, что метод возвращает установленный жанр книги.  
+- **`test_get_book_genre_nonexistent_book`** – проверяет, что для несуществующей книги возвращается `None`.  
+
+## Тесты для `get_books_with_specific_genre`  
+- **`test_get_books_with_specific_genre`** – проверяет, что метод возвращает список книг заданного жанра.  
+- **`test_get_books_with_nonexistent_genre`** – проверяет, что метод возвращает пустой список для жанра, которого нет в словаре.  
+
+## Тесты для `get_books_genre`  
+- **`test_get_books_genre`** – проверяет, что метод возвращает словарь всех книг с их жанрами.  
+
+## Тесты для `get_books_for_children`  
+- **`test_get_books_for_children_contains_valid_books`** – проверяет, что книги с допустимым жанром для детей попадают в список.  
+- **`test_get_books_for_children_excludes_non_children_books`** – проверяет, что книги с возрастным ограничением не попадают в список.  
+
+## Тесты для `add_book_in_favorites`  
+- **`test_add_book_in_favorites`** – проверяет успешное добавление книги в избранное.  
+- **`test_add_nonexistent_book_in_favorites`** – проверяет, что нельзя добавить в избранное книгу, которой нет в словаре.  
+- **`test_add_duplicate_book_in_favorites`** – проверяет, что одна и та же книга не добавляется в избранное дважды.  
+
+## Тесты для `delete_book_from_favorites`  
+- **`test_delete_book_from_favorites`** – проверяет удаление книги из избранного.  
+- **`test_delete_nonexistent_book_from_favorites`** – проверяет, что удаление несуществующей книги из избранного не вызывает ошибок.  
+
+## Тесты для `get_list_of_favorites_books`  
+- **`test_get_list_of_favorites_books_contains_added_book`** – проверяет, что метод возвращает список избранных книг.  
+- **`test_get_list_of_favorites_books_does_not_contain_non_favorite_books`** – проверяет, что в списке избранных книг нет книг, которые не добавлялись в избранное.
diff --git a/tests.py b/tests.py
index 383385e..2f15884 100644
--- a/tests.py
+++ b/tests.py
@@ -1,24 +1,109 @@
+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
         collector = BooksCollector()
-
-        # добавляем две книги
         collector.add_new_book('Гордость и предубеждение и зомби')
         collector.add_new_book('Что делать, если ваш кот хочет вас убить')
+        assert len(collector.get_books_genre()) == 2
+
+    def test_add_new_book_add_one_book(self):
+        collector = BooksCollector()
+        collector.add_new_book('1984')
+        assert '1984' in collector.get_books_genre()
+
+    @pytest.mark.parametrize("book_name", [
+        "Очень длинное название книги, превышающее 40 символов",
+        "Книга с невероятно длинным названием, которое никто не запомнит"
+    ])
+    def test_add_new_book_too_long(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        assert book_name not in collector.get_books_genre()
+
+    @pytest.mark.parametrize("book_name", ["1984", "Гарри Поттер", "Дюна"])
+    def test_add_duplicate_book(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_new_book(book_name)
+        assert len(collector.get_books_genre()) == 1
 
-        # проверяем, что добавилось именно две
-        # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
-        assert len(collector.get_books_rating()) == 2
+    @pytest.mark.parametrize("book_name, genre", [
+        ("1984", "Фантастика"),
+        ("Шерлок Холмс", "Детективы"),
+        ("Гарри Поттер", "Мультфильмы")
+    ])
+    def test_set_book_genre(self, book_name, genre):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.set_book_genre(book_name, genre)
+        assert collector.get_book_genre(book_name) == genre
+
+    def test_set_invalid_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) == ""
+
+    def test_get_book_genre_existing_book(self):
+        collector = BooksCollector()
+        collector.add_new_book("1984")
+        collector.set_book_genre("1984", "Фантастика")
+        assert collector.get_book_genre("1984") == "Фантастика"
+
+    def test_get_book_genre_nonexistent_book(self):
+        collector = BooksCollector()
+        assert collector.get_book_genre("Неизвестная книга") is None
 
-    # напиши свои тесты ниже
-    # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
\ No newline at end of file
+    def test_get_books_genre(self):
+        collector = BooksCollector()
+        collector.add_new_book("1984")
+        collector.set_book_genre("1984", "Фантастика")
+        collector.add_new_book("Гарри Поттер")
+        collector.set_book_genre("Гарри Поттер", "Мультфильмы")
+        assert collector.get_books_genre() == {"1984": "Фантастика", "Гарри Поттер": "Мультфильмы"}
+
+    def test_get_books_for_children_contains_valid_books(self):
+        collector = BooksCollector()
+        collector.add_new_book("Король Лев")
+        collector.set_book_genre("Король Лев", "Мультфильмы")
+        assert "Король Лев" in collector.get_books_for_children()
+
+    def test_get_books_for_children_excludes_non_children_books(self):
+        collector = BooksCollector()
+        collector.add_new_book("Оно")
+        collector.set_book_genre("Оно", "Ужасы")
+        collector.add_new_book("Безжанровая книга")
+        assert "Оно" not in collector.get_books_for_children()
+        assert "Безжанровая книга" not in collector.get_books_for_children()
+
+    @pytest.mark.parametrize("book_name", ["Гарри Поттер", "Дюна", "1984"])
+    def test_add_book_in_favorites(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_book_in_favorites(book_name)
+        assert book_name in collector.get_list_of_favorites_books()
+
+    @pytest.mark.parametrize("book_name", ["Гарри Поттер", "Дюна", "1984"])
+    def test_delete_book_from_favorites(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_book_in_favorites(book_name)
+        collector.delete_book_from_favorites(book_name)
+        assert book_name not in collector.get_list_of_favorites_books()
+
+    def test_get_list_of_favorites_books_contains_added_book(self):
+        collector = BooksCollector()
+        collector.add_new_book("Гарри Поттер")
+        collector.add_book_in_favorites("Гарри Поттер")
+        assert collector.get_list_of_favorites_books() == ["Гарри Поттер"]
+
+    def test_get_list_of_favorites_books_does_not_contain_non_favorite_books(self):
+        collector = BooksCollector()
+        collector.add_new_book("Гарри Поттер")
+        collector.add_new_book("Дюна")
+        collector.add_book_in_favorites("Гарри Поттер")
+        assert "Дюна" not in collector.get_list_of_favorites_books()


Reviews:
user: login: AlexKitIt
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-19T07:06:19Z
user: login: AlexKitIt
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-19T07:06:46Z
user: login: AlexKitIt
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-19T07:07:56Z
user: login: AlexKitIt
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-19T09:08:25Z

Review comments:
diff_hunk: @@ -1,24 +1,95 @@
+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
         collector = BooksCollector()
-
-        # добавляем две книги
         collector.add_new_book('Гордость и предубеждение и зомби')
         collector.add_new_book('Что делать, если ваш кот хочет вас убить')
+        assert len(collector.get_books_genre()) == 2
+
+    def test_add_new_book_add_one_book(self):
+        collector = BooksCollector()
+        collector.add_new_book('1984')
+        assert '1984' in collector.get_books_genre()
+
+    @pytest.mark.parametrize("book_name", [
+        "Очень длинное название книги, превышающее 40 символов",
+        "Книга с невероятно длинным названием, которое никто не запомнит"
+    ])
+    def test_add_new_book_too_long(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        assert book_name not in collector.get_books_genre()
 
-        # проверяем, что добавилось именно две
-        # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
-        assert len(collector.get_books_rating()) == 2
+    @pytest.mark.parametrize("book_name", ["1984", "Гарри Поттер", "Дюна"])
+    def test_add_duplicate_book(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_new_book(book_name)
+        assert len(collector.get_books_genre()) == 1
+
+    @pytest.mark.parametrize("book_name, genre", [
+        ("1984", "Фантастика"),
+        ("Шерлок Холмс", "Детективы"),
+        ("Гарри Поттер", "Мультфильмы")
+    ])
+    def test_set_book_genre(self, book_name, genre):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.set_book_genre(book_name, genre)
+        assert collector.get_book_genre(book_name) == genre
+
+    def test_set_invalid_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) == ""
 
-    # напиши свои тесты ниже
-    # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
\ No newline at end of file
+    @pytest.mark.parametrize("genre, expected_books", [
+        ("Фантастика", ["Гарри Поттер"]),
+        ("Детективы", ["Шерлок Холмс"])
+    ])
+    def test_get_books_with_specific_genre(self, genre, expected_books):
+        collector = BooksCollector()
+        collector.add_new_book("Гарри Поттер")
+        collector.set_book_genre("Гарри Поттер", "Фантастика")
+        collector.add_new_book("Шерлок Холмс")
+        collector.set_book_genre("Шерлок Холмс", "Детективы")
+        assert collector.get_books_with_specific_genre(genre) == expected_books
+
+    def test_get_books_for_children(self):
+        collector = BooksCollector()
+        collector.add_new_book("Король Лев")
+        collector.set_book_genre("Король Лев", "Мультфильмы")
+        collector.add_new_book("Оно")
+        collector.set_book_genre("Оно", "Ужасы")
+        collector.add_new_book("Безжанровая книга")
+        assert "Оно" not in collector.get_books_for_children()
+        assert "Король Лев" in collector.get_books_for_children()
+        assert "Безжанровая книга" not in collector.get_books_for_children()
+
+    @pytest.mark.parametrize("book_name", ["Гарри Поттер", "Дюна", "1984"])
+    def test_add_book_in_favorites(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_book_in_favorites(book_name)
+        assert book_name in collector.get_list_of_favorites_books()
+
+    @pytest.mark.parametrize("book_name", ["Гарри Поттер", "Дюна", "1984"])
+    def test_delete_book_from_favorites(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_book_in_favorites(book_name)
+        collector.delete_book_from_favorites(book_name)
+        assert book_name not in collector.get_list_of_favorites_books()
+
+    def test_get_list_of_favorites_books(self):
+        collector = BooksCollector()
+        assert collector.get_list_of_favorites_books() == []
path: tests.py
user: login: AlexKitIt
body: Нужно исправить: assert ставится только на проверяемую функциональность 
created_at: 2025-03-19T07:06:19Z
author_association: NONE
diff_hunk: @@ -1,24 +1,95 @@
+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
         collector = BooksCollector()
-
-        # добавляем две книги
         collector.add_new_book('Гордость и предубеждение и зомби')
         collector.add_new_book('Что делать, если ваш кот хочет вас убить')
+        assert len(collector.get_books_genre()) == 2
+
+    def test_add_new_book_add_one_book(self):
+        collector = BooksCollector()
+        collector.add_new_book('1984')
+        assert '1984' in collector.get_books_genre()
+
+    @pytest.mark.parametrize("book_name", [
+        "Очень длинное название книги, превышающее 40 символов",
+        "Книга с невероятно длинным названием, которое никто не запомнит"
+    ])
+    def test_add_new_book_too_long(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        assert book_name not in collector.get_books_genre()
 
-        # проверяем, что добавилось именно две
-        # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
-        assert len(collector.get_books_rating()) == 2
+    @pytest.mark.parametrize("book_name", ["1984", "Гарри Поттер", "Дюна"])
+    def test_add_duplicate_book(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_new_book(book_name)
+        assert len(collector.get_books_genre()) == 1
+
+    @pytest.mark.parametrize("book_name, genre", [
+        ("1984", "Фантастика"),
+        ("Шерлок Холмс", "Детективы"),
+        ("Гарри Поттер", "Мультфильмы")
+    ])
+    def test_set_book_genre(self, book_name, genre):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.set_book_genre(book_name, genre)
+        assert collector.get_book_genre(book_name) == genre
+
+    def test_set_invalid_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) == ""
 
-    # напиши свои тесты ниже
-    # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
\ No newline at end of file
+    @pytest.mark.parametrize("genre, expected_books", [
+        ("Фантастика", ["Гарри Поттер"]),
+        ("Детективы", ["Шерлок Холмс"])
+    ])
+    def test_get_books_with_specific_genre(self, genre, expected_books):
+        collector = BooksCollector()
+        collector.add_new_book("Гарри Поттер")
+        collector.set_book_genre("Гарри Поттер", "Фантастика")
+        collector.add_new_book("Шерлок Холмс")
+        collector.set_book_genre("Шерлок Холмс", "Детективы")
+        assert collector.get_books_with_specific_genre(genre) == expected_books
+
+    def test_get_books_for_children(self):
+        collector = BooksCollector()
+        collector.add_new_book("Король Лев")
+        collector.set_book_genre("Король Лев", "Мультфильмы")
+        collector.add_new_book("Оно")
+        collector.set_book_genre("Оно", "Ужасы")
+        collector.add_new_book("Безжанровая книга")
+        assert "Оно" not in collector.get_books_for_children()
+        assert "Король Лев" in collector.get_books_for_children()
+        assert "Безжанровая книга" not in collector.get_books_for_children()
path: tests.py
user: login: AlexKitIt
body: Нужно исправить: позитивный и негативные сценарии необходимо разделить
created_at: 2025-03-19T07:06:46Z
author_association: NONE
diff_hunk: @@ -1,24 +1,95 @@
+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
         collector = BooksCollector()
-
-        # добавляем две книги
         collector.add_new_book('Гордость и предубеждение и зомби')
         collector.add_new_book('Что делать, если ваш кот хочет вас убить')
+        assert len(collector.get_books_genre()) == 2
+
+    def test_add_new_book_add_one_book(self):
+        collector = BooksCollector()
+        collector.add_new_book('1984')
+        assert '1984' in collector.get_books_genre()
+
+    @pytest.mark.parametrize("book_name", [
+        "Очень длинное название книги, превышающее 40 символов",
+        "Книга с невероятно длинным названием, которое никто не запомнит"
+    ])
+    def test_add_new_book_too_long(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        assert book_name not in collector.get_books_genre()
 
-        # проверяем, что добавилось именно две
-        # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
-        assert len(collector.get_books_rating()) == 2
+    @pytest.mark.parametrize("book_name", ["1984", "Гарри Поттер", "Дюна"])
+    def test_add_duplicate_book(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_new_book(book_name)
+        assert len(collector.get_books_genre()) == 1
+
+    @pytest.mark.parametrize("book_name, genre", [
+        ("1984", "Фантастика"),
+        ("Шерлок Холмс", "Детективы"),
+        ("Гарри Поттер", "Мультфильмы")
+    ])
+    def test_set_book_genre(self, book_name, genre):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.set_book_genre(book_name, genre)
+        assert collector.get_book_genre(book_name) == genre
+
+    def test_set_invalid_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) == ""
 
-    # напиши свои тесты ниже
-    # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
\ No newline at end of file
+    @pytest.mark.parametrize("genre, expected_books", [
+        ("Фантастика", ["Гарри Поттер"]),
+        ("Детективы", ["Шерлок Холмс"])
+    ])
+    def test_get_books_with_specific_genre(self, genre, expected_books):
+        collector = BooksCollector()
+        collector.add_new_book("Гарри Поттер")
+        collector.set_book_genre("Гарри Поттер", "Фантастика")
+        collector.add_new_book("Шерлок Холмс")
+        collector.set_book_genre("Шерлок Холмс", "Детективы")
+        assert collector.get_books_with_specific_genre(genre) == expected_books
+
+    def test_get_books_for_children(self):
+        collector = BooksCollector()
+        collector.add_new_book("Король Лев")
+        collector.set_book_genre("Король Лев", "Мультфильмы")
+        collector.add_new_book("Оно")
+        collector.set_book_genre("Оно", "Ужасы")
+        collector.add_new_book("Безжанровая книга")
+        assert "Оно" not in collector.get_books_for_children()
+        assert "Король Лев" in collector.get_books_for_children()
+        assert "Безжанровая книга" not in collector.get_books_for_children()
+
+    @pytest.mark.parametrize("book_name", ["Гарри Поттер", "Дюна", "1984"])
+    def test_add_book_in_favorites(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_book_in_favorites(book_name)
+        assert book_name in collector.get_list_of_favorites_books()
+
+    @pytest.mark.parametrize("book_name", ["Гарри Поттер", "Дюна", "1984"])
+    def test_delete_book_from_favorites(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_book_in_favorites(book_name)
+        collector.delete_book_from_favorites(book_name)
+        assert book_name not in collector.get_list_of_favorites_books()
+
+    def test_get_list_of_favorites_books(self):
+        collector = BooksCollector()
+        assert collector.get_list_of_favorites_books() == []
+        collector.add_new_book("Гарри Поттер")
+        collector.add_new_book("Дюна")
+        collector.add_book_in_favorites("Гарри Поттер")
+        assert collector.get_list_of_favorites_books() == ["Гарри Поттер"]
path: tests.py
user: login: AlexKitIt
body: Нужно исправить: отсутствуют тесты на проверку методов get_book_genre и get_books_genre
То, что они используются в других тестовых методах, не значит что на них не должно быть отдельных тестов 
created_at: 2025-03-19T07:07:56Z
author_association: NONE
diff_hunk: @@ -1,24 +1,106 @@
+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
         collector = BooksCollector()
-
-        # добавляем две книги
         collector.add_new_book('Гордость и предубеждение и зомби')
         collector.add_new_book('Что делать, если ваш кот хочет вас убить')
+        assert len(collector.get_books_genre()) == 2
+
+    def test_add_new_book_add_one_book(self):
+        collector = BooksCollector()
+        collector.add_new_book('1984')
+        assert '1984' in collector.get_books_genre()
 
-        # проверяем, что добавилось именно две
-        # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
-        assert len(collector.get_books_rating()) == 2
+    @pytest.mark.parametrize("book_name", [
+        "Очень длинное название книги, превышающее 40 символов",
+        "Книга с невероятно длинным названием, которое никто не запомнит"
+    ])
+    def test_add_new_book_too_long(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        assert book_name not in collector.get_books_genre()
 
-    # напиши свои тесты ниже
-    # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
\ No newline at end of file
+    @pytest.mark.parametrize("book_name", ["1984", "Гарри Поттер", "Дюна"])
+    def test_add_duplicate_book(self, book_name):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.add_new_book(book_name)
+        assert len(collector.get_books_genre()) == 1
+
+    @pytest.mark.parametrize("book_name, genre", [
+        ("1984", "Фантастика"),
+        ("Шерлок Холмс", "Детективы"),
+        ("Гарри Поттер", "Мультфильмы")
+    ])
+    def test_set_book_genre(self, book_name, genre):
+        collector = BooksCollector()
+        collector.add_new_book(book_name)
+        collector.set_book_genre(book_name, genre)
+        assert collector.get_book_genre(book_name) == genre
+
+    def test_set_invalid_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) == ""
+
+    def test_get_book_genre(self):
+        collector = BooksCollector()
+        collector.add_new_book("1984")
+        collector.set_book_genre("1984", "Фантастика")
+        assert collector.get_book_genre("1984") == "Фантастика"
+        assert collector.get_book_genre("Неизвестная книга") is None
path: tests.py
user: login: AlexKitIt
body: Тут у нас опять 2 разных сценария
created_at: 2025-03-19T09:08:25Z
author_association: NONE

PR comments:
user: login: L1ghTyyyy
created_at: 2025-03-19T08:17:03Z
body: @AlexKitIt привет! внес правки по фидбеку. Посмотри, пожалуйста
author_association: OWNER