* Add event loop to the core * Add block_till_done to HA core object * Fix some tests * Linting core * Fix statemachine tests * Core test fixes * fix block_till_done to wait for loop and queue to empty * fix test_core for passing, and correct start/stop/block_till_done * Fix remote tests * Fix tests: block_till_done * Fix linting * Fix more tests * Fix final linting * Fix remote test * remove unnecessary import * reduce sleep to avoid slowing down the tests excessively * fix remaining tests to wait for non-threadsafe operations * Add async_ doc strings for event loop / coroutine info * Fix command line test to block for the right timeout * Fix py3.4.2 loop var access * Fix SERVICE_CALL_LIMIT being in effect for other tests * Fix lint errors * Fix lint error with proper placement * Fix slave start to not start a timer * Add asyncio compatible listeners. * Increase min Python version to 3.4.2 * Move async backports to util * Add backported async tests * Fix linting * Simplify Python version check * Fix lint * Remove unneeded try/except and queue listener appproriately. * Fix tuple vs. list unorderable error on version compare. * Fix version tests
160 lines
5.7 KiB
Python
160 lines
5.7 KiB
Python
"""Test check_config script."""
|
|
import asyncio
|
|
import logging
|
|
import os
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
import homeassistant.scripts.check_config as check_config
|
|
from tests.common import patch_yaml_files, get_test_config_dir
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
BASE_CONFIG = (
|
|
'homeassistant:\n'
|
|
' name: Home\n'
|
|
' latitude: -26.107361\n'
|
|
' longitude: 28.054500\n'
|
|
' elevation: 1600\n'
|
|
' unit_system: metric\n'
|
|
' time_zone: GMT\n'
|
|
'\n\n'
|
|
)
|
|
|
|
|
|
def change_yaml_files(check_dict):
|
|
"""Change the ['yaml_files'] property and remove the config path.
|
|
|
|
Also removes other files like service.yaml that gets loaded
|
|
"""
|
|
root = get_test_config_dir()
|
|
keys = check_dict['yaml_files'].keys()
|
|
check_dict['yaml_files'] = []
|
|
for key in sorted(keys):
|
|
if not key.startswith('/'):
|
|
check_dict['yaml_files'].append(key)
|
|
if key.startswith(root):
|
|
check_dict['yaml_files'].append('...' + key[len(root):])
|
|
|
|
|
|
def tearDownModule(self): # pylint: disable=invalid-name
|
|
"""Clean files."""
|
|
# .HA_VERSION created during bootstrap's config update
|
|
path = get_test_config_dir('.HA_VERSION')
|
|
if os.path.isfile(path):
|
|
os.remove(path)
|
|
|
|
|
|
@patch('asyncio.get_event_loop', return_value=asyncio.new_event_loop())
|
|
class TestCheckConfig(unittest.TestCase):
|
|
"""Tests for the homeassistant.scripts.check_config module."""
|
|
|
|
# pylint: disable=no-self-use,invalid-name
|
|
def test_config_platform_valid(self, mock_get_loop):
|
|
"""Test a valid platform setup."""
|
|
files = {
|
|
'light.yaml': BASE_CONFIG + 'light:\n platform: hue',
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir('light.yaml'))
|
|
change_yaml_files(res)
|
|
self.assertDictEqual({
|
|
'components': {'light': [{'platform': 'hue'}]},
|
|
'except': {},
|
|
'secret_cache': {},
|
|
'secrets': {},
|
|
'yaml_files': ['.../light.yaml']
|
|
}, res)
|
|
|
|
def test_config_component_platform_fail_validation(self, mock_get_loop):
|
|
"""Test errors if component & platform not found."""
|
|
files = {
|
|
'component.yaml': BASE_CONFIG + 'http:\n password: err123',
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir('component.yaml'))
|
|
change_yaml_files(res)
|
|
self.assertDictEqual({
|
|
'components': {},
|
|
'except': {'http': {'password': 'err123'}},
|
|
'secret_cache': {},
|
|
'secrets': {},
|
|
'yaml_files': ['.../component.yaml']
|
|
}, res)
|
|
|
|
files = {
|
|
'platform.yaml': (BASE_CONFIG + 'mqtt:\n\n'
|
|
'light:\n platform: mqtt_json'),
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir('platform.yaml'))
|
|
change_yaml_files(res)
|
|
self.assertDictEqual({
|
|
'components': {'mqtt': {'keepalive': 60, 'port': 1883,
|
|
'protocol': '3.1.1'}},
|
|
'except': {'light.mqtt_json': {'platform': 'mqtt_json'}},
|
|
'secret_cache': {},
|
|
'secrets': {},
|
|
'yaml_files': ['.../platform.yaml']
|
|
}, res)
|
|
|
|
def test_component_platform_not_found(self, mock_get_loop):
|
|
"""Test errors if component or platform not found."""
|
|
files = {
|
|
'badcomponent.yaml': BASE_CONFIG + 'beer:',
|
|
'badplatform.yaml': BASE_CONFIG + 'light:\n platform: beer',
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir('badcomponent.yaml'))
|
|
change_yaml_files(res)
|
|
self.assertDictEqual({
|
|
'components': {},
|
|
'except': {check_config.ERROR_STR:
|
|
['Component not found: beer']},
|
|
'secret_cache': {},
|
|
'secrets': {},
|
|
'yaml_files': ['.../badcomponent.yaml']
|
|
}, res)
|
|
|
|
res = check_config.check(get_test_config_dir('badplatform.yaml'))
|
|
change_yaml_files(res)
|
|
self.assertDictEqual({
|
|
'components': {},
|
|
'except': {check_config.ERROR_STR:
|
|
['Platform not found: light.beer']},
|
|
'secret_cache': {},
|
|
'secrets': {},
|
|
'yaml_files': ['.../badplatform.yaml']
|
|
}, res)
|
|
|
|
def test_secrets(self, mock_get_loop):
|
|
"""Test secrets config checking method."""
|
|
files = {
|
|
get_test_config_dir('secret.yaml'): (
|
|
BASE_CONFIG +
|
|
'http:\n'
|
|
' api_password: !secret http_pw'),
|
|
'secrets.yaml': ('logger: debug\n'
|
|
'http_pw: abc123'),
|
|
}
|
|
self.maxDiff = None
|
|
|
|
with patch_yaml_files(files):
|
|
config_path = get_test_config_dir('secret.yaml')
|
|
secrets_path = get_test_config_dir('secrets.yaml')
|
|
|
|
res = check_config.check(config_path)
|
|
change_yaml_files(res)
|
|
|
|
# convert secrets OrderedDict to dict for assertequal
|
|
for key, val in res['secret_cache'].items():
|
|
res['secret_cache'][key] = dict(val)
|
|
|
|
self.assertDictEqual({
|
|
'components': {'http': {'api_password': 'abc123',
|
|
'server_port': 8123}},
|
|
'except': {},
|
|
'secret_cache': {secrets_path: {'http_pw': 'abc123'}},
|
|
'secrets': {'http_pw': 'abc123'},
|
|
'yaml_files': ['.../secret.yaml', '.../secrets.yaml']
|
|
}, res)
|