mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 21:06:19 +00:00
Add integration type (#68349)
This commit is contained in:
@@ -23,6 +23,13 @@ from tests.common import (
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def clear_handlers():
|
||||
"""Clear config entry handlers."""
|
||||
with patch.dict(HANDLERS, clear=True):
|
||||
yield
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def mock_test_component(hass):
|
||||
"""Ensure a component called 'test' exists."""
|
||||
@@ -30,104 +37,133 @@ def mock_test_component(hass):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def client(hass, hass_client):
|
||||
async def client(hass, hass_client):
|
||||
"""Fixture that can interact with the config manager API."""
|
||||
hass.loop.run_until_complete(async_setup_component(hass, "http", {}))
|
||||
hass.loop.run_until_complete(config_entries.async_setup(hass))
|
||||
yield hass.loop.run_until_complete(hass_client())
|
||||
await async_setup_component(hass, "http", {})
|
||||
await config_entries.async_setup(hass)
|
||||
return await hass_client()
|
||||
|
||||
|
||||
async def test_get_entries(hass, client):
|
||||
async def test_get_entries(hass, client, clear_handlers):
|
||||
"""Test get entries."""
|
||||
with patch.dict(HANDLERS, clear=True):
|
||||
mock_integration(hass, MockModule("comp1"))
|
||||
mock_integration(
|
||||
hass, MockModule("comp2", partial_manifest={"integration_type": "helper"})
|
||||
)
|
||||
mock_integration(hass, MockModule("comp3"))
|
||||
|
||||
@HANDLERS.register("comp1")
|
||||
class Comp1ConfigFlow:
|
||||
"""Config flow with options flow."""
|
||||
@HANDLERS.register("comp1")
|
||||
class Comp1ConfigFlow:
|
||||
"""Config flow with options flow."""
|
||||
|
||||
@staticmethod
|
||||
@callback
|
||||
def async_get_options_flow(config_entry):
|
||||
"""Get options flow."""
|
||||
pass
|
||||
@staticmethod
|
||||
@callback
|
||||
def async_get_options_flow(config_entry):
|
||||
"""Get options flow."""
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
@callback
|
||||
def async_supports_options_flow(cls, config_entry):
|
||||
"""Return options flow support for this handler."""
|
||||
return True
|
||||
@classmethod
|
||||
@callback
|
||||
def async_supports_options_flow(cls, config_entry):
|
||||
"""Return options flow support for this handler."""
|
||||
return True
|
||||
|
||||
hass.helpers.config_entry_flow.register_discovery_flow(
|
||||
"comp2", "Comp 2", lambda: None
|
||||
)
|
||||
hass.helpers.config_entry_flow.register_discovery_flow(
|
||||
"comp2", "Comp 2", lambda: None
|
||||
)
|
||||
|
||||
entry = MockConfigEntry(
|
||||
domain="comp1",
|
||||
title="Test 1",
|
||||
source="bla",
|
||||
)
|
||||
entry.supports_unload = True
|
||||
entry.add_to_hass(hass)
|
||||
MockConfigEntry(
|
||||
domain="comp2",
|
||||
title="Test 2",
|
||||
source="bla2",
|
||||
state=core_ce.ConfigEntryState.SETUP_ERROR,
|
||||
reason="Unsupported API",
|
||||
).add_to_hass(hass)
|
||||
MockConfigEntry(
|
||||
domain="comp3",
|
||||
title="Test 3",
|
||||
source="bla3",
|
||||
disabled_by=core_ce.ConfigEntryDisabler.USER,
|
||||
).add_to_hass(hass)
|
||||
entry = MockConfigEntry(
|
||||
domain="comp1",
|
||||
title="Test 1",
|
||||
source="bla",
|
||||
)
|
||||
entry.supports_unload = True
|
||||
entry.add_to_hass(hass)
|
||||
MockConfigEntry(
|
||||
domain="comp2",
|
||||
title="Test 2",
|
||||
source="bla2",
|
||||
state=core_ce.ConfigEntryState.SETUP_ERROR,
|
||||
reason="Unsupported API",
|
||||
).add_to_hass(hass)
|
||||
MockConfigEntry(
|
||||
domain="comp3",
|
||||
title="Test 3",
|
||||
source="bla3",
|
||||
disabled_by=core_ce.ConfigEntryDisabler.USER,
|
||||
).add_to_hass(hass)
|
||||
|
||||
resp = await client.get("/api/config/config_entries/entry")
|
||||
assert resp.status == HTTPStatus.OK
|
||||
data = await resp.json()
|
||||
for entry in data:
|
||||
entry.pop("entry_id")
|
||||
assert data == [
|
||||
{
|
||||
"domain": "comp1",
|
||||
"title": "Test 1",
|
||||
"source": "bla",
|
||||
"state": core_ce.ConfigEntryState.NOT_LOADED.value,
|
||||
"supports_options": True,
|
||||
"supports_remove_device": False,
|
||||
"supports_unload": True,
|
||||
"pref_disable_new_entities": False,
|
||||
"pref_disable_polling": False,
|
||||
"disabled_by": None,
|
||||
"reason": None,
|
||||
},
|
||||
{
|
||||
"domain": "comp2",
|
||||
"title": "Test 2",
|
||||
"source": "bla2",
|
||||
"state": core_ce.ConfigEntryState.SETUP_ERROR.value,
|
||||
"supports_options": False,
|
||||
"supports_remove_device": False,
|
||||
"supports_unload": False,
|
||||
"pref_disable_new_entities": False,
|
||||
"pref_disable_polling": False,
|
||||
"disabled_by": None,
|
||||
"reason": "Unsupported API",
|
||||
},
|
||||
{
|
||||
"domain": "comp3",
|
||||
"title": "Test 3",
|
||||
"source": "bla3",
|
||||
"state": core_ce.ConfigEntryState.NOT_LOADED.value,
|
||||
"supports_options": False,
|
||||
"supports_remove_device": False,
|
||||
"supports_unload": False,
|
||||
"pref_disable_new_entities": False,
|
||||
"pref_disable_polling": False,
|
||||
"disabled_by": core_ce.ConfigEntryDisabler.USER,
|
||||
"reason": None,
|
||||
},
|
||||
]
|
||||
resp = await client.get("/api/config/config_entries/entry")
|
||||
assert resp.status == HTTPStatus.OK
|
||||
data = await resp.json()
|
||||
for entry in data:
|
||||
entry.pop("entry_id")
|
||||
assert data == [
|
||||
{
|
||||
"domain": "comp1",
|
||||
"title": "Test 1",
|
||||
"source": "bla",
|
||||
"state": core_ce.ConfigEntryState.NOT_LOADED.value,
|
||||
"supports_options": True,
|
||||
"supports_remove_device": False,
|
||||
"supports_unload": True,
|
||||
"pref_disable_new_entities": False,
|
||||
"pref_disable_polling": False,
|
||||
"disabled_by": None,
|
||||
"reason": None,
|
||||
},
|
||||
{
|
||||
"domain": "comp2",
|
||||
"title": "Test 2",
|
||||
"source": "bla2",
|
||||
"state": core_ce.ConfigEntryState.SETUP_ERROR.value,
|
||||
"supports_options": False,
|
||||
"supports_remove_device": False,
|
||||
"supports_unload": False,
|
||||
"pref_disable_new_entities": False,
|
||||
"pref_disable_polling": False,
|
||||
"disabled_by": None,
|
||||
"reason": "Unsupported API",
|
||||
},
|
||||
{
|
||||
"domain": "comp3",
|
||||
"title": "Test 3",
|
||||
"source": "bla3",
|
||||
"state": core_ce.ConfigEntryState.NOT_LOADED.value,
|
||||
"supports_options": False,
|
||||
"supports_remove_device": False,
|
||||
"supports_unload": False,
|
||||
"pref_disable_new_entities": False,
|
||||
"pref_disable_polling": False,
|
||||
"disabled_by": core_ce.ConfigEntryDisabler.USER,
|
||||
"reason": None,
|
||||
},
|
||||
]
|
||||
|
||||
resp = await client.get("/api/config/config_entries/entry?domain=comp3")
|
||||
assert resp.status == HTTPStatus.OK
|
||||
data = await resp.json()
|
||||
assert len(data) == 1
|
||||
assert data[0]["domain"] == "comp3"
|
||||
|
||||
resp = await client.get("/api/config/config_entries/entry?domain=comp3&type=helper")
|
||||
assert resp.status == HTTPStatus.OK
|
||||
data = await resp.json()
|
||||
assert len(data) == 0
|
||||
|
||||
resp = await client.get(
|
||||
"/api/config/config_entries/entry?domain=comp3&type=integration"
|
||||
)
|
||||
assert resp.status == HTTPStatus.OK
|
||||
data = await resp.json()
|
||||
assert len(data) == 1
|
||||
|
||||
resp = await client.get("/api/config/config_entries/entry?type=integration")
|
||||
assert resp.status == HTTPStatus.OK
|
||||
data = await resp.json()
|
||||
assert len(data) == 2
|
||||
assert data[0]["domain"] == "comp1"
|
||||
assert data[1]["domain"] == "comp3"
|
||||
|
||||
|
||||
async def test_remove_entry(hass, client):
|
||||
@@ -224,13 +260,28 @@ async def test_reload_entry_in_setup_retry(hass, client, hass_admin_user):
|
||||
assert len(hass.config_entries.async_entries()) == 1
|
||||
|
||||
|
||||
async def test_available_flows(hass, client):
|
||||
@pytest.mark.parametrize(
|
||||
"type_filter,result",
|
||||
(
|
||||
(None, {"hello", "another", "world"}),
|
||||
("integration", {"hello", "another"}),
|
||||
("helper", {"world"}),
|
||||
),
|
||||
)
|
||||
async def test_available_flows(hass, client, type_filter, result):
|
||||
"""Test querying the available flows."""
|
||||
with patch.object(config_flows, "FLOWS", ["hello", "world"]):
|
||||
resp = await client.get("/api/config/config_entries/flow_handlers")
|
||||
with patch.object(
|
||||
config_flows,
|
||||
"FLOWS",
|
||||
{"integration": ["hello", "another"], "helper": ["world"]},
|
||||
):
|
||||
resp = await client.get(
|
||||
"/api/config/config_entries/flow_handlers",
|
||||
params={"type": type_filter} if type_filter else {},
|
||||
)
|
||||
assert resp.status == HTTPStatus.OK
|
||||
data = await resp.json()
|
||||
assert set(data) == {"hello", "world"}
|
||||
assert set(data) == result
|
||||
|
||||
|
||||
############################
|
||||
|
||||
Reference in New Issue
Block a user