Adding Foobot device sensor (#12417)

* Added Foobot device sensor

* Added error handling tests

* Corrections after PR review.

* Migrated to async/await syntax

 * lint fixes
 * stop raising HomeAssistantError
 * debug log for number of requests

* Moved shared data between sensors from a class attribute to a separate class

* Made test more async-aware

disabled setup error test for now as it's not working

* Working failure scenarios tests
This commit is contained in:
Fabien Piuzzi 2018-03-16 03:50:58 +01:00 committed by Paulus Schoutsen
parent 2350ce96a6
commit 0deef34881
8 changed files with 289 additions and 0 deletions

View file

@ -0,0 +1,81 @@
"""The tests for the Foobot sensor platform."""
import re
import asyncio
from unittest.mock import MagicMock
import pytest
import homeassistant.components.sensor as sensor
from homeassistant.components.sensor import foobot
from homeassistant.const import (TEMP_CELSIUS)
from homeassistant.exceptions import PlatformNotReady
from homeassistant.setup import async_setup_component
from tests.common import load_fixture
VALID_CONFIG = {
'platform': 'foobot',
'token': 'adfdsfasd',
'username': 'example@example.com',
}
async def test_default_setup(hass, aioclient_mock):
"""Test the default setup."""
aioclient_mock.get(re.compile('api.foobot.io/v2/owner/.*'),
text=load_fixture('foobot_devices.json'))
aioclient_mock.get(re.compile('api.foobot.io/v2/device/.*'),
text=load_fixture('foobot_data.json'))
assert await async_setup_component(hass, sensor.DOMAIN,
{'sensor': VALID_CONFIG})
metrics = {'co2': ['1232.0', 'ppm'],
'temperature': ['21.1', TEMP_CELSIUS],
'humidity': ['49.5', '%'],
'pm25': ['144.8', 'µg/m3'],
'voc': ['340.7', 'ppb'],
'index': ['138.9', '%']}
for name, value in metrics.items():
state = hass.states.get('sensor.foobot_happybot_%s' % name)
assert state.state == value[0]
assert state.attributes.get('unit_of_measurement') == value[1]
async def test_setup_timeout_error(hass, aioclient_mock):
"""Expected failures caused by a timeout in API response."""
fake_async_add_devices = MagicMock()
aioclient_mock.get(re.compile('api.foobot.io/v2/owner/.*'),
exc=asyncio.TimeoutError())
with pytest.raises(PlatformNotReady):
await foobot.async_setup_platform(hass, {'sensor': VALID_CONFIG},
fake_async_add_devices)
async def test_setup_permanent_error(hass, aioclient_mock):
"""Expected failures caused by permanent errors in API response."""
fake_async_add_devices = MagicMock()
errors = [400, 401, 403]
for error in errors:
aioclient_mock.get(re.compile('api.foobot.io/v2/owner/.*'),
status=error)
result = await foobot.async_setup_platform(hass,
{'sensor': VALID_CONFIG},
fake_async_add_devices)
assert result is None
async def test_setup_temporary_error(hass, aioclient_mock):
"""Expected failures caused by temporary errors in API response."""
fake_async_add_devices = MagicMock()
errors = [429, 500]
for error in errors:
aioclient_mock.get(re.compile('api.foobot.io/v2/owner/.*'),
status=error)
with pytest.raises(PlatformNotReady):
await foobot.async_setup_platform(hass,
{'sensor': VALID_CONFIG},
fake_async_add_devices)