mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-10-15 14:49:39 +00:00
Compare commits
3 Commits
fix-websoc
...
remove-dep
Author | SHA1 | Date | |
---|---|---|---|
![]() |
66a3766b5a | ||
![]() |
7031a58083 | ||
![]() |
3c0e62f6ba |
@@ -222,11 +222,6 @@ class APIProxy(CoreSysAttributes):
|
||||
raise HTTPBadGateway()
|
||||
_LOGGER.info("Home Assistant WebSocket API request initialize")
|
||||
|
||||
# Check if transport is still valid before WebSocket upgrade
|
||||
if request.transport is None:
|
||||
_LOGGER.warning("WebSocket connection lost before upgrade")
|
||||
raise web.HTTPBadRequest(reason="Connection closed")
|
||||
|
||||
# init server
|
||||
server = web.WebSocketResponse(heartbeat=30)
|
||||
await server.prepare(request)
|
||||
|
@@ -108,8 +108,7 @@ class APISupervisor(CoreSysAttributes):
|
||||
ATTR_AUTO_UPDATE: self.sys_updater.auto_update,
|
||||
ATTR_DETECT_BLOCKING_IO: BlockBusterManager.is_enabled(),
|
||||
ATTR_COUNTRY: self.sys_config.country,
|
||||
# Depricated
|
||||
ATTR_WAIT_BOOT: self.sys_config.wait_boot,
|
||||
# Deprecated
|
||||
ATTR_ADDONS: [
|
||||
{
|
||||
ATTR_NAME: addon.name,
|
||||
@@ -123,10 +122,6 @@ class APISupervisor(CoreSysAttributes):
|
||||
}
|
||||
for addon in self.sys_addons.local.values()
|
||||
],
|
||||
ATTR_ADDONS_REPOSITORIES: [
|
||||
{ATTR_NAME: store.name, ATTR_SLUG: store.slug}
|
||||
for store in self.sys_store.all
|
||||
],
|
||||
}
|
||||
|
||||
@api_process
|
||||
@@ -182,20 +177,10 @@ class APISupervisor(CoreSysAttributes):
|
||||
self.sys_config.detect_blocking_io = False
|
||||
BlockBusterManager.deactivate()
|
||||
|
||||
# Deprecated
|
||||
if ATTR_WAIT_BOOT in body:
|
||||
self.sys_config.wait_boot = body[ATTR_WAIT_BOOT]
|
||||
|
||||
# Save changes before processing addons in case of errors
|
||||
await self.sys_updater.save_data()
|
||||
await self.sys_config.save_data()
|
||||
|
||||
# Remove: 2022.9
|
||||
if ATTR_ADDONS_REPOSITORIES in body:
|
||||
await asyncio.shield(
|
||||
self.sys_store.update_repositories(set(body[ATTR_ADDONS_REPOSITORIES]))
|
||||
)
|
||||
|
||||
await self.sys_resolution.evaluate.evaluate_system()
|
||||
|
||||
@api_process
|
||||
|
@@ -9,7 +9,7 @@ import logging
|
||||
from typing import Any, cast
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
from aiohttp import ClientWebSocketResponse, WSCloseCode, web
|
||||
from aiohttp import ClientWebSocketResponse, WSCloseCode
|
||||
from aiohttp.http_websocket import WSMessage, WSMsgType
|
||||
from aiohttp.test_utils import TestClient
|
||||
import pytest
|
||||
@@ -223,32 +223,6 @@ async def test_proxy_auth_abort_log(
|
||||
)
|
||||
|
||||
|
||||
async def test_websocket_transport_none(
|
||||
coresys,
|
||||
caplog: pytest.LogCaptureFixture,
|
||||
):
|
||||
"""Test WebSocket connection with transport None is handled gracefully."""
|
||||
# Get the API proxy instance from coresys
|
||||
api_proxy = APIProxy.__new__(APIProxy)
|
||||
api_proxy.coresys = coresys
|
||||
|
||||
# Create a mock request with transport set to None to simulate connection loss
|
||||
mock_request = AsyncMock(spec=web.Request)
|
||||
mock_request.transport = None
|
||||
|
||||
caplog.clear()
|
||||
with caplog.at_level(logging.WARNING):
|
||||
# This should raise HTTPBadRequest, not AssertionError
|
||||
with pytest.raises(web.HTTPBadRequest) as exc_info:
|
||||
await api_proxy.websocket(mock_request)
|
||||
|
||||
# Verify the error reason
|
||||
assert exc_info.value.reason == "Connection closed"
|
||||
|
||||
# Verify the warning was logged
|
||||
assert "WebSocket connection lost before upgrade" in caplog.text
|
||||
|
||||
|
||||
@pytest.mark.parametrize("path", ["", "mock_path"])
|
||||
async def test_api_proxy_get_request(
|
||||
api_client: TestClient,
|
||||
|
@@ -12,9 +12,8 @@ import pytest
|
||||
from supervisor.const import CoreState
|
||||
from supervisor.core import Core
|
||||
from supervisor.coresys import CoreSys
|
||||
from supervisor.exceptions import HassioError, HostNotSupportedError, StoreGitError
|
||||
from supervisor.exceptions import HassioError, HostNotSupportedError
|
||||
from supervisor.homeassistant.const import WSEvent
|
||||
from supervisor.store.repository import Repository
|
||||
from supervisor.supervisor import Supervisor
|
||||
from supervisor.updater import Updater
|
||||
|
||||
@@ -35,81 +34,6 @@ async def test_api_supervisor_options_debug(api_client: TestClient, coresys: Cor
|
||||
assert coresys.config.debug
|
||||
|
||||
|
||||
async def test_api_supervisor_options_add_repository(
|
||||
api_client: TestClient, coresys: CoreSys, supervisor_internet: AsyncMock
|
||||
):
|
||||
"""Test add a repository via POST /supervisor/options REST API."""
|
||||
assert REPO_URL not in coresys.store.repository_urls
|
||||
|
||||
with (
|
||||
patch("supervisor.store.repository.RepositoryGit.load", return_value=None),
|
||||
patch("supervisor.store.repository.RepositoryGit.validate", return_value=True),
|
||||
):
|
||||
response = await api_client.post(
|
||||
"/supervisor/options", json={"addons_repositories": [REPO_URL]}
|
||||
)
|
||||
|
||||
assert response.status == 200
|
||||
assert REPO_URL in coresys.store.repository_urls
|
||||
|
||||
|
||||
async def test_api_supervisor_options_remove_repository(
|
||||
api_client: TestClient, coresys: CoreSys, test_repository: Repository
|
||||
):
|
||||
"""Test remove a repository via POST /supervisor/options REST API."""
|
||||
assert test_repository.source in coresys.store.repository_urls
|
||||
assert test_repository.slug in coresys.store.repositories
|
||||
|
||||
response = await api_client.post(
|
||||
"/supervisor/options", json={"addons_repositories": []}
|
||||
)
|
||||
|
||||
assert response.status == 200
|
||||
assert test_repository.source not in coresys.store.repository_urls
|
||||
assert test_repository.slug not in coresys.store.repositories
|
||||
|
||||
|
||||
@pytest.mark.parametrize("git_error", [None, StoreGitError()])
|
||||
async def test_api_supervisor_options_repositories_skipped_on_error(
|
||||
api_client: TestClient, coresys: CoreSys, git_error: StoreGitError
|
||||
):
|
||||
"""Test repositories skipped on error via POST /supervisor/options REST API."""
|
||||
with (
|
||||
patch("supervisor.store.repository.RepositoryGit.load", side_effect=git_error),
|
||||
patch("supervisor.store.repository.RepositoryGit.validate", return_value=False),
|
||||
patch("supervisor.store.repository.RepositoryCustom.remove"),
|
||||
):
|
||||
response = await api_client.post(
|
||||
"/supervisor/options", json={"addons_repositories": [REPO_URL]}
|
||||
)
|
||||
|
||||
assert response.status == 400
|
||||
assert len(coresys.resolution.suggestions) == 0
|
||||
assert REPO_URL not in coresys.store.repository_urls
|
||||
|
||||
|
||||
async def test_api_supervisor_options_repo_error_with_config_change(
|
||||
api_client: TestClient, coresys: CoreSys
|
||||
):
|
||||
"""Test config change with add repository error via POST /supervisor/options REST API."""
|
||||
assert not coresys.config.debug
|
||||
|
||||
with patch(
|
||||
"supervisor.store.repository.RepositoryGit.load", side_effect=StoreGitError()
|
||||
):
|
||||
response = await api_client.post(
|
||||
"/supervisor/options",
|
||||
json={"debug": True, "addons_repositories": [REPO_URL]},
|
||||
)
|
||||
|
||||
assert response.status == 400
|
||||
assert REPO_URL not in coresys.store.repository_urls
|
||||
|
||||
assert coresys.config.debug
|
||||
coresys.updater.save_data.assert_called_once()
|
||||
coresys.config.save_data.assert_called_once()
|
||||
|
||||
|
||||
async def test_api_supervisor_options_auto_update(
|
||||
api_client: TestClient, coresys: CoreSys
|
||||
):
|
||||
|
Reference in New Issue
Block a user