test: add edge case tests to ApiClientBaseTests

Add 7 edge case tests for ApiClientBase:
- GetAsync_Returns200_EmptyBody_MapsToApiError
- GetAsync_Returns200_InvalidJson_MapsToApiError
- GetAsync_Returns204_ForUnitType_MapsToSuccess
- GetAsync_Returns204_ForNonUnitType_MapsToApiError
- GetAsync_NetworkException_MapsToApiError
- GetAsync_Timeout_MapsToApiError
- GetAsync_Returns400_WithoutValidationFormat_MapsToApiError

Also fix bug in ApiClientBase where 204 NoContent for Unit type
failed due to incorrect type casting. The implicit conversion from
Unit to ApiResult<Unit> must be applied before the runtime cast.
This commit is contained in:
Joseph Doherty
2026-01-06 11:23:54 -05:00
parent 6af5a4f9d6
commit c626ffbd69
2 changed files with 268 additions and 0 deletions
@@ -117,4 +117,106 @@ public class ApiClientBaseTests
result.IsError.ShouldBeTrue();
result.Error.StatusCode.ShouldBe(500);
}
// Edge cases
[Fact]
public async Task GetAsync_Returns200_EmptyBody_MapsToApiError()
{
// Arrange
_mockHttp.When("/api/test")
.Respond(HttpStatusCode.OK, "application/json", "");
// Act
var result = await _client.GetAsync<TestDto>("/api/test");
// Assert
result.IsError.ShouldBeTrue();
}
[Fact]
public async Task GetAsync_Returns200_InvalidJson_MapsToApiError()
{
// Arrange
_mockHttp.When("/api/test")
.Respond(HttpStatusCode.OK, "application/json", "not valid json {{{");
// Act
var result = await _client.GetAsync<TestDto>("/api/test");
// Assert
result.IsError.ShouldBeTrue();
}
[Fact]
public async Task GetAsync_Returns204_ForUnitType_MapsToSuccess()
{
// Arrange
_mockHttp.When("/api/test")
.Respond(HttpStatusCode.NoContent);
// Act
var result = await _client.GetAsync<Unit>("/api/test");
// Assert
result.IsSuccess.ShouldBeTrue();
}
[Fact]
public async Task GetAsync_Returns204_ForNonUnitType_MapsToApiError()
{
// Arrange
_mockHttp.When("/api/test")
.Respond(HttpStatusCode.NoContent);
// Act
var result = await _client.GetAsync<TestDto>("/api/test");
// Assert
result.IsError.ShouldBeTrue();
}
[Fact]
public async Task GetAsync_NetworkException_MapsToApiError()
{
// Arrange
_mockHttp.When("/api/test")
.Throw(new HttpRequestException("Network failure"));
// Act
var result = await _client.GetAsync<TestDto>("/api/test");
// Assert
result.IsError.ShouldBeTrue();
result.Error.Message.ShouldContain("Network failure");
}
[Fact]
public async Task GetAsync_Timeout_MapsToApiError()
{
// Arrange
_mockHttp.When("/api/test")
.Throw(new TaskCanceledException("Request timeout"));
// Act
var result = await _client.GetAsync<TestDto>("/api/test");
// Assert
result.IsError.ShouldBeTrue();
}
[Fact]
public async Task GetAsync_Returns400_WithoutValidationFormat_MapsToApiError()
{
// Arrange - Bad request without standard validation problem format
_mockHttp.When("/api/test")
.Respond(HttpStatusCode.BadRequest, "text/plain", "Bad request");
// Act
var result = await _client.GetAsync<TestDto>("/api/test");
// Assert
result.IsError.ShouldBeTrue();
result.Error.StatusCode.ShouldBe(400);
}
}