core/tests/components/foobot/test_sensor.py

96 lines
3.1 KiB
Python

"""The tests for the Foobot sensor platform."""
import asyncio
import re
import pytest
from homeassistant.components.foobot import sensor as foobot
import homeassistant.components.sensor as sensor
from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
HTTP_FORBIDDEN,
HTTP_INTERNAL_SERVER_ERROR,
TEMP_CELSIUS,
UNIT_PERCENTAGE,
)
from homeassistant.exceptions import PlatformNotReady
from homeassistant.setup import async_setup_component
from tests.async_mock import MagicMock
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})
await hass.async_block_till_done()
metrics = {
"co2": ["1232.0", CONCENTRATION_PARTS_PER_MILLION],
"temperature": ["21.1", TEMP_CELSIUS],
"humidity": ["49.5", UNIT_PERCENTAGE],
"pm2_5": ["144.8", CONCENTRATION_MICROGRAMS_PER_CUBIC_METER],
"voc": ["340.7", CONCENTRATION_PARTS_PER_BILLION],
"index": ["138.9", UNIT_PERCENTAGE],
}
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_entities = 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_entities
)
async def test_setup_permanent_error(hass, aioclient_mock):
"""Expected failures caused by permanent errors in API response."""
fake_async_add_entities = MagicMock()
errors = [400, 401, HTTP_FORBIDDEN]
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_entities
)
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_entities = MagicMock()
errors = [429, HTTP_INTERNAL_SERVER_ERROR]
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_entities
)