fault-log-analyzer/tests/test_integrations.py

95 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import _bootstrap # noqa: F401
import unittest
from datetime import datetime, timezone
from unittest.mock import patch
from fault_log_analyzer.integrations import (
ElasticsearchSink,
KafkaMessageBus,
MySQLFaultLogRepository,
MySQLFaultTypeRepository,
MySQLFilterRuleRepository,
MySQLResultEventRepository,
MySQLRootCauseRepository,
RedisDedupCache,
)
class TestElasticsearchSinkIndexName(unittest.TestCase):
"""ElasticsearchSink 的索引命名逻辑(不依赖 ES 客户端即可测试)。"""
def test_index_name_monthly_rollover(self):
sink = object.__new__(ElasticsearchSink)
sink._index_pattern = "hms-fault-log-{yyyy.MM}"
self.assertEqual(
sink._index_name(datetime(2025, 1, 15, tzinfo=timezone.utc)),
"hms-fault-log-2025.01",
)
self.assertEqual(
sink._index_name(datetime(2025, 12, 1, tzinfo=timezone.utc)),
"hms-fault-log-2025.12",
)
def test_index_name_custom_pattern(self):
sink = object.__new__(ElasticsearchSink)
sink._index_pattern = "my-index-{yyyy.MM}"
self.assertEqual(
sink._index_name(datetime(2025, 6, 30, tzinfo=timezone.utc)),
"my-index-2025.06",
)
class TestLazyImportBackends(unittest.TestCase):
"""可选后端依赖kafka/elasticsearch/pymysql/redis未安装时实例化应抛出
明确的 RuntimeError而非影响核心逻辑与单元测试。"""
def _assert_missing_dependency_raises_runtime_error(self, factory):
with patch("builtins.__import__", side_effect=ImportError("no optional dependency")):
with self.assertRaises(RuntimeError):
factory()
def test_kafka_message_bus(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: KafkaMessageBus("localhost:9092", "fault-log-analyzer")
)
def test_elasticsearch_sink(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: ElasticsearchSink(["http://localhost:9200"])
)
def test_mysql_fault_log_repository(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: MySQLFaultLogRepository("h", 3306, "u", "p", "hms")
)
def test_mysql_root_cause_repository(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: MySQLRootCauseRepository("h", 3306, "u", "p", "hms")
)
def test_mysql_fault_type_repository(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: MySQLFaultTypeRepository("h", 3306, "u", "p", "hms")
)
def test_mysql_filter_rule_repository(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: MySQLFilterRuleRepository("h", 3306, "u", "p", "hms")
)
def test_mysql_result_event_repository(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: MySQLResultEventRepository("h", 3306, "u", "p", "hms")
)
def test_redis_dedup_cache(self):
self._assert_missing_dependency_raises_runtime_error(
lambda: RedisDedupCache("redis://localhost:6379/0")
)
if __name__ == "__main__":
unittest.main()