mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 04:50:05 +00:00
Add Hyperion camera feed (#46516)
* Initial Hyperion camera. * Improve test coverage. * Minor state fixes. * Fix type annotation. * May rebase and updates (mostly typing). * Updates to use new camera typing improvements. * Use new support for returning None from async_get_mjpeg_stream . * Codereview feedback. * Lint: Use AsyncGenerator from collections.abc . * Update homeassistant/components/hyperion/camera.py Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
This commit is contained in:
@@ -2,7 +2,8 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
from typing import Any, Awaitable
|
||||
from collections.abc import Awaitable
|
||||
from typing import Any
|
||||
from unittest.mock import AsyncMock, Mock, patch
|
||||
|
||||
from hyperion import const
|
||||
@@ -26,6 +27,7 @@ from homeassistant.const import (
|
||||
SERVICE_TURN_ON,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.data_entry_flow import FlowResult
|
||||
|
||||
from . import (
|
||||
TEST_AUTH_REQUIRED_RESP,
|
||||
@@ -100,7 +102,7 @@ TEST_SSDP_SERVICE_INFO = {
|
||||
|
||||
async def _create_mock_entry(hass: HomeAssistant) -> MockConfigEntry:
|
||||
"""Add a test Hyperion entity to hass."""
|
||||
entry: MockConfigEntry = MockConfigEntry( # type: ignore[no-untyped-call]
|
||||
entry: MockConfigEntry = MockConfigEntry(
|
||||
entry_id=TEST_CONFIG_ENTRY_ID,
|
||||
domain=DOMAIN,
|
||||
unique_id=TEST_SYSINFO_ID,
|
||||
@@ -111,7 +113,7 @@ async def _create_mock_entry(hass: HomeAssistant) -> MockConfigEntry:
|
||||
"instance": TEST_INSTANCE,
|
||||
},
|
||||
)
|
||||
entry.add_to_hass(hass) # type: ignore[no-untyped-call]
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
# Setup
|
||||
client = create_mock_client()
|
||||
@@ -138,7 +140,7 @@ async def _init_flow(
|
||||
|
||||
|
||||
async def _configure_flow(
|
||||
hass: HomeAssistant, result: dict, user_input: dict[str, Any] | None = None
|
||||
hass: HomeAssistant, result: FlowResult, user_input: dict[str, Any] | None = None
|
||||
) -> Any:
|
||||
"""Provide input to a flow."""
|
||||
user_input = user_input or {}
|
||||
@@ -419,6 +421,11 @@ async def test_auth_create_token_approval_declined_task_canceled(
|
||||
class CanceledAwaitableMock(AsyncMock):
|
||||
"""A canceled awaitable mock."""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.done = Mock(return_value=False)
|
||||
self.cancel = Mock()
|
||||
|
||||
def __await__(self) -> None:
|
||||
raise asyncio.CancelledError
|
||||
|
||||
@@ -435,20 +442,15 @@ async def test_auth_create_token_approval_declined_task_canceled(
|
||||
), patch(
|
||||
"homeassistant.components.hyperion.config_flow.client.generate_random_auth_id",
|
||||
return_value=TEST_AUTH_ID,
|
||||
), patch.object(
|
||||
hass, "async_create_task", side_effect=create_task
|
||||
):
|
||||
result = await _configure_flow(
|
||||
hass, result, user_input={CONF_CREATE_TOKEN: True}
|
||||
)
|
||||
assert result["step_id"] == "create_token"
|
||||
|
||||
result = await _configure_flow(hass, result)
|
||||
assert result["step_id"] == "create_token_external"
|
||||
|
||||
# Leave the task running, to ensure it is canceled.
|
||||
mock_task.done = Mock(return_value=False)
|
||||
mock_task.cancel = Mock()
|
||||
with patch.object(hass, "async_create_task", side_effect=create_task):
|
||||
result = await _configure_flow(hass, result)
|
||||
assert result["step_id"] == "create_token_external"
|
||||
|
||||
result = await _configure_flow(hass, result)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user