ForcePilot/backend/test/unit/channels/sdk/test_dedupe.py
Kris 3264900bc9 test: 新增多渠道单元测试用例并配置测试环境变量
新增了Twitch、Telegram、Discord、Slack、Mattermost、WeChat、Zalo等多渠道的单元测试用例,覆盖了令牌处理、速率限制、消息去重、会话解析、格式转换、安全策略等模块
同时在测试配置中添加了测试用的OpenAI API密钥环境变量
2026-05-12 00:56:47 +08:00

84 lines
2.5 KiB
Python

from __future__ import annotations
import time
import pytest
from yuxi.channels.sdk.dedupe import DedupeConfig, MessageDeduplicator
class TestDedupeConfig:
def test_default_values(self):
cfg = DedupeConfig()
assert cfg.ttl_seconds == 300.0
assert cfg.max_entries == 10000
def test_custom_values(self):
cfg = DedupeConfig(ttl_seconds=60.0, max_entries=100)
assert cfg.ttl_seconds == 60.0
assert cfg.max_entries == 100
class TestMessageDeduplicator:
def test_first_message_not_duplicate(self):
dedup = MessageDeduplicator()
assert dedup.is_duplicate("msg-001") is False
def test_second_same_message_is_duplicate(self):
dedup = MessageDeduplicator()
dedup.is_duplicate("msg-001")
assert dedup.is_duplicate("msg-001") is True
def test_different_messages_not_duplicate(self):
dedup = MessageDeduplicator()
assert dedup.is_duplicate("msg-001") is False
assert dedup.is_duplicate("msg-002") is False
def test_record_then_is_duplicate(self):
dedup = MessageDeduplicator()
dedup.record("msg-001")
assert dedup.is_duplicate("msg-001") is True
def test_ttl_expiry(self):
cfg = DedupeConfig(ttl_seconds=0.01)
dedup = MessageDeduplicator(cfg)
dedup.is_duplicate("msg-001")
time.sleep(0.02)
assert dedup.is_duplicate("msg-001") is False
def test_lru_eviction(self):
cfg = DedupeConfig(max_entries=3)
dedup = MessageDeduplicator(cfg)
dedup.is_duplicate("a")
dedup.is_duplicate("b")
dedup.is_duplicate("c")
dedup.is_duplicate("d")
assert dedup.is_duplicate("a") is False
def test_clear_removes_all(self):
dedup = MessageDeduplicator()
dedup.is_duplicate("msg-001")
dedup.is_duplicate("msg-002")
dedup.clear()
assert dedup.is_duplicate("msg-001") is False
assert dedup.is_duplicate("msg-002") is False
def test_thread_safety_basic(self):
import threading
dedup = MessageDeduplicator(DedupeConfig(max_entries=1000))
results: list[bool] = []
def worker(start: int):
for i in range(start, start + 100):
results.append(dedup.is_duplicate(f"msg-{i}"))
t1 = threading.Thread(target=worker, args=(0,))
t2 = threading.Thread(target=worker, args=(0,))
t1.start()
t2.start()
t1.join()
t2.join()
duplicates = sum(1 for r in results if r)
assert duplicates == 100