yj
2025-07-28 69945b730fd3f6b6138ce50e49fc3392fcd74d71
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
"""
静默模式服务测试
"""
 
import time
import pytest
from unittest.mock import Mock, patch
 
from app.services.silence_service import SilenceService
 
 
class TestSilenceService:
    """静默模式服务测试类"""
 
    def setup_method(self):
        """测试前准备"""
        self.service = SilenceService()
 
    @patch('app.services.silence_service.settings')
    @patch('app.services.silence_service.redis_queue')
    def test_activate_silence_mode_success(self, mock_redis_queue, mock_settings):
        """测试成功激活群组静默模式"""
        # 模拟配置
        mock_settings.silence_mode_enabled = True
        mock_settings.silence_duration_minutes = 10
 
        # 模拟Redis操作
        mock_redis_client = Mock()
        mock_redis_queue.redis_client = mock_redis_client
        mock_redis_client.setex.return_value = True
 
        # 测试激活群组静默模式
        group_id = "test_group@chatroom"
        result = self.service.activate_silence_mode(group_id)
 
        assert result is True
        # 验证Redis调用
        assert mock_redis_client.setex.call_count == 2  # 设置两个键
 
    @patch('app.services.silence_service.settings')
    def test_activate_silence_mode_disabled(self, mock_settings):
        """测试静默模式功能禁用时的行为"""
        mock_settings.silence_mode_enabled = False
 
        group_id = "test_group@chatroom"
        result = self.service.activate_silence_mode(group_id)
        assert result is False
 
    @patch('app.services.silence_service.settings')
    @patch('app.services.silence_service.redis_queue')
    def test_is_silence_active(self, mock_redis_queue, mock_settings):
        """测试检查静默模式是否激活"""
        mock_settings.silence_mode_enabled = True
        
        # 模拟Redis操作
        mock_redis_client = Mock()
        mock_redis_queue.redis_client = mock_redis_client
        
        # 测试静默模式激活状态
        mock_redis_client.exists.return_value = True
        group_id = "test_group@chatroom"
        result = self.service.is_silence_active(group_id)
        assert result is True
 
        # 测试静默模式未激活状态
        mock_redis_client.exists.return_value = False
        result = self.service.is_silence_active(group_id)
        assert result is False
 
    @patch('app.services.silence_service.settings')
    def test_is_silence_active_disabled(self, mock_settings):
        """测试功能禁用时的静默模式检查"""
        mock_settings.silence_mode_enabled = False
        
        group_id = "test_group@chatroom"
        result = self.service.is_silence_active(group_id)
        assert result is False
 
    @patch('app.services.silence_service.settings')
    @patch('app.services.silence_service.redis_queue')
    def test_get_silence_remaining_time(self, mock_redis_queue, mock_settings):
        """测试获取静默模式剩余时间"""
        mock_settings.silence_mode_enabled = True
        
        # 模拟Redis操作
        mock_redis_client = Mock()
        mock_redis_queue.redis_client = mock_redis_client
        
        # 模拟静默模式激活
        mock_redis_client.exists.return_value = True
        
        # 模拟结束时间(当前时间 + 300秒)
        future_time = time.time() + 300
        mock_redis_client.get.return_value = str(future_time)
        
        group_id = "test_group@chatroom"
        result = self.service.get_silence_remaining_time(group_id)
        assert result is not None
        assert result > 0
        assert result <= 300
 
    @patch('app.services.silence_service.settings')
    @patch('app.services.silence_service.redis_queue')
    def test_get_silence_remaining_time_inactive(self, mock_redis_queue, mock_settings):
        """测试静默模式未激活时获取剩余时间"""
        mock_settings.silence_mode_enabled = True
        
        # 模拟Redis操作
        mock_redis_client = Mock()
        mock_redis_queue.redis_client = mock_redis_client
        mock_redis_client.exists.return_value = False
        
        group_id = "test_group@chatroom"
        result = self.service.get_silence_remaining_time(group_id)
        assert result is None
 
    @patch('app.services.silence_service.settings')
    @patch('app.services.silence_service.redis_queue')
    def test_deactivate_silence_mode(self, mock_redis_queue, mock_settings):
        """测试手动停用静默模式"""
        # 模拟Redis操作
        mock_redis_client = Mock()
        mock_redis_queue.redis_client = mock_redis_client
        mock_redis_client.delete.return_value = True
        
        result = self.service.deactivate_silence_mode()
        assert result is True
        
        # 验证删除了两个键
        assert mock_redis_client.delete.call_count == 2
 
    @patch('app.services.silence_service.settings')
    @patch('app.services.silence_service.redis_queue')
    def test_extend_silence_mode(self, mock_redis_queue, mock_settings):
        """测试延长静默模式"""
        mock_settings.silence_mode_enabled = True
        mock_settings.silence_duration_minutes = 10
        
        # 模拟Redis操作
        mock_redis_client = Mock()
        mock_redis_queue.redis_client = mock_redis_client
        mock_redis_client.setex.return_value = True
        
        group_id = "test_group@chatroom"
        result = self.service.extend_silence_mode(group_id)
        assert result is True
 
    @patch('app.services.silence_service.settings')
    def test_get_silence_status(self, mock_settings):
        """测试获取静默模式状态"""
        mock_settings.silence_mode_enabled = True
        mock_settings.silence_duration_minutes = 10
        
        with patch.object(self.service, 'is_silence_active', return_value=False):
            status = self.service.get_silence_status()
            
            assert status["enabled"] is True
            assert status["active"] is False
            assert status["duration_minutes"] == 10
            assert status["remaining_seconds"] is None
            assert status["remaining_minutes"] is None
 
    @patch('app.services.silence_service.settings')
    def test_get_silence_status_active(self, mock_settings):
        """测试获取激活状态的静默模式状态"""
        mock_settings.silence_mode_enabled = True
        mock_settings.silence_duration_minutes = 10
        
        with patch.object(self.service, 'is_silence_active', return_value=True), \
             patch.object(self.service, 'get_silence_remaining_time', return_value=300):
            
            status = self.service.get_silence_status()
            
            assert status["enabled"] is True
            assert status["active"] is True
            assert status["remaining_seconds"] == 300
            assert status["remaining_minutes"] == 5.0