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
8 changes: 7 additions & 1 deletion homeassistant/components/config/automation.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Provide configuration end points for Automations."""
import asyncio
from collections import OrderedDict
import uuid

from homeassistant.const import CONF_ID
from homeassistant.components.config import EditIdBasedConfigView
Expand Down Expand Up @@ -29,7 +30,12 @@ def _write_value(self, hass, data, config_key, new_value):
"""Set value."""
index = None
for index, cur_value in enumerate(data):
if cur_value[CONF_ID] == config_key:
# When people copy paste their automations to the config file,
# they sometimes forget to add IDs. Fix it here.
if CONF_ID not in cur_value:
cur_value[CONF_ID] = uuid.uuid4().hex

elif cur_value[CONF_ID] == config_key:
break
else:
cur_value = OrderedDict()
Expand Down
67 changes: 60 additions & 7 deletions tests/components/config/test_automation.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ async def test_update_device_config(hass, aiohttp_client):
client = await aiohttp_client(hass.http.app)

orig_data = [
{
'id': 'sun',
},
{
'id': 'moon',
}
]
{
'id': 'sun',
},
{
'id': 'moon',
}
]

def mock_read(path):
"""Mock reading data."""
Expand Down Expand Up @@ -81,3 +81,56 @@ def mock_write(path, data):
'action': [],
}
assert written[0] == orig_data


async def test_bad_formatted_automations(hass, aiohttp_client):
"""Test that we handle automations without ID."""
with patch.object(config, 'SECTIONS', ['automation']):
await async_setup_component(hass, 'config', {})

client = await aiohttp_client(hass.http.app)

orig_data = [
{
# No ID
'action': {
'event': 'hello'
}
},
{
'id': 'moon',
}
]

def mock_read(path):
"""Mock reading data."""
return orig_data

written = []

def mock_write(path, data):
"""Mock writing data."""
written.append(data)

with patch('homeassistant.components.config._read', mock_read), \
patch('homeassistant.components.config._write', mock_write):
resp = await client.post(
'/api/config/automation/config/moon', data=json.dumps({
'trigger': [],
'action': [],
'condition': [],
}))

assert resp.status == 200
result = await resp.json()
assert result == {'result': 'ok'}

# Verify ID added to orig_data
assert 'id' in orig_data[0]

assert orig_data[1] == {
'id': 'moon',
'trigger': [],
'condition': [],
'action': [],
}