1
0
mirror of https://github.com/elisspace/core.git synced 2026-08-29 15:43:55 +00:00

Fix replay and test

This commit is contained in:
jbouwh
2023-03-01 16:50:05 +00:00
parent e595b9add2
commit c2d94f41dd
2 changed files with 13 additions and 7 deletions

View File

@@ -583,12 +583,16 @@ class MQTT:
self._async_track_subscription(subscription)
self._matching_subscriptions.cache_clear()
if self._init_payload.get(subscription, False) and topic in self._last_payload:
if topic in self._last_payload and not self._init_payload.get(
subscription, False
):
# pylint: disable-next=import-outside-toplevel
import paho.mqtt.client as mqtt
# replay last payload of retained topics we already discovered and
# skip subscribing at the broker
self._last_subscribe = time.time()
msg = mqtt.MQTTMessage()
msg.topic = topic
msg = mqtt.MQTTMessage(topic=topic.encode("utf-8"))
msg.retain = True
msg.payload, msg.qos = self._last_payload[topic]
self._mqtt_on_message(self._mqttc, None, msg)
@@ -774,7 +778,7 @@ class MQTT:
timestamp = dt_util.utcnow()
# Cache last payload
if len(msg.payload):
self._last_payload["topic"] = (msg.payload, msg.qos)
self._last_payload[msg.topic] = (msg.payload, msg.qos)
elif msg.topic in self._last_payload:
del self._last_payload[msg.topic]

View File

@@ -1264,6 +1264,7 @@ async def test_subscribe_same_topic(
mqtt_client_mock.subscribe.assert_called()
@patch("homeassistant.components.mqtt.client.SUBSCRIBE_COOLDOWN", 0.0)
async def test_replaying_payload_same_topic(
hass: HomeAssistant,
mqtt_client_mock: MqttMockPahoClient,
@@ -1296,21 +1297,21 @@ async def test_replaying_payload_same_topic(
) # Simulate a (retained) message played back
await hass.async_block_till_done()
assert len(calls_a) == 1
mqtt_client_mock.subscribe.assert_called()
calls_a = []
mqtt_client_mock.reset_mock()
await mqtt.async_subscribe(hass, "test/state", _callback_b)
async_fire_mqtt_message(
hass, "test/state", "online", qos=0, retain=True
) # Simulate a (retained) message played back on new subscriptions
await hass.async_block_till_done()
await hass.async_block_till_done()
await hass.async_block_till_done()
# The retained message playback should only be processed by the new subscription
# The existing subscription already got the latest update,
# hence the existing subscription should not receive the replayed payload.
assert len(calls_a) == 0
assert len(calls_b) == 1
mqtt_client_mock.subscribe.assert_called()
mqtt_client_mock.subscribe.assert_called_once()
calls_a = []
calls_b = []
@@ -1333,6 +1334,7 @@ async def test_replaying_payload_same_topic(
with patch("homeassistant.components.mqtt.client.DISCOVERY_COOLDOWN", 0):
mqtt_client_mock.on_connect(None, None, None, 0)
await hass.async_block_till_done()
await hass.async_block_till_done()
mqtt_client_mock.subscribe.assert_called()
async_fire_mqtt_message(
hass, "test/state", "online", qos=0, retain=True