Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/Http/Http.Results/src/HttpResultsHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,28 @@ internal static partial class HttpResultsHelper
private const string DefaultContentType = "text/plain; charset=utf-8";
private static readonly Encoding DefaultEncoding = Encoding.UTF8;

public static Task WriteResultAsJsonAsync(
HttpContext httpContext,
ILogger logger,
object? value,
Type valueType,
string? contentType = null,
JsonSerializerOptions? jsonSerializerOptions = null)
{
if (value is null)
{
return Task.CompletedTask;
}

Log.WritingResultAsJson(logger, valueType.Name);

return httpContext.Response.WriteAsJsonAsync(
value,
options: jsonSerializerOptions,
type: valueType,
contentType: contentType);
}

public static Task WriteResultAsJsonAsync<T>(
HttpContext httpContext,
ILogger logger,
Expand Down
3 changes: 3 additions & 0 deletions src/Http/Http.Results/src/ProblemHttpResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public sealed class ProblemHttpResult : IResult
/// <param name="problemDetails">The <see cref="ProblemDetails"/> instance to format in the entity body.</param>
internal ProblemHttpResult(ProblemDetails problemDetails)
{
ArgumentNullException.ThrowIfNull(problemDetails);

ProblemDetails = problemDetails;
HttpResultsHelper.ApplyProblemDetailsDefaults(ProblemDetails, statusCode: null);
}
Expand Down Expand Up @@ -57,6 +59,7 @@ public Task ExecuteAsync(HttpContext httpContext)
httpContext,
logger,
value: ProblemDetails,
valueType: ProblemDetails.GetType(),
ContentType);
}
}
33 changes: 32 additions & 1 deletion src/Http/Http.Results/test/ProblemResultTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ public async Task ExecuteAsync_UsesDefaults_ForValidationProblemDetails()

// Act
await result.ExecuteAsync(httpContext);

// Assert
Assert.Equal(StatusCodes.Status400BadRequest, httpContext.Response.StatusCode);
stream.Position = 0;
Expand All @@ -69,6 +68,38 @@ public async Task ExecuteAsync_UsesDefaults_ForValidationProblemDetails()
Assert.Equal(StatusCodes.Status400BadRequest, responseDetails.Status);
}

[Fact]
public async Task ExecuteAsync_IncludeErrors_ForValidationProblemDetails()
{
// Arrange
var details = new HttpValidationProblemDetails(new Dictionary<string, string[]>
{
{ "testError", new string[] { "message" } }
});

var result = new ProblemHttpResult(details);
var stream = new MemoryStream();
var httpContext = new DefaultHttpContext()
{
RequestServices = CreateServices(),
Response =
{
Body = stream,
},
};

// Act
await result.ExecuteAsync(httpContext);

// Assert
Assert.Equal(StatusCodes.Status400BadRequest, httpContext.Response.StatusCode);
stream.Position = 0;
var responseDetails = JsonSerializer.Deserialize<HttpValidationProblemDetails>(stream);
Assert.Equal(StatusCodes.Status400BadRequest, responseDetails.Status);
var error = Assert.Single(responseDetails.Errors);
Assert.Equal("testError", error.Key);
}

[Fact]
public async Task ExecuteAsync_GetsStatusCodeFromProblemDetails()
{
Expand Down