mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-11-08 18:39:33 +00:00
133 lines
5.0 KiB
Python
133 lines
5.0 KiB
Python
"""Test Home Assistant core."""
|
|
from unittest.mock import MagicMock, Mock, PropertyMock, patch
|
|
|
|
import pytest
|
|
|
|
from supervisor.const import CpuArch
|
|
from supervisor.coresys import CoreSys
|
|
from supervisor.docker.homeassistant import DockerHomeAssistant
|
|
from supervisor.docker.interface import DockerInterface
|
|
from supervisor.exceptions import (
|
|
AudioUpdateError,
|
|
CodeNotaryError,
|
|
DockerError,
|
|
HomeAssistantJobError,
|
|
)
|
|
from supervisor.homeassistant.core import HomeAssistantCore
|
|
from supervisor.updater import Updater
|
|
|
|
|
|
async def test_update_fails_if_out_of_date(coresys: CoreSys):
|
|
"""Test update of Home Assistant fails when supervisor or plugin is out of date."""
|
|
coresys.hardware.disk.get_disk_free_space = lambda x: 5000
|
|
|
|
with patch.object(
|
|
type(coresys.supervisor), "need_update", new=PropertyMock(return_value=True)
|
|
), pytest.raises(HomeAssistantJobError):
|
|
await coresys.homeassistant.core.update()
|
|
|
|
with patch.object(
|
|
type(coresys.plugins.audio), "need_update", new=PropertyMock(return_value=True)
|
|
), patch.object(
|
|
type(coresys.plugins.audio), "update", side_effect=AudioUpdateError
|
|
), pytest.raises(
|
|
HomeAssistantJobError
|
|
):
|
|
await coresys.homeassistant.core.update()
|
|
|
|
|
|
async def test_install_landingpage_docker_error(
|
|
coresys: CoreSys, capture_exception: Mock, caplog: pytest.LogCaptureFixture
|
|
):
|
|
"""Test install landing page fails due to docker error."""
|
|
coresys.security.force = True
|
|
with patch.object(
|
|
DockerHomeAssistant, "attach", side_effect=DockerError
|
|
), patch.object(
|
|
Updater, "image_homeassistant", new=PropertyMock(return_value="homeassistant")
|
|
), patch.object(
|
|
DockerInterface, "arch", new=PropertyMock(return_value=CpuArch.AMD64)
|
|
), patch(
|
|
"supervisor.homeassistant.core.asyncio.sleep"
|
|
) as sleep, patch(
|
|
"supervisor.security.module.cas_validate",
|
|
side_effect=[CodeNotaryError, None],
|
|
):
|
|
await coresys.homeassistant.core.install_landingpage()
|
|
sleep.assert_awaited_once_with(30)
|
|
|
|
assert "Fails install landingpage, retry after 30sec" in caplog.text
|
|
capture_exception.assert_not_called()
|
|
|
|
|
|
async def test_install_landingpage_other_error(
|
|
coresys: CoreSys, capture_exception: Mock, caplog: pytest.LogCaptureFixture
|
|
):
|
|
"""Test install landing page fails due to other error."""
|
|
coresys.docker.images.pull.side_effect = [(err := OSError()), MagicMock()]
|
|
|
|
with patch.object(
|
|
DockerHomeAssistant, "attach", side_effect=DockerError
|
|
), patch.object(
|
|
Updater, "image_homeassistant", new=PropertyMock(return_value="homeassistant")
|
|
), patch.object(
|
|
DockerInterface, "arch", new=PropertyMock(return_value=CpuArch.AMD64)
|
|
), patch(
|
|
"supervisor.homeassistant.core.asyncio.sleep"
|
|
) as sleep:
|
|
await coresys.homeassistant.core.install_landingpage()
|
|
sleep.assert_awaited_once_with(30)
|
|
|
|
assert "Fails install landingpage, retry after 30sec" in caplog.text
|
|
capture_exception.assert_called_once_with(err)
|
|
|
|
|
|
async def test_install_docker_error(
|
|
coresys: CoreSys, capture_exception: Mock, caplog: pytest.LogCaptureFixture
|
|
):
|
|
"""Test install fails due to docker error."""
|
|
coresys.security.force = True
|
|
with patch.object(HomeAssistantCore, "_start"), patch.object(
|
|
DockerHomeAssistant, "cleanup"
|
|
), patch.object(
|
|
Updater, "image_homeassistant", new=PropertyMock(return_value="homeassistant")
|
|
), patch.object(
|
|
Updater, "version_homeassistant", new=PropertyMock(return_value="2022.7.3")
|
|
), patch.object(
|
|
DockerInterface, "arch", new=PropertyMock(return_value=CpuArch.AMD64)
|
|
), patch(
|
|
"supervisor.homeassistant.core.asyncio.sleep"
|
|
) as sleep, patch(
|
|
"supervisor.security.module.cas_validate",
|
|
side_effect=[CodeNotaryError, None],
|
|
):
|
|
await coresys.homeassistant.core.install()
|
|
sleep.assert_awaited_once_with(30)
|
|
|
|
assert "Error on Home Assistant installation. Retry in 30sec" in caplog.text
|
|
capture_exception.assert_not_called()
|
|
|
|
|
|
async def test_install_other_error(
|
|
coresys: CoreSys, capture_exception: Mock, caplog: pytest.LogCaptureFixture
|
|
):
|
|
"""Test install fails due to other error."""
|
|
coresys.docker.images.pull.side_effect = [(err := OSError()), MagicMock()]
|
|
|
|
with patch.object(HomeAssistantCore, "_start"), patch.object(
|
|
DockerHomeAssistant, "cleanup"
|
|
), patch.object(
|
|
Updater, "image_homeassistant", new=PropertyMock(return_value="homeassistant")
|
|
), patch.object(
|
|
Updater, "version_homeassistant", new=PropertyMock(return_value="2022.7.3")
|
|
), patch.object(
|
|
DockerInterface, "arch", new=PropertyMock(return_value=CpuArch.AMD64)
|
|
), patch(
|
|
"supervisor.homeassistant.core.asyncio.sleep"
|
|
) as sleep:
|
|
await coresys.homeassistant.core.install()
|
|
sleep.assert_awaited_once_with(30)
|
|
|
|
assert "Error on Home Assistant installation. Retry in 30sec" in caplog.text
|
|
capture_exception.assert_called_once_with(err)
|