Skip to content

Commit f618299

Browse files
committed
Extend test_services.test_query_service_rollback_on_error
Signed-off-by: David Rapan <[email protected]>
1 parent a6c3fb6 commit f618299

File tree

2 files changed

+59
-34
lines changed

2 files changed

+59
-34
lines changed

tests/components/sql/test_sensor.py

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -193,18 +193,6 @@ def make_test_db():
193193
@pytest.mark.parametrize(
194194
("patch_create", "url", "expected_patterns", "not_expected_patterns"),
195195
[
196-
(
197-
"homeassistant.components.sql.util.sqlalchemy.create_engine",
198-
"sqlite://homeassistant:[email protected]",
199-
["sqlite://****:****@homeassistant.local"],
200-
["sqlite://homeassistant:[email protected]"],
201-
),
202-
(
203-
"homeassistant.components.sql.util.sqlalchemy.create_engine",
204-
"sqlite://homeassistant.local",
205-
["sqlite://homeassistant.local"],
206-
[],
207-
),
208196
(
209197
"homeassistant.components.sql.util.create_async_engine",
210198
"sqlite+aiosqlite://homeassistant:[email protected]",
@@ -217,6 +205,18 @@ def make_test_db():
217205
["sqlite+aiosqlite://homeassistant.local"],
218206
[],
219207
),
208+
(
209+
"homeassistant.components.sql.util.sqlalchemy.create_engine",
210+
"sqlite://homeassistant:[email protected]",
211+
["sqlite://****:****@homeassistant.local"],
212+
["sqlite://homeassistant:[email protected]"],
213+
),
214+
(
215+
"homeassistant.components.sql.util.sqlalchemy.create_engine",
216+
"sqlite://homeassistant.local",
217+
["sqlite://homeassistant.local"],
218+
[],
219+
),
220220
],
221221
)
222222
async def test_invalid_url_setup(
@@ -301,7 +301,7 @@ def rollback(self) -> None:
301301
assert "sqlite://****:****@homeassistant.local" in caplog.text
302302

303303

304-
@pytest.mark.parametrize("async_driver", [False, True])
304+
@pytest.mark.parametrize("async_driver", [True, False])
305305
async def test_query_from_yaml(
306306
recorder_mock: Recorder, hass: HomeAssistant, async_driver: bool
307307
) -> None:
@@ -411,18 +411,6 @@ async def test_config_from_old_yaml(
411411
@pytest.mark.parametrize(
412412
("patch_create", "url", "expected_patterns", "not_expected_patterns"),
413413
[
414-
(
415-
"homeassistant.components.sql.util.sqlalchemy.create_engine",
416-
"sqlite://homeassistant:[email protected]",
417-
["sqlite://****:****@homeassistant.local"],
418-
["sqlite://homeassistant:[email protected]"],
419-
),
420-
(
421-
"homeassistant.components.sql.util.sqlalchemy.create_engine",
422-
"sqlite://homeassistant.local",
423-
["sqlite://homeassistant.local"],
424-
[],
425-
),
426414
(
427415
"homeassistant.components.sql.util.create_async_engine",
428416
"sqlite+aiosqlite://homeassistant:[email protected]",
@@ -435,6 +423,18 @@ async def test_config_from_old_yaml(
435423
["sqlite+aiosqlite://homeassistant.local"],
436424
[],
437425
),
426+
(
427+
"homeassistant.components.sql.util.sqlalchemy.create_engine",
428+
"sqlite://homeassistant:[email protected]",
429+
["sqlite://****:****@homeassistant.local"],
430+
["sqlite://homeassistant:[email protected]"],
431+
),
432+
(
433+
"homeassistant.components.sql.util.sqlalchemy.create_engine",
434+
"sqlite://homeassistant.local",
435+
["sqlite://homeassistant.local"],
436+
[],
437+
),
438438
],
439439
)
440440
async def test_invalid_url_setup_from_yaml(
@@ -728,17 +728,17 @@ async def test_attributes_from_entry_config(
728728
@pytest.mark.parametrize(
729729
("config", "patch_rollback"),
730730
[
731-
(
732-
{},
733-
"sqlalchemy.orm.session.Session.rollback",
734-
),
735731
(
736732
{CONF_DB_URL: "sqlite+aiosqlite:///"},
737733
"sqlalchemy.ext.asyncio.session.AsyncSession.rollback",
738734
),
735+
(
736+
{},
737+
"sqlalchemy.orm.session.Session.rollback",
738+
),
739739
],
740740
)
741-
async def test_session_rollback_on_error(
741+
async def test_query_rollback_on_error(
742742
recorder_mock: Recorder,
743743
hass: HomeAssistant,
744744
freezer: FrozenDateTimeFactory,

tests/components/sql/test_services.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
from __future__ import annotations
44

5+
from datetime import timedelta
56
from pathlib import Path
67
import sqlite3
78
from unittest.mock import patch
89

10+
from freezegun.api import FrozenDateTimeFactory
911
import pytest
10-
from sqlalchemy.exc import SQLAlchemyError
12+
from sqlalchemy import text
1113
import voluptuous as vol
1214
from voluptuous import MultipleInvalid
1315

@@ -18,6 +20,7 @@
1820
from homeassistant.exceptions import ServiceValidationError
1921
from homeassistant.setup import async_setup_component
2022

23+
from tests.common import async_fire_time_changed
2124
from tests.components.recorder.common import async_wait_recording_done
2225

2326

@@ -87,14 +90,30 @@ async def test_query_service_external_db(hass: HomeAssistant, tmp_path: Path) ->
8790
}
8891

8992

93+
@pytest.mark.parametrize(
94+
("async_driver", "patch_rollback"),
95+
[
96+
(
97+
True,
98+
"sqlalchemy.ext.asyncio.session.AsyncSession.rollback",
99+
),
100+
(
101+
False,
102+
"sqlalchemy.orm.session.Session.rollback",
103+
),
104+
],
105+
)
90106
async def test_query_service_rollback_on_error(
91107
hass: HomeAssistant,
92108
tmp_path: Path,
109+
freezer: FrozenDateTimeFactory,
93110
caplog: pytest.LogCaptureFixture,
111+
async_driver: bool,
112+
patch_rollback: str,
94113
) -> None:
95114
"""Test the query service."""
96115
db_path = tmp_path / "test.db"
97-
db_url = f"sqlite:///{db_path}"
116+
db_url = f"sqlite{'+aiosqlite' if async_driver else ''}:///{db_path}"
98117

99118
# Create and populate the external database
100119
conn = sqlite3.connect(db_path)
@@ -109,12 +128,12 @@ async def test_query_service_rollback_on_error(
109128
with (
110129
patch(
111130
"homeassistant.components.sql.services.generate_lambda_stmt",
112-
side_effect=SQLAlchemyError("Error executing query"),
131+
return_value=text("Faulty syntax create operational issue"),
113132
),
114133
pytest.raises(
115134
ServiceValidationError, match="An error occurred when executing the query"
116135
),
117-
patch("sqlalchemy.orm.session.Session.rollback") as mock_session_rollback,
136+
patch(patch_rollback) as mock_session_rollback,
118137
):
119138
await hass.services.async_call(
120139
DOMAIN,
@@ -124,8 +143,14 @@ async def test_query_service_rollback_on_error(
124143
return_response=True,
125144
)
126145

146+
freezer.tick(timedelta(minutes=1))
147+
async_fire_time_changed(hass)
148+
await hass.async_block_till_done(wait_background_tasks=True)
149+
assert "sqlite3.OperationalError" in caplog.text
127150
assert mock_session_rollback.call_count == 1
128151

152+
await hass.async_stop()
153+
129154

130155
async def test_query_service_data_conversion(
131156
hass: HomeAssistant, tmp_path: Path

0 commit comments

Comments
 (0)