184 lines
6.6 KiB
Python
184 lines
6.6 KiB
Python
"""Test check_config script."""
|
|
import asyncio
|
|
import logging
|
|
import os # noqa: F401 pylint: disable=unused-import
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
import homeassistant.scripts.check_config as check_config
|
|
from homeassistant.config import YAML_CONFIG_FILE
|
|
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'
|
|
)
|
|
|
|
BAD_CORE_CONFIG = (
|
|
'homeassistant:\n'
|
|
' unit_system: bad\n'
|
|
'\n\n'
|
|
)
|
|
|
|
|
|
def normalize_yaml_files(check_dict):
|
|
"""Remove configuration path from ['yaml_files']."""
|
|
root = get_test_config_dir()
|
|
return [key.replace(root, '...')
|
|
for key in sorted(check_dict['yaml_files'].keys())]
|
|
|
|
|
|
# pylint: disable=unsubscriptable-object
|
|
class TestCheckConfig(unittest.TestCase):
|
|
"""Tests for the homeassistant.scripts.check_config module."""
|
|
|
|
def setUp(self):
|
|
"""Prepare the test."""
|
|
# Somewhere in the tests our event loop gets killed,
|
|
# this ensures we have one.
|
|
try:
|
|
asyncio.get_event_loop()
|
|
except RuntimeError:
|
|
asyncio.set_event_loop(asyncio.new_event_loop())
|
|
|
|
# Will allow seeing full diff
|
|
self.maxDiff = None # pylint: disable=invalid-name
|
|
|
|
# pylint: disable=no-self-use,invalid-name
|
|
@patch('os.path.isfile', return_value=True)
|
|
def test_bad_core_config(self, isfile_patch):
|
|
"""Test a bad core config setup."""
|
|
files = {
|
|
YAML_CONFIG_FILE: BAD_CORE_CONFIG,
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir())
|
|
assert res['except'].keys() == {'homeassistant'}
|
|
assert res['except']['homeassistant'][1] == {'unit_system': 'bad'}
|
|
|
|
@patch('os.path.isfile', return_value=True)
|
|
def test_config_platform_valid(self, isfile_patch):
|
|
"""Test a valid platform setup."""
|
|
files = {
|
|
YAML_CONFIG_FILE: BASE_CONFIG + 'light:\n platform: demo',
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir())
|
|
assert res['components'].keys() == {'homeassistant', 'light'}
|
|
assert res['components']['light'] == [{'platform': 'demo'}]
|
|
assert res['except'] == {}
|
|
assert res['secret_cache'] == {}
|
|
assert res['secrets'] == {}
|
|
assert len(res['yaml_files']) == 1
|
|
|
|
@patch('os.path.isfile', return_value=True)
|
|
def test_component_platform_not_found(self, isfile_patch):
|
|
"""Test errors if component or platform not found."""
|
|
# Make sure they don't exist
|
|
files = {
|
|
YAML_CONFIG_FILE: BASE_CONFIG + 'beer:',
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir())
|
|
assert res['components'].keys() == {'homeassistant'}
|
|
assert res['except'] == {
|
|
check_config.ERROR_STR: ['Component not found: beer']}
|
|
assert res['secret_cache'] == {}
|
|
assert res['secrets'] == {}
|
|
assert len(res['yaml_files']) == 1
|
|
|
|
files = {
|
|
YAML_CONFIG_FILE: BASE_CONFIG + 'light:\n platform: beer',
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir())
|
|
assert res['components'].keys() == {'homeassistant', 'light'}
|
|
assert res['components']['light'] == []
|
|
assert res['except'] == {
|
|
check_config.ERROR_STR: [
|
|
'Platform not found: light.beer',
|
|
]}
|
|
assert res['secret_cache'] == {}
|
|
assert res['secrets'] == {}
|
|
assert len(res['yaml_files']) == 1
|
|
|
|
@patch('os.path.isfile', return_value=True)
|
|
def test_secrets(self, isfile_patch):
|
|
"""Test secrets config checking method."""
|
|
secrets_path = get_test_config_dir('secrets.yaml')
|
|
|
|
files = {
|
|
get_test_config_dir(YAML_CONFIG_FILE): BASE_CONFIG + (
|
|
'http:\n'
|
|
' api_password: !secret http_pw'),
|
|
secrets_path: (
|
|
'logger: debug\n'
|
|
'http_pw: abc123'),
|
|
}
|
|
|
|
with patch_yaml_files(files):
|
|
|
|
res = check_config.check(get_test_config_dir(), True)
|
|
|
|
assert res['except'] == {}
|
|
assert res['components'].keys() == {'homeassistant', 'http'}
|
|
assert res['components']['http'] == {
|
|
'api_password': 'abc123',
|
|
'cors_allowed_origins': [],
|
|
'ip_ban_enabled': True,
|
|
'login_attempts_threshold': -1,
|
|
'server_host': '0.0.0.0',
|
|
'server_port': 8123,
|
|
'trusted_networks': [],
|
|
'ssl_profile': 'modern',
|
|
}
|
|
assert res['secret_cache'] == {secrets_path: {'http_pw': 'abc123'}}
|
|
assert res['secrets'] == {'http_pw': 'abc123'}
|
|
assert normalize_yaml_files(res) == [
|
|
'.../configuration.yaml', '.../secrets.yaml']
|
|
|
|
@patch('os.path.isfile', return_value=True)
|
|
def test_package_invalid(self, isfile_patch):
|
|
"""Test a valid platform setup."""
|
|
files = {
|
|
YAML_CONFIG_FILE: BASE_CONFIG + (
|
|
' packages:\n'
|
|
' p1:\n'
|
|
' group: ["a"]'),
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir())
|
|
|
|
assert res['except'].keys() == {'homeassistant.packages.p1.group'}
|
|
assert res['except']['homeassistant.packages.p1.group'][1] == \
|
|
{'group': ['a']}
|
|
assert len(res['except']) == 1
|
|
assert res['components'].keys() == {'homeassistant'}
|
|
assert len(res['components']) == 1
|
|
assert res['secret_cache'] == {}
|
|
assert res['secrets'] == {}
|
|
assert len(res['yaml_files']) == 1
|
|
|
|
def test_bootstrap_error(self):
|
|
"""Test a valid platform setup."""
|
|
files = {
|
|
YAML_CONFIG_FILE: BASE_CONFIG + 'automation: !include no.yaml',
|
|
}
|
|
with patch_yaml_files(files):
|
|
res = check_config.check(get_test_config_dir(YAML_CONFIG_FILE))
|
|
err = res['except'].pop(check_config.ERROR_STR)
|
|
assert len(err) == 1
|
|
assert res['except'] == {}
|
|
assert res['components'] == {} # No components, load failed
|
|
assert res['secret_cache'] == {}
|
|
assert res['secrets'] == {}
|
|
assert res['yaml_files'] == {}
|