pw_rpc: Fix __repr__ for UnaryResponse in Python client

UnaryResponse.__repr__ should only call proto_repr when it has a
response.

Fixes: b/247127597
Change-Id: Icdea31b50088669d1bded1eb21ec80c3b25f4590
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/110970
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Reviewed-by: Jonathon Reinhart <jrreinhart@google.com>
Reviewed-by: Carlos Chinchilla <cachinchilla@google.com>
diff --git a/pw_rpc/py/pw_rpc/callback_client/call.py b/pw_rpc/py/pw_rpc/callback_client/call.py
index abe1083..aba87f9 100644
--- a/pw_rpc/py/pw_rpc/callback_client/call.py
+++ b/pw_rpc/py/pw_rpc/callback_client/call.py
@@ -52,7 +52,8 @@
     response: Any
 
     def __repr__(self) -> str:
-        return f'({self.status}, {proto_repr(self.response)})'
+        reply = proto_repr(self.response) if self.response else self.response
+        return f'({self.status}, {reply})'
 
 
 class StreamResponse(NamedTuple):
diff --git a/pw_rpc/py/tests/callback_client_test.py b/pw_rpc/py/tests/callback_client_test.py
index b06939f..53d9030 100755
--- a/pw_rpc/py/tests/callback_client_test.py
+++ b/pw_rpc/py/tests/callback_client_test.py
@@ -401,6 +401,14 @@
 
         self.assertEqual(context.exception.__cause__, exception)
 
+    def test_unary_response(self) -> None:
+        proto = self._protos.packages.pw.test1.SomeMessage(magic_number=123)
+        self.assertEqual(
+            repr(callback_client.UnaryResponse(Status.ABORTED, proto)),
+            '(Status.ABORTED, pw.test1.SomeMessage(magic_number=123))')
+        self.assertEqual(repr(callback_client.UnaryResponse(Status.OK, None)),
+                         '(Status.OK, None)')
+
 
 class ServerStreamingTest(_CallbackClientImplTestBase):
     """Tests for server streaming RPCs."""
@@ -965,6 +973,15 @@
         self.assertIs(first_call.error, Status.CANCELLED)
         self.assertFalse(second_call.completed())
 
+    def test_stream_response(self) -> None:
+        proto = self._protos.packages.pw.test1.SomeMessage(magic_number=123)
+        self.assertEqual(
+            repr(callback_client.StreamResponse(Status.ABORTED, [proto] * 2)),
+            '(Status.ABORTED, [pw.test1.SomeMessage(magic_number=123), '
+            'pw.test1.SomeMessage(magic_number=123)])')
+        self.assertEqual(repr(callback_client.StreamResponse(Status.OK, [])),
+                         '(Status.OK, [])')
+
 
 if __name__ == '__main__':
     unittest.main()