/
githubmirror
/
aspnetcore
Обзор
Документация
Войти
/
githubmirror
/
aspnetcore
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Http/Http.Results/test/InternalServerErrorOfTResultTests.cs
205 строк
8 KB
Youssef Victor
Fix API metadata to have problem+json ContentType when dealing with ProblemDetails (#66499)
28 апр 2026, 13:29
Не верифицирован
28 апр 2026, 13:29
e7b5ff2
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace Microsoft.AspNetCore.Http.HttpResults; using System.Reflection; using System.Text; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http.Metadata; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing.Patterns; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Newtonsoft.Json.Linq; public class InternalServerErrorOfTResultTests { [Fact] public void InternalServerErrorObjectResult_SetsStatusCodeAndValue() { // Arrange & Act var obj = new object(); var internalServerErrorObjectResult = new InternalServerError<object>(obj); // Assert Assert.Equal(StatusCodes.Status500InternalServerError, internalServerErrorObjectResult.StatusCode); Assert.Equal(obj, internalServerErrorObjectResult.Value); } [Fact] public void InternalServerErrorObjectResult_ProblemDetails_SetsStatusCodeAndValue() { // Arrange & Act var obj = new HttpValidationProblemDetails(); var result = new InternalServerError<HttpValidationProblemDetails>(obj); // Assert Assert.Equal(StatusCodes.Status500InternalServerError, result.StatusCode); Assert.Equal(StatusCodes.Status500InternalServerError, obj.Status); Assert.Equal(obj, result.Value); } [Fact] public async Task InternalServerErrorObjectResult_ExecuteAsync_SetsStatusCode() { // Arrange var result = new InternalServerError<string>("Hello"); var httpContext = new DefaultHttpContext() { RequestServices = CreateServices(), }; // Act await result.ExecuteAsync(httpContext); // Assert Assert.Equal(StatusCodes.Status500InternalServerError, httpContext.Response.StatusCode); } [Fact] public async Task InternalServerErrorObjectResult_ExecuteResultAsync_FormatsData() { // Arrange var result = new InternalServerError<string>("Hello"); var stream = new MemoryStream(); var httpContext = new DefaultHttpContext() { RequestServices = CreateServices(), Response = { Body = stream, }, }; // Act await result.ExecuteAsync(httpContext); // Assert Assert.Equal("\"Hello\"", Encoding.UTF8.GetString(stream.ToArray())); } [Fact] public async Task InternalServerErrorObjectResult_ExecuteResultAsync_UsesStatusCodeFromResultTypeForProblemDetails() { // Arrange var details = new ProblemDetails { Status = StatusCodes.Status422UnprocessableEntity, }; var result = new InternalServerError<ProblemDetails>(details); var httpContext = new DefaultHttpContext() { RequestServices = CreateServices(), }; // Act await result.ExecuteAsync(httpContext); // Assert Assert.Equal(StatusCodes.Status422UnprocessableEntity, details.Status.Value); Assert.Equal(StatusCodes.Status500InternalServerError, result.StatusCode); Assert.Equal(StatusCodes.Status500InternalServerError, httpContext.Response.StatusCode); } [Fact] public void PopulateMetadata_AddsResponseTypeMetadata() { // Arrange InternalServerError<Todo> MyApi() { throw new NotImplementedException(); } var builder = new RouteEndpointBuilder(requestDelegate: null, RoutePatternFactory.Parse("/"), order: 0); // Act PopulateMetadata<InternalServerError<Todo>>(((Delegate)MyApi).GetMethodInfo(), builder); // Assert var producesResponseTypeMetadata = builder.Metadata.OfType<ProducesResponseTypeMetadata>().Last(); Assert.Equal(StatusCodes.Status500InternalServerError, producesResponseTypeMetadata.StatusCode); Assert.Equal(typeof(Todo), producesResponseTypeMetadata.Type); Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json"); Assert.Contains(builder.Metadata, m => m is IDisableCookieRedirectMetadata); } [Fact] public void PopulateMetadata_ProblemDetailsAddsProblemJsonMetadata() { // Arrange InternalServerError<ProblemDetails> MyApi() { throw new NotImplementedException(); } var builder = new RouteEndpointBuilder(requestDelegate: null, RoutePatternFactory.Parse("/"), order: 0); // Act PopulateMetadata<InternalServerError<ProblemDetails>>(((Delegate)MyApi).GetMethodInfo(), builder); // Assert var producesResponseTypeMetadata = builder.Metadata.OfType<ProducesResponseTypeMetadata>().Last(); Assert.Equal(StatusCodes.Status500InternalServerError, producesResponseTypeMetadata.StatusCode); Assert.Equal(typeof(ProblemDetails), producesResponseTypeMetadata.Type); Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/problem+json"); Assert.Contains(builder.Metadata, m => m is IDisableCookieRedirectMetadata); } [Fact] public async Task ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull() { // Arrange var result = new InternalServerError<object>(null); HttpContext httpContext = null; // Act & Assert await Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext)); } [Fact] public void PopulateMetadata_ThrowsArgumentNullException_WhenMethodOrBuilderAreNull() { // Act & Assert Assert.Throws<ArgumentNullException>("method", () => PopulateMetadata<InternalServerError<object>>(null, new RouteEndpointBuilder(requestDelegate: null, RoutePatternFactory.Parse("/"), order: 0))); Assert.Throws<ArgumentNullException>("builder", () => PopulateMetadata<InternalServerError<object>>(((Delegate)PopulateMetadata_ThrowsArgumentNullException_WhenMethodOrBuilderAreNull).GetMethodInfo(), null)); } [Fact] public void InternalServerErrorObjectResult_Implements_IStatusCodeHttpResult_Correctly() { // Act & Assert var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new InternalServerError<string>(null)); Assert.Equal(StatusCodes.Status500InternalServerError, result.StatusCode); } [Fact] public void InternalServerErrorObjectResult_Implements_IValueHttpResult_Correctly() { // Arrange var value = "Foo"; // Act & Assert var result = Assert.IsAssignableFrom<IValueHttpResult>(new InternalServerError<string>(value)); Assert.IsType<string>(result.Value); Assert.Equal(value, result.Value); } [Fact] public void InternalServerErrorObjectResult_Implements_IValueHttpResultOfT_Correctly() { // Arrange & Act var value = "Foo"; // Assert var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new InternalServerError<string>(value)); Assert.IsType<string>(result.Value); Assert.Equal(value, result.Value); } private static void PopulateMetadata<TResult>(MethodInfo method, EndpointBuilder builder) where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(method, builder); private record Todo(int Id, string Title); private static IServiceProvider CreateServices() { var services = new ServiceCollection(); services.AddSingleton<ILoggerFactory, NullLoggerFactory>(); return services.BuildServiceProvider(); } }