Skip to content
Snippets Groups Projects
Unverified Commit 91799e2b authored by mdegat01's avatar mdegat01 Committed by GitHub
Browse files

Modified Influx tests to mock test queries with accurate output (#37315)

parent 98bcf4f2
No related branches found
No related tags found
No related merge requests found
...@@ -11,6 +11,8 @@ from voluptuous import Invalid ...@@ -11,6 +11,8 @@ from voluptuous import Invalid
from homeassistant.components.influxdb.const import ( from homeassistant.components.influxdb.const import (
API_VERSION_2, API_VERSION_2,
DEFAULT_API_VERSION, DEFAULT_API_VERSION,
DEFAULT_BUCKET,
DEFAULT_DATABASE,
DOMAIN, DOMAIN,
TEST_QUERY_V1, TEST_QUERY_V1,
TEST_QUERY_V2, TEST_QUERY_V2,
...@@ -75,24 +77,6 @@ def mock_client_fixture(request): ...@@ -75,24 +77,6 @@ def mock_client_fixture(request):
yield client yield client
@pytest.fixture(autouse=True)
def mock_influx_platform():
"""
Mock the influx client and queue in the main platform.
Successful sensor setup is really independent of the main platform.
But since its one integration there is an internal dependency.
Mocking the client library there prevents failures and mocking the queue
to return `None` on get makes the listener shutdown immediately after initialization.
"""
with patch(f"{INFLUXDB_PATH}.InfluxDBClient") as mock_v1_client, patch(
f"{INFLUXDB_PATH}.InfluxDBClientV2"
) as mock_v2_client, patch(
f"{INFLUXDB_PATH}.queue.Queue.get", return_value=None
) as queue_get:
yield (mock_v1_client, mock_v2_client, queue_get)
@pytest.fixture(autouse=True, scope="module") @pytest.fixture(autouse=True, scope="module")
def mock_client_close(): def mock_client_close():
"""Mock close method of clients at module scope.""" """Mock close method of clients at module scope."""
...@@ -108,6 +92,12 @@ def _make_v1_resultset(*args): ...@@ -108,6 +92,12 @@ def _make_v1_resultset(*args):
yield {"value": arg} yield {"value": arg}
def _make_v1_databases_resultset():
"""Create a mock V1 'show databases' resultset."""
for name in [DEFAULT_DATABASE, "db2"]:
yield {"name": name}
def _make_v2_resultset(*args): def _make_v2_resultset(*args):
"""Create a mock V2 resultset.""" """Create a mock V2 resultset."""
tables = [] tables = []
...@@ -120,7 +110,18 @@ def _make_v2_resultset(*args): ...@@ -120,7 +110,18 @@ def _make_v2_resultset(*args):
return tables return tables
def _set_query_mock_v1(mock_influx_client, return_value=None, side_effect=None): def _make_v2_buckets_resultset():
"""Create a mock V2 'buckets()' resultset."""
records = []
for name in [DEFAULT_BUCKET, "bucket2"]:
records.append(Record({"name": name}))
return [Table(records)]
def _set_query_mock_v1(
mock_influx_client, return_value=None, query_exception=None, side_effect=None
):
"""Set return value or side effect for the V1 client.""" """Set return value or side effect for the V1 client."""
query_api = mock_influx_client.return_value.query query_api = mock_influx_client.return_value.query
if side_effect: if side_effect:
...@@ -133,10 +134,14 @@ def _set_query_mock_v1(mock_influx_client, return_value=None, side_effect=None): ...@@ -133,10 +134,14 @@ def _set_query_mock_v1(mock_influx_client, return_value=None, side_effect=None):
def get_return_value(query, **kwargs): def get_return_value(query, **kwargs):
"""Return mock for test query, return value otherwise.""" """Return mock for test query, return value otherwise."""
if query == TEST_QUERY_V1: if query == TEST_QUERY_V1:
return MagicMock() points = _make_v1_databases_resultset()
else:
if query_exception:
raise query_exception
points = return_value
query_output = MagicMock() query_output = MagicMock()
query_output.get_points.return_value = return_value query_output.get_points.return_value = points
return query_output return query_output
query_api.side_effect = get_return_value query_api.side_effect = get_return_value
...@@ -144,7 +149,9 @@ def _set_query_mock_v1(mock_influx_client, return_value=None, side_effect=None): ...@@ -144,7 +149,9 @@ def _set_query_mock_v1(mock_influx_client, return_value=None, side_effect=None):
return query_api return query_api
def _set_query_mock_v2(mock_influx_client, return_value=None, side_effect=None): def _set_query_mock_v2(
mock_influx_client, return_value=None, query_exception=None, side_effect=None
):
"""Set return value or side effect for the V2 client.""" """Set return value or side effect for the V2 client."""
query_api = mock_influx_client.return_value.query_api.return_value.query query_api = mock_influx_client.return_value.query_api.return_value.query
if side_effect: if side_effect:
...@@ -153,7 +160,17 @@ def _set_query_mock_v2(mock_influx_client, return_value=None, side_effect=None): ...@@ -153,7 +160,17 @@ def _set_query_mock_v2(mock_influx_client, return_value=None, side_effect=None):
if return_value is None: if return_value is None:
return_value = [] return_value = []
query_api.return_value = return_value def get_return_value(query):
"""Return buckets list for test query, return value otherwise."""
if query == TEST_QUERY_V2:
return _make_v2_buckets_resultset()
if query_exception:
raise query_exception
return return_value
query_api.side_effect = get_return_value
return query_api return query_api
...@@ -161,7 +178,7 @@ def _set_query_mock_v2(mock_influx_client, return_value=None, side_effect=None): ...@@ -161,7 +178,7 @@ def _set_query_mock_v2(mock_influx_client, return_value=None, side_effect=None):
async def _setup(hass, config_ext, queries, expected_sensors): async def _setup(hass, config_ext, queries, expected_sensors):
"""Create client and test expected sensors.""" """Create client and test expected sensors."""
config = { config = {
DOMAIN: {}, DOMAIN: config_ext,
sensor.DOMAIN: {"platform": DOMAIN}, sensor.DOMAIN: {"platform": DOMAIN},
} }
influx_config = config[sensor.DOMAIN] influx_config = config[sensor.DOMAIN]
...@@ -181,20 +198,21 @@ async def _setup(hass, config_ext, queries, expected_sensors): ...@@ -181,20 +198,21 @@ async def _setup(hass, config_ext, queries, expected_sensors):
@pytest.mark.parametrize( @pytest.mark.parametrize(
"mock_client, config_ext, queries", "mock_client, config_ext, queries, set_query_mock",
[ [
(DEFAULT_API_VERSION, BASE_V1_CONFIG, BASE_V1_QUERY), (DEFAULT_API_VERSION, BASE_V1_CONFIG, BASE_V1_QUERY, _set_query_mock_v1),
(API_VERSION_2, BASE_V2_CONFIG, BASE_V2_QUERY), (API_VERSION_2, BASE_V2_CONFIG, BASE_V2_QUERY, _set_query_mock_v2),
], ],
indirect=["mock_client"], indirect=["mock_client"],
) )
async def test_minimal_config(hass, mock_client, config_ext, queries): async def test_minimal_config(hass, mock_client, config_ext, queries, set_query_mock):
"""Test the minimal config and defaults.""" """Test the minimal config and defaults."""
set_query_mock(mock_client)
await _setup(hass, config_ext, queries, ["sensor.test"]) await _setup(hass, config_ext, queries, ["sensor.test"])
@pytest.mark.parametrize( @pytest.mark.parametrize(
"mock_client, config_ext, queries", "mock_client, config_ext, queries, set_query_mock",
[ [
( (
DEFAULT_API_VERSION, DEFAULT_API_VERSION,
...@@ -207,6 +225,8 @@ async def test_minimal_config(hass, mock_client, config_ext, queries): ...@@ -207,6 +225,8 @@ async def test_minimal_config(hass, mock_client, config_ext, queries):
"password": "pass", "password": "pass",
"database": "db", "database": "db",
"verify_ssl": "true", "verify_ssl": "true",
},
{
"queries": [ "queries": [
{ {
"name": "test", "name": "test",
...@@ -220,7 +240,7 @@ async def test_minimal_config(hass, mock_client, config_ext, queries): ...@@ -220,7 +240,7 @@ async def test_minimal_config(hass, mock_client, config_ext, queries):
} }
], ],
}, },
{}, _set_query_mock_v1,
), ),
( (
API_VERSION_2, API_VERSION_2,
...@@ -233,6 +253,8 @@ async def test_minimal_config(hass, mock_client, config_ext, queries): ...@@ -233,6 +253,8 @@ async def test_minimal_config(hass, mock_client, config_ext, queries):
"token": "token", "token": "token",
"organization": "org", "organization": "org",
"bucket": "bucket", "bucket": "bucket",
},
{
"queries_flux": [ "queries_flux": [
{ {
"name": "test", "name": "test",
...@@ -246,13 +268,14 @@ async def test_minimal_config(hass, mock_client, config_ext, queries): ...@@ -246,13 +268,14 @@ async def test_minimal_config(hass, mock_client, config_ext, queries):
} }
], ],
}, },
{}, _set_query_mock_v2,
), ),
], ],
indirect=["mock_client"], indirect=["mock_client"],
) )
async def test_full_config(hass, mock_client, config_ext, queries): async def test_full_config(hass, mock_client, config_ext, queries, set_query_mock):
"""Test the full config.""" """Test the full config."""
set_query_mock(mock_client)
await _setup(hass, config_ext, queries, ["sensor.test"]) await _setup(hass, config_ext, queries, ["sensor.test"])
...@@ -403,14 +426,7 @@ async def test_error_querying_influx( ...@@ -403,14 +426,7 @@ async def test_error_querying_influx(
hass, caplog, mock_client, config_ext, queries, set_query_mock, query_exception hass, caplog, mock_client, config_ext, queries, set_query_mock, query_exception
): ):
"""Test behavior of sensor when influx returns error.""" """Test behavior of sensor when influx returns error."""
set_query_mock(mock_client, query_exception=query_exception)
def mock_query_error(query, **kwargs):
"""Throw error for any query besides test query."""
if query in [TEST_QUERY_V1, TEST_QUERY_V2]:
return MagicMock()
raise query_exception
set_query_mock(mock_client, side_effect=mock_query_error)
sensors = await _setup(hass, config_ext, queries, ["sensor.test"]) sensors = await _setup(hass, config_ext, queries, ["sensor.test"])
assert sensors[0].state == STATE_UNKNOWN assert sensors[0].state == STATE_UNKNOWN
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment