159 lines
5.7 KiB
Python
159 lines
5.7 KiB
Python
"""The tests for the Updater component."""
|
|
import asyncio
|
|
from datetime import timedelta
|
|
from unittest.mock import patch, Mock
|
|
|
|
from freezegun import freeze_time
|
|
import pytest
|
|
|
|
from homeassistant.setup import async_setup_component
|
|
from homeassistant.components import updater
|
|
import homeassistant.util.dt as dt_util
|
|
from tests.common import async_fire_time_changed, mock_coro
|
|
|
|
NEW_VERSION = '10000.0'
|
|
MOCK_VERSION = '10.0'
|
|
MOCK_DEV_VERSION = '10.0.dev0'
|
|
MOCK_HUUID = 'abcdefg'
|
|
MOCK_RESPONSE = {
|
|
'version': '0.15',
|
|
'release-notes': 'https://home-assistant.io'
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_get_newest_version():
|
|
"""Fixture to mock get_newest_version."""
|
|
with patch('homeassistant.components.updater.get_newest_version') as mock:
|
|
yield mock
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_get_uuid():
|
|
"""Fixture to mock get_uuid."""
|
|
with patch('homeassistant.components.updater._load_uuid') as mock:
|
|
yield mock
|
|
|
|
|
|
@asyncio.coroutine
|
|
@freeze_time("Mar 15th, 2017")
|
|
def test_new_version_shows_entity_after_hour(hass, mock_get_uuid,
|
|
mock_get_newest_version):
|
|
"""Test if new entity is created if new version is available."""
|
|
mock_get_uuid.return_value = MOCK_HUUID
|
|
mock_get_newest_version.return_value = mock_coro((NEW_VERSION, ''))
|
|
|
|
res = yield from async_setup_component(
|
|
hass, updater.DOMAIN, {updater.DOMAIN: {}})
|
|
assert res, 'Updater failed to setup'
|
|
|
|
with patch('homeassistant.components.updater.CURRENT_VERSION',
|
|
MOCK_VERSION):
|
|
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(hours=1))
|
|
yield from hass.async_block_till_done()
|
|
|
|
assert hass.states.is_state(updater.ENTITY_ID, NEW_VERSION)
|
|
|
|
|
|
@asyncio.coroutine
|
|
@freeze_time("Mar 15th, 2017")
|
|
def test_same_version_not_show_entity(hass, mock_get_uuid,
|
|
mock_get_newest_version):
|
|
"""Test if new entity is created if new version is available."""
|
|
mock_get_uuid.return_value = MOCK_HUUID
|
|
mock_get_newest_version.return_value = mock_coro((MOCK_VERSION, ''))
|
|
|
|
res = yield from async_setup_component(
|
|
hass, updater.DOMAIN, {updater.DOMAIN: {}})
|
|
assert res, 'Updater failed to setup'
|
|
|
|
with patch('homeassistant.components.updater.CURRENT_VERSION',
|
|
MOCK_VERSION):
|
|
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(hours=1))
|
|
yield from hass.async_block_till_done()
|
|
|
|
assert hass.states.get(updater.ENTITY_ID) is None
|
|
|
|
|
|
@asyncio.coroutine
|
|
@freeze_time("Mar 15th, 2017")
|
|
def test_disable_reporting(hass, mock_get_uuid, mock_get_newest_version):
|
|
"""Test if new entity is created if new version is available."""
|
|
mock_get_uuid.return_value = MOCK_HUUID
|
|
mock_get_newest_version.return_value = mock_coro((MOCK_VERSION, ''))
|
|
|
|
res = yield from async_setup_component(
|
|
hass, updater.DOMAIN, {updater.DOMAIN: {
|
|
'reporting': False
|
|
}})
|
|
assert res, 'Updater failed to setup'
|
|
|
|
with patch('homeassistant.components.updater.CURRENT_VERSION',
|
|
MOCK_VERSION):
|
|
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(hours=1))
|
|
yield from hass.async_block_till_done()
|
|
|
|
assert hass.states.get(updater.ENTITY_ID) is None
|
|
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):
|
|
"""Test we do not gather analytics when no huuid is passed in."""
|
|
aioclient_mock.post(updater.UPDATER_URL, json=MOCK_RESPONSE)
|
|
|
|
with patch('homeassistant.components.updater.get_system_info',
|
|
side_effect=Exception):
|
|
res = yield from updater.get_newest_version(hass, None)
|
|
assert res == (MOCK_RESPONSE['version'],
|
|
MOCK_RESPONSE['release-notes'])
|
|
|
|
|
|
@asyncio.coroutine
|
|
def test_get_newest_version_analytics_when_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.components.updater.get_system_info',
|
|
Mock(return_value=mock_coro({'fake': 'bla'}))):
|
|
res = yield from updater.get_newest_version(hass, MOCK_HUUID)
|
|
assert res == (MOCK_RESPONSE['version'],
|
|
MOCK_RESPONSE['release-notes'])
|
|
|
|
|
|
@asyncio.coroutine
|
|
def test_error_fetching_new_version_timeout(hass):
|
|
"""Test we do not gather analytics when no huuid is passed in."""
|
|
with patch('homeassistant.components.updater.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)
|
|
assert res is None
|
|
|
|
|
|
@asyncio.coroutine
|
|
def test_error_fetching_new_version_bad_json(hass, aioclient_mock):
|
|
"""Test we do not gather analytics when no huuid is passed in."""
|
|
aioclient_mock.post(updater.UPDATER_URL, text='not json')
|
|
|
|
with patch('homeassistant.components.updater.get_system_info',
|
|
Mock(return_value=mock_coro({'fake': 'bla'}))):
|
|
res = yield from updater.get_newest_version(hass, MOCK_HUUID)
|
|
assert res is None
|
|
|
|
|
|
@asyncio.coroutine
|
|
def test_error_fetching_new_version_invalid_response(hass, aioclient_mock):
|
|
"""Test we do not gather analytics when no huuid is passed in."""
|
|
aioclient_mock.post(updater.UPDATER_URL, json={
|
|
'version': '0.15'
|
|
# 'release-notes' is missing
|
|
})
|
|
|
|
with patch('homeassistant.components.updater.get_system_info',
|
|
Mock(return_value=mock_coro({'fake': 'bla'}))):
|
|
res = yield from updater.get_newest_version(hass, MOCK_HUUID)
|
|
assert res is None
|