core/tests/components/flume/conftest.py

167 lines
4.6 KiB
Python
Raw Normal View History

"""Flume test fixtures."""
from collections.abc import Generator
import datetime
from http import HTTPStatus
from unittest.mock import patch
import jwt
import pytest
import requests
from requests_mock.mocker import Mocker
from homeassistant.components.flume.const import DOMAIN
from homeassistant.const import (
CONF_CLIENT_ID,
CONF_CLIENT_SECRET,
CONF_PASSWORD,
CONF_USERNAME,
)
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry
USER_ID = "test-user-id"
REFRESH_TOKEN = "refresh-token"
TOKEN_URL = "https://api.flumetech.com/oauth/token"
DEVICE_LIST_URL = (
"https://api.flumetech.com/users/test-user-id/devices?user=true&location=true"
)
BRIDGE_DEVICE = {
"id": "1234",
"type": 1, # Bridge
"location": {
"name": "Bridge Location",
},
"name": "Flume Bridge",
"connected": True,
}
SENSOR_DEVICE = {
"id": "1234",
"type": 2, # Sensor
"location": {
"name": "Sensor Location",
},
"name": "Flume Sensor",
"connected": True,
}
DEVICE_LIST = [BRIDGE_DEVICE, SENSOR_DEVICE]
NOTIFICATIONS_URL = "https://api.flumetech.com/users/test-user-id/notifications?limit=50&offset=0&sort_direction=ASC"
NOTIFICATION = {
"id": 111111,
"device_id": "6248148189204194987",
"user_id": USER_ID,
"type": 1,
"message": "Low Flow Leak triggered at Home. Water has been running for 2 hours averaging 0.43 gallons every minute.",
"created_datetime": "2020-01-15T16:33:39.000Z",
"title": "Potential Leak Detected!",
"read": True,
"extra": {
"query": {
"request_id": "SYSTEM_TRIGGERED_USAGE_ALERT",
"since_datetime": "2020-01-15 06:33:59",
"until_datetime": "2020-01-15 08:33:59",
"tz": "America/Los_Angeles",
"bucket": "MIN",
"raw": False,
"group_multiplier": 2,
"device_id": ["6248148189204194987"],
}
},
"event_rule": "Low Flow Leak",
}
NOTIFICATIONS_LIST = [NOTIFICATION]
@pytest.fixture(name="config_entry")
def config_entry_fixture(hass: HomeAssistant) -> MockConfigEntry:
"""Fixture to create a config entry."""
config_entry = MockConfigEntry(
domain=DOMAIN,
title="test-username",
unique_id="test-username",
data={
CONF_USERNAME: "test-username",
CONF_PASSWORD: "test-password",
CONF_CLIENT_ID: "client_id",
CONF_CLIENT_SECRET: "client_secret",
},
)
config_entry.add_to_hass(hass)
return config_entry
def encode_access_token() -> str:
"""Encode the payload of the access token."""
expiration_time = datetime.datetime.now() + datetime.timedelta(hours=12)
payload = {
"user_id": USER_ID,
"exp": int(expiration_time.timestamp()),
}
return jwt.encode(payload, key="secret")
@pytest.fixture(name="access_token")
def access_token_fixture(requests_mock: Mocker) -> Generator[None]:
"""Fixture to setup the access token."""
token_response = {
"refresh_token": REFRESH_TOKEN,
"access_token": encode_access_token(),
}
requests_mock.register_uri(
"POST",
TOKEN_URL,
status_code=HTTPStatus.OK,
json={"data": [token_response]},
)
with patch("homeassistant.components.flume.coordinator.FlumeAuth.write_token_file"):
yield
@pytest.fixture(name="device_list")
def device_list_fixture(requests_mock: Mocker) -> None:
"""Fixture to setup the device list API response access token."""
requests_mock.register_uri(
"GET",
DEVICE_LIST_URL,
status_code=HTTPStatus.OK,
json={
"data": DEVICE_LIST,
},
)
@pytest.fixture(name="device_list_timeout")
def device_list_timeout_fixture(requests_mock: Mocker) -> None:
"""Fixture to test a timeout when connecting to the device list url."""
requests_mock.register_uri(
"GET",
DEVICE_LIST_URL,
exc=requests.exceptions.ConnectTimeout,
)
@pytest.fixture(name="device_list_unauthorized")
def device_list_unauthorized_fixture(requests_mock: Mocker) -> None:
"""Fixture to test an authorized error from the device list url."""
requests_mock.register_uri(
"GET",
DEVICE_LIST_URL,
status_code=HTTPStatus.UNAUTHORIZED,
json={},
)
@pytest.fixture(name="notifications_list")
def notifications_list_fixture(requests_mock: Mocker) -> None:
"""Fixture to setup the device list API response access token."""
requests_mock.register_uri(
"GET",
NOTIFICATIONS_URL,
status_code=HTTPStatus.OK,
json={
"data": NOTIFICATIONS_LIST,
},
)