Skip to content
35 changes: 35 additions & 0 deletions Activout.RestClient.Test/NonJsonRestClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,24 @@ public async Task TestGetByteArray()
Assert.Equal(new byte[] { 42 }, bytes);
}

[Fact]
public async Task TestGetEmptyByteArray()
{
// arrange
_mockHttp
.When($"{BaseUri}/movies/bytes")
.Respond(new ByteArrayContent(new byte[0]));

var reviewSvc = CreateMovieReviewService();

// act
var bytes = await reviewSvc.GetByteArray();

// assert
Assert.NotNull(bytes);
Assert.Empty(bytes);
}

[Fact]
public async Task TestGetByteArrayObject()
{
Expand All @@ -246,6 +264,23 @@ public async Task TestGetByteArrayObject()
Assert.Equal(new byte[] { 42 }, byteArrayObject.Bytes);
}

[Fact]
public async Task TestGetByteArrayObjectWithEmptyArray()
{
// arrange
_mockHttp
.When($"{BaseUri}/movies/byte-object")
.Respond(new ByteArrayContent(new byte[0]));

var reviewSvc = CreateMovieReviewService();

// act
var byteArrayObject = await reviewSvc.GetByteArrayObject();

// assert
Assert.Null(byteArrayObject);
}

[Fact]
public async Task TestGetString()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,19 @@ internal class ByteArrayDeserializer : IDeserializer
public async Task<object> Deserialize(HttpContent content, Type type)
{
var bytes = await content.ReadAsByteArrayAsync();
if (type == typeof(byte[]))
{
return bytes;
}

return type == typeof(byte[])
? bytes
: Activator.CreateInstance(type, bytes);
if (type.IsValueType)
{
throw new InvalidOperationException(
$"Cannot deserialize empty application/octet-stream to value type '{type.FullName}'.");
}

// If the byte array is empty, do not try to create an object
return bytes.Length == 0 ? null : Activator.CreateInstance(type, bytes);
}

public bool CanDeserialize(MediaType mediaType)
Expand Down
Loading