Files
core/tests/test_utils_coverage.py

269 lines
9.6 KiB
Python
Raw Normal View History

2025-07-31 18:55:59 +03:00
"""
Тесты для покрытия модуля utils
"""
import pytest
from unittest.mock import Mock, patch, MagicMock
import json
import re
from datetime import datetime
# Импортируем модули utils для покрытия
import utils.logger
import utils.diff
import utils.encoders
import utils.extract_text
import utils.generate_slug
class TestUtilsLogger:
"""Тесты для utils.logger"""
def test_logger_import(self):
"""Тест импорта логгера"""
from utils.logger import root_logger
assert root_logger is not None
def test_logger_configuration(self):
"""Тест конфигурации логгера"""
from utils.logger import root_logger
assert hasattr(root_logger, 'handlers')
assert hasattr(root_logger, 'level')
class TestUtilsDiff:
"""Тесты для utils.diff"""
def test_diff_import(self):
"""Тест импорта diff"""
from utils.diff import get_diff, apply_diff
assert get_diff is not None
assert apply_diff is not None
def test_get_diff_same_texts(self):
"""Тест get_diff для одинаковых текстов"""
from utils.diff import get_diff
result = get_diff(" hello world", " hello world")
assert len(result) == 0 # Для идентичных текстов разницы нет
def test_get_diff_different_texts(self):
"""Тест get_diff с разными текстами"""
from utils.diff import get_diff
original = "hello world"
modified = "hello new world"
result = get_diff(original, modified)
assert len(result) > 0
assert any(line.startswith('+') for line in result)
def test_get_diff_empty_texts(self):
"""Тест get_diff с пустыми текстами"""
from utils.diff import get_diff
result = get_diff("", "")
assert result == []
def test_apply_diff(self):
"""Тест apply_diff"""
from utils.diff import apply_diff
original = "hello world"
diff = [" hello", "+ new", " world"]
result = apply_diff(original, diff)
assert "new" in result
class TestUtilsEncoders:
"""Тесты для utils.encoders"""
def test_encoders_import(self):
"""Тест импорта encoders"""
from utils.encoders import default_json_encoder, orjson_dumps, orjson_loads
assert default_json_encoder is not None
assert orjson_dumps is not None
assert orjson_loads is not None
def test_default_json_encoder_datetime(self):
"""Тест default_json_encoder с datetime"""
from utils.encoders import default_json_encoder
dt = datetime(2023, 1, 1, 12, 0, 0)
result = default_json_encoder(dt)
assert isinstance(result, str)
assert "2023-01-01T12:00:00" in result
def test_default_json_encoder_unknown_type(self):
"""Тест default_json_encoder с несериализуемым типом"""
from utils.encoders import default_json_encoder
import pytest
class UnserializableClass:
def __json__(self):
raise TypeError("Unsupported type")
with pytest.raises(TypeError):
default_json_encoder(UnserializableClass())
def test_orjson_dumps(self):
"""Тест orjson_dumps"""
from utils.encoders import orjson_dumps
data = {"key": "value"}
result = orjson_dumps(data)
assert isinstance(result, bytes)
assert b"key" in result
def test_orjson_loads(self):
"""Тест orjson_loads"""
from utils.encoders import orjson_loads
data = b'{"key": "value"}'
result = orjson_loads(data)
assert result == {"key": "value"}
def test_json_encoder_class(self):
"""Тест JSONEncoder класса"""
from utils.encoders import JSONEncoder
encoder = JSONEncoder()
data = {"key": "value"}
result = encoder.encode(data)
assert isinstance(result, str)
assert "key" in result
def test_fast_json_functions(self):
"""Тест быстрых JSON функций"""
from utils.encoders import fast_json_dumps, fast_json_loads
data = {"key": "value"}
json_str = fast_json_dumps(data)
result = fast_json_loads(json_str)
assert result == data
class TestUtilsExtractText:
"""Тесты для utils.extract_text"""
def test_extract_text_import(self):
"""Тест импорта extract_text"""
from utils.extract_text import extract_text, wrap_html_fragment
assert extract_text is not None
assert wrap_html_fragment is not None
def test_extract_text_from_html_simple(self):
"""Тест extract_text с простым HTML"""
from utils.extract_text import extract_text
html = """
<!DOCTYPE html>
<html>
<body>
<p>Hello world</p>
</body>
</html>
"""
result = extract_text(html)
assert "Hello world" in result, f"Результат: {result}"
def test_extract_text_from_html_complex(self):
"""Тест extract_text с комплексным HTML"""
from utils.extract_text import extract_text
html = """
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h1>Title</h1>
<p>Paragraph with <strong>bold</strong> text</p>
<ul><li>Item 1</li><li>Item 2</li></ul>
</body>
</html>
"""
result = extract_text(html)
assert "Title" in result, f"Результат: {result}"
assert "Paragraph with bold text" in result, f"Результат: {result}"
assert "Item 1" in result, f"Результат: {result}"
assert "Item 2" in result, f"Результат: {result}"
def test_extract_text_from_html_empty(self):
"""Тест extract_text с пустым HTML"""
from utils.extract_text import extract_text
result = extract_text("")
assert result == ""
def test_extract_text_from_html_none(self):
"""Тест extract_text с None"""
from utils.extract_text import extract_text
result = extract_text(None)
assert result == ""
def test_wrap_html_fragment(self):
"""Тест wrap_html_fragment"""
from utils.extract_text import wrap_html_fragment
fragment = "<p>Test</p>"
result = wrap_html_fragment(fragment)
assert "<!DOCTYPE html>" in result
assert "<html>" in result
assert "<p>Test</p>" in result
def test_wrap_html_fragment_full_html(self):
"""Тест wrap_html_fragment с полным HTML"""
from utils.extract_text import wrap_html_fragment
full_html = "<!DOCTYPE html><html><body><p>Test</p></body></html>"
result = wrap_html_fragment(full_html)
assert result == full_html
class TestUtilsGenerateSlug:
"""Тесты для utils.generate_slug"""
def test_generate_slug_import(self):
"""Тест импорта generate_slug"""
from utils.generate_slug import replace_translit, generate_unique_slug
assert replace_translit is not None
assert generate_unique_slug is not None
def test_replace_translit_simple(self):
"""Тест replace_translit с простым текстом"""
from utils.generate_slug import replace_translit
result = replace_translit("hello")
assert result == "hello"
def test_replace_translit_with_special_chars(self):
"""Тест replace_translit со специальными символами"""
from utils.generate_slug import replace_translit
result = replace_translit("hello.world")
assert result == "hello-world"
def test_replace_translit_with_cyrillic(self):
"""Тест replace_translit с кириллицей"""
from utils.generate_slug import replace_translit
result = replace_translit("привет")
assert result == "privet" # Корректная транслитерация слова "привет"
def test_replace_translit_empty(self):
"""Тест replace_translit с пустой строкой"""
from utils.generate_slug import replace_translit
result = replace_translit("")
assert result == ""
def test_replace_translit_none(self):
"""Тест replace_translit с None"""
from utils.generate_slug import replace_translit
result = replace_translit(None)
assert result == ""
def test_replace_translit_with_numbers(self):
"""Тест replace_translit с числами"""
from utils.generate_slug import replace_translit
result = replace_translit("test123")
assert "123" in result
def test_replace_translit_multiple_spaces(self):
"""Тест replace_translit с множественными пробелами"""
from utils.generate_slug import replace_translit
result = replace_translit("hello world")
assert "hello" in result
assert "world" in result
@patch('utils.generate_slug.local_session')
def test_generate_unique_slug(self, mock_session):
"""Тест generate_unique_slug с моком сессии"""
from utils.generate_slug import generate_unique_slug
mock_session.return_value.__enter__.return_value.query.return_value.where.return_value.first.return_value = None
result = generate_unique_slug("test")
assert isinstance(result, str)
assert len(result) > 0