Allow hiding and unhiding group members (#68192)

This commit is contained in:
Erik Montnemery 2022-03-22 12:14:34 +01:00 committed by GitHub
parent b5d2c6e43a
commit 1b955970f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 359 additions and 14 deletions

View file

@ -7,6 +7,7 @@ from homeassistant import config_entries
from homeassistant.components.group import DOMAIN, async_setup_entry
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import RESULT_TYPE_CREATE_ENTRY, RESULT_TYPE_FORM
from homeassistant.helpers import entity_registry as er
from tests.common import MockConfigEntry
@ -68,8 +69,9 @@ async def test_config_flow(
assert result["title"] == "Living Room"
assert result["data"] == {}
assert result["options"] == {
"group_type": group_type,
"entities": members,
"group_type": group_type,
"hide_members": False,
"name": "Living Room",
**extra_options,
}
@ -78,9 +80,10 @@ async def test_config_flow(
config_entry = hass.config_entries.async_entries(DOMAIN)[0]
assert config_entry.data == {}
assert config_entry.options == {
"group_type": group_type,
"name": "Living Room",
"entities": members,
"group_type": group_type,
"hide_members": False,
"name": "Living Room",
**extra_options,
}
@ -91,6 +94,69 @@ async def test_config_flow(
assert state.attributes[key] == extra_attrs[key]
@pytest.mark.parametrize(
"hide_members,hidden_by", ((False, None), (True, "integration"))
)
@pytest.mark.parametrize(
"group_type,extra_input",
(
("binary_sensor", {"all": False}),
("cover", {}),
("fan", {}),
("light", {}),
("media_player", {}),
),
)
async def test_config_flow_hides_members(
hass: HomeAssistant, group_type, extra_input, hide_members, hidden_by
) -> None:
"""Test the config flow hides members if requested."""
fake_uuid = "a266a680b608c32770e6c45bfe6b8411"
registry = er.async_get(hass)
entry = registry.async_get_or_create(
group_type, "test", "unique", suggested_object_id="one"
)
assert entry.entity_id == f"{group_type}.one"
assert entry.hidden_by is None
entry = registry.async_get_or_create(
group_type, "test", "unique3", suggested_object_id="three"
)
assert entry.entity_id == f"{group_type}.three"
assert entry.hidden_by is None
members = [f"{group_type}.one", f"{group_type}.two", fake_uuid, entry.id]
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
assert result["type"] == RESULT_TYPE_FORM
assert result["errors"] is None
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{"group_type": group_type},
)
await hass.async_block_till_done()
assert result["type"] == RESULT_TYPE_FORM
assert result["step_id"] == group_type
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"name": "Living Room",
"entities": members,
"hide_members": hide_members,
**extra_input,
},
)
await hass.async_block_till_done()
assert result["type"] == RESULT_TYPE_CREATE_ENTRY
assert registry.async_get(f"{group_type}.one").hidden_by == hidden_by
assert registry.async_get(f"{group_type}.three").hidden_by == hidden_by
def get_suggested(schema, key):
"""Get suggested value for key in voluptuous schema."""
for k in schema.keys():
@ -124,7 +190,7 @@ async def test_options(
for member in members2:
hass.states.async_set(member, member_state, {})
switch_as_x_config_entry = MockConfigEntry(
group_config_entry = MockConfigEntry(
data={},
domain=DOMAIN,
options={
@ -135,9 +201,9 @@ async def test_options(
},
title="Bed Room",
)
switch_as_x_config_entry.add_to_hass(hass)
group_config_entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(switch_as_x_config_entry.entry_id)
assert await hass.config_entries.async_setup(group_config_entry.entry_id)
await hass.async_block_till_done()
state = hass.states.get(f"{group_type}.bed_room")
@ -159,15 +225,17 @@ async def test_options(
)
assert result["type"] == RESULT_TYPE_CREATE_ENTRY
assert result["data"] == {
"group_type": group_type,
"entities": members2,
"group_type": group_type,
"hide_members": False,
"name": "Bed Room",
**extra_options,
}
assert config_entry.data == {}
assert config_entry.options == {
"group_type": group_type,
"entities": members2,
"group_type": group_type,
"hide_members": False,
"name": "Bed Room",
**extra_options,
}
@ -196,3 +264,83 @@ async def test_options(
assert get_suggested(result["data_schema"].schema, "entities") is None
assert get_suggested(result["data_schema"].schema, "name") is None
@pytest.mark.parametrize(
"hide_members,hidden_by_initial,hidden_by",
((False, "integration", None), (True, None, "integration")),
)
@pytest.mark.parametrize(
"group_type,extra_input",
(
("binary_sensor", {"all": False}),
("cover", {}),
("fan", {}),
("light", {}),
("media_player", {}),
),
)
async def test_options_flow_hides_members(
hass: HomeAssistant,
group_type,
extra_input,
hide_members,
hidden_by_initial,
hidden_by,
) -> None:
"""Test the options flow hides or unhides members if requested."""
fake_uuid = "a266a680b608c32770e6c45bfe6b8411"
registry = er.async_get(hass)
entry = registry.async_get_or_create(
group_type,
"test",
"unique1",
suggested_object_id="one",
hidden_by=hidden_by_initial,
)
assert entry.entity_id == f"{group_type}.one"
entry = registry.async_get_or_create(
group_type,
"test",
"unique3",
suggested_object_id="three",
hidden_by=hidden_by_initial,
)
assert entry.entity_id == f"{group_type}.three"
members = [f"{group_type}.one", f"{group_type}.two", fake_uuid, entry.id]
group_config_entry = MockConfigEntry(
data={},
domain=DOMAIN,
options={
"entities": members,
"group_type": group_type,
"hide_members": False,
"name": "Bed Room",
**extra_input,
},
title="Bed Room",
)
group_config_entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(group_config_entry.entry_id)
await hass.async_block_till_done()
result = await hass.config_entries.options.async_init(group_config_entry.entry_id)
assert result["type"] == RESULT_TYPE_FORM
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input={
"entities": members,
"hide_members": hide_members,
},
)
await hass.async_block_till_done()
assert result["type"] == RESULT_TYPE_CREATE_ENTRY
assert registry.async_get(f"{group_type}.one").hidden_by == hidden_by
assert registry.async_get(f"{group_type}.three").hidden_by == hidden_by