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 = ( + 'Следующие страницы не найдены либо их заголовки расположены не на первой строке новой ' + 'страницы: ' + 'Проверьте очередность листов и орфографию заголовков.' + ) + 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()