mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Don't test config on yaml import for generic camera (#69714)
This commit is contained in:
parent
06e4c2f351
commit
6fd041b290
@ -324,16 +324,7 @@ class GenericIPCamConfigFlow(ConfigFlow, domain=DOMAIN):
|
|||||||
# abort if we've already got this one.
|
# abort if we've already got this one.
|
||||||
if self.check_for_existing(import_config):
|
if self.check_for_existing(import_config):
|
||||||
return self.async_abort(reason="already_exists")
|
return self.async_abort(reason="already_exists")
|
||||||
errors, still_format = await async_test_still(self.hass, import_config)
|
# Don't bother testing the still or stream details on yaml import.
|
||||||
if errors.get(CONF_STILL_IMAGE_URL) == "template_error":
|
|
||||||
_LOGGER.warning(
|
|
||||||
"Could not render template, but it could be that "
|
|
||||||
"referenced entities are still initialising. "
|
|
||||||
"Continuing assuming that imported YAML template is valid"
|
|
||||||
)
|
|
||||||
errors.pop(CONF_STILL_IMAGE_URL)
|
|
||||||
still_format = import_config.get(CONF_CONTENT_TYPE, "image/jpeg")
|
|
||||||
errors = errors | await async_test_stream(self.hass, import_config)
|
|
||||||
still_url = import_config.get(CONF_STILL_IMAGE_URL)
|
still_url = import_config.get(CONF_STILL_IMAGE_URL)
|
||||||
stream_url = import_config.get(CONF_STREAM_SOURCE)
|
stream_url = import_config.get(CONF_STREAM_SOURCE)
|
||||||
name = import_config.get(
|
name = import_config.get(
|
||||||
@ -341,15 +332,10 @@ class GenericIPCamConfigFlow(ConfigFlow, domain=DOMAIN):
|
|||||||
)
|
)
|
||||||
if CONF_LIMIT_REFETCH_TO_URL_CHANGE not in import_config:
|
if CONF_LIMIT_REFETCH_TO_URL_CHANGE not in import_config:
|
||||||
import_config[CONF_LIMIT_REFETCH_TO_URL_CHANGE] = False
|
import_config[CONF_LIMIT_REFETCH_TO_URL_CHANGE] = False
|
||||||
if not errors:
|
still_format = import_config.get(CONF_CONTENT_TYPE, "image/jpeg")
|
||||||
import_config[CONF_CONTENT_TYPE] = still_format
|
import_config[CONF_CONTENT_TYPE] = still_format
|
||||||
await self.async_set_unique_id(self.flow_id)
|
await self.async_set_unique_id(self.flow_id)
|
||||||
return self.async_create_entry(title=name, data={}, options=import_config)
|
return self.async_create_entry(title=name, data={}, options=import_config)
|
||||||
_LOGGER.error(
|
|
||||||
"Error importing generic IP camera platform config: unexpected error '%s'",
|
|
||||||
list(errors.values()),
|
|
||||||
)
|
|
||||||
return self.async_abort(reason="unknown")
|
|
||||||
|
|
||||||
|
|
||||||
class GenericOptionsFlowHandler(OptionsFlow):
|
class GenericOptionsFlowHandler(OptionsFlow):
|
||||||
|
@ -43,12 +43,12 @@ async def test_fetching_url(hass, hass_client, fakeimgbytes_png, mock_av_open):
|
|||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
|
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
assert respx.calls.call_count == 2
|
assert respx.calls.call_count == 1
|
||||||
body = await resp.read()
|
body = await resp.read()
|
||||||
assert body == fakeimgbytes_png
|
assert body == fakeimgbytes_png
|
||||||
|
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
assert respx.calls.call_count == 3
|
assert respx.calls.call_count == 2
|
||||||
|
|
||||||
|
|
||||||
@respx.mock
|
@respx.mock
|
||||||
@ -143,19 +143,19 @@ async def test_limit_refetch(hass, hass_client, fakeimgbytes_png, fakeimgbytes_j
|
|||||||
):
|
):
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
|
|
||||||
assert respx.calls.call_count == 2
|
assert respx.calls.call_count == 1
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
hass.states.async_set("sensor.temp", "10")
|
hass.states.async_set("sensor.temp", "10")
|
||||||
|
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
assert respx.calls.call_count == 3
|
assert respx.calls.call_count == 2
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
body = await resp.read()
|
body = await resp.read()
|
||||||
assert body == fakeimgbytes_png
|
assert body == fakeimgbytes_png
|
||||||
|
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
assert respx.calls.call_count == 3
|
assert respx.calls.call_count == 2
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
body = await resp.read()
|
body = await resp.read()
|
||||||
assert body == fakeimgbytes_png
|
assert body == fakeimgbytes_png
|
||||||
@ -164,7 +164,7 @@ async def test_limit_refetch(hass, hass_client, fakeimgbytes_png, fakeimgbytes_j
|
|||||||
|
|
||||||
# Url change = fetch new image
|
# Url change = fetch new image
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
assert respx.calls.call_count == 4
|
assert respx.calls.call_count == 3
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
body = await resp.read()
|
body = await resp.read()
|
||||||
assert body == fakeimgbytes_jpg
|
assert body == fakeimgbytes_jpg
|
||||||
@ -172,7 +172,7 @@ async def test_limit_refetch(hass, hass_client, fakeimgbytes_png, fakeimgbytes_j
|
|||||||
# Cause a template render error
|
# Cause a template render error
|
||||||
hass.states.async_remove("sensor.temp")
|
hass.states.async_remove("sensor.temp")
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
assert respx.calls.call_count == 4
|
assert respx.calls.call_count == 3
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
body = await resp.read()
|
body = await resp.read()
|
||||||
assert body == fakeimgbytes_jpg
|
assert body == fakeimgbytes_jpg
|
||||||
@ -392,14 +392,14 @@ async def test_camera_content_type(
|
|||||||
client = await hass_client()
|
client = await hass_client()
|
||||||
|
|
||||||
resp_1 = await client.get("/api/camera_proxy/camera.config_test_svg")
|
resp_1 = await client.get("/api/camera_proxy/camera.config_test_svg")
|
||||||
assert respx.calls.call_count == 3
|
assert respx.calls.call_count == 1
|
||||||
assert resp_1.status == HTTPStatus.OK
|
assert resp_1.status == HTTPStatus.OK
|
||||||
assert resp_1.content_type == "image/svg+xml"
|
assert resp_1.content_type == "image/svg+xml"
|
||||||
body = await resp_1.read()
|
body = await resp_1.read()
|
||||||
assert body == fakeimgbytes_svg
|
assert body == fakeimgbytes_svg
|
||||||
|
|
||||||
resp_2 = await client.get("/api/camera_proxy/camera.config_test_jpg")
|
resp_2 = await client.get("/api/camera_proxy/camera.config_test_jpg")
|
||||||
assert respx.calls.call_count == 4
|
assert respx.calls.call_count == 2
|
||||||
assert resp_2.status == HTTPStatus.OK
|
assert resp_2.status == HTTPStatus.OK
|
||||||
assert resp_2.content_type == "image/jpeg"
|
assert resp_2.content_type == "image/jpeg"
|
||||||
body = await resp_2.read()
|
body = await resp_2.read()
|
||||||
@ -432,7 +432,7 @@ async def test_timeout_cancelled(hass, hass_client, fakeimgbytes_png, fakeimgbyt
|
|||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
|
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
assert respx.calls.call_count == 2
|
assert respx.calls.call_count == 1
|
||||||
assert await resp.read() == fakeimgbytes_png
|
assert await resp.read() == fakeimgbytes_png
|
||||||
|
|
||||||
respx.get("http://example.com").respond(stream=fakeimgbytes_jpg)
|
respx.get("http://example.com").respond(stream=fakeimgbytes_jpg)
|
||||||
@ -442,7 +442,7 @@ async def test_timeout_cancelled(hass, hass_client, fakeimgbytes_png, fakeimgbyt
|
|||||||
side_effect=asyncio.CancelledError(),
|
side_effect=asyncio.CancelledError(),
|
||||||
):
|
):
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
assert respx.calls.call_count == 2
|
assert respx.calls.call_count == 1
|
||||||
assert resp.status == HTTPStatus.INTERNAL_SERVER_ERROR
|
assert resp.status == HTTPStatus.INTERNAL_SERVER_ERROR
|
||||||
|
|
||||||
respx.get("http://example.com").side_effect = [
|
respx.get("http://example.com").side_effect = [
|
||||||
@ -450,7 +450,7 @@ async def test_timeout_cancelled(hass, hass_client, fakeimgbytes_png, fakeimgbyt
|
|||||||
httpx.TimeoutException,
|
httpx.TimeoutException,
|
||||||
]
|
]
|
||||||
|
|
||||||
for total_calls in range(3, 5):
|
for total_calls in range(2, 4):
|
||||||
resp = await client.get("/api/camera_proxy/camera.config_test")
|
resp = await client.get("/api/camera_proxy/camera.config_test")
|
||||||
assert respx.calls.call_count == total_calls
|
assert respx.calls.call_count == total_calls
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
|
@ -167,8 +167,9 @@ async def test_form_only_still_sample(hass, user_flow, image_file):
|
|||||||
async def test_form_rtsp_mode(hass, fakeimg_png, mock_av_open, user_flow):
|
async def test_form_rtsp_mode(hass, fakeimg_png, mock_av_open, user_flow):
|
||||||
"""Test we complete ok if the user enters a stream url."""
|
"""Test we complete ok if the user enters a stream url."""
|
||||||
with mock_av_open as mock_setup:
|
with mock_av_open as mock_setup:
|
||||||
data = TESTDATA
|
data = TESTDATA.copy()
|
||||||
data[CONF_RTSP_TRANSPORT] = "tcp"
|
data[CONF_RTSP_TRANSPORT] = "tcp"
|
||||||
|
data[CONF_STREAM_SOURCE] = "rtsp://127.0.0.1/testurl/2"
|
||||||
result2 = await hass.config_entries.flow.async_configure(
|
result2 = await hass.config_entries.flow.async_configure(
|
||||||
user_flow["flow_id"], data
|
user_flow["flow_id"], data
|
||||||
)
|
)
|
||||||
@ -178,7 +179,7 @@ async def test_form_rtsp_mode(hass, fakeimg_png, mock_av_open, user_flow):
|
|||||||
assert result2["options"] == {
|
assert result2["options"] == {
|
||||||
CONF_STILL_IMAGE_URL: "http://127.0.0.1/testurl/1",
|
CONF_STILL_IMAGE_URL: "http://127.0.0.1/testurl/1",
|
||||||
CONF_AUTHENTICATION: HTTP_BASIC_AUTHENTICATION,
|
CONF_AUTHENTICATION: HTTP_BASIC_AUTHENTICATION,
|
||||||
CONF_STREAM_SOURCE: "http://127.0.0.1/testurl/2",
|
CONF_STREAM_SOURCE: "rtsp://127.0.0.1/testurl/2",
|
||||||
CONF_RTSP_TRANSPORT: "tcp",
|
CONF_RTSP_TRANSPORT: "tcp",
|
||||||
CONF_USERNAME: "fred_flintstone",
|
CONF_USERNAME: "fred_flintstone",
|
||||||
CONF_PASSWORD: "bambam",
|
CONF_PASSWORD: "bambam",
|
||||||
@ -216,7 +217,6 @@ async def test_form_only_stream(hass, mock_av_open, fakeimgbytes_jpg):
|
|||||||
assert result3["options"] == {
|
assert result3["options"] == {
|
||||||
CONF_AUTHENTICATION: HTTP_BASIC_AUTHENTICATION,
|
CONF_AUTHENTICATION: HTTP_BASIC_AUTHENTICATION,
|
||||||
CONF_STREAM_SOURCE: "http://127.0.0.1/testurl/2",
|
CONF_STREAM_SOURCE: "http://127.0.0.1/testurl/2",
|
||||||
CONF_RTSP_TRANSPORT: "tcp",
|
|
||||||
CONF_USERNAME: "fred_flintstone",
|
CONF_USERNAME: "fred_flintstone",
|
||||||
CONF_PASSWORD: "bambam",
|
CONF_PASSWORD: "bambam",
|
||||||
CONF_LIMIT_REFETCH_TO_URL_CHANGE: False,
|
CONF_LIMIT_REFETCH_TO_URL_CHANGE: False,
|
||||||
@ -551,31 +551,6 @@ async def test_import(hass, fakeimg_png, mock_av_open):
|
|||||||
assert result2["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
assert result2["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||||
|
|
||||||
|
|
||||||
@respx.mock
|
|
||||||
async def test_import_invalid_still_image(hass, mock_av_open):
|
|
||||||
"""Test configuration.yaml import used during migration."""
|
|
||||||
respx.get("http://127.0.0.1/testurl/1").respond(stream=b"invalid")
|
|
||||||
with mock_av_open:
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=TESTDATA_YAML
|
|
||||||
)
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
|
||||||
assert result["reason"] == "unknown"
|
|
||||||
|
|
||||||
|
|
||||||
@respx.mock
|
|
||||||
async def test_import_other_error(hass, fakeimgbytes_png):
|
|
||||||
"""Test that non-specific import errors are raised."""
|
|
||||||
respx.get("http://127.0.0.1/testurl/1").respond(stream=fakeimgbytes_png)
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.generic.config_flow.av.open",
|
|
||||||
side_effect=OSError("other error"),
|
|
||||||
), pytest.raises(OSError):
|
|
||||||
await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=TESTDATA_YAML
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# These above can be deleted after deprecation period is finished.
|
# These above can be deleted after deprecation period is finished.
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user