124 lines
4.5 KiB
Python
124 lines
4.5 KiB
Python
|
"""Tests for the Ambiclimate config flow."""
|
||
|
import ambiclimate
|
||
|
from unittest.mock import Mock, patch
|
||
|
|
||
|
from homeassistant.components.ambiclimate import config_flow
|
||
|
from homeassistant.setup import async_setup_component
|
||
|
from homeassistant.util import aiohttp
|
||
|
from homeassistant import data_entry_flow
|
||
|
from tests.common import mock_coro
|
||
|
|
||
|
|
||
|
async def init_config_flow(hass):
|
||
|
"""Init a configuration flow."""
|
||
|
await async_setup_component(hass, 'http', {
|
||
|
'http': {
|
||
|
'base_url': 'https://hass.com'
|
||
|
}
|
||
|
})
|
||
|
|
||
|
config_flow.register_flow_implementation(hass, 'id', 'secret')
|
||
|
flow = config_flow.AmbiclimateFlowHandler()
|
||
|
|
||
|
flow.hass = hass
|
||
|
return flow
|
||
|
|
||
|
|
||
|
async def test_abort_if_no_implementation_registered(hass):
|
||
|
"""Test we abort if no implementation is registered."""
|
||
|
flow = config_flow.AmbiclimateFlowHandler()
|
||
|
flow.hass = hass
|
||
|
|
||
|
result = await flow.async_step_user()
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT
|
||
|
assert result['reason'] == 'no_config'
|
||
|
|
||
|
|
||
|
async def test_abort_if_already_setup(hass):
|
||
|
"""Test we abort if Ambiclimate is already setup."""
|
||
|
flow = await init_config_flow(hass)
|
||
|
|
||
|
with patch.object(hass.config_entries, 'async_entries', return_value=[{}]):
|
||
|
result = await flow.async_step_user()
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT
|
||
|
assert result['reason'] == 'already_setup'
|
||
|
|
||
|
with patch.object(hass.config_entries, 'async_entries', return_value=[{}]):
|
||
|
result = await flow.async_step_code()
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT
|
||
|
assert result['reason'] == 'already_setup'
|
||
|
|
||
|
|
||
|
async def test_full_flow_implementation(hass):
|
||
|
"""Test registering an implementation and finishing flow works."""
|
||
|
config_flow.register_flow_implementation(hass, None, None)
|
||
|
flow = await init_config_flow(hass)
|
||
|
|
||
|
result = await flow.async_step_user()
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_FORM
|
||
|
assert result['step_id'] == 'auth'
|
||
|
assert result['description_placeholders']['cb_url']\
|
||
|
== 'https://hass.com/api/ambiclimate'
|
||
|
|
||
|
url = result['description_placeholders']['authorization_url']
|
||
|
assert 'https://api.ambiclimate.com/oauth2/authorize' in url
|
||
|
assert 'client_id=id' in url
|
||
|
assert 'response_type=code' in url
|
||
|
assert 'redirect_uri=https%3A%2F%2Fhass.com%2Fapi%2Fambiclimate' in url
|
||
|
|
||
|
with patch('ambiclimate.AmbiclimateOAuth.get_access_token',
|
||
|
return_value=mock_coro('test')):
|
||
|
result = await flow.async_step_code('123ABC')
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||
|
assert result['title'] == 'Ambiclimate'
|
||
|
assert result['data']['callback_url'] == 'https://hass.com/api/ambiclimate'
|
||
|
assert result['data']['client_secret'] == 'secret'
|
||
|
assert result['data']['client_id'] == 'id'
|
||
|
|
||
|
with patch('ambiclimate.AmbiclimateOAuth.get_access_token',
|
||
|
return_value=mock_coro(None)):
|
||
|
result = await flow.async_step_code('123ABC')
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT
|
||
|
|
||
|
with patch('ambiclimate.AmbiclimateOAuth.get_access_token',
|
||
|
side_effect=ambiclimate.AmbiclimateOauthError()):
|
||
|
result = await flow.async_step_code('123ABC')
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT
|
||
|
|
||
|
|
||
|
async def test_abort_no_code(hass):
|
||
|
"""Test if no code is given to step_code."""
|
||
|
config_flow.register_flow_implementation(hass, None, None)
|
||
|
flow = await init_config_flow(hass)
|
||
|
|
||
|
result = await flow.async_step_code('invalid')
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT
|
||
|
assert result['reason'] == 'access_token'
|
||
|
|
||
|
|
||
|
async def test_already_setup(hass):
|
||
|
"""Test when already setup."""
|
||
|
config_flow.register_flow_implementation(hass, None, None)
|
||
|
flow = await init_config_flow(hass)
|
||
|
|
||
|
with patch.object(hass.config_entries, 'async_entries', return_value=True):
|
||
|
result = await flow.async_step_user()
|
||
|
|
||
|
assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT
|
||
|
assert result['reason'] == 'already_setup'
|
||
|
|
||
|
|
||
|
async def test_view(hass):
|
||
|
"""Test view."""
|
||
|
hass.config_entries.flow.async_init = Mock()
|
||
|
|
||
|
request = aiohttp.MockRequest(b'', query_string='code=test_code')
|
||
|
request.app = {'hass': hass}
|
||
|
view = config_flow.AmbiclimateAuthCallbackView()
|
||
|
assert await view.get(request) == 'OK!'
|
||
|
|
||
|
request = aiohttp.MockRequest(b'', query_string='')
|
||
|
request.app = {'hass': hass}
|
||
|
view = config_flow.AmbiclimateAuthCallbackView()
|
||
|
assert await view.get(request) == 'No code'
|