99 lines
3.2 KiB
Python
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"
|