Files
banban/talkingq-url/tests/test_volume_command_status.py
2026-06-05 17:12:48 +08:00

99 lines
3.2 KiB
Python

import pytest
from handlers.mqtt_handler import TalkingQMQTTService
@pytest.mark.asyncio
async def test_volume_command_includes_time_and_completes_on_matching_response(monkeypatch):
service = TalkingQMQTTService({"broker": "127.0.0.1"})
published = []
async def fake_publish(topic, payload):
published.append((topic, payload))
return True
async def fake_schedule_persistence(device_id, label, coro):
del device_id, label
coro.close()
monkeypatch.setattr(service, "_publish", fake_publish)
monkeypatch.setattr(service, "_schedule_persistence", fake_schedule_persistence)
monkeypatch.setattr(service, "_current_utc_timestamp_ms", lambda: 1717560000000)
command = await service.send_volume_command("TalkingQ_XQSN00001005", 70)
assert command["msg_id"] == "002"
assert command["time"] == 1717560000000
assert command["status"] == "sent"
assert published == [
(
"device/TalkingQ_XQSN00001005/command",
{"msg_id": "002", "params": {"level": 70}, "time": 1717560000000},
)
]
await service._handle_volume_response(
"TalkingQ_XQSN00001005",
{
"msg_id": "002",
"status": "success",
"data": {"current_level": 70},
"time": 1717560000000,
},
)
status = await service.get_volume_command_status("TalkingQ_XQSN00001005", 1717560000000)
assert status["status"] == "completed"
assert status["current_level"] == 70
@pytest.mark.asyncio
async def test_volume_command_response_without_time_does_not_complete_command(monkeypatch):
service = TalkingQMQTTService({"broker": "127.0.0.1"})
async def fake_publish(topic, payload):
del topic, payload
return True
async def fake_schedule_persistence(device_id, label, coro):
del device_id, label
coro.close()
monkeypatch.setattr(service, "_publish", fake_publish)
monkeypatch.setattr(service, "_schedule_persistence", fake_schedule_persistence)
monkeypatch.setattr(service, "_current_utc_timestamp_ms", lambda: 1717560000000)
command = await service.send_volume_command("TalkingQ_XQSN00001005", 70)
await service._handle_volume_response(
"TalkingQ_XQSN00001005",
{
"msg_id": "002",
"status": "success",
"data": {"current_level": 70},
},
)
status = await service.get_volume_command_status("TalkingQ_XQSN00001005", command["time"])
assert status["status"] == "sent"
assert status["current_level"] is None
@pytest.mark.asyncio
async def test_volume_command_status_times_out(monkeypatch):
service = TalkingQMQTTService({"broker": "127.0.0.1"})
now = 1717560000000
async def fake_publish(topic, payload):
del topic, payload
return True
monkeypatch.setattr(service, "_publish", fake_publish)
monkeypatch.setattr(service, "_current_utc_timestamp_ms", lambda: now)
command = await service.send_volume_command("TalkingQ_XQSN00001005", 70)
now += 10001
status = await service.get_volume_command_status("TalkingQ_XQSN00001005", command["time"])
assert status["status"] == "timeout"
assert status["error"] == "device response timeout"