Skip to content

Commit 414dc15

Browse files
committed
Migrate is_connected to aiohasupervisor
1 parent fe796ff commit 414dc15

File tree

6 files changed

+51
-95
lines changed

6 files changed

+51
-95
lines changed

homeassistant/components/hassio/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import re
1111
from typing import Any, NamedTuple
1212

13+
from aiohasupervisor import SupervisorError
1314
import voluptuous as vol
1415

1516
from homeassistant.auth.const import GROUP_ID_ADMIN
@@ -306,8 +307,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: # noqa:
306307
host = os.environ["SUPERVISOR"]
307308
websession = async_get_clientsession(hass)
308309
hass.data[DOMAIN] = hassio = HassIO(hass.loop, websession, host)
310+
supervisor_client = get_supervisor_client(hass)
309311

310-
if not await hassio.is_connected():
312+
try:
313+
await supervisor_client.supervisor.ping()
314+
except SupervisorError:
311315
_LOGGER.warning("Not connected with the supervisor / system too busy!")
312316

313317
store = Store[dict[str, str]](hass, STORAGE_VERSION, STORAGE_KEY)

homeassistant/components/hassio/handler.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,6 @@ def base_url(self) -> URL:
173173
"""Return base url for Supervisor."""
174174
return self._base_url
175175

176-
@_api_bool
177-
def is_connected(self) -> Coroutine:
178-
"""Return true if it connected to Hass.io supervisor.
179-
180-
This method returns a coroutine.
181-
"""
182-
return self.send_command("/supervisor/ping", method="get", timeout=15)
183-
184176
@api_data
185177
def get_info(self) -> Coroutine:
186178
"""Return generic Supervisor information.

tests/components/conftest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,13 @@ def addon_changelog_fixture(supervisor_client: AsyncMock) -> AsyncMock:
464464
return supervisor_client.store.addon_changelog
465465

466466

467+
@pytest.fixture(name="supervisor_is_connected")
468+
def supervisor_is_connected_fixture(supervisor_client: AsyncMock) -> AsyncMock:
469+
"""Mock supervisor is connected."""
470+
supervisor_client.supervisor.ping.return_value = None
471+
return supervisor_client.supervisor.ping
472+
473+
467474
@pytest.fixture(name="supervisor_client")
468475
def supervisor_client() -> Generator[AsyncMock]:
469476
"""Mock the supervisor client."""

tests/components/hassio/conftest.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,10 @@ def disable_security_filter() -> Generator[None]:
3232

3333

3434
@pytest.fixture
35-
def hassio_env() -> Generator[None]:
35+
def hassio_env(supervisor_is_connected: AsyncMock) -> Generator[None]:
3636
"""Fixture to inject hassio env."""
3737
with (
3838
patch.dict(os.environ, {"SUPERVISOR": "127.0.0.1"}),
39-
patch(
40-
"homeassistant.components.hassio.HassIO.is_connected",
41-
return_value={"result": "ok", "data": {}},
42-
),
4339
patch.dict(os.environ, {"SUPERVISOR_TOKEN": SUPERVISOR_TOKEN}),
4440
patch(
4541
"homeassistant.components.hassio.HassIO.get_info",

tests/components/hassio/test_handler.py

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from typing import Any, Literal
66

7-
import aiohttp
87
from aiohttp import hdrs, web
98
import pytest
109

@@ -16,36 +15,6 @@
1615
from tests.test_util.aiohttp import AiohttpClientMocker
1716

1817

19-
async def test_api_ping(
20-
hassio_handler: HassIO, aioclient_mock: AiohttpClientMocker
21-
) -> None:
22-
"""Test setup with API ping."""
23-
aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={"result": "ok"})
24-
25-
assert await hassio_handler.is_connected()
26-
assert aioclient_mock.call_count == 1
27-
28-
29-
async def test_api_ping_error(
30-
hassio_handler: HassIO, aioclient_mock: AiohttpClientMocker
31-
) -> None:
32-
"""Test setup with API ping error."""
33-
aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={"result": "error"})
34-
35-
assert not (await hassio_handler.is_connected())
36-
assert aioclient_mock.call_count == 1
37-
38-
39-
async def test_api_ping_exeption(
40-
hassio_handler: HassIO, aioclient_mock: AiohttpClientMocker
41-
) -> None:
42-
"""Test setup with API ping exception."""
43-
aioclient_mock.get("http://127.0.0.1/supervisor/ping", exc=aiohttp.ClientError())
44-
45-
assert not (await hassio_handler.is_connected())
46-
assert aioclient_mock.call_count == 1
47-
48-
4918
async def test_api_info(
5019
hassio_handler: HassIO, aioclient_mock: AiohttpClientMocker
5120
) -> None:

tests/components/hassio/test_init.py

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Any
66
from unittest.mock import AsyncMock, patch
77

8+
from aiohasupervisor import SupervisorError
89
from aiohasupervisor.models import AddonsStats
910
import pytest
1011
from voluptuous import Invalid
@@ -282,9 +283,9 @@ async def test_setup_api_push_api_data(
282283

283284
assert result
284285
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 20
285-
assert not aioclient_mock.mock_calls[1][2]["ssl"]
286-
assert aioclient_mock.mock_calls[1][2]["port"] == 9999
287-
assert "watchdog" not in aioclient_mock.mock_calls[1][2]
286+
assert not aioclient_mock.mock_calls[0][2]["ssl"]
287+
assert aioclient_mock.mock_calls[0][2]["port"] == 9999
288+
assert "watchdog" not in aioclient_mock.mock_calls[0][2]
288289

289290

290291
async def test_setup_api_push_api_data_server_host(
@@ -303,9 +304,9 @@ async def test_setup_api_push_api_data_server_host(
303304

304305
assert result
305306
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 20
306-
assert not aioclient_mock.mock_calls[1][2]["ssl"]
307-
assert aioclient_mock.mock_calls[1][2]["port"] == 9999
308-
assert not aioclient_mock.mock_calls[1][2]["watchdog"]
307+
assert not aioclient_mock.mock_calls[0][2]["ssl"]
308+
assert aioclient_mock.mock_calls[0][2]["port"] == 9999
309+
assert not aioclient_mock.mock_calls[0][2]["watchdog"]
309310

310311

311312
async def test_setup_api_push_api_data_default(
@@ -321,9 +322,9 @@ async def test_setup_api_push_api_data_default(
321322

322323
assert result
323324
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 20
324-
assert not aioclient_mock.mock_calls[1][2]["ssl"]
325-
assert aioclient_mock.mock_calls[1][2]["port"] == 8123
326-
refresh_token = aioclient_mock.mock_calls[1][2]["refresh_token"]
325+
assert not aioclient_mock.mock_calls[0][2]["ssl"]
326+
assert aioclient_mock.mock_calls[0][2]["port"] == 8123
327+
refresh_token = aioclient_mock.mock_calls[0][2]["refresh_token"]
327328
hassio_user = await hass.auth.async_get_user(
328329
hass_storage[STORAGE_KEY]["data"]["hassio_user"]
329330
)
@@ -402,9 +403,9 @@ async def test_setup_api_existing_hassio_user(
402403

403404
assert result
404405
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 20
405-
assert not aioclient_mock.mock_calls[1][2]["ssl"]
406-
assert aioclient_mock.mock_calls[1][2]["port"] == 8123
407-
assert aioclient_mock.mock_calls[1][2]["refresh_token"] == token.token
406+
assert not aioclient_mock.mock_calls[0][2]["ssl"]
407+
assert aioclient_mock.mock_calls[0][2]["port"] == 8123
408+
assert aioclient_mock.mock_calls[0][2]["refresh_token"] == token.token
408409

409410

410411
async def test_setup_core_push_timezone(
@@ -421,7 +422,7 @@ async def test_setup_core_push_timezone(
421422

422423
assert result
423424
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 20
424-
assert aioclient_mock.mock_calls[2][2]["timezone"] == "testzone"
425+
assert aioclient_mock.mock_calls[1][2]["timezone"] == "testzone"
425426

426427
with patch("homeassistant.util.dt.set_default_time_zone"):
427428
await hass.config.async_update(time_zone="America/New_York")
@@ -455,16 +456,13 @@ async def test_fail_setup_without_environ_var(hass: HomeAssistant) -> None:
455456

456457

457458
async def test_warn_when_cannot_connect(
458-
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
459+
hass: HomeAssistant,
460+
caplog: pytest.LogCaptureFixture,
461+
supervisor_is_connected: AsyncMock,
459462
) -> None:
460463
"""Fail warn when we cannot connect."""
461-
with (
462-
patch.dict(os.environ, MOCK_ENVIRON),
463-
patch(
464-
"homeassistant.components.hassio.HassIO.is_connected",
465-
return_value=None,
466-
),
467-
):
464+
supervisor_is_connected.side_effect = SupervisorError
465+
with patch.dict(os.environ, MOCK_ENVIRON):
468466
result = await async_setup_component(hass, "hassio", {})
469467
assert result
470468

@@ -496,17 +494,13 @@ async def test_service_calls(
496494
aioclient_mock: AiohttpClientMocker,
497495
caplog: pytest.LogCaptureFixture,
498496
supervisor_client: AsyncMock,
499-
addon_installed,
497+
addon_installed: AsyncMock,
498+
supervisor_is_connected: AsyncMock,
500499
issue_registry: ir.IssueRegistry,
501500
) -> None:
502501
"""Call service and check the API calls behind that."""
503-
with (
504-
patch.dict(os.environ, MOCK_ENVIRON),
505-
patch(
506-
"homeassistant.components.hassio.HassIO.is_connected",
507-
return_value=None,
508-
),
509-
):
502+
supervisor_is_connected.side_effect = SupervisorError
503+
with patch.dict(os.environ, MOCK_ENVIRON):
510504
assert await async_setup_component(hass, "hassio", {})
511505
await hass.async_block_till_done()
512506

@@ -536,14 +530,14 @@ async def test_service_calls(
536530
)
537531
await hass.async_block_till_done()
538532

539-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 24
533+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 25
540534
assert aioclient_mock.mock_calls[-1][2] == "test"
541535

542536
await hass.services.async_call("hassio", "host_shutdown", {})
543537
await hass.services.async_call("hassio", "host_reboot", {})
544538
await hass.async_block_till_done()
545539

546-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 26
540+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 27
547541

548542
await hass.services.async_call("hassio", "backup_full", {})
549543
await hass.services.async_call(
@@ -558,7 +552,7 @@ async def test_service_calls(
558552
)
559553
await hass.async_block_till_done()
560554

561-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 28
555+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 29
562556
assert aioclient_mock.mock_calls[-1][2] == {
563557
"name": "2021-11-13 03:48:00",
564558
"homeassistant": True,
@@ -583,7 +577,7 @@ async def test_service_calls(
583577
)
584578
await hass.async_block_till_done()
585579

586-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 30
580+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 31
587581
assert aioclient_mock.mock_calls[-1][2] == {
588582
"addons": ["test"],
589583
"folders": ["ssl"],
@@ -602,7 +596,7 @@ async def test_service_calls(
602596
)
603597
await hass.async_block_till_done()
604598

605-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 31
599+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 32
606600
assert aioclient_mock.mock_calls[-1][2] == {
607601
"name": "backup_name",
608602
"location": "backup_share",
@@ -618,7 +612,7 @@ async def test_service_calls(
618612
)
619613
await hass.async_block_till_done()
620614

621-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 32
615+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 33
622616
assert aioclient_mock.mock_calls[-1][2] == {
623617
"name": "2021-11-13 03:48:00",
624618
"location": None,
@@ -637,7 +631,7 @@ async def test_service_calls(
637631
)
638632
await hass.async_block_till_done()
639633

640-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 34
634+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 35
641635
assert aioclient_mock.mock_calls[-1][2] == {
642636
"name": "2021-11-13 11:48:00",
643637
"location": None,
@@ -647,15 +641,11 @@ async def test_service_calls(
647641
async def test_invalid_service_calls(
648642
hass: HomeAssistant,
649643
aioclient_mock: AiohttpClientMocker,
644+
supervisor_is_connected: AsyncMock,
650645
) -> None:
651646
"""Call service with invalid input and check that it raises."""
652-
with (
653-
patch.dict(os.environ, MOCK_ENVIRON),
654-
patch(
655-
"homeassistant.components.hassio.HassIO.is_connected",
656-
return_value=None,
657-
),
658-
):
647+
supervisor_is_connected.side_effect = SupervisorError
648+
with patch.dict(os.environ, MOCK_ENVIRON):
659649
assert await async_setup_component(hass, "hassio", {})
660650
await hass.async_block_till_done()
661651

@@ -672,6 +662,7 @@ async def test_invalid_service_calls(
672662
async def test_addon_service_call_with_complex_slug(
673663
hass: HomeAssistant,
674664
aioclient_mock: AiohttpClientMocker,
665+
supervisor_is_connected: AsyncMock,
675666
) -> None:
676667
"""Addon slugs can have ., - and _, confirm that passes validation."""
677668
supervisor_mock_data = {
@@ -691,12 +682,9 @@ async def test_addon_service_call_with_complex_slug(
691682
},
692683
],
693684
}
685+
supervisor_is_connected.side_effect = SupervisorError
694686
with (
695687
patch.dict(os.environ, MOCK_ENVIRON),
696-
patch(
697-
"homeassistant.components.hassio.HassIO.is_connected",
698-
return_value=None,
699-
),
700688
patch(
701689
"homeassistant.components.hassio.HassIO.get_supervisor_info",
702690
return_value=supervisor_mock_data,
@@ -724,12 +712,12 @@ async def test_service_calls_core(
724712
await hass.services.async_call("homeassistant", "stop")
725713
await hass.async_block_till_done()
726714

727-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 5
715+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 6
728716

729717
await hass.services.async_call("homeassistant", "check_config")
730718
await hass.async_block_till_done()
731719

732-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 5
720+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 6
733721

734722
with patch(
735723
"homeassistant.config.async_check_ha_config_file", return_value=None
@@ -738,7 +726,7 @@ async def test_service_calls_core(
738726
await hass.async_block_till_done()
739727
assert mock_check_config.called
740728

741-
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 6
729+
assert aioclient_mock.call_count + len(supervisor_client.mock_calls) == 7
742730

743731

744732
@pytest.mark.usefixtures("addon_installed")

0 commit comments

Comments
 (0)