diff --git a/homeassistant/components/websocket_api/commands.py b/homeassistant/components/websocket_api/commands.py index 85725361bcf28c..a9755217dd4fe3 100644 --- a/homeassistant/components/websocket_api/commands.py +++ b/homeassistant/components/websocket_api/commands.py @@ -1076,6 +1076,8 @@ async def handle_execute_script( translation_placeholders=err.translation_placeholders, ) return + finally: + script_obj.async_unload() connection.send_result( msg["id"], { diff --git a/tests/components/websocket_api/test_commands.py b/tests/components/websocket_api/test_commands.py index 10cc6fc7d6bf85..0056553f598c16 100644 --- a/tests/components/websocket_api/test_commands.py +++ b/tests/components/websocket_api/test_commands.py @@ -4432,3 +4432,29 @@ async def test_get_automation_component_lookup_table_cache( _get_automation_component_lookup_table(hass, "services", services) is service_result1 ) + + +@pytest.mark.parametrize( + ("side_effect", "expect_success"), + [(Exception("error"), False), (None, True)], +) +async def test_execute_script_unloads_script( + hass: HomeAssistant, + websocket_client: MockHAClientWebSocket, + side_effect: Exception | None, + expect_success: bool, +) -> None: + """Test that execute_script unloads the script after execution.""" + with patch("homeassistant.helpers.script.Script", autospec=True) as script_mock: + script_mock.return_value.async_run.return_value = None + script_mock.return_value.async_run.side_effect = side_effect + await websocket_client.send_json_auto_id( + { + "type": "execute_script", + "sequence": [{"service": "domain_test.test_service"}], + } + ) + msg = await websocket_client.receive_json() + assert msg["success"] == expect_success + + script_mock.return_value.async_unload.assert_called_once()