Prevent discovered Tradfri while already configured (#16891)

* Prevent discovered Tradfri while already configured

* Lint
pull/16895/merge
Paulus Schoutsen 2018-09-26 18:03:25 +02:00 committed by GitHub
parent 4b674b1d16
commit 273a7af330
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 120 additions and 4 deletions

View File

@ -44,10 +44,16 @@ async def async_setup(hass, config):
if conf is None:
return True
known_hosts = await hass.async_add_executor_job(
configured_hosts = [entry.data['host'] for entry in
hass.config_entries.async_entries(DOMAIN)]
legacy_hosts = await hass.async_add_executor_job(
load_json, hass.config.path(CONFIG_FILE))
for host, info in known_hosts.items():
for host, info in legacy_hosts.items():
if host in configured_hosts:
continue
info[CONF_HOST] = host
info[CONF_IMPORT_GROUPS] = conf[CONF_ALLOW_TRADFRI_GROUPS]
@ -58,7 +64,7 @@ async def async_setup(hass, config):
host = conf.get(CONF_HOST)
if host is None or host in known_hosts:
if host is None or host in configured_hosts or host in legacy_hosts:
return True
hass.async_create_task(hass.config_entries.flow.async_init(

View File

@ -77,6 +77,12 @@ class FlowHandler(config_entries.ConfigFlow):
async def async_step_discovery(self, user_input):
"""Handle discovery."""
for entry in self._async_current_entries():
if entry.data[CONF_HOST] == user_input['host']:
return self.async_abort(
reason='already_configured'
)
self._host = user_input['host']
return await self.async_step_auth()

View File

@ -6,7 +6,7 @@ import pytest
from homeassistant import data_entry_flow
from homeassistant.components.tradfri import config_flow
from tests.common import mock_coro
from tests.common import mock_coro, MockConfigEntry
@pytest.fixture
@ -185,3 +185,35 @@ async def test_import_connection_legacy(hass, mock_gateway_info,
assert len(mock_gateway_info.mock_calls) == 1
assert len(mock_entry_setup.mock_calls) == 1
async def test_discovery_duplicate_aborted(hass):
"""Test a duplicate discovery host is ignored."""
MockConfigEntry(
domain='tradfri',
data={'host': 'some-host'}
).add_to_hass(hass)
flow = await hass.config_entries.flow.async_init(
'tradfri', context={'source': 'discovery'}, data={
'host': 'some-host'
})
assert flow['type'] == data_entry_flow.RESULT_TYPE_ABORT
assert flow['reason'] == 'already_configured'
async def test_import_duplicate_aborted(hass):
"""Test a duplicate discovery host is ignored."""
MockConfigEntry(
domain='tradfri',
data={'host': 'some-host'}
).add_to_hass(hass)
flow = await hass.config_entries.flow.async_init(
'tradfri', context={'source': 'import'}, data={
'host': 'some-host'
})
assert flow['type'] == data_entry_flow.RESULT_TYPE_ABORT
assert flow['reason'] == 'already_configured'

View File

@ -0,0 +1,72 @@
"""Tests for Tradfri setup."""
from unittest.mock import patch
from homeassistant.setup import async_setup_component
from tests.common import MockConfigEntry
async def test_config_yaml_host_not_imported(hass):
"""Test that we don't import a configured host."""
MockConfigEntry(
domain='tradfri',
data={'host': 'mock-host'}
).add_to_hass(hass)
with patch('homeassistant.components.tradfri.load_json',
return_value={}), \
patch.object(hass.config_entries.flow, 'async_init') as mock_init:
assert await async_setup_component(hass, 'tradfri', {
'tradfri': {
'host': 'mock-host'
}
})
assert len(mock_init.mock_calls) == 0
async def test_config_yaml_host_imported(hass):
"""Test that we import a configured host."""
with patch('homeassistant.components.tradfri.load_json',
return_value={}):
assert await async_setup_component(hass, 'tradfri', {
'tradfri': {
'host': 'mock-host'
}
})
progress = hass.config_entries.flow.async_progress()
assert len(progress) == 1
assert progress[0]['handler'] == 'tradfri'
assert progress[0]['context'] == {'source': 'import'}
async def test_config_json_host_not_imported(hass):
"""Test that we don't import a configured host."""
MockConfigEntry(
domain='tradfri',
data={'host': 'mock-host'}
).add_to_hass(hass)
with patch('homeassistant.components.tradfri.load_json',
return_value={'mock-host': {'key': 'some-info'}}), \
patch.object(hass.config_entries.flow, 'async_init') as mock_init:
assert await async_setup_component(hass, 'tradfri', {
'tradfri': {}
})
assert len(mock_init.mock_calls) == 0
async def test_config_json_host_imported(hass):
"""Test that we import a configured host."""
with patch('homeassistant.components.tradfri.load_json',
return_value={'mock-host': {'key': 'some-info'}}):
assert await async_setup_component(hass, 'tradfri', {
'tradfri': {}
})
progress = hass.config_entries.flow.async_progress()
assert len(progress) == 1
assert progress[0]['handler'] == 'tradfri'
assert progress[0]['context'] == {'source': 'import'}