diff --git a/homeassistant/components/sensor/hydroquebec.py b/homeassistant/components/sensor/hydroquebec.py index d4dea54514a..e10abc14ff1 100644 --- a/homeassistant/components/sensor/hydroquebec.py +++ b/homeassistant/components/sensor/hydroquebec.py @@ -21,7 +21,7 @@ from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['pyhydroquebec==2.0.2'] +REQUIREMENTS = ['pyhydroquebec==2.1.0'] _LOGGER = logging.getLogger(__name__) @@ -103,8 +103,12 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): password = config.get(CONF_PASSWORD) contract = config.get(CONF_CONTRACT) - hydroquebec_data = HydroquebecData(username, password, contract) + httpsession = hass.helpers.aiohttp_client.async_get_clientsession() + hydroquebec_data = HydroquebecData(username, password, httpsession, + contract) contracts = yield from hydroquebec_data.get_contract_list() + if not contracts: + return _LOGGER.info("Contract list: %s", ", ".join(contracts)) @@ -161,11 +165,11 @@ class HydroQuebecSensor(Entity): class HydroquebecData(object): """Get data from HydroQuebec.""" - def __init__(self, username, password, contract=None): + def __init__(self, username, password, httpsession, contract=None): """Initialize the data object.""" from pyhydroquebec import HydroQuebecClient self.client = HydroQuebecClient( - username, password, REQUESTS_TIMEOUT) + username, password, REQUESTS_TIMEOUT, httpsession) self._contract = contract self.data = {} @@ -173,17 +177,22 @@ class HydroquebecData(object): def get_contract_list(self): """Return the contract list.""" # Fetch data - yield from self._fetch_data() - return self.client.get_contracts() + ret = yield from self._fetch_data() + if ret: + return self.client.get_contracts() + return [] @asyncio.coroutine @Throttle(MIN_TIME_BETWEEN_UPDATES) def _fetch_data(self): """Fetch latest data from HydroQuebec.""" + from pyhydroquebec.client import PyHydroQuebecError try: yield from self.client.fetch_data() - except BaseException as exp: + except PyHydroQuebecError as exp: _LOGGER.error("Error on receive last Hydroquebec data: %s", exp) + return False + return True @asyncio.coroutine def async_update(self): diff --git a/requirements_all.txt b/requirements_all.txt index 7084efae27b..0dccf542fd9 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -717,7 +717,7 @@ pyhiveapi==0.2.10 pyhomematic==0.1.36 # homeassistant.components.sensor.hydroquebec -pyhydroquebec==2.0.2 +pyhydroquebec==2.1.0 # homeassistant.components.alarm_control_panel.ialarm pyialarm==0.2 diff --git a/tests/components/sensor/test_hydroquebec.py b/tests/components/sensor/test_hydroquebec.py index f2ca97313d3..debd6ef6167 100644 --- a/tests/components/sensor/test_hydroquebec.py +++ b/tests/components/sensor/test_hydroquebec.py @@ -15,7 +15,7 @@ CONTRACT = "123456789" class HydroQuebecClientMock(): """Fake Hydroquebec client.""" - def __init__(self, username, password, contract=None): + def __init__(self, username, password, contract=None, httpsession=None): """Fake Hydroquebec client init.""" pass @@ -36,16 +36,32 @@ class HydroQuebecClientMock(): class HydroQuebecClientMockError(HydroQuebecClientMock): """Fake Hydroquebec client error.""" + def get_contracts(self): + """Return fake hydroquebec contracts.""" + return [] + @asyncio.coroutine def fetch_data(self): """Return fake fetching data.""" - raise hydroquebec.PyHydroQuebecError("Fake Error") + raise PyHydroQuebecErrorMock("Fake Error") class PyHydroQuebecErrorMock(BaseException): """Fake PyHydroquebec Error.""" +class PyHydroQuebecClientFakeModule(): + """Fake pyfido.client module.""" + + PyHydroQuebecError = PyHydroQuebecErrorMock + + +class PyHydroQuebecFakeModule(): + """Fake pyfido module.""" + + HydroQuebecClient = HydroQuebecClientMockError + + @asyncio.coroutine def test_hydroquebec_sensor(loop, hass): """Test the Hydroquebec number sensor.""" @@ -79,11 +95,11 @@ def test_hydroquebec_sensor(loop, hass): def test_error(hass, caplog): """Test the Hydroquebec sensor errors.""" caplog.set_level(logging.ERROR) - sys.modules['pyhydroquebec'] = MagicMock() - sys.modules['pyhydroquebec.client'] = MagicMock() - import pyhydroquebec.client - pyhydroquebec.HydroQuebecClient = HydroQuebecClientMockError - pyhydroquebec.client.PyHydroQuebecError = BaseException - hydro_data = hydroquebec.HydroquebecData('username', 'password') - yield from hydro_data._fetch_data() - assert "Error on receive last Hydroquebec data: " in caplog.text + sys.modules['pyhydroquebec'] = PyHydroQuebecFakeModule() + sys.modules['pyhydroquebec.client'] = PyHydroQuebecClientFakeModule() + + config = {} + fake_async_add_devices = MagicMock() + yield from hydroquebec.async_setup_platform(hass, config, + fake_async_add_devices) + assert fake_async_add_devices.called is False