diff --git a/neo4j/exceptions.py b/neo4j/exceptions.py index 88b00b1e4..d24dfe41b 100644 --- a/neo4j/exceptions.py +++ b/neo4j/exceptions.py @@ -247,15 +247,17 @@ def is_fatal_during_discovery(self) -> bool: return False def __str__(self): - return "{{code: {code}}} {{message: {message}}}".format(code=self.code, message=self.message) + if self.code or self.message: + return "{{code: {code}}} {{message: {message}}}".format( + code=self.code, message=self.message + ) + return super().__str__() # Neo4jError > ClientError class ClientError(Neo4jError): """ The Client sent a bad request - changing the request might yield a successful outcome. """ - def __str__(self) -> str: - return super().__str__() # Neo4jError > ClientError > CypherSyntaxError diff --git a/tests/unit/common/test_exceptions.py b/tests/unit/common/test_exceptions.py index e1c89766d..8f34d5907 100644 --- a/tests/unit/common/test_exceptions.py +++ b/tests/unit/common/test_exceptions.py @@ -257,3 +257,59 @@ def test_error_rewrite(code, expected_cls, expected_code): assert error.is_retryable() is expected_retryable with pytest.warns(DeprecationWarning, match=".*is_retryable.*"): assert error.is_retriable() is expected_retryable + + +@pytest.mark.parametrize( + ("code", "message", "expected_cls", "expected_str"), + ( + ( + "Neo.ClientError.General.UnknownError", + "Test error message", + ClientError, + "{code: Neo.ClientError.General.UnknownError} " + "{message: Test error message}" + ), + ( + None, + "Test error message", + DatabaseError, + "{code: Neo.DatabaseError.General.UnknownError} " + "{message: Test error message}" + ), + ( + "", + "Test error message", + DatabaseError, + "{code: Neo.DatabaseError.General.UnknownError} " + "{message: Test error message}" + ), + ( + "Neo.ClientError.General.UnknownError", + None, + ClientError, + "{code: Neo.ClientError.General.UnknownError} " + "{message: An unknown error occurred}" + ), + ( + "Neo.ClientError.General.UnknownError", + "", + ClientError, + "{code: Neo.ClientError.General.UnknownError} " + "{message: An unknown error occurred}" + ), + ) +) +def test_neo4j_error_from_server_as_str(code, message, expected_cls, + expected_str): + error = Neo4jError.hydrate(code=code, message=message) + + assert type(error) == expected_cls + assert str(error) == expected_str + + +@pytest.mark.parametrize("cls", (Neo4jError, ClientError)) +def test_neo4j_error_from_code_as_str(cls): + error = cls("Generated somewhere in the driver") + + assert type(error)== cls + assert str(error) == "Generated somewhere in the driver"