Skip to content

Commit 846807f

Browse files
authored
fix: void type handling with return type creator (#77)
* fix: void type handling with return type creator * adds the api response wrapping to empty responses where applicable * add equality comparator
1 parent 518dc0b commit 846807f

File tree

2 files changed

+53
-16
lines changed

2 files changed

+53
-16
lines changed

APIMatic.Core.Test/Api/HttpGet/ApiCallGetTest.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,33 @@ public void ApiCall_GetVoid()
383383
Assert.Null(actual);
384384
}
385385

386+
[Test]
387+
public void ApiCall_GetVoid_WithApiResponse()
388+
{
389+
//Arrange
390+
var url = "/apicall/get-void/api-response/200";
391+
392+
var content = JsonContent.Create("Test body");
393+
handlerMock.When(GetCompleteUrl(url))
394+
.With(req =>
395+
{
396+
Assert.AreEqual(0, req.Headers.Accept.Count);
397+
return true;
398+
})
399+
.Respond(HttpStatusCode.OK, content);
400+
401+
var apiCall = CreateApiCall<VoidType>()
402+
.RequestBuilder(requestBuilderAction => requestBuilderAction.Setup(HttpMethod.Get, url))
403+
.ExecuteAsync();
404+
405+
// Act
406+
ApiResponse<VoidType> actual = CoreHelper.RunTask(apiCall);
407+
408+
// Assert
409+
Assert.AreEqual(200, actual.StatusCode);
410+
Assert.Null(actual.Data);
411+
}
412+
386413
[Test]
387414
public void ApiCall_GetStream()
388415
{

APIMatic.Core/Response/ResponseHandler.cs

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -119,33 +119,29 @@ internal ReturnType Result<ReturnType>(CoreContext<CoreRequest, CoreResponse> co
119119
{
120120
return default;
121121
}
122+
122123
throw ResponseError(context);
123124
}
124-
if (HasEmptyResponse(context.Response))
125-
{
126-
return default;
127-
}
125+
128126
ResponseType result = ConvertResponse(context.Response);
129127
result = contextAdder(result, compatibilityFactory.CreateHttpContext(context.Request, context.Response));
130-
if (result is ReturnType convertedResult)
131-
{
132-
return convertedResult;
133-
}
128+
134129
if (returnTypeCreator != null)
135130
{
136131
return returnTypeCreator(compatibilityFactory.CreateHttpResponse(context.Response), result);
137132
}
138-
throw new InvalidOperationException($"Unable to transform {typeof(ResponseType)} into {typeof(ReturnType)}. ReturnTypeCreator is not provided.");
139-
}
140133

141-
private bool HasEmptyResponse(CoreResponse response)
142-
{
143-
var resType = typeof(ResponseType);
144-
if (resType == typeof(VoidType))
134+
if (EqualityComparer<ResponseType>.Default.Equals(result, default))
145135
{
146-
return true;
136+
return default;
147137
}
148-
return string.Equals(response.Body?.Trim(), string.Empty) && CoreHelper.IsNullableType(resType);
138+
139+
if (result is ReturnType convertedResult)
140+
{
141+
return convertedResult;
142+
}
143+
144+
throw new InvalidOperationException($"Unable to transform {typeof(ResponseType)} into {typeof(ReturnType)}. ReturnTypeCreator is not provided.");
149145
}
150146

151147
private ApiException ResponseError(CoreContext<CoreRequest, CoreResponse> context)
@@ -206,6 +202,10 @@ private bool GetDefaultErrorCaseFromErrors(out ErrorCase<Request, Response, Cont
206202

207203
private ResponseType ConvertResponse(CoreResponse response)
208204
{
205+
if (HasEmptyResponse(response))
206+
{
207+
return default;
208+
}
209209
if (response.RawBody is ResponseType streamResponse)
210210
{
211211
return streamResponse;
@@ -216,5 +216,15 @@ private ResponseType ConvertResponse(CoreResponse response)
216216
}
217217
return deserializer(response.Body);
218218
}
219+
220+
private bool HasEmptyResponse(CoreResponse response)
221+
{
222+
var resType = typeof(ResponseType);
223+
if (typeof(VoidType).IsAssignableFrom(resType))
224+
{
225+
return true;
226+
}
227+
return string.Equals(response.Body?.Trim(), string.Empty) && CoreHelper.IsNullableType(resType);
228+
}
219229
}
220230
}

0 commit comments

Comments
 (0)