From f84d63c834a081c0b1e3af95b56a2b6b62e77c7a Mon Sep 17 00:00:00 2001 From: Harry Pierson Date: Wed, 5 Oct 2022 00:36:42 -0700 Subject: [PATCH] add throwOnError param to RpcClient Send/SendAsync (#763) Co-authored-by: Shargon Co-authored-by: Owen Zhang <38493437+superboyiii@users.noreply.github.com> --- src/RpcClient/RpcClient.cs | 13 ++++----- tests/Neo.Network.RPC.Tests/UT_RpcClient.cs | 29 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/RpcClient/RpcClient.cs b/src/RpcClient/RpcClient.cs index b8a6f31ac..be031e055 100644 --- a/src/RpcClient/RpcClient.cs +++ b/src/RpcClient/RpcClient.cs @@ -88,12 +88,13 @@ static RpcRequest AsRpcRequest(string method, params JToken[] paraArgs) Params = paraArgs }; } - static RpcResponse AsRpcResponse(string content) + + static RpcResponse AsRpcResponse(string content, bool throwOnError) { var response = RpcResponse.FromJson((JObject)JToken.Parse(content)); response.RawResponse = content; - if (response.Error != null) + if (response.Error != null && throwOnError) { throw new RpcException(response.Error.Code, response.Error.Message); } @@ -110,7 +111,7 @@ HttpRequestMessage AsHttpRequest(RpcRequest request) }; } - public RpcResponse Send(RpcRequest request) + public RpcResponse Send(RpcRequest request, bool throwOnError = true) { if (disposedValue) throw new ObjectDisposedException(nameof(RpcClient)); @@ -118,17 +119,17 @@ public RpcResponse Send(RpcRequest request) using var responseMsg = httpClient.Send(requestMsg); using var contentStream = responseMsg.Content.ReadAsStream(); using var contentReader = new StreamReader(contentStream); - return AsRpcResponse(contentReader.ReadToEnd()); + return AsRpcResponse(contentReader.ReadToEnd(), throwOnError); } - public async Task SendAsync(RpcRequest request) + public async Task SendAsync(RpcRequest request, bool throwOnError = true) { if (disposedValue) throw new ObjectDisposedException(nameof(RpcClient)); using var requestMsg = AsHttpRequest(request); using var responseMsg = await httpClient.SendAsync(requestMsg).ConfigureAwait(false); var content = await responseMsg.Content.ReadAsStringAsync(); - return AsRpcResponse(content); + return AsRpcResponse(content, throwOnError); } public virtual JToken RpcSend(string method, params JToken[] paraArgs) diff --git a/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs b/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs index f4de96f66..52191b34f 100644 --- a/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs +++ b/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs @@ -69,6 +69,35 @@ public async Task TestErrorResponse() } } + [TestMethod] + public async Task TestNoThrowErrorResponse() + { + var test = TestUtils.RpcTestCases.Find(p => p.Name == (nameof(rpc.SendRawTransactionAsync) + "error").ToLower()); + handlerMock = new Mock(MockBehavior.Strict); + handlerMock.Protected() + // Setup the PROTECTED method to mock + .Setup>( + "SendAsync", + ItExpr.IsAny(), + ItExpr.IsAny()) + // prepare the expected response of the mocked http call + .ReturnsAsync(new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(test.Response.ToJson().ToString()), + }) + .Verifiable(); + + var httpClient = new HttpClient(handlerMock.Object); + var client = new RpcClient(httpClient, new Uri("http://seed1.neo.org:10331"), null); + var response = await client.SendAsync(test.Request, false); + + Assert.IsNull(response.Result); + Assert.IsNotNull(response.Error); + Assert.AreEqual(-500, response.Error.Code); + Assert.AreEqual("InsufficientFunds", response.Error.Message); + } + [TestMethod] public void TestConstructorByUrlAndDispose() {