# tests/test_hanging.py # Тесты для модуля висячей пунктуации (HangingPunctuationProcessor). import pytest from bs4 import BeautifulSoup from etpgrf.hanging import HangingPunctuationProcessor from etpgrf.config import ( CHAR_RU_QUOT1_OPEN, CHAR_RU_QUOT1_CLOSE, CHAR_EN_QUOT1_OPEN, CHAR_EN_QUOT1_CLOSE ) # Вспомогательная функция для создания soup def make_soup(html_str): return BeautifulSoup(html_str, 'html.parser') # Набор тестовых случаев в формате: # (режим, входной_html, ожидаемый_html) HANGING_TEST_CASES = [ # --- Режим 'left' (только левая пунктуация) --- ('left', f'
{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}
', f'{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}
'), ('left', '(Скобки)
', '(Скобки)
'), ('left', 'Текст.
', 'Текст.
'), # --- Режим 'right' (только правая пунктуация) --- ('right', f'{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}
', f'{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}
'), ('right', 'Текст.
', 'Текст.
'), ('right', '(Скобки)
', '(Скобки)
'), ('right', '3.14
', '3.14
'), ('right', 'End.
', 'End.
'), # --- Режим None / False (отключено) --- (None, f'{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}
', f'{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}
'), (False, f'{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}
', f'{CHAR_RU_QUOT1_OPEN}Текст{CHAR_RU_QUOT1_CLOSE}
'), ] # --- Режим list[str] (список тегов с обеими сторонами) --- HANGING_LIST_MODE_CASES = [ (['p'], f'{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}
', f'{CHAR_RU_QUOT1_OPEN}Цитата{CHAR_RU_QUOT1_CLOSE}
'), (['p'], f'Текст.{CHAR_RU_QUOT1_CLOSE}
', f'Текст.{CHAR_RU_QUOT1_CLOSE}
'), (['p'], f'func {CHAR_RU_QUOT1_OPEN}arg
', f'func {CHAR_RU_QUOT1_OPEN}arg
'), (['p'], f'arg{CHAR_RU_QUOT1_CLOSE} next
', f'arg{CHAR_RU_QUOT1_CLOSE} next
'), ] @pytest.mark.parametrize("mode, input_html, expected_html", HANGING_TEST_CASES) def test_hanging_punctuation_processor(mode, input_html, expected_html): """ Проверяет работу HangingPunctuationProcessor в различных режимах. """ # Arrange processor = HangingPunctuationProcessor(mode=mode) soup = make_soup(input_html) # Act processor.process(soup) actual_html = str(soup) # Assert assert actual_html == expected_html def test_hanging_punctuation_target_tags(): """ Отдельный тест для проверки работы со списком целевых тегов. """ mode = ['blockquote', 'h1'] input_html = (f'{CHAR_RU_QUOT1_OPEN}Обработка{CHAR_RU_QUOT1_CLOSE}' f'
{CHAR_RU_QUOT1_OPEN}Обработка{CHAR_RU_QUOT1_CLOSE}' f'