From 3e050a5a460b55e065881b5e6b45568675bf1292 Mon Sep 17 00:00:00 2001 From: Jakub Kucharski Date: Tue, 21 Oct 2025 12:58:30 +0200 Subject: [PATCH 1/3] RDBC-954 Python client: fix Connection String R/W Bugs (OLAP + AI) --- .../operations/ai/ai_connection_string.py | 2 +- .../documents/operations/backups/settings.py | 10 +++++++-- .../remove_connection_string_operation.py | 21 +++++++++++-------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/ravendb/documents/operations/ai/ai_connection_string.py b/ravendb/documents/operations/ai/ai_connection_string.py index e67baab1..0bd13cc7 100644 --- a/ravendb/documents/operations/ai/ai_connection_string.py +++ b/ravendb/documents/operations/ai/ai_connection_string.py @@ -17,7 +17,7 @@ class AiModelType(enum.Enum): CHAT = "Chat" -class AiConnectionString(ConnectionString): # todo kuba +class AiConnectionString(ConnectionString): def __init__( self, name: str, diff --git a/ravendb/documents/operations/backups/settings.py b/ravendb/documents/operations/backups/settings.py index a4392f5b..12c16629 100644 --- a/ravendb/documents/operations/backups/settings.py +++ b/ravendb/documents/operations/backups/settings.py @@ -68,14 +68,20 @@ def __init__( def from_json(cls, json_dict: Dict[str, Any]) -> LocalSettings: return cls( json_dict["Disabled"], - GetBackupConfigurationScript.from_json(json_dict["GetBackupConfigurationScript"]), + ( + GetBackupConfigurationScript.from_json(json_dict["GetBackupConfigurationScript"]) + if json_dict["GetBackupConfigurationScript"] + else None + ), json_dict["FolderPath"], ) def to_json(self) -> Dict[str, Any]: return { "Disabled": self.disabled, - "GetBackupConfigurationScript": self.get_backup_configuration_script.to_json(), + "GetBackupConfigurationScript": ( + self.get_backup_configuration_script.to_json() if self.get_backup_configuration_script else None + ), "FolderPath": self.folder_path, } diff --git a/ravendb/documents/operations/connection_string/remove_connection_string_operation.py b/ravendb/documents/operations/connection_string/remove_connection_string_operation.py index dec9b0f8..6ff75bd4 100644 --- a/ravendb/documents/operations/connection_string/remove_connection_string_operation.py +++ b/ravendb/documents/operations/connection_string/remove_connection_string_operation.py @@ -4,9 +4,10 @@ import requests -from ravendb import RavenCommand, RaftCommand, ConnectionString, ServerNode +from ravendb import RavenCommand, RaftCommand, ServerNode from ravendb.documents.operations.definitions import MaintenanceOperation from ravendb.util.util import RaftIdGenerator +from ravendb.serverwide.server_operation_executor import ConnectionStringType class RemoveConnectionStringResult: @@ -17,27 +18,29 @@ def to_json(self) -> Dict: return {"RaftCommandIndex": self.raft_command_index} @classmethod - def from_json(cls, json_dict: Dict) -> "PutConnectionStringResult": + def from_json(cls, json_dict: Dict) -> "RemoveConnectionStringResult": return cls(json_dict["RaftCommandIndex"]) class RemoveConnectionStringOperation(MaintenanceOperation[RemoveConnectionStringResult]): - def __init__(self, connection_string: ConnectionString = None): - self._connection_string = connection_string + def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType): + self._connection_string_name = connection_string_name + self._connection_string_type = connection_string_type - def get_command(self, conventions: "DocumentConventions") -> "RavenCommand[_T]": - return self.RemoveConnectionStringCommand(self._connection_string) + def get_command(self, conventions: "DocumentConventions") -> "RavenCommand[RemoveConnectionStringResult]": + return self.RemoveConnectionStringCommand(self._connection_string_name, self._connection_string_type) class RemoveConnectionStringCommand(RavenCommand[RemoveConnectionStringResult], RaftCommand): - def __init__(self, connection_string: ConnectionString = None): + def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType): super().__init__(RemoveConnectionStringResult) - self._connection_string = connection_string + self._connection_string_name = connection_string_name + self._connection_string_type = connection_string_type def is_read_request(self) -> bool: return False def create_request(self, node: ServerNode) -> requests.Request: - url = f"{node.url}/databases/{node.database}/admin/connection-strings?connectionString={urllib.parse.quote(self._connection_string.name)}&type={self._connection_string.get_type}" + url = f"{node.url}/databases/{node.database}/admin/connection-strings?connectionString={urllib.parse.quote(self._connection_string_name)}&type={self._connection_string_type.value}" request = requests.Request("DELETE") request.url = url From 77c91561ee48ecd6cb5754f63e2cc504a89ac2f7 Mon Sep 17 00:00:00 2001 From: Jakub Kucharski Date: Tue, 21 Oct 2025 13:40:00 +0200 Subject: [PATCH 2/3] RDBC-954 Fix tests --- .../test_connection_string.py | 76 ++++++++++++++----- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py b/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py index 6d002458..8826ef8e 100644 --- a/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py +++ b/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py @@ -83,7 +83,9 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(raven_get_result.raven_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(raven_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("raven1", ConnectionStringType.RAVEN) + ) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -101,7 +103,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(sql_get_result.sql_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(sql_connection_string)) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation("sql1", ConnectionStringType.SQL)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -119,7 +121,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(olap_get_result.olap_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(olap_connection_string)) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation("olap1", ConnectionStringType.OLAP)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -138,7 +140,9 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(elastic_get_result.elastic_search_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(elastic_search_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("elastic1", ConnectionStringType.ELASTIC_SEARCH) + ) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -160,7 +164,9 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(queue_get_result.queue_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(queue_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("queue1", ConnectionStringType.QUEUE) + ) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -180,7 +186,9 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(snowflake_get_result.snowflake_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(snowflake_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("snowflake1", ConnectionStringType.SNOWFLAKE) + ) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -200,7 +208,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(ai_get_result.ai_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_connection_string)) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation("ai1", ConnectionStringType.AI)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -229,7 +237,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(raven_connection_string.topology_discovery_urls, retrieved.topology_discovery_urls) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(raven_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("raven_all_fields", ConnectionStringType.RAVEN) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -261,7 +271,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(sql_connection_string.factory_name, retrieved.factory_name) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(sql_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("sql_all_fields", ConnectionStringType.SQL) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -455,7 +467,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): ) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(olap_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("olap_all_fields", ConnectionStringType.OLAP) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -504,7 +518,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(openai_chat_settings.dimensions, retrieved.openai_settings.dimensions) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_openai_chat_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("ai_openai_chat", ConnectionStringType.AI) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -554,7 +570,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): # Delete remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation(ai_openai_embeddings_connection_string) + RemoveConnectionStringOperation("ai_openai_embeddings", ConnectionStringType.AI) ) self.assertGreater(remove_result.raft_command_index, 0) @@ -602,7 +618,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(azure_openai_settings.dimensions, retrieved.azure_openai_settings.dimensions) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_azure_openai_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("ai_azure_openai", ConnectionStringType.AI) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -643,7 +661,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(ollama_settings.think, retrieved.ollama_settings.think) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_ollama_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("ai_ollama", ConnectionStringType.AI) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -674,7 +694,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertIsNotNone(retrieved.embedded_settings) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_embedded_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("ai_embedded", ConnectionStringType.AI) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -710,7 +732,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(google_settings.dimensions, retrieved.google_settings.dimensions) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_google_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("ai_google", ConnectionStringType.AI) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -750,7 +774,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(huggingface_settings.endpoint, retrieved.huggingface_settings.endpoint) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_huggingface_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("ai_huggingface", ConnectionStringType.AI) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -788,7 +814,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(mistral_ai_settings.endpoint, retrieved.mistral_ai_settings.endpoint) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_mistral_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("ai_mistral", ConnectionStringType.AI) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -853,7 +881,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): ) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(elastic_search_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("elastic_all_fields", ConnectionStringType.ELASTIC_SEARCH) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -986,7 +1016,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): ) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(queue_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("queue_all_fields", ConnectionStringType.QUEUE) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -1016,7 +1048,9 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(snowflake_connection_string.connection_string, retrieved.connection_string) # Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(snowflake_connection_string)) + remove_result = self.store.maintenance.send( + RemoveConnectionStringOperation("snowflake_all_fields", ConnectionStringType.SNOWFLAKE) + ) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None From 2d9222c6d8cf790a73e5c1b35ffe52c2314d6668 Mon Sep 17 00:00:00 2001 From: Jakub Kucharski Date: Tue, 4 Nov 2025 14:43:28 +0100 Subject: [PATCH 3/3] RDBC-954 RemoveConnectionStringByNameOperation --- ...ove_connection_string_by_name_operation.py | 57 +++++++++++ .../remove_connection_string_operation.py | 16 ++- .../test_connection_string.py | 99 +++++++++---------- 3 files changed, 108 insertions(+), 64 deletions(-) create mode 100644 ravendb/documents/operations/connection_string/remove_connection_string_by_name_operation.py diff --git a/ravendb/documents/operations/connection_string/remove_connection_string_by_name_operation.py b/ravendb/documents/operations/connection_string/remove_connection_string_by_name_operation.py new file mode 100644 index 00000000..c0150dc5 --- /dev/null +++ b/ravendb/documents/operations/connection_string/remove_connection_string_by_name_operation.py @@ -0,0 +1,57 @@ +import json +import urllib +from typing import Dict + +import requests + +from ravendb import RavenCommand, RaftCommand, ServerNode +from ravendb.documents.operations.definitions import MaintenanceOperation +from ravendb.util.util import RaftIdGenerator +from ravendb.serverwide.server_operation_executor import ConnectionStringType + + +class RemoveConnectionStringByNameResult: + def __init__(self, raft_command_index: int = None): + self.raft_command_index = raft_command_index + + def to_json(self) -> Dict: + return {"RaftCommandIndex": self.raft_command_index} + + @classmethod + def from_json(cls, json_dict: Dict) -> "RemoveConnectionStringResult": + return cls(json_dict["RaftCommandIndex"]) + + +class RemoveConnectionStringByNameOperation(MaintenanceOperation[RemoveConnectionStringByNameResult]): + def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType): + self._connection_string_name = connection_string_name + self._connection_string_type = connection_string_type + + def get_command(self, conventions: "DocumentConventions") -> "RavenCommand[RemoveConnectionStringResult]": + return self.RemoveConnectionStringCommand(self._connection_string_name, self._connection_string_type) + + class RemoveConnectionStringCommand(RavenCommand[RemoveConnectionStringByNameResult], RaftCommand): + def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType): + super().__init__(RemoveConnectionStringByNameResult) + self._connection_string_name = connection_string_name + self._connection_string_type = connection_string_type + + def is_read_request(self) -> bool: + return False + + def create_request(self, node: ServerNode) -> requests.Request: + url = f"{node.url}/databases/{node.database}/admin/connection-strings?connectionString={urllib.parse.quote(self._connection_string_name)}&type={self._connection_string_type.value}" + + request = requests.Request("DELETE") + request.url = url + + return request + + def set_response(self, response: str, from_cache: bool) -> None: + if response is None: + self._throw_invalid_response() + + self.result = RemoveConnectionStringByNameResult.from_json(json.loads(response)) + + def get_raft_unique_request_id(self) -> str: + return RaftIdGenerator.new_id() diff --git a/ravendb/documents/operations/connection_string/remove_connection_string_operation.py b/ravendb/documents/operations/connection_string/remove_connection_string_operation.py index 6ff75bd4..f5eb8092 100644 --- a/ravendb/documents/operations/connection_string/remove_connection_string_operation.py +++ b/ravendb/documents/operations/connection_string/remove_connection_string_operation.py @@ -4,7 +4,7 @@ import requests -from ravendb import RavenCommand, RaftCommand, ServerNode +from ravendb import RavenCommand, RaftCommand, ConnectionString, ServerNode from ravendb.documents.operations.definitions import MaintenanceOperation from ravendb.util.util import RaftIdGenerator from ravendb.serverwide.server_operation_executor import ConnectionStringType @@ -23,24 +23,22 @@ def from_json(cls, json_dict: Dict) -> "RemoveConnectionStringResult": class RemoveConnectionStringOperation(MaintenanceOperation[RemoveConnectionStringResult]): - def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType): - self._connection_string_name = connection_string_name - self._connection_string_type = connection_string_type + def __init__(self, connection_string: ConnectionString = None): + self._connection_string = connection_string def get_command(self, conventions: "DocumentConventions") -> "RavenCommand[RemoveConnectionStringResult]": - return self.RemoveConnectionStringCommand(self._connection_string_name, self._connection_string_type) + return self.RemoveConnectionStringCommand(self._connection_string) class RemoveConnectionStringCommand(RavenCommand[RemoveConnectionStringResult], RaftCommand): - def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType): + def __init__(self, connection_string: ConnectionString = None): super().__init__(RemoveConnectionStringResult) - self._connection_string_name = connection_string_name - self._connection_string_type = connection_string_type + self._connection_string = connection_string def is_read_request(self) -> bool: return False def create_request(self, node: ServerNode) -> requests.Request: - url = f"{node.url}/databases/{node.database}/admin/connection-strings?connectionString={urllib.parse.quote(self._connection_string_name)}&type={self._connection_string_type.value}" + url = f"{node.url}/databases/{node.database}/admin/connection-strings?connectionString={urllib.parse.quote(self._connection_string.name)}&type={self._connection_string.get_type}" request = requests.Request("DELETE") request.url = url diff --git a/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py b/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py index 8826ef8e..5137fdf5 100644 --- a/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py +++ b/ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py @@ -18,6 +18,9 @@ from ravendb.documents.operations.connection_string.put_connection_string_operation import ( PutConnectionStringOperation, ) +from ravendb.documents.operations.connection_string.remove_connection_string_by_name_operation import ( + RemoveConnectionStringByNameOperation, +) from ravendb.documents.operations.connection_string.remove_connection_string_operation import ( RemoveConnectionStringOperation, ) @@ -83,9 +86,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(raven_get_result.raven_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("raven1", ConnectionStringType.RAVEN) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(raven_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -103,7 +104,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(sql_get_result.sql_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation("sql1", ConnectionStringType.SQL)) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(sql_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -121,7 +122,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(olap_get_result.olap_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation("olap1", ConnectionStringType.OLAP)) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(olap_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -140,9 +141,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(elastic_get_result.elastic_search_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("elastic1", ConnectionStringType.ELASTIC_SEARCH) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(elastic_search_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -164,9 +163,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(queue_get_result.queue_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("queue1", ConnectionStringType.QUEUE) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(queue_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -186,9 +183,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(snowflake_get_result.snowflake_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("snowflake1", ConnectionStringType.SNOWFLAKE) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(snowflake_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -208,7 +203,7 @@ def test_full_lifecycle_for_all_connection_string_types(self): self.assertEqual(1, len(ai_get_result.ai_connection_strings)) # 3. Delete - remove_result = self.store.maintenance.send(RemoveConnectionStringOperation("ai1", ConnectionStringType.AI)) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # 4. Get and Assert None @@ -237,9 +232,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(raven_connection_string.topology_discovery_urls, retrieved.topology_discovery_urls) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("raven_all_fields", ConnectionStringType.RAVEN) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(raven_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -271,9 +264,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(sql_connection_string.factory_name, retrieved.factory_name) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("sql_all_fields", ConnectionStringType.SQL) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(sql_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -467,9 +458,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): ) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("olap_all_fields", ConnectionStringType.OLAP) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(olap_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -518,9 +507,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(openai_chat_settings.dimensions, retrieved.openai_settings.dimensions) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_openai_chat", ConnectionStringType.AI) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_openai_chat_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -570,7 +557,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): # Delete remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_openai_embeddings", ConnectionStringType.AI) + RemoveConnectionStringOperation(ai_openai_embeddings_connection_string) ) self.assertGreater(remove_result.raft_command_index, 0) @@ -618,9 +605,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(azure_openai_settings.dimensions, retrieved.azure_openai_settings.dimensions) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_azure_openai", ConnectionStringType.AI) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_azure_openai_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -661,9 +646,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(ollama_settings.think, retrieved.ollama_settings.think) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_ollama", ConnectionStringType.AI) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_ollama_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -694,9 +677,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertIsNotNone(retrieved.embedded_settings) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_embedded", ConnectionStringType.AI) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_embedded_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -732,9 +713,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(google_settings.dimensions, retrieved.google_settings.dimensions) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_google", ConnectionStringType.AI) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_google_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -774,9 +753,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(huggingface_settings.endpoint, retrieved.huggingface_settings.endpoint) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_huggingface", ConnectionStringType.AI) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_huggingface_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -814,9 +791,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(mistral_ai_settings.endpoint, retrieved.mistral_ai_settings.endpoint) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("ai_mistral", ConnectionStringType.AI) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(ai_mistral_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -881,9 +856,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): ) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("elastic_all_fields", ConnectionStringType.ELASTIC_SEARCH) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(elastic_search_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -1016,9 +989,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): ) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("queue_all_fields", ConnectionStringType.QUEUE) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(queue_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -1048,9 +1019,7 @@ def test_all_possible_fields_for_each_connection_string_type(self): self.assertEqual(snowflake_connection_string.connection_string, retrieved.connection_string) # Delete - remove_result = self.store.maintenance.send( - RemoveConnectionStringOperation("snowflake_all_fields", ConnectionStringType.SNOWFLAKE) - ) + remove_result = self.store.maintenance.send(RemoveConnectionStringOperation(snowflake_connection_string)) self.assertGreater(remove_result.raft_command_index, 0) # Get and Assert None @@ -1058,3 +1027,23 @@ def test_all_possible_fields_for_each_connection_string_type(self): GetConnectionStringsOperation("snowflake_all_fields", ConnectionStringType.SNOWFLAKE) ) self.assertIsNone(after_delete.snowflake_connection_strings) + + def test_remove_connection_string_by_name_operation(self): + raven_connection_string = RavenConnectionString("raven1", self.store.database, self.store.urls) + + put_result = self.store.maintenance.send(PutConnectionStringOperation(raven_connection_string)) + self.assertGreater(put_result.raft_command_index, 0) + + raven_get_result = self.store.maintenance.send( + GetConnectionStringsOperation("raven1", ConnectionStringType.RAVEN) + ) + self.assertIn("raven1", raven_get_result.raven_connection_strings) + self.assertEqual(1, len(raven_get_result.raven_connection_strings)) + + remove_result = self.store.maintenance.send( + RemoveConnectionStringByNameOperation("raven1", ConnectionStringType.RAVEN) + ) + self.assertGreater(remove_result.raft_command_index, 0) + + after_delete = self.store.maintenance.send(GetConnectionStringsOperation("raven1", ConnectionStringType.RAVEN)) + self.assertIsNone(after_delete.raven_connection_strings)