Iterate over a copy of the list of programs at Home Connect select setup entry (#134684)

pull/134890/head
J. Diego Rodríguez Royo 2025-01-06 15:21:02 +01:00 committed by GitHub
parent fb0047ead0
commit 67e2379d2b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 41 additions and 2 deletions

View File

@ -220,7 +220,7 @@ async def async_setup_entry(
with contextlib.suppress(HomeConnectError): with contextlib.suppress(HomeConnectError):
programs = device.appliance.get_programs_available() programs = device.appliance.get_programs_available()
if programs: if programs:
for program in programs: for program in programs.copy():
if program not in PROGRAMS_TRANSLATION_KEYS_MAP: if program not in PROGRAMS_TRANSLATION_KEYS_MAP:
programs.remove(program) programs.remove(program)
if program not in programs_not_found: if program not in programs_not_found:

View File

@ -10,11 +10,16 @@ from homeassistant.components.home_connect.const import (
BSH_ACTIVE_PROGRAM, BSH_ACTIVE_PROGRAM,
BSH_SELECTED_PROGRAM, BSH_SELECTED_PROGRAM,
) )
from homeassistant.components.select import ATTR_OPTION, DOMAIN as SELECT_DOMAIN from homeassistant.components.select import (
ATTR_OPTION,
ATTR_OPTIONS,
DOMAIN as SELECT_DOMAIN,
)
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_ENTITY_ID, SERVICE_SELECT_OPTION, Platform from homeassistant.const import ATTR_ENTITY_ID, SERVICE_SELECT_OPTION, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_registry as er
from .conftest import get_all_appliances from .conftest import get_all_appliances
@ -52,6 +57,40 @@ async def test_select(
assert config_entry.state is ConfigEntryState.LOADED assert config_entry.state is ConfigEntryState.LOADED
async def test_filter_unknown_programs(
bypass_throttle: Generator[None],
hass: HomeAssistant,
config_entry: MockConfigEntry,
integration_setup: Callable[[], Awaitable[bool]],
setup_credentials: None,
get_appliances: Mock,
appliance: Mock,
entity_registry: er.EntityRegistry,
) -> None:
"""Test select that programs that are not part of the official Home Connect API specification are filtered out.
We use two programs to ensure that programs are iterated over a copy of the list,
and it does not raise problems when removing an element from the original list.
"""
appliance.status.update(SETTINGS_STATUS)
appliance.get_programs_available.return_value = [
PROGRAM,
"NonOfficialProgram",
"AntotherNonOfficialProgram",
]
get_appliances.return_value = [appliance]
assert config_entry.state is ConfigEntryState.NOT_LOADED
assert await integration_setup()
assert config_entry.state is ConfigEntryState.LOADED
entity = entity_registry.async_get("select.washer_selected_program")
assert entity
assert entity.capabilities.get(ATTR_OPTIONS) == [
"dishcare_dishwasher_program_eco_50"
]
@pytest.mark.parametrize( @pytest.mark.parametrize(
("entity_id", "status", "program_to_set"), ("entity_id", "status", "program_to_set"),
[ [