Improve config flow test coverage for Russound RIO (#132981)

This commit is contained in:
Noah Husby 2024-12-12 01:56:29 -05:00 committed by GitHub
parent e39897ff9a
commit 2d0c4e4a59
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 68 additions and 14 deletions

View File

@ -10,10 +10,7 @@ rules:
This integration uses a push API. No polling required. This integration uses a push API. No polling required.
brands: done brands: done
common-modules: done common-modules: done
config-flow-test-coverage: config-flow-test-coverage: done
status: todo
comment: |
Missing unique_id check in test_form() and test_import(). Test for adding same device twice missing.
config-flow: done config-flow: done
dependency-transparency: done dependency-transparency: done
docs-actions: docs-actions:

View File

@ -1,5 +1,9 @@
"""Tests for the Russound RIO integration.""" """Tests for the Russound RIO integration."""
from unittest.mock import AsyncMock
from aiorussound.models import CallbackType
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -11,3 +15,11 @@ async def setup_integration(hass: HomeAssistant, config_entry: MockConfigEntry)
await hass.config_entries.async_setup(config_entry.entry_id) await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
async def mock_state_update(
client: AsyncMock, callback_type: CallbackType = CallbackType.STATE
) -> None:
"""Trigger a callback in the media player."""
for callback in client.register_state_update_callbacks.call_args_list:
await callback[0][0](client, callback_type)

View File

@ -9,6 +9,8 @@ from homeassistant.data_entry_flow import FlowResultType
from .const import MOCK_CONFIG, MODEL from .const import MOCK_CONFIG, MODEL
from tests.common import MockConfigEntry
async def test_form( async def test_form(
hass: HomeAssistant, mock_setup_entry: AsyncMock, mock_russound_client: AsyncMock hass: HomeAssistant, mock_setup_entry: AsyncMock, mock_russound_client: AsyncMock
@ -29,6 +31,7 @@ async def test_form(
assert result["title"] == MODEL assert result["title"] == MODEL
assert result["data"] == MOCK_CONFIG assert result["data"] == MOCK_CONFIG
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
assert result["result"].unique_id == "00:11:22:33:44:55"
async def test_form_cannot_connect( async def test_form_cannot_connect(
@ -60,6 +63,31 @@ async def test_form_cannot_connect(
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
async def test_duplicate(
hass: HomeAssistant,
mock_russound_client: AsyncMock,
mock_setup_entry: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test duplicate flow."""
mock_config_entry.add_to_hass(hass)
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_USER},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "user"
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
MOCK_CONFIG,
)
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "already_configured"
async def test_import( async def test_import(
hass: HomeAssistant, mock_setup_entry: AsyncMock, mock_russound_client: AsyncMock hass: HomeAssistant, mock_setup_entry: AsyncMock, mock_russound_client: AsyncMock
) -> None: ) -> None:
@ -74,6 +102,7 @@ async def test_import(
assert result["title"] == MODEL assert result["title"] == MODEL
assert result["data"] == MOCK_CONFIG assert result["data"] == MOCK_CONFIG
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
assert result["result"].unique_id == "00:11:22:33:44:55"
async def test_import_cannot_connect( async def test_import_cannot_connect(

View File

@ -1,7 +1,9 @@
"""Tests for the Russound RIO integration.""" """Tests for the Russound RIO integration."""
from unittest.mock import AsyncMock from unittest.mock import AsyncMock, Mock
from aiorussound.models import CallbackType
import pytest
from syrupy import SnapshotAssertion from syrupy import SnapshotAssertion
from homeassistant.components.russound_rio.const import DOMAIN from homeassistant.components.russound_rio.const import DOMAIN
@ -9,7 +11,7 @@ from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from . import setup_integration from . import mock_state_update, setup_integration
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -42,3 +44,23 @@ async def test_device_info(
) )
assert device_entry is not None assert device_entry is not None
assert device_entry == snapshot assert device_entry == snapshot
async def test_disconnect_reconnect_log(
hass: HomeAssistant,
snapshot: SnapshotAssertion,
mock_russound_client: AsyncMock,
mock_config_entry: MockConfigEntry,
device_registry: dr.DeviceRegistry,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test device registry integration."""
await setup_integration(hass, mock_config_entry)
mock_russound_client.is_connected = Mock(return_value=False)
await mock_state_update(mock_russound_client, CallbackType.CONNECTION)
assert "Disconnected from device at 127.0.0.1" in caplog.text
mock_russound_client.is_connected = Mock(return_value=True)
await mock_state_update(mock_russound_client, CallbackType.CONNECTION)
assert "Reconnected to device at 127.0.0.1" in caplog.text

View File

@ -2,7 +2,7 @@
from unittest.mock import AsyncMock from unittest.mock import AsyncMock
from aiorussound.models import CallbackType, PlayStatus from aiorussound.models import PlayStatus
import pytest import pytest
from homeassistant.const import ( from homeassistant.const import (
@ -15,18 +15,12 @@ from homeassistant.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from . import setup_integration from . import mock_state_update, setup_integration
from .const import ENTITY_ID_ZONE_1 from .const import ENTITY_ID_ZONE_1
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
async def mock_state_update(client: AsyncMock) -> None:
"""Trigger a callback in the media player."""
for callback in client.register_state_update_callbacks.call_args_list:
await callback[0][0](client, CallbackType.STATE)
@pytest.mark.parametrize( @pytest.mark.parametrize(
("zone_status", "source_play_status", "media_player_state"), ("zone_status", "source_play_status", "media_player_state"),
[ [