* Part 1 of 2 (no breaking changes in part 1). When integrations configured via the UI block startup or fail to start, the webserver can remain offline which make it is impossible to recover without manually changing files in .storage since the UI is not available. This change is the foundation that part 2 will build on and enable a listener to start the webserver when the frontend is finished loading. Frontend Changes (home-assistant/frontend#6068) * Address review comments * bump timeout to 1800s, adjust comment * bump timeout to 4h * remove timeout failsafe * and the test
71 lines
2 KiB
Python
71 lines
2 KiB
Python
"""Tests for Home Assistant View."""
|
|
from aiohttp.web_exceptions import (
|
|
HTTPBadRequest,
|
|
HTTPInternalServerError,
|
|
HTTPUnauthorized,
|
|
)
|
|
import pytest
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.http.view import (
|
|
HomeAssistantView,
|
|
request_handler_factory,
|
|
)
|
|
from homeassistant.exceptions import ServiceNotFound, Unauthorized
|
|
|
|
from tests.async_mock import AsyncMock, Mock
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_request():
|
|
"""Mock a request."""
|
|
return Mock(app={"hass": Mock(is_stopping=False)}, match_info={})
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_request_with_stopping():
|
|
"""Mock a request."""
|
|
return Mock(app={"hass": Mock(is_stopping=True)}, match_info={})
|
|
|
|
|
|
async def test_invalid_json(caplog):
|
|
"""Test trying to return invalid JSON."""
|
|
view = HomeAssistantView()
|
|
|
|
with pytest.raises(HTTPInternalServerError):
|
|
view.json(float("NaN"))
|
|
|
|
assert str(float("NaN")) in caplog.text
|
|
|
|
|
|
async def test_handling_unauthorized(mock_request):
|
|
"""Test handling unauth exceptions."""
|
|
with pytest.raises(HTTPUnauthorized):
|
|
await request_handler_factory(
|
|
Mock(requires_auth=False), AsyncMock(side_effect=Unauthorized)
|
|
)(mock_request)
|
|
|
|
|
|
async def test_handling_invalid_data(mock_request):
|
|
"""Test handling unauth exceptions."""
|
|
with pytest.raises(HTTPBadRequest):
|
|
await request_handler_factory(
|
|
Mock(requires_auth=False), AsyncMock(side_effect=vol.Invalid("yo"))
|
|
)(mock_request)
|
|
|
|
|
|
async def test_handling_service_not_found(mock_request):
|
|
"""Test handling unauth exceptions."""
|
|
with pytest.raises(HTTPInternalServerError):
|
|
await request_handler_factory(
|
|
Mock(requires_auth=False),
|
|
AsyncMock(side_effect=ServiceNotFound("test", "test")),
|
|
)(mock_request)
|
|
|
|
|
|
async def test_not_running(mock_request_with_stopping):
|
|
"""Test we get a 503 when not running."""
|
|
response = await request_handler_factory(
|
|
Mock(requires_auth=False), AsyncMock(side_effect=Unauthorized)
|
|
)(mock_request_with_stopping)
|
|
assert response.status == 503
|