core/tests/components/flume/conftest.py

167 lines
4.6 KiB
Python

"""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,
},
)