From 9dc40197e9d2ea44aa1a4ede501c13476de77e55 Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Tue, 27 Aug 2019 03:30:41 -0500 Subject: [PATCH] Fix flaky updater tests (#26221) --- tests/components/updater/test_init.py | 120 +++++++++++++------------- 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/tests/components/updater/test_init.py b/tests/components/updater/test_init.py index 014fb7b6f45..237b8125072 100644 --- a/tests/components/updater/test_init.py +++ b/tests/components/updater/test_init.py @@ -1,18 +1,19 @@ """The tests for the Updater component.""" import asyncio from datetime import timedelta -from unittest.mock import patch, Mock +from unittest.mock import Mock, patch import pytest -from homeassistant.setup import async_setup_component from homeassistant.components import updater +from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util + from tests.common import ( - async_fire_time_changed, - mock_coro, - mock_component, MockDependency, + async_fire_time_changed, + mock_component, + mock_coro, ) NEW_VERSION = "10000.0" @@ -31,44 +32,44 @@ def mock_distro(): yield -@pytest.fixture -def mock_get_newest_version(): +@pytest.fixture(name="mock_get_newest_version") +def mock_get_newest_version_fixture(): """Fixture to mock get_newest_version.""" with patch("homeassistant.components.updater.get_newest_version") as mock: yield mock -@pytest.fixture -def mock_get_uuid(): +@pytest.fixture(name="mock_get_uuid") +def mock_get_uuid_fixture(): """Fixture to mock get_uuid.""" with patch("homeassistant.components.updater._load_uuid") as mock: yield mock -@pytest.fixture -def mock_utcnow(): +@pytest.fixture(name="mock_utcnow") +def mock_utcnow_fixture(): """Fixture to mock utcnow.""" - with patch("homeassistant.components.updater.dt_util.utcnow") as mock: - yield mock + with patch("homeassistant.components.updater.dt_util") as mock: + yield mock.utcnow -@asyncio.coroutine -def test_new_version_shows_entity_startup(hass, mock_get_uuid, mock_get_newest_version): +async def test_new_version_shows_entity_startup( + hass, mock_get_uuid, mock_get_newest_version +): """Test if binary sensor is unavailable at first.""" mock_get_uuid.return_value = MOCK_HUUID mock_get_newest_version.return_value = mock_coro((NEW_VERSION, RELEASE_NOTES)) - res = yield from async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) + res = await async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) assert res, "Updater failed to set up" - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.updater", "unavailable") assert "newest_version" not in hass.states.get("binary_sensor.updater").attributes assert "release_notes" not in hass.states.get("binary_sensor.updater").attributes -@asyncio.coroutine -def test_rename_entity(hass, mock_get_uuid, mock_get_newest_version): +async def test_rename_entity(hass, mock_get_uuid, mock_get_newest_version, mock_utcnow): """Test if renaming the binary sensor works correctly.""" mock_get_uuid.return_value = MOCK_HUUID mock_get_newest_version.return_value = mock_coro((NEW_VERSION, RELEASE_NOTES)) @@ -77,32 +78,33 @@ def test_rename_entity(hass, mock_get_uuid, mock_get_newest_version): later = now + timedelta(hours=1) mock_utcnow.return_value = now - res = yield from async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) + res = await async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) assert res, "Updater failed to set up" - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.updater", "unavailable") assert hass.states.get("binary_sensor.new_entity_id") is None - entity_registry = yield from hass.helpers.entity_registry.async_get_registry() + entity_registry = await hass.helpers.entity_registry.async_get_registry() entity_registry.async_update_entity( "binary_sensor.updater", new_entity_id="binary_sensor.new_entity_id" ) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.new_entity_id", "unavailable") assert hass.states.get("binary_sensor.updater") is None with patch("homeassistant.components.updater.current_version", MOCK_VERSION): async_fire_time_changed(hass, later) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.new_entity_id", "on") assert hass.states.get("binary_sensor.updater") is None -@asyncio.coroutine -def test_new_version_shows_entity_true(hass, mock_get_uuid, mock_get_newest_version): +async def test_new_version_shows_entity_true( + hass, mock_get_uuid, mock_get_newest_version, mock_utcnow +): """Test if sensor is true if new version is available.""" mock_get_uuid.return_value = MOCK_HUUID mock_get_newest_version.return_value = mock_coro((NEW_VERSION, RELEASE_NOTES)) @@ -111,13 +113,13 @@ def test_new_version_shows_entity_true(hass, mock_get_uuid, mock_get_newest_vers later = now + timedelta(hours=1) mock_utcnow.return_value = now - res = yield from async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) + res = await async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) assert res, "Updater failed to set up" - yield from hass.async_block_till_done() + await hass.async_block_till_done() with patch("homeassistant.components.updater.current_version", MOCK_VERSION): async_fire_time_changed(hass, later) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.updater", "on") assert ( @@ -130,8 +132,9 @@ def test_new_version_shows_entity_true(hass, mock_get_uuid, mock_get_newest_vers ) -@asyncio.coroutine -def test_same_version_shows_entity_false(hass, mock_get_uuid, mock_get_newest_version): +async def test_same_version_shows_entity_false( + hass, mock_get_uuid, mock_get_newest_version, mock_utcnow +): """Test if sensor is false if no new version is available.""" mock_get_uuid.return_value = MOCK_HUUID mock_get_newest_version.return_value = mock_coro((MOCK_VERSION, "")) @@ -140,13 +143,13 @@ def test_same_version_shows_entity_false(hass, mock_get_uuid, mock_get_newest_ve later = now + timedelta(hours=1) mock_utcnow.return_value = now - res = yield from async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) + res = await async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) assert res, "Updater failed to set up" - yield from hass.async_block_till_done() + await hass.async_block_till_done() with patch("homeassistant.components.updater.current_version", MOCK_VERSION): async_fire_time_changed(hass, later) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.updater", "off") assert ( @@ -156,8 +159,9 @@ def test_same_version_shows_entity_false(hass, mock_get_uuid, mock_get_newest_ve assert "release_notes" not in hass.states.get("binary_sensor.updater").attributes -@asyncio.coroutine -def test_disable_reporting(hass, mock_get_uuid, mock_get_newest_version): +async def test_disable_reporting( + hass, mock_get_uuid, mock_get_newest_version, mock_utcnow +): """Test we do not gather analytics when disable reporting is active.""" mock_get_uuid.return_value = MOCK_HUUID mock_get_newest_version.return_value = mock_coro((MOCK_VERSION, "")) @@ -166,37 +170,35 @@ def test_disable_reporting(hass, mock_get_uuid, mock_get_newest_version): later = now + timedelta(hours=1) mock_utcnow.return_value = now - res = yield from async_setup_component( + res = await async_setup_component( hass, updater.DOMAIN, {updater.DOMAIN: {"reporting": False}} ) assert res, "Updater failed to set up" - yield from hass.async_block_till_done() + await hass.async_block_till_done() with patch("homeassistant.components.updater.current_version", MOCK_VERSION): async_fire_time_changed(hass, later) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.updater", "off") - res = yield from updater.get_newest_version(hass, MOCK_HUUID, MOCK_CONFIG) + res = await updater.get_newest_version(hass, MOCK_HUUID, MOCK_CONFIG) call = mock_get_newest_version.mock_calls[0][1] assert call[0] is hass assert call[1] is None -@asyncio.coroutine -def test_get_newest_version_no_analytics_when_no_huuid(hass, aioclient_mock): +async def test_get_newest_version_no_analytics_when_no_huuid(hass, aioclient_mock): """Test we do not gather analytics when no huuid is passed in.""" aioclient_mock.post(updater.UPDATER_URL, json=MOCK_RESPONSE) with patch( "homeassistant.helpers.system_info.async_get_system_info", side_effect=Exception ): - res = yield from updater.get_newest_version(hass, None, False) + res = await updater.get_newest_version(hass, None, False) assert res == (MOCK_RESPONSE["version"], MOCK_RESPONSE["release-notes"]) -@asyncio.coroutine -def test_get_newest_version_analytics_when_huuid(hass, aioclient_mock): +async def test_get_newest_version_analytics_when_huuid(hass, aioclient_mock): """Test we gather analytics when huuid is passed in.""" aioclient_mock.post(updater.UPDATER_URL, json=MOCK_RESPONSE) @@ -204,23 +206,21 @@ def test_get_newest_version_analytics_when_huuid(hass, aioclient_mock): "homeassistant.helpers.system_info.async_get_system_info", Mock(return_value=mock_coro({"fake": "bla"})), ): - res = yield from updater.get_newest_version(hass, MOCK_HUUID, False) + res = await updater.get_newest_version(hass, MOCK_HUUID, False) assert res == (MOCK_RESPONSE["version"], MOCK_RESPONSE["release-notes"]) -@asyncio.coroutine -def test_error_fetching_new_version_timeout(hass): +async def test_error_fetching_new_version_timeout(hass): """Test we handle timeout error while fetching new version.""" with patch( "homeassistant.helpers.system_info.async_get_system_info", Mock(return_value=mock_coro({"fake": "bla"})), ), patch("async_timeout.timeout", side_effect=asyncio.TimeoutError): - res = yield from updater.get_newest_version(hass, MOCK_HUUID, False) + res = await updater.get_newest_version(hass, MOCK_HUUID, False) assert res is None -@asyncio.coroutine -def test_error_fetching_new_version_bad_json(hass, aioclient_mock): +async def test_error_fetching_new_version_bad_json(hass, aioclient_mock): """Test we handle json error while fetching new version.""" aioclient_mock.post(updater.UPDATER_URL, text="not json") @@ -228,12 +228,11 @@ def test_error_fetching_new_version_bad_json(hass, aioclient_mock): "homeassistant.helpers.system_info.async_get_system_info", Mock(return_value=mock_coro({"fake": "bla"})), ): - res = yield from updater.get_newest_version(hass, MOCK_HUUID, False) + res = await updater.get_newest_version(hass, MOCK_HUUID, False) assert res is None -@asyncio.coroutine -def test_error_fetching_new_version_invalid_response(hass, aioclient_mock): +async def test_error_fetching_new_version_invalid_response(hass, aioclient_mock): """Test we handle response error while fetching new version.""" aioclient_mock.post( updater.UPDATER_URL, @@ -247,13 +246,12 @@ def test_error_fetching_new_version_invalid_response(hass, aioclient_mock): "homeassistant.helpers.system_info.async_get_system_info", Mock(return_value=mock_coro({"fake": "bla"})), ): - res = yield from updater.get_newest_version(hass, MOCK_HUUID, False) + res = await updater.get_newest_version(hass, MOCK_HUUID, False) assert res is None -@asyncio.coroutine -def test_new_version_shows_entity_after_hour_hassio( - hass, mock_get_uuid, mock_get_newest_version +async def test_new_version_shows_entity_after_hour_hassio( + hass, mock_get_uuid, mock_get_newest_version, mock_utcnow ): """Test if binary sensor gets updated if new version is available / hass.io.""" mock_get_uuid.return_value = MOCK_HUUID @@ -265,13 +263,13 @@ def test_new_version_shows_entity_after_hour_hassio( later = now + timedelta(hours=1) mock_utcnow.return_value = now - res = yield from async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) + res = await async_setup_component(hass, updater.DOMAIN, {updater.DOMAIN: {}}) assert res, "Updater failed to set up" - yield from hass.async_block_till_done() + await hass.async_block_till_done() with patch("homeassistant.components.updater.current_version", MOCK_VERSION): async_fire_time_changed(hass, later) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert hass.states.is_state("binary_sensor.updater", "on") assert (