同步设备期望音量并补发音量指令

This commit is contained in:
stu2not
2026-05-25 08:39:41 +08:00
parent 6e104201fb
commit a6882e8371
5 changed files with 140 additions and 2 deletions

View File

@@ -0,0 +1,89 @@
import pytest
from handlers.mqtt_handler import TalkingQMQTTService
@pytest.mark.asyncio
async def test_sync_desired_volume_republishes_when_reported_volume_differs(monkeypatch):
service = TalkingQMQTTService({"device_prefix": "TalkingQ"})
sent_commands = []
class FakeDeviceVolumeManager:
async def get_configured_volume(self, device_id):
assert device_id == "TalkingQ_XQSN00001001"
return 70
async def fake_send_volume_command(device_id, level):
sent_commands.append((device_id, level))
return "002"
monkeypatch.setattr("handlers.mqtt_handler.device_volume_manager", FakeDeviceVolumeManager())
monkeypatch.setattr(service, "send_volume_command", fake_send_volume_command)
await service._sync_desired_volume("TalkingQ_XQSN00001001", 30)
assert sent_commands == [("TalkingQ_XQSN00001001", 70)]
@pytest.mark.asyncio
async def test_sync_desired_volume_skips_when_reported_volume_matches(monkeypatch):
service = TalkingQMQTTService({"device_prefix": "TalkingQ"})
sent_commands = []
class FakeDeviceVolumeManager:
async def get_configured_volume(self, device_id):
return 70
async def fake_send_volume_command(device_id, level):
sent_commands.append((device_id, level))
return "002"
monkeypatch.setattr("handlers.mqtt_handler.device_volume_manager", FakeDeviceVolumeManager())
monkeypatch.setattr(service, "send_volume_command", fake_send_volume_command)
await service._sync_desired_volume("TalkingQ_XQSN00001001", "70")
assert sent_commands == []
@pytest.mark.asyncio
async def test_device_service_persists_desired_volume_before_mqtt(monkeypatch):
from banban.service.device import DeviceService
service = DeviceService()
calls = []
async def fake_ensure_device_access(*, device_id, user_id):
calls.append(("access", device_id, user_id))
class FakeDeviceVolumeManager:
async def set_volume(self, device_id, level):
calls.append(("persist", device_id, level))
return True
class FakeMQTTService:
async def send_volume_command(self, device_id, level):
calls.append(("mqtt", device_id, level))
return "002"
class FakeTalkingQMQTTService:
@classmethod
async def get_instance(cls):
return FakeMQTTService()
monkeypatch.setattr(service, "ensure_device_access", fake_ensure_device_access)
monkeypatch.setattr("banban.service.device.device_volume_manager", FakeDeviceVolumeManager())
monkeypatch.setattr("handlers.mqtt_handler.TalkingQMQTTService", FakeTalkingQMQTTService)
msg_id = await service.set_device_volume(
device_id="TalkingQ_XQSN00001001",
user_id=1,
level=70,
)
assert msg_id == "002"
assert calls == [
("access", "TalkingQ_XQSN00001001", 1),
("persist", "TalkingQ_XQSN00001001", 70),
("mqtt", "TalkingQ_XQSN00001001", 70),
]