mirror of https://github.com/home-assistant/core
163 lines
4.0 KiB
Python
163 lines
4.0 KiB
Python
"""Fixtures for emoncms integration tests."""
|
|
|
|
from collections.abc import AsyncGenerator, Generator
|
|
import copy
|
|
from unittest.mock import AsyncMock, patch
|
|
|
|
import pytest
|
|
|
|
from homeassistant.components.emoncms.const import CONF_ONLY_INCLUDE_FEEDID, DOMAIN
|
|
from homeassistant.const import (
|
|
CONF_API_KEY,
|
|
CONF_ID,
|
|
CONF_PLATFORM,
|
|
CONF_URL,
|
|
CONF_VALUE_TEMPLATE,
|
|
)
|
|
from homeassistant.helpers.typing import ConfigType
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
UNITS = ["kWh", "Wh", "W", "V", "A", "VA", "°C", "°F", "K", "Hz", "hPa", ""]
|
|
|
|
|
|
def get_feed(
|
|
number: int, unit: str = "W", value: int = 18.04, timestamp: int = 1665509570
|
|
):
|
|
"""Generate feed details."""
|
|
return {
|
|
"id": str(number),
|
|
"userid": "1",
|
|
"name": f"parameter {number}",
|
|
"tag": "tag",
|
|
"size": "35809224",
|
|
"unit": unit,
|
|
"time": timestamp,
|
|
"value": value,
|
|
}
|
|
|
|
|
|
FEEDS = [get_feed(i + 1, unit=unit) for i, unit in enumerate(UNITS)]
|
|
|
|
|
|
EMONCMS_FAILURE = {"success": False, "message": "failure"}
|
|
|
|
FLOW_RESULT = {
|
|
CONF_API_KEY: "my_api_key",
|
|
CONF_ONLY_INCLUDE_FEEDID: [str(i + 1) for i in range(len(UNITS))],
|
|
CONF_URL: "http://1.1.1.1",
|
|
}
|
|
|
|
SENSOR_NAME = "emoncms@1.1.1.1"
|
|
|
|
YAML_BASE = {
|
|
CONF_PLATFORM: "emoncms",
|
|
CONF_API_KEY: "my_api_key",
|
|
CONF_ID: 1,
|
|
CONF_URL: "http://1.1.1.1",
|
|
}
|
|
|
|
YAML = {
|
|
**YAML_BASE,
|
|
CONF_ONLY_INCLUDE_FEEDID: [1],
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def emoncms_yaml_config() -> ConfigType:
|
|
"""Mock emoncms yaml configuration."""
|
|
return {"sensor": YAML}
|
|
|
|
|
|
@pytest.fixture
|
|
def emoncms_yaml_config_with_template() -> ConfigType:
|
|
"""Mock emoncms yaml conf with template parameter."""
|
|
return {"sensor": {**YAML, CONF_VALUE_TEMPLATE: "{{ value | float + 1500 }}"}}
|
|
|
|
|
|
@pytest.fixture
|
|
def emoncms_yaml_config_no_include_only_feed_id() -> ConfigType:
|
|
"""Mock emoncms yaml configuration without include_only_feed_id parameter."""
|
|
return {"sensor": YAML_BASE}
|
|
|
|
|
|
@pytest.fixture
|
|
def config_entry() -> MockConfigEntry:
|
|
"""Mock emoncms config entry."""
|
|
return MockConfigEntry(
|
|
domain=DOMAIN,
|
|
title=SENSOR_NAME,
|
|
data=FLOW_RESULT,
|
|
)
|
|
|
|
|
|
FLOW_RESULT_SECOND_URL = copy.deepcopy(FLOW_RESULT)
|
|
FLOW_RESULT_SECOND_URL[CONF_URL] = "http://1.1.1.2"
|
|
|
|
|
|
@pytest.fixture
|
|
def config_entry_unique_id() -> MockConfigEntry:
|
|
"""Mock emoncms config entry."""
|
|
return MockConfigEntry(
|
|
domain=DOMAIN,
|
|
title=SENSOR_NAME,
|
|
data=FLOW_RESULT_SECOND_URL,
|
|
unique_id="123-53535292",
|
|
)
|
|
|
|
|
|
FLOW_RESULT_NO_FEED = copy.deepcopy(FLOW_RESULT)
|
|
FLOW_RESULT_NO_FEED[CONF_ONLY_INCLUDE_FEEDID] = None
|
|
|
|
|
|
@pytest.fixture
|
|
def config_no_feed() -> MockConfigEntry:
|
|
"""Mock emoncms config entry with no feed selected."""
|
|
return MockConfigEntry(
|
|
domain=DOMAIN,
|
|
title=SENSOR_NAME,
|
|
data=FLOW_RESULT_NO_FEED,
|
|
)
|
|
|
|
|
|
FLOW_RESULT_SINGLE_FEED = copy.deepcopy(FLOW_RESULT)
|
|
FLOW_RESULT_SINGLE_FEED[CONF_ONLY_INCLUDE_FEEDID] = ["1"]
|
|
|
|
|
|
@pytest.fixture
|
|
def config_single_feed() -> MockConfigEntry:
|
|
"""Mock emoncms config entry with a single feed exposed."""
|
|
return MockConfigEntry(
|
|
domain=DOMAIN,
|
|
title=SENSOR_NAME,
|
|
data=FLOW_RESULT_SINGLE_FEED,
|
|
entry_id="XXXXXXXX",
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_setup_entry() -> Generator[AsyncMock]:
|
|
"""Override async_setup_entry."""
|
|
with patch(
|
|
"homeassistant.components.emoncms.async_setup_entry", return_value=True
|
|
) as mock_setup_entry:
|
|
yield mock_setup_entry
|
|
|
|
|
|
@pytest.fixture
|
|
async def emoncms_client() -> AsyncGenerator[AsyncMock]:
|
|
"""Mock pyemoncms success response."""
|
|
with (
|
|
patch(
|
|
"homeassistant.components.emoncms.EmoncmsClient", autospec=True
|
|
) as mock_client,
|
|
patch(
|
|
"homeassistant.components.emoncms.config_flow.EmoncmsClient",
|
|
new=mock_client,
|
|
),
|
|
):
|
|
client = mock_client.return_value
|
|
client.async_request.return_value = {"success": True, "message": FEEDS}
|
|
client.async_get_uuid.return_value = "123-53535292"
|
|
yield client
|