|
13 | 13 | from homeassistant.components.recorder import Recorder |
14 | 14 | from homeassistant.components.sql.const import DOMAIN |
15 | 15 | from homeassistant.components.sql.services import SERVICE_QUERY |
| 16 | +from homeassistant.components.sql.util import generate_lambda_stmt |
16 | 17 | from homeassistant.core import HomeAssistant |
17 | 18 | from homeassistant.exceptions import ServiceValidationError |
18 | 19 | from homeassistant.setup import async_setup_component |
@@ -86,6 +87,35 @@ async def test_query_service_external_db(hass: HomeAssistant, tmp_path: Path) -> |
86 | 87 | } |
87 | 88 |
|
88 | 89 |
|
| 90 | +async def test_query_service_rollback_on_error(hass: HomeAssistant) -> None: |
| 91 | + """Test the query service.""" |
| 92 | + await async_setup_component(hass, DOMAIN, {}) |
| 93 | + await hass.async_block_till_done() |
| 94 | + |
| 95 | + with ( |
| 96 | + patch( |
| 97 | + "homeassistant.components.sql.services.generate_lambda_stmt", |
| 98 | + return_value=generate_lambda_stmt("Faulty syntax create operational issue"), |
| 99 | + ), |
| 100 | + pytest.raises( |
| 101 | + ServiceValidationError, match="An error occurred when executing the query" |
| 102 | + ), |
| 103 | + patch("sqlalchemy.orm.session.Session.rollback") as mock_session_rollback, |
| 104 | + ): |
| 105 | + await hass.services.async_call( |
| 106 | + DOMAIN, |
| 107 | + SERVICE_QUERY, |
| 108 | + { |
| 109 | + "query": "SELECT name, age FROM users ORDER BY age", |
| 110 | + "db_url": "sqlite:///", |
| 111 | + }, |
| 112 | + blocking=True, |
| 113 | + return_response=True, |
| 114 | + ) |
| 115 | + |
| 116 | + mock_session_rollback.assert_called_once() |
| 117 | + |
| 118 | + |
89 | 119 | async def test_query_service_data_conversion( |
90 | 120 | hass: HomeAssistant, tmp_path: Path |
91 | 121 | ) -> None: |
|
0 commit comments