diff --git a/tests/scripts/docker_check_tests.sh b/tests/scripts/docker_check_tests.sh
old mode 100755
new mode 100644
diff --git a/tests/tests_check/README.md b/tests/tests_check/README.md
new file mode 100644
index 00000000..9c6d67d1
--- /dev/null
+++ b/tests/tests_check/README.md
@@ -0,0 +1,13 @@
+## For local tests:
+
+```bash
+$ pip install -r requirements.txt
+```
+
+### Run tests:
+
+```bash
+
+$ python -m unittest discover tests/tests_check
+
+```
diff --git a/tests/tests_check/__init__.py b/tests/tests_check/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/tests_check/base_test.py b/tests/tests_check/base_test.py
new file mode 100644
index 00000000..3a72d461
--- /dev/null
+++ b/tests/tests_check/base_test.py
@@ -0,0 +1,11 @@
+import unittest
+from unittest.mock import MagicMock
+
+class BaseTestCase(unittest.TestCase):
+ def setUp(self):
+ self.file_info = {
+ 'file': MagicMock(),
+ 'filename': 'test.pdf',
+ 'pdf_id': '1234',
+ 'file_type': {'report_type': 'VKR'}
+ }
diff --git a/tests/tests_check/test_banned_words.py b/tests/tests_check/test_banned_words.py
new file mode 100644
index 00000000..82215237
--- /dev/null
+++ b/tests/tests_check/test_banned_words.py
@@ -0,0 +1,58 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.presentation_checks.banned_words import PresBannedWordsCheck
+from app.main.checks.base_check import morph
+
+class TestPresBannedWordsCheck(unittest.TestCase):
+
+ def setUp(self):
+ self.mock_file_info = {
+ 'file': MagicMock(),
+ 'filename': 'test_presentation.pptx',
+ 'pdf_id': '12345'
+ }
+
+ self.mock_text_slides = [
+ "Это пример текста на первом слайде",
+ "Запрещенное слово тут",
+ "Еще один пример текста на слайде",
+ "Снова запрещенное слово на слайде",
+ "Обычный текст без запрещенных слов"
+ ]
+
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=self.mock_text_slides)
+ self.checker = PresBannedWordsCheck(self.mock_file_info, words=['запрещенное', 'слово'], min_count=1, max_count=3)
+
+ def test_no_banned_words(self):
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=[
+ "Просто пример текста."
+ ])
+ result = self.checker.check()
+ self.assertEqual(result['score'], 1)
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+ def test_banned_words_below_min_count(self):
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=[
+ "Запрещенное слово тут",
+ "Еще один пример текста",
+ "Снова запрещенное слово"
+ ])
+ self.checker = PresBannedWordsCheck(self.mock_file_info, words=['запрещенное', 'слово'], min_count=3, max_count=6)
+ result = self.checker.check()
+ self.assertEqual(result['score'], 1.0)
+ self.assertIn("Обнаружены запретные слова!", result['verdict'][0])
+
+ def test_banned_words_above_max_count(self):
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=[
+ "Запрещенное слово тут",
+ "Еще одно запрещенное слово тут",
+ "Снова запрещенное слово",
+ "Запрещенное слово тут снова"
+ ])
+ result = self.checker.check()
+ self.assertEqual(result['score'], 0)
+ self.assertIn("Обнаружены запретные слова!", result['verdict'][0])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/tests_check/test_banned_words_check.py b/tests/tests_check/test_banned_words_check.py
new file mode 100644
index 00000000..0c9ed1f4
--- /dev/null
+++ b/tests/tests_check/test_banned_words_check.py
@@ -0,0 +1,90 @@
+import unittest
+from tests.tests_check.base_test import BaseTestCase
+from app.main.checks.base_check import morph, answer
+from app.main.checks.report_checks import ReportBannedWordsCheck
+
+class TestReportBannedWordsCheck(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.file_info['file'].page_counter.return_value = 5
+ self.check = ReportBannedWordsCheck(file_info=self.file_info, words=["мы"], min_count=3, max_count=6)
+
+ def test_check_not_enough_pages(self):
+ self.file_info['file'].page_counter.return_value = 3
+ result = self.check.check()
+ self.assertEqual(result, answer(False, "В отчете недостаточно страниц. Нечего проверять."))
+
+ def test_check_no_banned_words(self):
+ self.file_info['file'].pdf_file.get_text_on_page.return_value = {
+ 1: "Пример текста без запретных слов.",
+ 2: "Еще один пример текста.",
+ 3: "Текст без запретных слов.",
+ 4: "Текст без запретных слов.",
+ 5: "Текст без запретных слов."
+ }
+ result = self.check.check()
+ expected_output = 'Пройдена!'
+ expected_result = answer(1, expected_output)
+ self.assertEqual(result, expected_result)
+
+ def test_check_with_banned_words_in_range(self):
+ '''
+ исходя из кода критерия, из каждой строки берется только одно вхождение каждого слова
+ (создается множество), поэтому в этом примере запретных слов 5, что нарушает здравый смысл
+ '''
+ self.file_info['file'].pdf_file.get_text_on_page.return_value = {
+ 1: "мы мы мы",
+ 2: "мы мы",
+ 3: "мы",
+ 4: "мы мы",
+ 5: "мы"
+ }
+ result = self.check.check()
+ expected_output = (
+ 'Запрещенные слова: мы
Обнаружены запретные слова!
'
+ 'Страница №1:
Строка 1: мы мы мы [мы]
'
+ 'Страница №2:
Строка 1: мы мы [мы]
'
+ 'Страница №3:
Строка 1: мы [мы]
'
+ 'Страница №4:
Строка 1: мы мы [мы]
'
+ 'Страница №5:
Строка 1: мы [мы]
'
+ )
+ expected_result = answer(0, expected_output)
+ self.assertEqual(result['score'], expected_result['score'])
+ self.assertEqual(result['verdict'][0], expected_result['verdict'][0])
+
+ def test_check_with_banned_words_exceeding_max(self):
+ self.file_info['file'].page_counter.return_value = 5
+ self.file_info['file'].pdf_file.get_text_on_page.return_value = {
+ 1: "мы идем домой\nмы говорим о нас\nмы идем на работу",
+ 2: "мы любим природу\nмы читаем книги\nмы изучаем языки",
+ 3: "мы пишем код\nмы гуляем в парке\nмы играем в игры",
+ 4: "мы поем песни\nмы танцуем дома\nмы готовим ужин",
+ 5: "мы смотрим фильмы\nмы слушаем музыку\nмы общаемся с друзьями"
+ }
+
+ checker = ReportBannedWordsCheck(self.file_info, words=["мы"], min_count=3, max_count=6)
+ result = checker.check()
+ expected_output = (
+ 'Запрещенные слова: мы
'
+ 'Обнаружены запретные слова!
'
+ 'Страница №1:
Строка 1: мы идем домой [мы]
'
+ 'Строка 2: мы говорим о нас [мы]
'
+ 'Строка 3: мы идем на работу [мы]
'
+ 'Страница №2:
Строка 1: мы любим природу [мы]
'
+ 'Строка 2: мы читаем книги [мы]
'
+ 'Строка 3: мы изучаем языки [мы]
'
+ 'Страница №3:
Строка 1: мы пишем код [мы]
'
+ 'Строка 2: мы гуляем в парке [мы]
'
+ 'Строка 3: мы играем в игры [мы]
'
+ 'Страница №4:
Строка 1: мы поем песни [мы]
'
+ 'Строка 2: мы танцуем дома [мы]
'
+ 'Строка 3: мы готовим ужин [мы]
'
+ 'Страница №5:
Строка 1: мы смотрим фильмы [мы]
'
+ 'Строка 2: мы слушаем музыку [мы]
'
+ 'Строка 3: мы общаемся с друзьями [мы]
'
+ )
+
+ self.assertEqual(result, answer(0, expected_output))
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
diff --git a/tests/tests_check/test_banned_words_in_literature.py b/tests/tests_check/test_banned_words_in_literature.py
new file mode 100644
index 00000000..cf106012
--- /dev/null
+++ b/tests/tests_check/test_banned_words_in_literature.py
@@ -0,0 +1,45 @@
+import unittest
+from app.main.checks.report_checks import BannedWordsInLiteratureCheck
+from tests.tests_check.base_test import BaseTestCase
+from app.main.checks.base_check import morph, answer
+
+morph.normal_forms = lambda word: [word]
+
+class TestBannedWordsInLiteratureCheck(BaseTestCase):
+
+ def test_check_with_no_banned_words(self):
+ self.file_info['file'].page_counter.return_value = 10
+ self.file_info['file'].find_literature_vkr.return_value = {"number": 1, "child": [{"number": 2, "text": "This is a good source."}]}
+ self.file_info['file'].find_literature_page.return_value = 10
+
+ checker = BannedWordsInLiteratureCheck(self.file_info)
+ result = checker.check()
+
+ self.assertEqual(result, answer(True, "Пройдена!"))
+
+ def test_check_with_banned_words(self):
+ self.file_info['file'].page_counter.return_value = 10
+ self.file_info['file'].find_literature_vkr.return_value = {"number": 1, "child": [{"number": 2, "text": "Source from wikipedia."}]}
+ self.file_info['file'].find_literature_page.return_value = 10
+
+ checker = BannedWordsInLiteratureCheck(self.file_info)
+ result = checker.check()
+
+ expected_output = (
+ 'Есть запрещенные слова в списке источников '
+ '[\'10\']:
'
+ 'Абзац 1: wikipedia.
'
+ )
+
+ self.assertEqual(result, answer(False, expected_output))
+
+ def test_check_not_enough_pages(self):
+ self.file_info['file'].page_counter.return_value = 3
+
+ checker = BannedWordsInLiteratureCheck(self.file_info)
+ result = checker.check()
+
+ self.assertEqual(result, answer(False, "В отчете недостаточно страниц. Нечего проверять."))
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_chapters.py b/tests/tests_check/test_chapters.py
new file mode 100644
index 00000000..71822121
--- /dev/null
+++ b/tests/tests_check/test_chapters.py
@@ -0,0 +1,70 @@
+import unittest
+from unittest.mock import MagicMock
+from tests.tests_check.base_test import BaseTestCase
+from app.main.checks.base_check import morph, answer
+from app.main.checks.report_checks import ReportChapters
+
+class TestReportChaptersCheck(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.file_info['file'].page_counter.return_value = 5
+ self.check = ReportChapters(file_info=self.file_info)
+
+ def test_check_not_enough_pages(self):
+ self.file_info['file'].page_counter.return_value = 3 # Недостаточное количество страниц
+ result = self.check.check()
+ self.assertEqual(result, answer(False, "В отчете недостаточно страниц. Нечего проверять."))
+
+ def test_check_no_headers_found(self):
+ self.file_info['file'].make_chapters.return_value = [] # Пустой список заголовков
+ result = self.check.check()
+ self.assertEqual(result, answer(False, "Не найдено ни одного заголовка.
Проверьте корректность использования стилей."))
+
+ def test_check_valid_headers(self):
+ # Подготовка заголовков
+ mock_headers = [
+ {"text": "Заголовок 1", "style": "Заголовок", "styled_text": {"runs": [{"text": "Заголовок 1", "style": MagicMock()}]}},
+ {"text": "Заголовок 2", "style": "Заголовок", "styled_text": {"runs": [{"text": "Заголовок 2", "style": MagicMock()}]}}
+ ]
+ self.file_info['file'].make_chapters.return_value = mock_headers
+
+ # Настройка
+ self.check.docx_styles = {
+ 0: ["Заголовок"]
+ }
+ self.check.target_styles = {
+ 0: {"style": MagicMock()}
+ }
+ self.check.style_regex = {
+ 0: MagicMock()
+ }
+
+ result = self.check.check()
+ self.assertEqual(result['score'], 1)
+ self.assertTrue("Форматирование заголовков соответствует требованиям." in result['verdict'])
+
+ def test_check_invalid_headers(self):
+ # Подготовка заголовков с несоответствующим стилем
+ mock_headers = [
+ {"text": "Заголовок 1", "style": "Неверный стиль", "styled_text": {"runs": [{"text": "Заголовок 1", "style": MagicMock()}]}},
+ {"text": "Заголовок 2", "style": "Неверный стиль", "styled_text": {"runs": [{"text": "Заголовок 2", "style": MagicMock()}]}}
+ ]
+ self.file_info['file'].make_chapters.return_value = mock_headers
+
+ # Настройка
+ self.check.docx_styles = {
+ 0: ["Заголовок"]
+ }
+ self.check.target_styles = {
+ 0: {"style": MagicMock()}
+ }
+ self.check.style_regex = {
+ 0: MagicMock()
+ }
+
+ result = self.check.check()
+ self.assertEqual(result['score'], 0)
+ self.assertFalse("Найдены ошибки в оформлении заголовков" in result['verdict'])
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_empty_slide_check.py b/tests/tests_check/test_empty_slide_check.py
new file mode 100644
index 00000000..d58a8378
--- /dev/null
+++ b/tests/tests_check/test_empty_slide_check.py
@@ -0,0 +1,100 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.presentation_checks.empty_slide_check import PresEmptySlideCheck
+from app.utils.parse_for_html import format_header
+
+
+class TestPresEmptySlideCheck(unittest.TestCase):
+
+ def setUp(self):
+ self.mock_file_info = {
+ 'file': MagicMock(),
+ 'filename': 'test_presentation.pptx',
+ 'pdf_id': '12345',
+ 'presentation_name': 'test_presentation.pptx'
+ }
+
+ self.mock_text_slides = [
+ "", # Пустой слайд
+ "Title Slide\nContent on Slide", # Слайд с заголовком и контентом
+ "Only Title Slide\n", # Слайд только с заголовком
+ "", # Пустой слайд
+ ]
+ self.mock_titles = [
+ "Title Slide",
+ "Title Slide",
+ "Only Title Slide",
+ ""
+ ]
+
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=self.mock_text_slides)
+ self.mock_file_info['file'].get_titles = MagicMock(return_value=self.mock_titles)
+ self.mock_file_info['file'].slides = [MagicMock() for _ in self.mock_text_slides]
+
+ for slide in self.mock_file_info['file'].slides:
+ slide.get_images = MagicMock(return_value=[])
+ slide.get_table = MagicMock(return_value=None)
+
+ self.checker = PresEmptySlideCheck(self.mock_file_info)
+
+ def test_empty_slides(self):
+ result = self.checker.check()
+ self.assertEqual(result['score'], 0)
+ self.assertIn("Не пройдена! Обнаружены пустые слайды:", result['verdict'][0])
+
+ def test_only_title_slides(self):
+ self.mock_text_slides = [
+ "Title Slide\n",
+ "Title Slide\nContent on Slide",
+ "Only Title Slide\n",
+ "Another Title\nContent"
+ ]
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=self.mock_text_slides)
+ self.mock_file_info['file'].get_titles = MagicMock(return_value=self.mock_titles)
+
+ result = self.checker.check()
+ self.assertEqual(result['score'], 0)
+ self.assertIn("Не пройдена! Обнаружены слайды, в которых присутствует только заголовок:", result['verdict'][0])
+
+ def test_mixed_empty_and_title_slides(self):
+ self.mock_text_slides = [
+ "",
+ "Title Slide\nContent on Slide",
+ "Only Title Slide\n",
+ "",
+ ]
+ self.mock_titles = [
+ "Empty Slide",
+ "Title Slide",
+ "Only Title Slide",
+ "Empty Slide"
+ ]
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=self.mock_text_slides)
+ self.mock_file_info['file'].get_titles = MagicMock(return_value=self.mock_titles)
+
+ result = self.checker.check()
+ self.assertEqual(result['score'], 0)
+ self.assertIn("Не пройдена! Обнаружены пустые слайды:", result['verdict'][0])
+ self.assertIn("также обнаружены слайды, в которых присутствует только заголовок:", result['verdict'][0])
+
+ def test_no_empty_or_title_only_slides(self):
+ self.mock_text_slides = [
+ "Title Slide\nContent on Slide",
+ "Another Title\nContent",
+ "Content without Title",
+ ]
+ self.mock_titles = [
+ "Title Slide",
+ "Another Title",
+ ""
+ ]
+ self.mock_file_info['file'].get_text_from_slides = MagicMock(return_value=self.mock_text_slides)
+ self.mock_file_info['file'].get_titles = MagicMock(return_value=self.mock_titles)
+
+ result = self.checker.check()
+ self.assertEqual(result['score'], 1)
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/tests_check/test_find_def_sld.py b/tests/tests_check/test_find_def_sld.py
new file mode 100644
index 00000000..2ccddd21
--- /dev/null
+++ b/tests/tests_check/test_find_def_sld.py
@@ -0,0 +1,55 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.presentation_checks.find_def_sld import FindDefSld
+
+class TestFindDefSld(unittest.TestCase):
+
+ def setUp(self):
+ self.mock_file_info = {
+ 'file': MagicMock(),
+ 'filename': 'test_presentation.pptx',
+ 'pdf_id': '12345',
+ 'presentation_name': 'test_presentation.pptx'
+ }
+ self.key_slide = "Key Slide"
+
+ self.mock_titles = [
+ "Introduction",
+ "Key Slide Overview",
+ "Details of Key Slide",
+ "Conclusion"
+ ]
+
+ self.mock_file_info['file'].get_titles = MagicMock(return_value=self.mock_titles)
+ self.mock_file_info['file'].found_index = {}
+
+ self.checker = FindDefSld(self.mock_file_info, self.key_slide)
+
+ def test_find_key_slide(self):
+ result = self.checker.check()
+ self.assertTrue(result['score'])
+ self.assertIn("Найден под номером: ", result['verdict'][0])
+ self.assertIn('2', result['verdict'][0])
+ self.assertIn('3', result['verdict'][0])
+
+ def test_key_slide_not_found(self):
+ self.checker.type_of_slide = "Nonexistent Slide"
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], 'Слайд не найден')
+
+ def test_key_slide_case_insensitive(self):
+ self.checker.type_of_slide = "key slide"
+ result = self.checker.check()
+ self.assertTrue(result['score'])
+ self.assertIn("Найден под номером: ", result['verdict'][0])
+ self.assertIn('2', result['verdict'][0])
+ self.assertIn('3', result['verdict'][0])
+
+ def test_save_found_indices(self):
+ self.checker.check()
+ self.assertIn("Key Slide", self.mock_file_info['file'].found_index)
+ self.assertEqual(self.mock_file_info['file'].found_index["Key Slide"], [2, 3])
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/tests_check/test_first_pages_check.py b/tests/tests_check/test_first_pages_check.py
new file mode 100644
index 00000000..3f65e21b
--- /dev/null
+++ b/tests/tests_check/test_first_pages_check.py
@@ -0,0 +1,73 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.report_checks import ReportFirstPagesCheck
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportFirstPagesCheck(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.mock_file.page_counter.return_value = 10
+ self.mock_file.make_headers = MagicMock(return_value=[])
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportFirstPagesCheck(file_info=self.file_info)
+
+ def test_all_required_pages_present(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Титульный лист", "marker": True},
+ {"name": "Задание на выпускную квалификационную работу", "marker": True},
+ {"name": "Календарный план", "marker": True},
+ {"name": "Реферат", "marker": True},
+ {"name": "Abstract", "marker": True},
+ {"name": "Содержание", "marker": True},
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportFirstPagesCheck(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = "Все обязательные страницы найдены и их заголовки находятся на первой строке новой страницы."
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_some_required_pages_missing(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Титульный лист", "marker": True},
+ {"name": "Задание на выпускную квалификационную работу", "marker": False},
+ {"name": "Календарный план", "marker": True},
+ {"name": "Реферат", "marker": False},
+ {"name": "Abstract", "marker": True},
+ {"name": "Содержание", "marker": True},
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportFirstPagesCheck(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = (
+ 'Следующие страницы не найдены либо их заголовки расположены не на первой строке новой '
+ 'страницы: - Задание на выпускную квалификационную работу
- Реферат
'
+ 'Проверьте очередность листов и орфографию заголовков.'
+ )
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_no_required_pages_present(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Титульный лист", "marker": False},
+ {"name": "Задание на выпускную квалификационную работу", "marker": False},
+ {"name": "Календарный план", "marker": False},
+ {"name": "Реферат", "marker": False},
+ {"name": "Abstract", "marker": False},
+ {"name": "Содержание", "marker": False},
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportFirstPagesCheck(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = (
+ 'Следующие страницы не найдены либо их заголовки расположены не на первой строке новой '
+ 'страницы: - Титульный лист
- Задание на выпускную квалификационную работу
'
+ '- Календарный план
- Реферат
- Abstract
- Содержание
'
+ 'Проверьте очередность листов и орфографию заголовков.'
+ )
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
diff --git a/tests/tests_check/test_image_share.py b/tests/tests_check/test_image_share.py
new file mode 100644
index 00000000..a766fc81
--- /dev/null
+++ b/tests/tests_check/test_image_share.py
@@ -0,0 +1,46 @@
+import unittest
+from unittest.mock import Mock, MagicMock
+
+from app.main.checks.base_check import morph, answer
+from app.main.checks.presentation_checks.image_share import PresImageShareCheck
+
+
+class TestPresImageShareCheck(unittest.TestCase):
+
+ def setUp(self):
+ slide_with_image = Mock()
+ slide_with_image.get_images.return_value = ['image1']
+ slide_with_image.get_page_number.return_value = 1
+
+ slide_without_image = Mock()
+ slide_without_image.get_images.return_value = []
+ slide_without_image.get_page_number.return_value = 2
+
+ self.mock_file_info = {
+ 'file': Mock(),
+ 'filename': 'presentation.pptx',
+ 'pdf_id': '123'
+ }
+ self.mock_file_info['file'].slides = [slide_with_image, slide_without_image, slide_with_image]
+ self.checker = PresImageShareCheck(self.mock_file_info)
+
+ def test_images_below_limit(self):
+ result = self.checker.check()
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], 'Пройдена!')
+
+ def test_images_above_limit(self):
+ checker_with_lower_limit = PresImageShareCheck(self.mock_file_info, limit=0.3)
+ result = checker_with_lower_limit.check()
+ self.assertFalse(result['score'])
+ self.assertIn('Проверка не пройдена!', result['verdict'][0])
+
+ def test_images_equal_limit(self):
+ checker_with_equal_limit = PresImageShareCheck(self.mock_file_info, limit=0.67)
+ result = checker_with_equal_limit.check()
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], 'Пройдена!')
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_image_share_check.py b/tests/tests_check/test_image_share_check.py
new file mode 100644
index 00000000..ec448784
--- /dev/null
+++ b/tests/tests_check/test_image_share_check.py
@@ -0,0 +1,58 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.report_checks import ReportImageShareCheck
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportImageShareCheck(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.mock_file.page_counter = MagicMock(return_value=5)
+ self.mock_file.page_count = 5
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportImageShareCheck(file_info=self.file_info, limit=0.3)
+
+ def test_check_not_enough_pages(self):
+ self.mock_file.page_counter.return_value = 3
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportImageShareCheck(file_info=self.file_info, limit=0.3)
+ result = self.checker.check()
+ expected_output = "В отчете недостаточно страниц. Нечего проверять."
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_images_share_exceeds_limit(self):
+ self.mock_file.pdf_file.page_images.return_value = 1000
+ self.mock_file.pdf_file.page_height.return_value = 2000
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportImageShareCheck(file_info=self.file_info, limit=0.3)
+ result = self.checker.check()
+ expected_output = (
+ 'Проверка не пройдена! Изображения в работе занимают около 0.5 объема '
+ 'документа без учета приложения, ограничение - 0.3'
+ '''
+ Если доля отчета, приходящаяся на изображения, больше нормы, попробуйте сделать следующее:
+
+ - Попробуйте перенести малозначимые иллюстрации в Приложение;
+ - Если у вас уже есть раздел Приложение, убедитесь, что количество страниц в отчете посчитано программой без учета приложения;
+ - Если страницы посчитаны программой неверно, убедитесь, что заголовок приложения правильно оформлен;
+ - Убедитесь, что красная строка не сделана с помощью пробелов или табуляции.
+
+ '''
+ )
+ self.assertFalse(result['score'])
+ self.assertIn(expected_output[:100], result['verdict'][0])
+
+ def test_images_share_within_limit(self):
+ self.mock_file.pdf_file.page_images.return_value = 500
+ self.mock_file.pdf_file.page_height.return_value = 2000
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportImageShareCheck(file_info=self.file_info, limit=0.3)
+ result = self.checker.check()
+ expected_output = 'Пройдена!'
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_max_abstract_size_check.py b/tests/tests_check/test_max_abstract_size_check.py
new file mode 100644
index 00000000..49798bb1
--- /dev/null
+++ b/tests/tests_check/test_max_abstract_size_check.py
@@ -0,0 +1,81 @@
+import unittest
+from app.main.checks.report_checks import ReportMaxSizeOfAbstractCheck
+from tests.tests_check.base_test import BaseTestCase
+
+
+class TestReportMaxSizeOfAbstractCheck(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportMaxSizeOfAbstractCheck(file_info=self.file_info, max_size=1)
+
+ def test_abstract_and_referat_size_within_limit(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Реферат", "page": 1},
+ {"name": "Abstract", "page": 2},
+ {"name": "Содержание", "page": 3}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportMaxSizeOfAbstractCheck(file_info=self.file_info, max_size=1)
+ result = self.checker.check()
+ expected_output = "
Размеры разделов \"Реферат\" и \"Abstract\" соответствуют шаблону"
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_referat_exceeds_limit(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Реферат", "page": 1},
+ {"name": "Abstract", "page": 3},
+ {"name": "Содержание", "page": 4}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportMaxSizeOfAbstractCheck(file_info=self.file_info, max_size=1)
+ result = self.checker.check()
+ expected_output = "
Размер раздела \"Реферат\" равен 2 страницы, должен быть 1"
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_abstract_exceeds_limit(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Реферат", "page": 1},
+ {"name": "Abstract", "page": 2},
+ {"name": "Содержание", "page": 4}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportMaxSizeOfAbstractCheck(file_info=self.file_info, max_size=1)
+ result = self.checker.check()
+ expected_output = "
Размер раздела \"Abstract\" равен 2 страницы, должен быть 1"
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_both_exceed_limit(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Реферат", "page": 1},
+ {"name": "Abstract", "page": 3},
+ {"name": "Содержание", "page": 6}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportMaxSizeOfAbstractCheck(file_info=self.file_info, max_size=1)
+ result = self.checker.check()
+ expected_output = "
Размеры разделов \"Реферат\" и \"Abstract\" превышает максимальный размер"
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_no_referat_and_abstract(self):
+ self.mock_file.make_headers.return_value = [
+ {"name": "Содержание", "page": 1}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportMaxSizeOfAbstractCheck(file_info=self.file_info, max_size=1)
+ self.checker.late_init()
+ self.assertEqual(self.checker.referat_size, 0)
+ self.assertEqual(self.checker.abstract_size, 0) #self.referat_size = abstract_page - referat_page = 1 (хотя Abstract не существует)
+ result = self.checker.check()
+ expected_output = "
Размеры разделов \"Реферат\" и \"Abstract\" соответствуют шаблону"
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_needed_headers_check.py b/tests/tests_check/test_needed_headers_check.py
new file mode 100644
index 00000000..0838eefb
--- /dev/null
+++ b/tests/tests_check/test_needed_headers_check.py
@@ -0,0 +1,70 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.report_checks import ReportNeededHeadersCheck
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportNeededHeadersCheck(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.mock_file.page_counter.return_value = 5
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportNeededHeadersCheck(file_info=self.file_info)
+
+ def test_all_headers_present(self):
+ self.mock_file.make_chapters.return_value = [
+ {"text": "Введение", "style": "heading 2"},
+ {"text": "Обзор литературы", "style": "heading 2"},
+ {"text": "Методы исследования", "style": "heading 2"},
+ {"text": "Заключение", "style": "heading 2"}
+ ]
+ self.mock_file.find_header_page.return_value = 1
+ self.mock_file.show_chapters.return_value = "Иерархия заголовков"
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportNeededHeadersCheck(file_info=self.file_info)
+ self.checker.patterns = ["Введение", "Обзор литературы", "Методы исследования", "Заключение"]
+ result = self.checker.check()
+ expected_output = 'Все необходимые заголовки обнаружены!'
+ self.assertTrue(result['score'])
+ self.assertIn(expected_output, result['verdict'][0])
+
+ def test_missing_headers(self):
+ self.mock_file.make_chapters.return_value = [
+ {"text": "Введение", "style": "heading 2"},
+ {"text": "Методы исследования", "style": "heading 2"}
+ ]
+ self.mock_file.find_header_page.return_value = 1
+ self.mock_file.show_chapters.return_value = "Иерархия заголовков"
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportNeededHeadersCheck(file_info=self.file_info)
+ self.checker.patterns = ["Введение", "Обзор литературы", "Методы исследования", "Заключение"]
+ result = self.checker.check()
+ expected_output = 'Не найдены следующие обязательные заголовки:'
+ self.assertFalse(result['score'])
+ self.assertIn(expected_output, result['verdict'][0])
+ self.assertIn('Обзор литературы', result['verdict'][0])
+ self.assertIn('Заключение', result['verdict'][0])
+
+ def test_no_headers(self):
+ self.mock_file.make_chapters.return_value = []
+ self.mock_file.find_header_page.return_value = 1
+ self.mock_file.show_chapters.return_value = "Иерархия заголовков"
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportNeededHeadersCheck(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = "Не найдено ни одного заголовка.
Проверьте корректность использования стилей."
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+ def test_insufficient_pages(self):
+ self.mock_file.page_counter.return_value = 3
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportNeededHeadersCheck(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = "В отчете недостаточно страниц. Нечего проверять."
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], expected_output)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_page_counter.py b/tests/tests_check/test_page_counter.py
new file mode 100644
index 00000000..e1f8682b
--- /dev/null
+++ b/tests/tests_check/test_page_counter.py
@@ -0,0 +1,55 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.report_checks import ReportPageCounter
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportPageCounter(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.mock_file.page_counter.return_value = 5
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportPageCounter(file_info=self.file_info)
+
+ def test_within_range(self):
+ self.mock_file.page_counter.return_value = 100
+ self.mock_file.page_count = 100
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportPageCounter(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = "Пройдена! В отчете 100 стр не считая Приложения."
+ self.assertTrue(result['score'])
+ self.assertIn(expected_output, result['verdict'][0])
+
+ def test_below_minimum(self):
+ self.mock_file.page_counter.return_value = 40
+ self.mock_file.page_count = 40
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportPageCounter(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = 'Неверное количество страниц в файле: должно быть [50, 150] стр.'
+ self.assertFalse(result['score'])
+ self.assertIn(expected_output, result['verdict'][0])
+
+ def test_above_maximum(self):
+ self.mock_file.page_counter.return_value = 160
+ self.mock_file.page_count = 160
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportPageCounter(file_info=self.file_info)
+ result = self.checker.check()
+ expected_output = 'Неверное количество страниц в файле: должно быть [50, 150] стр.'
+ self.assertFalse(result['score'])
+ self.assertIn(expected_output, result['verdict'][0])
+
+ def test_with_no_max_limit(self):
+ self.mock_file.page_counter.return_value = 160
+ self.mock_file.page_count = 160
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportPageCounter(file_info=self.file_info, min_number=50, max_number=None)
+ result = self.checker.check()
+ expected_output = "Пройдена! В отчете 160 стр не считая Приложения."
+ self.assertTrue(result['score'])
+ self.assertIn(expected_output, result['verdict'][0])
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_pres_template_name.py b/tests/tests_check/test_pres_template_name.py
new file mode 100644
index 00000000..0396dd86
--- /dev/null
+++ b/tests/tests_check/test_pres_template_name.py
@@ -0,0 +1,44 @@
+import unittest
+from app.main.checks.base_check import answer, BasePresCriterion
+from app.main.checks.presentation_checks.template_name import PresTemplateNameCheck
+
+class TestPresTemplateNameCheck(unittest.TestCase):
+
+ def setUp(self):
+ self.file_info = {
+ 'filename': "Презентация_ВКР_Иванов.pdf",
+ 'file': None,
+ 'pdf_id': '12345'
+ }
+
+ def test_correct_filename_format(self):
+ checker = PresTemplateNameCheck(self.file_info)
+
+ result = checker.check()
+
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+ def test_incorrect_filename_format(self):
+ self.file_info['filename'] = "Презентация_ДИПЛОМ_Петров.pdf"
+
+ checker = PresTemplateNameCheck(self.file_info)
+
+ result = checker.check()
+
+ self.assertFalse(result['score'])
+ self.assertIn("не соответствует шаблону", result['verdict'][0])
+
+ def test_empty_filename(self):
+ self.file_info['filename'] = ""
+
+ checker = PresTemplateNameCheck(self.file_info)
+
+ result = checker.check()
+
+ self.assertFalse(result['score'])
+ self.assertIn("не соответствует шаблону", result['verdict'][0])
+
+if __name__ == '__main__':
+ unittest.main()
+
diff --git a/tests/tests_check/test_right_words_check.py b/tests/tests_check/test_right_words_check.py
new file mode 100644
index 00000000..56f27982
--- /dev/null
+++ b/tests/tests_check/test_right_words_check.py
@@ -0,0 +1,68 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.report_checks import ReportRightWordsCheck
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportRightWordsCheck(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.mock_file.page_counter.return_value = 5
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportRightWordsCheck(file_info=self.file_info)
+
+ def test_right_words_present(self):
+ self.mock_file.page_counter.return_value = 5
+ self.mock_file.pdf_file.get_text_on_page.return_value = {
+ 1: "Введение. Цель работы - изучение.",
+ 2: "Методология. В работе используются методы.",
+ 3: "Результаты. Исследования показали.",
+ 4: "Обсуждение. Выводы и рекомендации.",
+ 5: "Заключение. Цель достигнута."
+ }
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportRightWordsCheck(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+ def test_right_words_absent(self):
+ self.mock_file.page_counter.return_value = 5
+ self.mock_file.pdf_file.get_text_on_page.return_value = {
+ 1: "Введение. Задачи исследования.",
+ 2: "Методология. В работе используются методы.",
+ 3: "Результаты. Исследования показали.",
+ 4: "Обсуждение. Выводы и рекомендации.",
+ 5: "Заключение. Задачи выполнены."
+ }
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportRightWordsCheck(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertIn('Не найдены слова, соответствующие следующим регулярным выражениям: ', result['verdict'])
+
+ def test_insufficient_pages(self):
+ self.mock_file.page_counter.return_value = 3
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportRightWordsCheck(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], "В отчете недостаточно страниц. Нечего проверять.")
+
+ def test_case_insensitivity(self):
+ self.mock_file.page_counter.return_value = 5
+ self.mock_file.pdf_file.get_text_on_page.return_value = {
+ 1: "Введение. ЦЕЛЬ работы - изучение.",
+ 2: "Методология. В работе используются методы.",
+ 3: "Результаты. Исследования показали.",
+ 4: "Обсуждение. Выводы и рекомендации.",
+ 5: "Заключение. цель достигнута."
+ }
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportRightWordsCheck(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_search_keyword.py b/tests/tests_check/test_search_keyword.py
new file mode 100644
index 00000000..d3ab79c9
--- /dev/null
+++ b/tests/tests_check/test_search_keyword.py
@@ -0,0 +1,55 @@
+import unittest
+from unittest.mock import Mock
+from datetime import datetime
+from app.main.checks.presentation_checks.search_keyword import SearchKeyWord
+
+class TestSearchKeyWord(unittest.TestCase):
+
+ def setUp(self):
+ # Создаем заглушку для file_info
+ self.file_info = {
+ 'file': Mock(),
+ 'filename': f'{datetime.now().year}ВКР111111ИВАНОВ.pdf',
+ 'pdf_id': '12345'
+ }
+ # Мокаем метод get_text_from_slides()
+ self.file_info['file'].get_text_from_slides.return_value = [
+ "Это текст первого слайда с актуальностью.",
+ "Второй слайд без ключевого слова.",
+ "Третий слайд с Актуальностью в заголовке.",
+ "Четвертый слайд с актуальностью в конце текста",
+ ]
+
+ def test_find_existing_keyword(self):
+ checker = SearchKeyWord(self.file_info, ["актуальность"])
+
+ result = checker.check()
+
+ self.assertTrue(result['score'])
+ self.assertIn("Найден под номером:", result['verdict'][0])
+
+ def test_find_non_existing_keyword(self):
+ checker = SearchKeyWord(self.file_info, ["новое"])
+
+ result = checker.check()
+
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], "Слайд не найден")
+
+ def test_multiple_key_words(self):
+ checker = SearchKeyWord(self.file_info, ["актуальность", "важность"])
+
+ result = checker.check()
+
+ self.assertTrue(result['score'])
+ self.assertIn("Найден под номером:", result['verdict'][0])
+
+ def test_case_insensitivity(self):
+ checker = SearchKeyWord(self.file_info, ["АКТУАЛЬНОСТЬ"])
+ result = checker.check()
+
+ self.assertTrue(result['score'])
+ self.assertIn("Найден под номером:", result['verdict'][0])
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
diff --git a/tests/tests_check/test_section_component.py b/tests/tests_check/test_section_component.py
new file mode 100644
index 00000000..05e49983
--- /dev/null
+++ b/tests/tests_check/test_section_component.py
@@ -0,0 +1,68 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.report_checks import ReportSectionComponent
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportSectionComponent(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportSectionComponent(file_info=self.file_info)
+
+ def test_all_components_present(self):
+ self.mock_file.page_counter.return_value = 5
+ self.mock_file.make_chapters.return_value = [
+ {"text": "Введение", "child": [
+ {"text": "Цель работы - изучение."},
+ {"text": "Задачи исследования."},
+ {"text": "Объект исследования."},
+ {"text": "Предмет исследования."}
+ ]}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportSectionComponent(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], 'Все необходимые компоненты раздела "Введение" обнаружены!')
+
+ def test_some_components_missing(self):
+ self.mock_file.page_counter.return_value = 5
+ self.mock_file.make_chapters.return_value = [
+ {"text": "Введение", "child": [
+ {"text": "Цель работы - изучение."},
+ {"text": "Задачи исследования."}
+ ]}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportSectionComponent(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertIn('Не найдены следующие компоненты раздела Введение:', result['verdict'][0])
+ self.assertIn('Объект', result['verdict'][0])
+ self.assertIn('Предмет', result['verdict'][0])
+
+ def test_no_introduction_section(self):
+ self.mock_file.page_counter.return_value = 5
+ self.mock_file.make_chapters.return_value = [
+ {"text": "Методология", "child": [
+ {"text": "Цель работы - изучение."},
+ {"text": "Задачи исследования."}
+ ]}
+ ]
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportSectionComponent(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], 'Раздел "Введение" не обнаружен!')
+
+ def test_insufficient_pages(self):
+ self.mock_file.page_counter.return_value = 3
+ self.file_info['file'] = self.mock_file
+ self.checker = ReportSectionComponent(file_info=self.file_info)
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], "В отчете недостаточно страниц. Нечего проверять.")
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_simple_check.py b/tests/tests_check/test_simple_check.py
new file mode 100644
index 00000000..45850c22
--- /dev/null
+++ b/tests/tests_check/test_simple_check.py
@@ -0,0 +1,30 @@
+import unittest
+from unittest.mock import MagicMock
+from app.main.checks.report_checks.simple_check import ReportSimpleCheck
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportSimpleCheck(BaseTestCase):
+
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.file_info['file'] = self.mock_file
+
+ def test_file_not_empty(self):
+ self.mock_file.paragraphs = ["Это текст параграфа."]
+ self.file_info['file'] = self.mock_file
+ checker = ReportSimpleCheck(file_info=self.file_info)
+ result = checker.check()
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+ def test_file_empty(self):
+ self.mock_file.paragraphs = []
+ self.file_info['file'] = self.mock_file
+ checker = ReportSimpleCheck(file_info=self.file_info)
+ result = checker.check()
+ self.assertFalse(result['score'])
+ self.assertEqual(result['verdict'][0], 'В файле нет текста.')
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/tests_check/test_sld_enum.py b/tests/tests_check/test_sld_enum.py
new file mode 100644
index 00000000..8146e882
--- /dev/null
+++ b/tests/tests_check/test_sld_enum.py
@@ -0,0 +1,54 @@
+import unittest
+from unittest.mock import Mock
+from datetime import datetime
+# from utils import format_header
+from app.main.checks.presentation_checks.sld_enum import SldEnumCheck
+
+class TestSldEnumCheck(unittest.TestCase):
+
+ def setUp(self):
+ self.file_info = {
+ 'file': Mock(),
+ 'filename': f'{datetime.now().year}ВКР111111ИВАНОВ.pdf',
+ 'pdf_id': '12345'
+ }
+ self.file_info['file'].slides = [
+ Mock(page_number=[-1]),
+ Mock(page_number=[2]),
+ Mock(page_number=[3]),
+ Mock(page_number=[4]),
+ Mock(page_number=[5])
+ ]
+
+ def test_correct_slide_numbering(self):
+ checker = SldEnumCheck(self.file_info)
+
+ result = checker.check()
+
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+ def test_incorrect_slide_numbering(self):
+ self.file_info['file'].slides[1].page_number = [3]
+
+ checker = SldEnumCheck(self.file_info)
+
+ result = checker.check()
+
+ self.assertFalse(result['score'])
+ self.assertIn("Не пройдена", result['verdict'][0])
+
+ def test_multiple_errors(self):
+ self.file_info['file'].slides[1].page_number = [3]
+ self.file_info['file'].slides[3].page_number = [5]
+
+ checker = SldEnumCheck(self.file_info)
+ result = checker.check()
+
+ self.assertFalse(result['score'])
+ self.assertIn("Не пройдена", result['verdict'][0])
+ self.assertIn('проблемные слайды: ', result['verdict'][0])
+
+if __name__ == '__main__':
+ unittest.main()
+
diff --git a/tests/tests_check/test_table_references.py b/tests/tests_check/test_table_references.py
new file mode 100644
index 00000000..f24c3c3d
--- /dev/null
+++ b/tests/tests_check/test_table_references.py
@@ -0,0 +1,31 @@
+import unittest
+from unittest.mock import MagicMock, patch
+from app.main.checks.report_checks.table_references import TableReferences
+from app.main.checks.base_check import answer
+from tests.tests_check.base_test import BaseTestCase
+
+class TestTableReferences(BaseTestCase):
+
+ def setUp(self):
+ super().setUp()
+ self.mock_file = self.file_info['file']
+ self.file_info['file'] = self.mock_file
+
+
+ def test_invalid_references(self):
+ self.mock_file.page_counter.return_value = 10
+ self.mock_file.make_chapters.return_value = [
+ {"child": [{"style": "ВКР_Подпись таблицы".lower(), "text": "Таблица 1 -- Пример таблицы", "number": 1}]}
+ ]
+ self.mock_file.paragraphs = ["Этот текст содержит неправильную ссылку на таблицу 2."]
+ self.file_info['file'] = self.mock_file
+
+ checker = TableReferences(file_info=self.file_info)
+ result = checker.check()
+
+ self.assertFalse(result['score'])
+ self.assertIn('Упомянуты несуществующие таблицы:', result['verdict'][0])
+
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
diff --git a/tests/tests_check/test_template_name.py b/tests/tests_check/test_template_name.py
new file mode 100644
index 00000000..a74a1bbd
--- /dev/null
+++ b/tests/tests_check/test_template_name.py
@@ -0,0 +1,60 @@
+import unittest
+from unittest.mock import MagicMock
+from datetime import datetime
+from app.main.checks.report_checks.template_name import ReportTemplateNameCheck
+from app.main.checks.base_check import answer
+from tests.tests_check.base_test import BaseTestCase
+
+class TestReportTemplateNameCheck(BaseTestCase):
+
+ def setUp(self):
+ self.mock_file_info = {
+ 'file': MagicMock(),
+ 'filename': f'{datetime.now().year}ВКР111111ИВАНОВ.pdf'
+ }
+ self.checker = ReportTemplateNameCheck(file_info=self.mock_file_info)
+
+ def test_correct_filename(self):
+ self.mock_file_info['filename'] = f'{datetime.now().year}ВКР111111ИВАНОВ.pdf'
+ self.checker.filename = self.mock_file_info['filename'].split('.', 1)[0]
+ result = self.checker.check()
+ self.assertTrue(result['score'])
+ self.assertEqual(result['verdict'][0], "Пройдена!")
+
+ def test_incorrect_filename(self):
+ self.mock_file_info['filename'] = f'{datetime.now().year}ВКР111111ivanov.pdf'
+ self.checker.filename = self.mock_file_info['filename'].split('.', 1)[0]
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertIn('не соответствует шаблону', result['verdict'][0])
+
+ def test_missing_year(self):
+ self.mock_file_info['filename'] = 'ВКР111111ИВАНОВ.pdf'
+ self.checker.filename = self.mock_file_info['filename'].split('.', 1)[0]
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertIn('не соответствует шаблону', result['verdict'][0])
+
+ def test_missing_vkr(self):
+ self.mock_file_info['filename'] = f'{datetime.now().year}111111ИВАНОВ.pdf'
+ self.checker.filename = self.mock_file_info['filename'].split('.', 1)[0]
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertIn('не соответствует шаблону', result['verdict'][0])
+
+ def test_short_student_id(self):
+ self.mock_file_info['filename'] = f'{datetime.now().year}ВКР11111ИВАНОВ.pdf'
+ self.checker.filename = self.mock_file_info['filename'].split('.', 1)[0]
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertIn('не соответствует шаблону', result['verdict'][0])
+
+ def test_non_cyrillic_surname(self):
+ self.mock_file_info['filename'] = f'{datetime.now().year}ВКР111111IVANOV.pdf'
+ self.checker.filename = self.mock_file_info['filename'].split('.', 1)[0]
+ result = self.checker.check()
+ self.assertFalse(result['score'])
+ self.assertIn('не соответствует шаблону', result['verdict'][0])
+
+if __name__ == '__main__':
+ unittest.main()