mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 22:27:07 +00:00
Abort Fritz config flow for configured hostnames (#58140)
* Abort Fritz config flow for configured hostnames * Fix tests + consider all combinations * Fix async context
This commit is contained in:
parent
6bc5961f8a
commit
9d231ac2f8
@ -2,6 +2,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import socket
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from urllib.parse import ParseResult, urlparse
|
from urllib.parse import ParseResult, urlparse
|
||||||
|
|
||||||
@ -85,8 +86,16 @@ class FritzBoxToolsFlowHandler(ConfigFlow, domain=DOMAIN):
|
|||||||
|
|
||||||
async def async_check_configured_entry(self) -> ConfigEntry | None:
|
async def async_check_configured_entry(self) -> ConfigEntry | None:
|
||||||
"""Check if entry is configured."""
|
"""Check if entry is configured."""
|
||||||
|
|
||||||
|
current_host = await self.hass.async_add_executor_job(
|
||||||
|
socket.gethostbyname, self._host
|
||||||
|
)
|
||||||
|
|
||||||
for entry in self._async_current_entries(include_ignore=False):
|
for entry in self._async_current_entries(include_ignore=False):
|
||||||
if entry.data[CONF_HOST] == self._host:
|
entry_host = await self.hass.async_add_executor_job(
|
||||||
|
socket.gethostbyname, entry.data[CONF_HOST]
|
||||||
|
)
|
||||||
|
if entry_host == current_host:
|
||||||
return entry
|
return entry
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ ATTR_HOST = "host"
|
|||||||
ATTR_NEW_SERIAL_NUMBER = "NewSerialNumber"
|
ATTR_NEW_SERIAL_NUMBER = "NewSerialNumber"
|
||||||
|
|
||||||
MOCK_HOST = "fake_host"
|
MOCK_HOST = "fake_host"
|
||||||
|
MOCK_IP = "192.168.178.1"
|
||||||
MOCK_SERIAL_NUMBER = "fake_serial_number"
|
MOCK_SERIAL_NUMBER = "fake_serial_number"
|
||||||
MOCK_FIRMWARE_INFO = [True, "1.1.1"]
|
MOCK_FIRMWARE_INFO = [True, "1.1.1"]
|
||||||
|
|
||||||
@ -51,7 +52,7 @@ MOCK_DEVICE_INFO = {
|
|||||||
}
|
}
|
||||||
MOCK_IMPORT_CONFIG = {CONF_HOST: MOCK_HOST, CONF_USERNAME: "username"}
|
MOCK_IMPORT_CONFIG = {CONF_HOST: MOCK_HOST, CONF_USERNAME: "username"}
|
||||||
MOCK_SSDP_DATA = {
|
MOCK_SSDP_DATA = {
|
||||||
ATTR_SSDP_LOCATION: "https://fake_host:12345/test",
|
ATTR_SSDP_LOCATION: f"https://{MOCK_IP}:12345/test",
|
||||||
ATTR_UPNP_FRIENDLY_NAME: "fake_name",
|
ATTR_UPNP_FRIENDLY_NAME: "fake_name",
|
||||||
ATTR_UPNP_UDN: "uuid:only-a-test",
|
ATTR_UPNP_UDN: "uuid:only-a-test",
|
||||||
}
|
}
|
||||||
@ -81,7 +82,10 @@ async def test_user(hass: HomeAssistant, fc_class_mock, mock_get_source_ip):
|
|||||||
"requests.get"
|
"requests.get"
|
||||||
) as mock_request_get, patch(
|
) as mock_request_get, patch(
|
||||||
"requests.post"
|
"requests.post"
|
||||||
) as mock_request_post:
|
) as mock_request_post, patch(
|
||||||
|
"homeassistant.components.fritz.config_flow.socket.gethostbyname",
|
||||||
|
return_value=MOCK_IP,
|
||||||
|
):
|
||||||
|
|
||||||
mock_request_get.return_value.status_code = 200
|
mock_request_get.return_value.status_code = 200
|
||||||
mock_request_get.return_value.content = MOCK_REQUEST
|
mock_request_get.return_value.content = MOCK_REQUEST
|
||||||
@ -129,7 +133,10 @@ async def test_user_already_configured(
|
|||||||
"requests.get"
|
"requests.get"
|
||||||
) as mock_request_get, patch(
|
) as mock_request_get, patch(
|
||||||
"requests.post"
|
"requests.post"
|
||||||
) as mock_request_post:
|
) as mock_request_post, patch(
|
||||||
|
"homeassistant.components.fritz.config_flow.socket.gethostbyname",
|
||||||
|
return_value=MOCK_IP,
|
||||||
|
):
|
||||||
|
|
||||||
mock_request_get.return_value.status_code = 200
|
mock_request_get.return_value.status_code = 200
|
||||||
mock_request_get.return_value.content = MOCK_REQUEST
|
mock_request_get.return_value.content = MOCK_REQUEST
|
||||||
@ -319,7 +326,10 @@ async def test_ssdp_already_configured(
|
|||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.fritz.common.FritzConnection",
|
"homeassistant.components.fritz.common.FritzConnection",
|
||||||
side_effect=fc_class_mock,
|
side_effect=fc_class_mock,
|
||||||
), patch("homeassistant.components.fritz.common.FritzStatus"):
|
), patch("homeassistant.components.fritz.common.FritzStatus"), patch(
|
||||||
|
"homeassistant.components.fritz.config_flow.socket.gethostbyname",
|
||||||
|
return_value=MOCK_IP,
|
||||||
|
):
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_SSDP_DATA
|
DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_SSDP_DATA
|
||||||
@ -343,7 +353,10 @@ async def test_ssdp_already_configured_host(
|
|||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.fritz.common.FritzConnection",
|
"homeassistant.components.fritz.common.FritzConnection",
|
||||||
side_effect=fc_class_mock,
|
side_effect=fc_class_mock,
|
||||||
), patch("homeassistant.components.fritz.common.FritzStatus"):
|
), patch("homeassistant.components.fritz.common.FritzStatus"), patch(
|
||||||
|
"homeassistant.components.fritz.config_flow.socket.gethostbyname",
|
||||||
|
return_value=MOCK_IP,
|
||||||
|
):
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_SSDP_DATA
|
DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_SSDP_DATA
|
||||||
@ -367,7 +380,10 @@ async def test_ssdp_already_configured_host_uuid(
|
|||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.fritz.common.FritzConnection",
|
"homeassistant.components.fritz.common.FritzConnection",
|
||||||
side_effect=fc_class_mock,
|
side_effect=fc_class_mock,
|
||||||
), patch("homeassistant.components.fritz.common.FritzStatus"):
|
), patch("homeassistant.components.fritz.common.FritzStatus"), patch(
|
||||||
|
"homeassistant.components.fritz.config_flow.socket.gethostbyname",
|
||||||
|
return_value=MOCK_IP,
|
||||||
|
):
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_SSDP_DATA
|
DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_SSDP_DATA
|
||||||
@ -436,7 +452,7 @@ async def test_ssdp(hass: HomeAssistant, fc_class_mock, mock_get_source_ip):
|
|||||||
)
|
)
|
||||||
|
|
||||||
assert result["type"] == RESULT_TYPE_CREATE_ENTRY
|
assert result["type"] == RESULT_TYPE_CREATE_ENTRY
|
||||||
assert result["data"][CONF_HOST] == "fake_host"
|
assert result["data"][CONF_HOST] == MOCK_IP
|
||||||
assert result["data"][CONF_PASSWORD] == "fake_pass"
|
assert result["data"][CONF_PASSWORD] == "fake_pass"
|
||||||
assert result["data"][CONF_USERNAME] == "fake_user"
|
assert result["data"][CONF_USERNAME] == "fake_user"
|
||||||
|
|
||||||
@ -482,7 +498,10 @@ async def test_import(hass: HomeAssistant, fc_class_mock, mock_get_source_ip):
|
|||||||
"requests.get"
|
"requests.get"
|
||||||
) as mock_request_get, patch(
|
) as mock_request_get, patch(
|
||||||
"requests.post"
|
"requests.post"
|
||||||
) as mock_request_post:
|
) as mock_request_post, patch(
|
||||||
|
"homeassistant.components.fritz.config_flow.socket.gethostbyname",
|
||||||
|
return_value=MOCK_IP,
|
||||||
|
):
|
||||||
|
|
||||||
mock_request_get.return_value.status_code = 200
|
mock_request_get.return_value.status_code = 200
|
||||||
mock_request_get.return_value.content = MOCK_REQUEST
|
mock_request_get.return_value.content = MOCK_REQUEST
|
||||||
|
Loading…
x
Reference in New Issue
Block a user