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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user