x /
tests /
test_unfollow_agent.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64import pytest
from unittest.mock import MagicMock, AsyncMock
from x_agent.agents.unfollow_agent import UnfollowAgent
from x_agent.services.x_service import XService
from x_agent.database import DatabaseManager
@pytest.fixture
def mock_x_service():
service = MagicMock(spec=XService)
service.ensure_initialized = AsyncMock()
service.get_follower_user_ids = AsyncMock()
return service
@pytest.fixture
def mock_db_manager():
return MagicMock(spec=DatabaseManager)
@pytest.fixture
def unfollow_agent(mock_x_service, mock_db_manager):
return UnfollowAgent(x_service=mock_x_service, db_manager=mock_db_manager)
@pytest.mark.asyncio
async def test_execute_first_run(unfollow_agent, mock_x_service, mock_db_manager):
"""Test first run where no previous followers exist in DB."""
mock_x_service.get_follower_user_ids.return_value = {101, 102}
mock_db_manager.get_all_follower_ids.return_value = set()
await unfollow_agent.execute()
mock_x_service.get_follower_user_ids.assert_awaited_once()
mock_db_manager.get_all_follower_ids.assert_called_once()
mock_db_manager.replace_followers.assert_called_once_with({101, 102})
mock_db_manager.log_unfollows.assert_not_called()
@pytest.mark.asyncio
async def test_execute_detect_unfollow(unfollow_agent, mock_x_service, mock_db_manager):
"""Test detecting an unfollow (ID 101 is gone)."""
mock_x_service.get_follower_user_ids.return_value = {102, 103}
mock_db_manager.get_all_follower_ids.return_value = {101, 102}
await unfollow_agent.execute()
# 101 was in DB but not in API -> Unfollowed
# 103 is new
mock_db_manager.log_unfollows.assert_called_once_with([101])
mock_db_manager.replace_followers.assert_called_once_with({102, 103})
@pytest.mark.asyncio
async def test_execute_no_changes(unfollow_agent, mock_x_service, mock_db_manager):
"""Test when follower list remains the same."""
mock_x_service.get_follower_user_ids.return_value = {101, 102}
mock_db_manager.get_all_follower_ids.return_value = {101, 102}
await unfollow_agent.execute()
mock_db_manager.log_unfollows.assert_not_called()
mock_db_manager.replace_followers.assert_called_once_with({101, 102})