Files
core/tests/components/sql/test_util.py
2025-09-28 19:03:13 +02:00

67 lines
1.9 KiB
Python

"""Test the sql utils."""
import pytest
import voluptuous as vol
from homeassistant.components.recorder import Recorder, get_instance
from homeassistant.components.sql.util import resolve_db_url, validate_sql_select
from homeassistant.core import HomeAssistant
async def test_resolve_db_url_when_none_configured(
recorder_mock: Recorder,
hass: HomeAssistant,
) -> None:
"""Test return recorder db_url if provided db_url is None."""
db_url = None
resolved_url = resolve_db_url(hass, db_url)
assert resolved_url == get_instance(hass).db_url
async def test_resolve_db_url_when_configured(hass: HomeAssistant) -> None:
"""Test return provided db_url if it's set."""
db_url = "mssql://"
resolved_url = resolve_db_url(hass, db_url)
assert resolved_url == db_url
@pytest.mark.parametrize(
("sql_query", "expected_error_message"),
[
(
"DROP TABLE *",
"Only SELECT queries allowed",
),
(
"SELECT5 as value",
"Invalid SQL query",
),
(
";;",
"Invalid SQL query",
),
(
"UPDATE states SET state = 999999 WHERE state_id = 11125",
"Only SELECT queries allowed",
),
(
"WITH test AS (SELECT state FROM states) UPDATE states SET states.state = test.state;",
"Only SELECT queries allowed",
),
(
"SELECT 5 as value; UPDATE states SET state = 10;",
"Multiple SQL queries are not supported",
),
],
)
async def test_invalid_sql_queries(
hass: HomeAssistant,
sql_query: str,
expected_error_message: str,
) -> None:
"""Test that various invalid or disallowed SQL queries raise the correct exception."""
with pytest.raises(vol.Invalid, match=expected_error_message):
validate_sql_select(sql_query)