""" 好友忽略服务测试 """ import pytest from unittest.mock import Mock, patch from app.services.friend_ignore_service import FriendIgnoreService class TestFriendIgnoreService: """好友忽略服务测试类""" def setup_method(self): """测试前准备""" self.service = FriendIgnoreService() @patch('app.services.friend_ignore_service.redis_queue') def test_add_friends_to_ignore_list_success(self, mock_redis_queue): """测试成功添加好友到忽略列表""" # 模拟Redis操作 mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client friends = ["wxid_test1", "wxid_test2", "wxid_test3"] result = self.service.add_friends_to_ignore_list(friends) # 验证结果 assert result is True # 验证Redis操作被调用 mock_redis_client.delete.assert_called_once_with(self.service.ignore_list_key) mock_redis_client.sadd.assert_called_once_with(self.service.ignore_list_key, *friends) @patch('app.services.friend_ignore_service.redis_queue') def test_add_friends_to_ignore_list_empty(self, mock_redis_queue): """测试添加空好友列表""" result = self.service.add_friends_to_ignore_list([]) # 验证结果 assert result is True # 验证Redis操作未被调用 mock_redis_queue.redis_client.delete.assert_not_called() mock_redis_queue.redis_client.sadd.assert_not_called() @patch('app.services.friend_ignore_service.redis_queue') def test_is_friend_ignored_true(self, mock_redis_queue): """测试检查好友在忽略列表中""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.sismember.return_value = True result = self.service.is_friend_ignored("wxid_test1") assert result is True mock_redis_client.sismember.assert_called_once_with(self.service.ignore_list_key, "wxid_test1") @patch('app.services.friend_ignore_service.redis_queue') def test_is_friend_ignored_false(self, mock_redis_queue): """测试检查好友不在忽略列表中""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.sismember.return_value = False result = self.service.is_friend_ignored("wxid_test1") assert result is False mock_redis_client.sismember.assert_called_once_with(self.service.ignore_list_key, "wxid_test1") @patch('app.services.friend_ignore_service.redis_queue') def test_get_ignore_list(self, mock_redis_queue): """测试获取忽略列表""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client expected_set = {"wxid_test1", "wxid_test2"} mock_redis_client.smembers.return_value = expected_set result = self.service.get_ignore_list() assert result == expected_set mock_redis_client.smembers.assert_called_once_with(self.service.ignore_list_key) @patch('app.services.friend_ignore_service.redis_queue') def test_remove_friend_from_ignore_list(self, mock_redis_queue): """测试从忽略列表移除好友""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.srem.return_value = 1 # 表示成功移除 result = self.service.remove_friend_from_ignore_list("wxid_test1") assert result is True mock_redis_client.srem.assert_called_once_with(self.service.ignore_list_key, "wxid_test1") @patch('app.services.friend_ignore_service.redis_queue') def test_clear_ignore_list(self, mock_redis_queue): """测试清空忽略列表""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client result = self.service.clear_ignore_list() assert result is True mock_redis_client.delete.assert_called_once_with(self.service.ignore_list_key) @patch('app.services.friend_ignore_service.redis_queue') def test_get_ignore_list_count(self, mock_redis_queue): """测试获取忽略列表数量""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.scard.return_value = 5 result = self.service.get_ignore_list_count() assert result == 5 mock_redis_client.scard.assert_called_once_with(self.service.ignore_list_key) @patch('app.services.friend_ignore_service.redis_queue') def test_add_friends_exception_handling(self, mock_redis_queue): """测试添加好友时的异常处理""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.sadd.side_effect = Exception("Redis error") result = self.service.add_friends_to_ignore_list(["wxid_test1"]) assert result is False @patch('app.services.friend_ignore_service.redis_queue') def test_is_friend_ignored_exception_handling(self, mock_redis_queue): """测试检查好友时的异常处理""" mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.sismember.side_effect = Exception("Redis error") result = self.service.is_friend_ignored("wxid_test1") assert result is False @patch('app.services.friend_ignore_service.settings') @patch('app.services.friend_ignore_service.redis_queue') @patch('app.services.friend_ignore_service.get_db') def test_is_friend_ignored_whitelist(self, mock_get_db, mock_redis_queue, mock_settings): """测试白名单功能""" # 模拟配置 mock_settings.friend_ignore_enabled = True mock_settings.friend_ignore_whitelist = ["测试用户1", "测试用户2"] # 模拟数据库查询 mock_db = Mock() mock_get_db.return_value.__next__.return_value.__enter__.return_value = mock_db mock_get_db.return_value.__next__.return_value.__exit__.return_value = None # 模拟联系人查询结果 - 根据昵称返回不同的联系人 def mock_query_side_effect(*args, **kwargs): mock_query = Mock() mock_filter = Mock() mock_query.filter.return_value = mock_filter # 根据查询条件返回不同的结果 def mock_first(): # 这里简化处理,假设查询"测试用户1"时返回wxid_whitelist1 mock_contact = Mock() mock_contact.wc_id = "wxid_whitelist1" return mock_contact mock_filter.first = mock_first return mock_query mock_db.query.side_effect = mock_query_side_effect # 模拟Redis操作 mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.sismember.return_value = True # 在忽略列表中 # 测试白名单用户(即使在忽略列表中也不应该被忽略) result = self.service.is_friend_ignored("wxid_whitelist1") assert result is False # 测试非白名单用户(在忽略列表中应该被忽略) result = self.service.is_friend_ignored("wxid_normal_user") assert result is True @patch('app.services.friend_ignore_service.settings') def test_is_friend_ignored_disabled(self, mock_settings): """测试功能禁用时的行为""" mock_settings.friend_ignore_enabled = False mock_settings.friend_ignore_whitelist = [] result = self.service.is_friend_ignored("wxid_test1") assert result is False @patch('app.services.friend_ignore_service.settings') @patch('app.services.friend_ignore_service.redis_queue') @patch('app.services.friend_ignore_service.get_db') def test_get_ignore_status_info(self, mock_get_db, mock_redis_queue, mock_settings): """测试获取详细状态信息""" mock_settings.friend_ignore_enabled = True mock_settings.friend_ignore_whitelist = ["测试用户1"] # 模拟数据库查询 mock_db = Mock() mock_get_db.return_value.__enter__.return_value = mock_db mock_get_db.return_value.__exit__.return_value = None # 模拟联系人查询结果 mock_contact = Mock() mock_contact.wc_id = "wxid_whitelist1" mock_db.query.return_value.filter.return_value.first.return_value = mock_contact mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.sismember.return_value = True # 测试白名单用户 result = self.service.get_ignore_status_info("wxid_whitelist1") assert result["w_id"] == "wxid_whitelist1" assert result["in_whitelist"] is True assert result["final_ignored"] is False assert "白名单" in result["reason"] assert result["whitelist_nicknames"] == ["测试用户1"] # 测试普通用户 result = self.service.get_ignore_status_info("wxid_normal_user") assert result["w_id"] == "wxid_normal_user" assert result["in_whitelist"] is False assert result["in_ignore_list"] is True assert result["final_ignored"] is True @patch('app.services.friend_ignore_service.FriendIgnoreService._get_whitelist_wids') @patch('app.services.friend_ignore_service.settings') @patch('app.services.friend_ignore_service.redis_queue') def test_is_friend_ignored_nickname_whitelist(self, mock_redis_queue, mock_settings, mock_get_whitelist_wids): """测试昵称白名单功能""" # 模拟配置 mock_settings.friend_ignore_enabled = True mock_settings.friend_ignore_whitelist = ["测试用户1", "测试用户2"] # 模拟白名单w_id转换结果 mock_get_whitelist_wids.return_value = ["wxid_whitelist1", "wxid_whitelist2"] # 模拟Redis操作 mock_redis_client = Mock() mock_redis_queue.redis_client = mock_redis_client mock_redis_client.sismember.return_value = True # 在忽略列表中 # 测试白名单用户(即使在忽略列表中也不应该被忽略) result = self.service.is_friend_ignored("wxid_whitelist1") assert result is False # 测试非白名单用户(在忽略列表中应该被忽略) result = self.service.is_friend_ignored("wxid_normal_user") assert result is True # 验证方法被调用 assert mock_get_whitelist_wids.call_count >= 2