From 00cbdffa126278bdd85dccba67e8e3bb38d69908 Mon Sep 17 00:00:00 2001
From: Paulus Schoutsen <paulus@paulusschoutsen.nl>
Date: Sat, 16 Jun 2018 17:12:03 -0400
Subject: [PATCH] Add experimental UI backend (#15002)

* Add experimental UI

* Add test

* Lint
---
 homeassistant/components/frontend/__init__.py | 31 ++++++++++++++++---
 tests/components/test_frontend.py             | 19 ++++++++++++
 2 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py
index 0c425ccd3b1..e38376edd9b 100644
--- a/homeassistant/components/frontend/__init__.py
+++ b/homeassistant/components/frontend/__init__.py
@@ -23,6 +23,7 @@ from homeassistant.const import CONF_NAME, EVENT_THEMES_UPDATED
 from homeassistant.core import callback
 from homeassistant.helpers.translation import async_get_translations
 from homeassistant.loader import bind_hass
+from homeassistant.util.yaml import load_yaml
 
 REQUIREMENTS = ['home-assistant-frontend==20180615.0']
 
@@ -105,6 +106,10 @@ SCHEMA_GET_TRANSLATIONS = websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend({
     vol.Required('type'): WS_TYPE_GET_TRANSLATIONS,
     vol.Required('language'): str,
 })
+WS_TYPE_GET_EXPERIMENTAL_UI = 'frontend/experimental_ui'
+SCHEMA_GET_EXPERIMENTAL_UI = websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend({
+    vol.Required('type'): WS_TYPE_GET_EXPERIMENTAL_UI,
+})
 
 
 class Panel:
@@ -210,6 +215,9 @@ async def async_setup(hass, config):
     hass.components.websocket_api.async_register_command(
         WS_TYPE_GET_TRANSLATIONS, websocket_get_translations,
         SCHEMA_GET_TRANSLATIONS)
+    hass.components.websocket_api.async_register_command(
+        WS_TYPE_GET_EXPERIMENTAL_UI, websocket_experimental_config,
+        SCHEMA_GET_EXPERIMENTAL_UI)
     hass.http.register_view(ManifestJSONView)
 
     conf = config.get(DOMAIN, {})
@@ -254,10 +262,11 @@ async def async_setup(hass, config):
         """Finalize setup of a panel."""
         panel.async_register_index_routes(hass.http.app.router, index_view)
 
-    await asyncio.wait([
-        async_register_built_in_panel(hass, panel)
-        for panel in ('dev-event', 'dev-info', 'dev-service', 'dev-state',
-                      'dev-template', 'dev-mqtt', 'kiosk')], loop=hass.loop)
+    await asyncio.wait(
+        [async_register_built_in_panel(hass, panel) for panel in (
+            'dev-event', 'dev-info', 'dev-service', 'dev-state',
+            'dev-template', 'dev-mqtt', 'kiosk', 'experimental-ui')],
+        loop=hass.loop)
 
     hass.data[DATA_FINALIZE_PANEL] = async_finalize_panel
 
@@ -488,3 +497,17 @@ def websocket_get_translations(hass, connection, msg):
         ))
 
     hass.async_add_job(send_translations())
+
+
+def websocket_experimental_config(hass, connection, msg):
+    """Send experimental UI config over websocket config."""
+    async def send_exp_config():
+        """Send experimental frontend config."""
+        config = await hass.async_add_job(
+            load_yaml, hass.config.path('experimental-ui.yaml'))
+
+        connection.send_message_outside(websocket_api.result_message(
+            msg['id'], config
+        ))
+
+    hass.async_add_job(send_exp_config())
diff --git a/tests/components/test_frontend.py b/tests/components/test_frontend.py
index 2f118f24ef0..cb0c72e9edd 100644
--- a/tests/components/test_frontend.py
+++ b/tests/components/test_frontend.py
@@ -278,3 +278,22 @@ async def test_get_translations(hass, hass_ws_client):
     assert msg['type'] == wapi.TYPE_RESULT
     assert msg['success']
     assert msg['result'] == {'resources': {'lang': 'nl'}}
+
+
+async def test_experimental_ui(hass, hass_ws_client):
+    """Test experimental_ui command."""
+    await async_setup_component(hass, 'frontend')
+    client = await hass_ws_client(hass)
+
+    with patch('homeassistant.components.frontend.load_yaml',
+               return_value={'hello': 'world'}):
+        await client.send_json({
+            'id': 5,
+            'type': 'frontend/experimental_ui',
+        })
+        msg = await client.receive_json()
+
+    assert msg['id'] == 5
+    assert msg['type'] == wapi.TYPE_RESULT
+    assert msg['success']
+    assert msg['result'] == {'hello': 'world'}
-- 
GitLab