from __future__ import annotations import time from yuxi.channels.adapters.twitch.deduplicator import MessageDeduplicator class TestMessageDeduplicator: def test_first_message_not_duplicate(self): dedup = MessageDeduplicator() assert dedup.is_duplicate("msg_001") is False def test_repeated_message_is_duplicate(self): dedup = MessageDeduplicator() assert dedup.is_duplicate("msg_001") is False assert dedup.is_duplicate("msg_001") is True assert dedup.is_duplicate("msg_001") is True def test_different_messages_not_duplicates(self): dedup = MessageDeduplicator() assert dedup.is_duplicate("msg_001") is False assert dedup.is_duplicate("msg_002") is False assert dedup.is_duplicate("msg_003") is False def test_expired_message_not_duplicate(self, monkeypatch): dedup = MessageDeduplicator() dedup.TTL_SECONDS = 0.1 assert dedup.is_duplicate("msg_001") is False time.sleep(0.15) assert dedup.is_duplicate("msg_001") is False def test_mark_seen(self): dedup = MessageDeduplicator() dedup.mark_seen("msg_001") assert dedup.is_duplicate("msg_001") is True def test_length_tracks_entries(self): dedup = MessageDeduplicator() assert len(dedup) == 0 dedup.is_duplicate("msg_001") assert len(dedup) == 1 dedup.is_duplicate("msg_002") assert len(dedup) == 2 dedup.is_duplicate("msg_001") assert len(dedup) == 2 def test_different_ids_independent(self): dedup = MessageDeduplicator() for i in range(100): assert dedup.is_duplicate(f"msg_{i:04d}") is False for i in range(100): assert dedup.is_duplicate(f"msg_{i:04d}") is True