From c3a53eb2e65fbb1b511d48e15de48ecfad7f6f6e Mon Sep 17 00:00:00 2001 From: Asad Ali Date: Thu, 29 Aug 2024 14:45:23 +0500 Subject: [PATCH 1/3] fix: void type handling with return type creator --- .../Api/HttpGet/ApiCallGetTest.cs | 27 +++++++++++++++++++ APIMatic.Core/Response/ResponseHandler.cs | 16 ++++++----- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs b/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs index f861e330..6092d62f 100644 --- a/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs +++ b/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs @@ -383,6 +383,33 @@ public void ApiCall_GetVoid() Assert.Null(actual); } + [Test] + public void ApiCall_GetVoid_WithApiResponse() + { + //Arrange + var url = "/apicall/get-void/api-response/200"; + + var content = JsonContent.Create("Test body"); + handlerMock.When(GetCompleteUrl(url)) + .With(req => + { + Assert.AreEqual(0, req.Headers.Accept.Count); + return true; + }) + .Respond(HttpStatusCode.OK, content); + + var apiCall = CreateApiCall() + .RequestBuilder(requestBuilderAction => requestBuilderAction.Setup(HttpMethod.Get, url)) + .ExecuteAsync(); + + // Act + var actual = CoreHelper.RunTask(apiCall); + + // Assert + Assert.IsInstanceOf>(actual); + Assert.Null(actual.Data); + } + [Test] public void ApiCall_GetStream() { diff --git a/APIMatic.Core/Response/ResponseHandler.cs b/APIMatic.Core/Response/ResponseHandler.cs index b58b2b0f..7cad227f 100644 --- a/APIMatic.Core/Response/ResponseHandler.cs +++ b/APIMatic.Core/Response/ResponseHandler.cs @@ -127,13 +127,17 @@ internal ReturnType Result(CoreContext co } ResponseType result = ConvertResponse(context.Response); result = contextAdder(result, compatibilityFactory.CreateHttpContext(context.Request, context.Response)); + if (returnTypeCreator != null) + { + return returnTypeCreator(compatibilityFactory.CreateHttpResponse(context.Response), result); + } if (result is ReturnType convertedResult) { return convertedResult; } - if (returnTypeCreator != null) + if (typeof(ReturnType) == typeof(VoidType)) { - return returnTypeCreator(compatibilityFactory.CreateHttpResponse(context.Response), result); + return default; } throw new InvalidOperationException($"Unable to transform {typeof(ResponseType)} into {typeof(ReturnType)}. ReturnTypeCreator is not provided."); } @@ -141,10 +145,6 @@ internal ReturnType Result(CoreContext co private bool HasEmptyResponse(CoreResponse response) { var resType = typeof(ResponseType); - if (resType == typeof(VoidType)) - { - return true; - } return string.Equals(response.Body?.Trim(), string.Empty) && CoreHelper.IsNullableType(resType); } @@ -206,6 +206,10 @@ private bool GetDefaultErrorCaseFromErrors(out ErrorCase Date: Thu, 29 Aug 2024 17:13:00 +0500 Subject: [PATCH 2/3] adds the api response wrapping to empty responses where applicable --- .../Api/HttpGet/ApiCallGetTest.cs | 4 +-- APIMatic.Core/Response/ResponseHandler.cs | 36 +++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs b/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs index 6092d62f..ab408a1c 100644 --- a/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs +++ b/APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs @@ -403,10 +403,10 @@ public void ApiCall_GetVoid_WithApiResponse() .ExecuteAsync(); // Act - var actual = CoreHelper.RunTask(apiCall); + ApiResponse actual = CoreHelper.RunTask(apiCall); // Assert - Assert.IsInstanceOf>(actual); + Assert.AreEqual(200, actual.StatusCode); Assert.Null(actual.Data); } diff --git a/APIMatic.Core/Response/ResponseHandler.cs b/APIMatic.Core/Response/ResponseHandler.cs index 7cad227f..f3ba3ec4 100644 --- a/APIMatic.Core/Response/ResponseHandler.cs +++ b/APIMatic.Core/Response/ResponseHandler.cs @@ -119,33 +119,29 @@ internal ReturnType Result(CoreContext co { return default; } + throw ResponseError(context); } - if (HasEmptyResponse(context.Response)) - { - return default; - } + ResponseType result = ConvertResponse(context.Response); result = contextAdder(result, compatibilityFactory.CreateHttpContext(context.Request, context.Response)); + if (returnTypeCreator != null) { return returnTypeCreator(compatibilityFactory.CreateHttpResponse(context.Response), result); } - if (result is ReturnType convertedResult) + + if (result == null || result.Equals(default)) { - return convertedResult; + return default; } - if (typeof(ReturnType) == typeof(VoidType)) + + if (result is ReturnType convertedResult) { - return default; + return convertedResult; } - throw new InvalidOperationException($"Unable to transform {typeof(ResponseType)} into {typeof(ReturnType)}. ReturnTypeCreator is not provided."); - } - private bool HasEmptyResponse(CoreResponse response) - { - var resType = typeof(ResponseType); - return string.Equals(response.Body?.Trim(), string.Empty) && CoreHelper.IsNullableType(resType); + throw new InvalidOperationException($"Unable to transform {typeof(ResponseType)} into {typeof(ReturnType)}. ReturnTypeCreator is not provided."); } private ApiException ResponseError(CoreContext context) @@ -206,7 +202,7 @@ private bool GetDefaultErrorCaseFromErrors(out ErrorCase Date: Thu, 29 Aug 2024 17:45:39 +0500 Subject: [PATCH 3/3] add equality comparator --- APIMatic.Core/Response/ResponseHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/APIMatic.Core/Response/ResponseHandler.cs b/APIMatic.Core/Response/ResponseHandler.cs index f3ba3ec4..b27881b5 100644 --- a/APIMatic.Core/Response/ResponseHandler.cs +++ b/APIMatic.Core/Response/ResponseHandler.cs @@ -131,7 +131,7 @@ internal ReturnType Result(CoreContext co return returnTypeCreator(compatibilityFactory.CreateHttpResponse(context.Response), result); } - if (result == null || result.Equals(default)) + if (EqualityComparer.Default.Equals(result, default)) { return default; }