Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions homeassistant/components/tradfri/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand All @@ -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(
Expand Down
6 changes: 6 additions & 0 deletions homeassistant/components/tradfri/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ async def async_step_auth(self, user_input=None):

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()

Expand Down
34 changes: 33 additions & 1 deletion tests/components/tradfri/test_config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
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
Expand Down Expand Up @@ -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'
72 changes: 72 additions & 0 deletions tests/components/tradfri/test_init.py
Original file line number Diff line number Diff line change
@@ -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'}