diff --git a/homeassistant/components/hangouts/__init__.py b/homeassistant/components/hangouts/__init__.py index 953994d6ac0..d4892c66890 100644 --- a/homeassistant/components/hangouts/__init__.py +++ b/homeassistant/components/hangouts/__init__.py @@ -1,16 +1,16 @@ """Support for Hangouts.""" import logging +from hangups.auth import GoogleAuthError import voluptuous as vol from homeassistant import config_entries +from homeassistant.components.conversation.util import create_matcher from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.helpers import dispatcher, intent import homeassistant.helpers.config_validation as cv -from homeassistant.components.conversation.util import create_matcher # We need an import from .config_flow, without it .config_flow is never loaded. -from .intents import HelpIntent from .config_flow import HangoutsFlowHandler # noqa: F401 from .const import ( CONF_BOT, @@ -32,6 +32,8 @@ from .const import ( SERVICE_UPDATE, TARGETS_SCHEMA, ) +from .hangouts_bot import HangoutsBot +from .intents import HelpIntent _LOGGER = logging.getLogger(__name__) @@ -96,11 +98,7 @@ async def async_setup(hass, config): async def async_setup_entry(hass, config): """Set up a config entry.""" - from hangups.auth import GoogleAuthError - try: - from .hangouts_bot import HangoutsBot - bot = HangoutsBot( hass, config.data.get(CONF_REFRESH_TOKEN), diff --git a/homeassistant/components/hangouts/config_flow.py b/homeassistant/components/hangouts/config_flow.py index 8e262d8b40f..f253df49341 100644 --- a/homeassistant/components/hangouts/config_flow.py +++ b/homeassistant/components/hangouts/config_flow.py @@ -1,7 +1,8 @@ """Config flow to configure Google Hangouts.""" import functools -import voluptuous as vol +from hangups import get_auth +import voluptuous as vol from homeassistant import config_entries from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -9,10 +10,16 @@ from homeassistant.core import callback from .const import ( CONF_2FA, - CONF_REFRESH_TOKEN, CONF_AUTH_CODE, + CONF_REFRESH_TOKEN, DOMAIN as HANGOUTS_DOMAIN, ) +from .hangups_utils import ( + Google2FAError, + GoogleAuthError, + HangoutsCredentials, + HangoutsRefreshToken, +) @callback @@ -44,14 +51,6 @@ class HangoutsFlowHandler(config_entries.ConfigFlow): return self.async_abort(reason="already_configured") if user_input is not None: - from hangups import get_auth - from .hangups_utils import ( - HangoutsCredentials, - HangoutsRefreshToken, - GoogleAuthError, - Google2FAError, - ) - user_email = user_input[CONF_EMAIL] user_password = user_input[CONF_PASSWORD] user_auth_code = user_input.get(CONF_AUTH_CODE) @@ -99,9 +98,6 @@ class HangoutsFlowHandler(config_entries.ConfigFlow): errors = {} if user_input is not None: - from hangups import get_auth - from .hangups_utils import GoogleAuthError - self._credentials.set_verification_code(user_input[CONF_2FA]) try: await self.hass.async_add_executor_job( diff --git a/homeassistant/components/hangouts/hangouts_bot.py b/homeassistant/components/hangouts/hangouts_bot.py index 9eee2ca2be3..8575a547a9c 100644 --- a/homeassistant/components/hangouts/hangouts_bot.py +++ b/homeassistant/components/hangouts/hangouts_bot.py @@ -4,6 +4,8 @@ import io import logging import aiohttp +import hangups +from hangups import ChatMessageEvent, ChatMessageSegment, Client, get_auth, hangouts_pb2 from homeassistant.helpers import dispatcher, intent from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -24,6 +26,7 @@ from .const import ( EVENT_HANGOUTS_MESSAGE_RECEIVED, INTENT_HELP, ) +from .hangups_utils import HangoutsCredentials, HangoutsRefreshToken _LOGGER = logging.getLogger(__name__) @@ -126,8 +129,6 @@ class HangoutsBot: ) async def _async_handle_conversation_event(self, event): - from hangups import ChatMessageEvent - if isinstance(event, ChatMessageEvent): dispatcher.async_dispatcher_send( self.hass, @@ -196,11 +197,6 @@ class HangoutsBot: async def async_connect(self): """Login to the Google Hangouts.""" - from .hangups_utils import HangoutsRefreshToken, HangoutsCredentials - - from hangups import Client - from hangups import get_auth - session = await self.hass.async_add_executor_job( get_auth, HangoutsCredentials(None, None, None), @@ -252,8 +248,6 @@ class HangoutsBot: if not conversations: return False - from hangups import ChatMessageSegment, hangouts_pb2 - messages = [] for segment in message: if messages: @@ -306,8 +300,6 @@ class HangoutsBot: await conv.send_message(messages, image_file) async def _async_list_conversations(self): - import hangups - ( self._user_list, self._conversation_list, diff --git a/tests/components/hangouts/test_config_flow.py b/tests/components/hangouts/test_config_flow.py index 29585db5f61..93f909d3bd4 100644 --- a/tests/components/hangouts/test_config_flow.py +++ b/tests/components/hangouts/test_config_flow.py @@ -4,6 +4,10 @@ from unittest.mock import patch from homeassistant import data_entry_flow from homeassistant.components.hangouts import config_flow +from homeassistant.const import CONF_EMAIL, CONF_PASSWORD + +EMAIL = "test@test.com" +PASSWORD = "1232456" async def test_flow_works(hass, aioclient_mock): @@ -12,12 +16,12 @@ async def test_flow_works(hass, aioclient_mock): flow.hass = hass - with patch("hangups.get_auth"): + with patch("homeassistant.components.hangouts.config_flow.get_auth"): result = await flow.async_step_user( - {"email": "test@test.com", "password": "1232456"} + {CONF_EMAIL: EMAIL, CONF_PASSWORD: PASSWORD} ) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["title"] == "test@test.com" + assert result["title"] == EMAIL async def test_flow_works_with_authcode(hass, aioclient_mock): @@ -26,16 +30,16 @@ async def test_flow_works_with_authcode(hass, aioclient_mock): flow.hass = hass - with patch("hangups.get_auth"): + with patch("homeassistant.components.hangouts.config_flow.get_auth"): result = await flow.async_step_user( { - "email": "test@test.com", - "password": "1232456", + CONF_EMAIL: EMAIL, + CONF_PASSWORD: PASSWORD, "authorization_code": "c29tZXJhbmRvbXN0cmluZw==", } ) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["title"] == "test@test.com" + assert result["title"] == EMAIL async def test_flow_works_with_2fa(hass, aioclient_mock): @@ -46,17 +50,20 @@ async def test_flow_works_with_2fa(hass, aioclient_mock): flow.hass = hass - with patch("hangups.get_auth", side_effect=Google2FAError): + with patch( + "homeassistant.components.hangouts.config_flow.get_auth", + side_effect=Google2FAError, + ): result = await flow.async_step_user( - {"email": "test@test.com", "password": "1232456"} + {CONF_EMAIL: EMAIL, CONF_PASSWORD: PASSWORD} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "2fa" - with patch("hangups.get_auth"): + with patch("homeassistant.components.hangouts.config_flow.get_auth"): result = await flow.async_step_2fa({"2fa": 123456}) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["title"] == "test@test.com" + assert result["title"] == EMAIL async def test_flow_with_unknown_2fa(hass, aioclient_mock): @@ -68,11 +75,11 @@ async def test_flow_with_unknown_2fa(hass, aioclient_mock): flow.hass = hass with patch( - "hangups.get_auth", + "homeassistant.components.hangouts.config_flow.get_auth", side_effect=GoogleAuthError("Unknown verification code input"), ): result = await flow.async_step_user( - {"email": "test@test.com", "password": "1232456"} + {CONF_EMAIL: EMAIL, CONF_PASSWORD: PASSWORD} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["errors"]["base"] == "invalid_2fa_method" @@ -86,9 +93,12 @@ async def test_flow_invalid_login(hass, aioclient_mock): flow.hass = hass - with patch("hangups.get_auth", side_effect=GoogleAuthError): + with patch( + "homeassistant.components.hangouts.config_flow.get_auth", + side_effect=GoogleAuthError, + ): result = await flow.async_step_user( - {"email": "test@test.com", "password": "1232456"} + {CONF_EMAIL: EMAIL, CONF_PASSWORD: PASSWORD} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["errors"]["base"] == "invalid_login" @@ -102,14 +112,20 @@ async def test_flow_invalid_2fa(hass, aioclient_mock): flow.hass = hass - with patch("hangups.get_auth", side_effect=Google2FAError): + with patch( + "homeassistant.components.hangouts.config_flow.get_auth", + side_effect=Google2FAError, + ): result = await flow.async_step_user( - {"email": "test@test.com", "password": "1232456"} + {CONF_EMAIL: EMAIL, CONF_PASSWORD: PASSWORD} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "2fa" - with patch("hangups.get_auth", side_effect=Google2FAError): + with patch( + "homeassistant.components.hangouts.config_flow.get_auth", + side_effect=Google2FAError, + ): result = await flow.async_step_2fa({"2fa": 123456}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM