|
1 | 1 | """Test scheduled tasks.""" |
2 | 2 |
|
3 | | -from unittest.mock import MagicMock, Mock, patch |
| 3 | +from collections.abc import AsyncGenerator |
| 4 | +from contextlib import asynccontextmanager |
| 5 | +from unittest.mock import AsyncMock, MagicMock, Mock, PropertyMock, patch |
4 | 6 |
|
5 | 7 | from awesomeversion import AwesomeVersion |
6 | 8 | import pytest |
7 | 9 |
|
| 10 | +from supervisor.const import CoreState |
8 | 11 | from supervisor.coresys import CoreSys |
9 | 12 | from supervisor.exceptions import HomeAssistantError |
10 | 13 | from supervisor.homeassistant.api import HomeAssistantAPI |
11 | 14 | from supervisor.homeassistant.const import LANDINGPAGE |
12 | 15 | from supervisor.homeassistant.core import HomeAssistantCore |
13 | 16 | from supervisor.misc.tasks import Tasks |
| 17 | +from supervisor.supervisor import Supervisor |
| 18 | + |
| 19 | +from tests.common import load_fixture |
14 | 20 |
|
15 | 21 | # pylint: disable=protected-access |
16 | 22 |
|
17 | 23 |
|
18 | 24 | @pytest.fixture(name="tasks") |
19 | | -async def fixture_tasks(coresys: CoreSys, container: MagicMock) -> Tasks: |
| 25 | +async def fixture_tasks( |
| 26 | + coresys: CoreSys, container: MagicMock |
| 27 | +) -> AsyncGenerator[Tasks]: |
20 | 28 | """Return task manager.""" |
21 | 29 | coresys.homeassistant.watchdog = True |
22 | 30 | coresys.homeassistant.version = AwesomeVersion("2023.12.0") |
@@ -159,3 +167,44 @@ async def test_watchdog_homeassistant_api_reanimation_limit( |
159 | 167 | assert not caplog.text |
160 | 168 | restart.assert_not_called() |
161 | 169 | rebuild.assert_not_called() |
| 170 | + |
| 171 | + |
| 172 | +async def test_reload_updater_triggers_supervisor_update( |
| 173 | + tasks: Tasks, coresys: CoreSys |
| 174 | +): |
| 175 | + """Test an updater reload triggers a supervisor update if there is one.""" |
| 176 | + coresys.hardware.disk.get_disk_free_space = lambda x: 5000 |
| 177 | + coresys.core.state = CoreState.RUNNING |
| 178 | + coresys.security.content_trust = False |
| 179 | + |
| 180 | + version_data = load_fixture("version_stable.json") |
| 181 | + version_resp = AsyncMock() |
| 182 | + version_resp.status = 200 |
| 183 | + version_resp.read.return_value = version_data |
| 184 | + |
| 185 | + @asynccontextmanager |
| 186 | + async def mock_get_for_version(*args, **kwargs) -> AsyncGenerator[AsyncMock]: |
| 187 | + """Mock get call for version information.""" |
| 188 | + yield version_resp |
| 189 | + |
| 190 | + with ( |
| 191 | + patch("supervisor.coresys.aiohttp.ClientSession.get", new=mock_get_for_version), |
| 192 | + patch.object( |
| 193 | + Supervisor, |
| 194 | + "version", |
| 195 | + new=PropertyMock(return_value=AwesomeVersion("2024.10.0")), |
| 196 | + ), |
| 197 | + patch.object(Supervisor, "update") as update, |
| 198 | + ): |
| 199 | + # Set supervisor's version intially |
| 200 | + await coresys.updater.reload() |
| 201 | + assert coresys.supervisor.latest_version == AwesomeVersion("2024.10.0") |
| 202 | + |
| 203 | + # No change in version means no update |
| 204 | + await tasks._reload_updater() |
| 205 | + update.assert_not_called() |
| 206 | + |
| 207 | + # Version change causes an update |
| 208 | + version_resp.read.return_value = version_data.replace("2024.10.0", "2024.10.1") |
| 209 | + await tasks._reload_updater() |
| 210 | + update.assert_called_once() |
0 commit comments