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