mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 16:57:10 +00:00
Convert progress API to WS (#26082)
This commit is contained in:
parent
1fe3b147fa
commit
93a800a612
@ -1,4 +1,5 @@
|
|||||||
"""Http views to control the config manager."""
|
"""Http views to control the config manager."""
|
||||||
|
import aiohttp.web_exceptions
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries, data_entry_flow
|
from homeassistant import config_entries, data_entry_flow
|
||||||
@ -28,6 +29,7 @@ async def async_setup(hass):
|
|||||||
OptionManagerFlowResourceView(hass.config_entries.options.flow)
|
OptionManagerFlowResourceView(hass.config_entries.options.flow)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
hass.components.websocket_api.async_register_command(config_entries_progress)
|
||||||
hass.components.websocket_api.async_register_command(system_options_list)
|
hass.components.websocket_api.async_register_command(system_options_list)
|
||||||
hass.components.websocket_api.async_register_command(system_options_update)
|
hass.components.websocket_api.async_register_command(system_options_update)
|
||||||
|
|
||||||
@ -116,23 +118,8 @@ class ConfigManagerFlowIndexView(FlowManagerIndexView):
|
|||||||
name = "api:config:config_entries:flow"
|
name = "api:config:config_entries:flow"
|
||||||
|
|
||||||
async def get(self, request):
|
async def get(self, request):
|
||||||
"""List flows that are in progress but not started by a user.
|
"""Not implemented."""
|
||||||
|
raise aiohttp.web_exceptions.HTTPMethodNotAllowed("GET", ["POST"])
|
||||||
Example of a non-user initiated flow is a discovered Hue hub that
|
|
||||||
requires user interaction to finish setup.
|
|
||||||
"""
|
|
||||||
if not request["hass_user"].is_admin:
|
|
||||||
raise Unauthorized(perm_category=CAT_CONFIG_ENTRIES, permission="add")
|
|
||||||
|
|
||||||
hass = request.app["hass"]
|
|
||||||
|
|
||||||
return self.json(
|
|
||||||
[
|
|
||||||
flw
|
|
||||||
for flw in hass.config_entries.flow.async_progress()
|
|
||||||
if flw["context"]["source"] != config_entries.SOURCE_USER
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
# pylint: disable=arguments-differ
|
# pylint: disable=arguments-differ
|
||||||
async def post(self, request):
|
async def post(self, request):
|
||||||
@ -241,6 +228,24 @@ class OptionManagerFlowResourceView(FlowManagerResourceView):
|
|||||||
return await super().post(request, flow_id)
|
return await super().post(request, flow_id)
|
||||||
|
|
||||||
|
|
||||||
|
@websocket_api.require_admin
|
||||||
|
@websocket_api.websocket_command({"type": "config_entries/flow/progress"})
|
||||||
|
def config_entries_progress(hass, connection, msg):
|
||||||
|
"""List flows that are in progress but not started by a user.
|
||||||
|
|
||||||
|
Example of a non-user initiated flow is a discovered Hue hub that
|
||||||
|
requires user interaction to finish setup.
|
||||||
|
"""
|
||||||
|
connection.send_result(
|
||||||
|
msg["id"],
|
||||||
|
[
|
||||||
|
flw
|
||||||
|
for flw in hass.config_entries.flow.async_progress()
|
||||||
|
if flw["context"]["source"] != config_entries.SOURCE_USER
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@websocket_api.require_admin
|
@websocket_api.require_admin
|
||||||
@websocket_api.async_response
|
@websocket_api.async_response
|
||||||
@websocket_api.websocket_command(
|
@websocket_api.websocket_command(
|
||||||
|
@ -373,40 +373,46 @@ async def test_continue_flow_unauth(hass, client, hass_admin_user):
|
|||||||
assert resp.status == 401
|
assert resp.status == 401
|
||||||
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
async def test_get_progress_index(hass, hass_ws_client):
|
||||||
def test_get_progress_index(hass, client):
|
|
||||||
"""Test querying for the flows that are in progress."""
|
"""Test querying for the flows that are in progress."""
|
||||||
|
assert await async_setup_component(hass, "config", {})
|
||||||
mock_entity_platform(hass, "config_flow.test", None)
|
mock_entity_platform(hass, "config_flow.test", None)
|
||||||
|
ws_client = await hass_ws_client(hass)
|
||||||
|
|
||||||
class TestFlow(core_ce.ConfigFlow):
|
class TestFlow(core_ce.ConfigFlow):
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
|
|
||||||
@asyncio.coroutine
|
async def async_step_hassio(self, info):
|
||||||
def async_step_hassio(self, info):
|
return await self.async_step_account()
|
||||||
return (yield from self.async_step_account())
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
async def async_step_account(self, user_input=None):
|
||||||
def async_step_account(self, user_input=None):
|
|
||||||
return self.async_show_form(step_id="account")
|
return self.async_show_form(step_id="account")
|
||||||
|
|
||||||
with patch.dict(HANDLERS, {"test": TestFlow}):
|
with patch.dict(HANDLERS, {"test": TestFlow}):
|
||||||
form = yield from hass.config_entries.flow.async_init(
|
form = await hass.config_entries.flow.async_init(
|
||||||
"test", context={"source": "hassio"}
|
"test", context={"source": "hassio"}
|
||||||
)
|
)
|
||||||
|
|
||||||
resp = yield from client.get("/api/config/config_entries/flow")
|
await ws_client.send_json({"id": 5, "type": "config_entries/flow/progress"})
|
||||||
assert resp.status == 200
|
response = await ws_client.receive_json()
|
||||||
data = yield from resp.json()
|
|
||||||
assert data == [
|
assert response["success"]
|
||||||
|
assert response["result"] == [
|
||||||
{"flow_id": form["flow_id"], "handler": "test", "context": {"source": "hassio"}}
|
{"flow_id": form["flow_id"], "handler": "test", "context": {"source": "hassio"}}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
async def test_get_progress_index_unauth(hass, client, hass_admin_user):
|
async def test_get_progress_index_unauth(hass, hass_ws_client, hass_admin_user):
|
||||||
"""Test we can't get flows that are in progress."""
|
"""Test we can't get flows that are in progress."""
|
||||||
|
assert await async_setup_component(hass, "config", {})
|
||||||
hass_admin_user.groups = []
|
hass_admin_user.groups = []
|
||||||
resp = await client.get("/api/config/config_entries/flow")
|
ws_client = await hass_ws_client(hass)
|
||||||
assert resp.status == 401
|
|
||||||
|
await ws_client.send_json({"id": 5, "type": "config_entries/flow/progress"})
|
||||||
|
response = await ws_client.receive_json()
|
||||||
|
|
||||||
|
assert not response["success"]
|
||||||
|
assert response["error"]["code"] == "unauthorized"
|
||||||
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
|
Loading…
x
Reference in New Issue
Block a user