1
0
mirror of https://github.com/home-assistant/core.git synced 2026-07-03 12:46:09 +01:00
Files
2026-06-15 15:43:53 +02:00

150 lines
4.5 KiB
Python

"""Greencell integration initialization test cases."""
from collections.abc import Callable
import time
from unittest.mock import patch
import pytest
from homeassistant.components.greencell.const import GREENCELL_DISC_TOPIC
from homeassistant.components.mqtt import ReceiveMessage
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant
from .conftest import TEST_SERIAL_NUMBER, TEST_VOLTAGE_TOPIC
from tests.common import MockConfigEntry
from tests.typing import MqttMockHAClient
def _make_message(topic: str, payload: str) -> ReceiveMessage:
"""Build a ReceiveMessage for the mocked subscription callback."""
return ReceiveMessage(
topic=topic,
payload=payload,
qos=0,
retain=False,
subscribed_topic=topic,
timestamp=time.time(),
)
async def _mock_subscribe_fires(messages: list[tuple[str, str]]):
"""Return a mock async_subscribe that fires given messages on subscription."""
async def _subscribe(
hass: HomeAssistant, topic: str, msg_callback, *args, **kwargs
) -> Callable[[], None]:
for msg_topic, payload in messages:
if msg_topic == topic:
msg_callback(_make_message(topic, payload))
return lambda: None
return _subscribe
@pytest.mark.parametrize(
"messages",
[
pytest.param(
[(GREENCELL_DISC_TOPIC, f'{{"id": "{TEST_SERIAL_NUMBER}"}}')],
id="discovery_match",
),
pytest.param(
[(TEST_VOLTAGE_TOPIC, '{"l1": 230, "l2": 230, "l3": 230}')],
id="voltage_no_id",
),
pytest.param(
[(TEST_VOLTAGE_TOPIC, f'{{"id": "{TEST_SERIAL_NUMBER}", "l1": 230}}')],
id="voltage_matching_id",
),
],
)
async def test_async_setup_entry_ready(
hass: HomeAssistant,
mqtt_mock: MqttMockHAClient,
mock_config_entry: MockConfigEntry,
messages: list[tuple[str, str]],
) -> None:
"""Setup completes once matching device data arrives on a subscribed topic."""
mock_config_entry.add_to_hass(hass)
subscribe = await _mock_subscribe_fires(messages)
with patch(
"homeassistant.components.greencell.mqtt.async_subscribe",
side_effect=subscribe,
):
result = await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert result is True
assert mock_config_entry.state is ConfigEntryState.LOADED
@pytest.mark.parametrize(
"messages",
[
pytest.param(
[(GREENCELL_DISC_TOPIC, '{"id": "OTHER_SERIAL"}')],
id="discovery_wrong_serial",
),
pytest.param(
[(TEST_VOLTAGE_TOPIC, '{"id": "OTHER_SERIAL", "l1": 230}')],
id="voltage_wrong_id",
),
pytest.param(
[(TEST_VOLTAGE_TOPIC, "{INVALID JSON}")],
id="invalid_payload",
),
pytest.param([], id="no_response"),
],
)
async def test_async_setup_entry_not_ready(
hass: HomeAssistant,
mqtt_mock: MqttMockHAClient,
mock_config_entry: MockConfigEntry,
messages: list[tuple[str, str]],
) -> None:
"""Setup retries when no matching device data arrives before the timeout."""
mock_config_entry.add_to_hass(hass)
subscribe = await _mock_subscribe_fires(messages)
with (
patch("homeassistant.components.greencell.DISCOVERY_TIMEOUT", 0),
patch(
"homeassistant.components.greencell.mqtt.async_subscribe",
side_effect=subscribe,
),
):
result = await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert result is False
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY
async def test_async_unload_entry_success(
hass: HomeAssistant,
mqtt_mock: MqttMockHAClient,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test unload entry cleans up platforms."""
mock_config_entry.add_to_hass(hass)
subscribe = await _mock_subscribe_fires(
[(GREENCELL_DISC_TOPIC, f'{{"id": "{TEST_SERIAL_NUMBER}"}}')]
)
with patch(
"homeassistant.components.greencell.mqtt.async_subscribe",
side_effect=subscribe,
):
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
result = await hass.config_entries.async_unload(mock_config_entry.entry_id)
assert result is True
assert mock_config_entry.state is ConfigEntryState.NOT_LOADED