diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_config.py | 4 | ||||
| -rw-r--r-- | tests/test_spam_detector.py | 74 |
2 files changed, 78 insertions, 0 deletions
diff --git a/tests/test_config.py b/tests/test_config.py index a160a84..71879c1 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -14,8 +14,10 @@ def test_config_from_env(): "REDDIT_CLIENT_SECRET": "test_client_secret", "REDDIT_USERNAME": "test_username", "REDDIT_PASSWORD": "test_password", + "OPENAI_API_KEY": "test_openai_key", "SUBREDDIT_NAME": "test_subreddit", "ROLEPLAY_MESSAGE": "Test roleplay message", + "DRY_RUN": "false", } with patch.dict(os.environ, test_env): @@ -40,6 +42,7 @@ def test_config_validation(): username="", password="", user_agent="test", + openai_api_key="", subreddit_name="", roleplay_message="" ) @@ -56,6 +59,7 @@ def test_config_validation_success(): username="test", password="test", user_agent="test", + openai_api_key="test", subreddit_name="test", roleplay_message="test" ) diff --git a/tests/test_spam_detector.py b/tests/test_spam_detector.py new file mode 100644 index 0000000..4ac8591 --- /dev/null +++ b/tests/test_spam_detector.py @@ -0,0 +1,74 @@ +"""Tests for spam detection rule behavior.""" + +import time +from collections import OrderedDict +from types import SimpleNamespace +from typing import Optional +from unittest.mock import MagicMock + +from umabot.bot import UmaBot +from umabot.rules.spam_detector import SpamDetector + + +def make_submission(post_id: str, username: str, created_utc: Optional[float] = None): + """Create a submission-like test object.""" + return SimpleNamespace( + id=post_id, + author=SimpleNamespace(name=username), + created_utc=created_utc if created_utc is not None else time.time(), + ) + + +def make_config(max_posts_per_day: int = 3): + """Create a minimal config-like object for tests.""" + return SimpleNamespace( + max_posts_per_day=max_posts_per_day, + subreddit_name="okbuddyumamusume", + ) + + +def test_spam_detector_removes_fourth_unique_post_same_day(): + """Fourth unique post in the same UTC day should be removed.""" + detector = SpamDetector(make_config()) + + assert detector.should_remove(make_submission("p1", "alice")) is False + assert detector.should_remove(make_submission("p2", "alice")) is False + assert detector.should_remove(make_submission("p3", "alice")) is False + assert detector.should_remove(make_submission("p4", "alice")) is True + + +def test_spam_detector_does_not_double_count_same_submission(): + """Seeing the same submission again should not increment the user's count.""" + detector = SpamDetector(make_config()) + submission = make_submission("p1", "alice") + + assert detector.should_remove(submission) is False + assert detector.should_remove(submission) is False + assert detector.should_remove(make_submission("p2", "alice")) is False + assert detector.should_remove(make_submission("p3", "alice")) is False + assert detector.should_remove(make_submission("p4", "alice")) is True + + +def test_spam_detector_ignores_old_submission_seen_today(): + """Old submissions should not be treated as today's posts.""" + detector = SpamDetector(make_config()) + two_days_ago = time.time() - (2 * 24 * 60 * 60) + + assert detector.should_remove(make_submission("old", "alice", two_days_ago)) is False + assert detector.should_remove(make_submission("p1", "alice")) is False + assert detector.should_remove(make_submission("p2", "alice")) is False + assert detector.should_remove(make_submission("p3", "alice")) is False + + +def test_cleanup_processed_submissions_prunes_oldest_entries(): + """Processed submission cleanup should keep the most recently seen IDs.""" + bot = UmaBot.__new__(UmaBot) + bot.logger = MagicMock() + bot.processed_submissions = OrderedDict((str(i), None) for i in range(1005)) + + UmaBot._cleanup_processed_submissions(bot) + + assert len(bot.processed_submissions) == 1000 + assert "0" not in bot.processed_submissions + assert "4" not in bot.processed_submissions + assert "5" in bot.processed_submissions |