/
githubmirror
/
aspnetcore
Обзор
Документация
Войти
/
githubmirror
/
aspnetcore
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Http/Http.Results/test/AcceptedAtRouteResultTests.cs
137 строк
5 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. using System.Reflection; using System.Text; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http.Metadata; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing.Patterns; using Microsoft.AspNetCore.InternalTesting; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Http.HttpResults; public class AcceptedAtRouteResultTests { public static TheoryData<object> AcceptedAtRouteData { get { return new TheoryData<object> { null, new Dictionary<string, string>() { { "hello", "world" } }, new RouteValueDictionary( new Dictionary<string, string>() { { "test", "case" }, { "sample", "route" } }), }; } } [Theory] [MemberData(nameof(AcceptedAtRouteData))] public async Task ExecuteResultAsync_SetsStatusCodeAndLocationHeader(object values) { // Arrange var expectedUrl = "testAction"; var linkGenerator = new TestLinkGenerator { Url = expectedUrl }; var httpContext = GetHttpContext(linkGenerator); // Act var result = new AcceptedAtRoute(routeValues: values); await result.ExecuteAsync(httpContext); // Assert Assert.Equal(StatusCodes.Status202Accepted, httpContext.Response.StatusCode); Assert.Equal(expectedUrl, httpContext.Response.Headers["Location"]); Assert.Equal(new RouteValueDictionary(values), linkGenerator.RouteValuesAddress.ExplicitValues); } [Fact] public async Task ExecuteResultAsync_ThrowsIfRouteUrlIsNull() { // Arrange var linkGenerator = new TestLinkGenerator(); var httpContext = GetHttpContext(linkGenerator); // Act var result = new AcceptedAtRoute( routeName: null, routeValues: new Dictionary<string, object>()); // Assert await ExceptionAssert.ThrowsAsync<InvalidOperationException>(() => result.ExecuteAsync(httpContext), "No route matches the supplied values."); } [Fact] public void PopulateMetadata_AddsResponseTypeMetadata() { // Arrange AcceptedAtRoute MyApi() { throw new NotImplementedException(); } var builder = new RouteEndpointBuilder(requestDelegate: null, RoutePatternFactory.Parse("/"), order: 0); // Act PopulateMetadata<AcceptedAtRoute>(((Delegate)MyApi).GetMethodInfo(), builder); // Assert var producesResponseTypeMetadata = builder.Metadata.OfType<ProducesResponseTypeMetadata>().Last(); Assert.Equal(StatusCodes.Status202Accepted, producesResponseTypeMetadata.StatusCode); Assert.Equal(typeof(void), producesResponseTypeMetadata.Type); Assert.Contains(builder.Metadata, m => m is IDisableCookieRedirectMetadata); } [Fact] public async Task ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull() { // Arrange var result = new AcceptedAtRoute(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<AcceptedAtRoute>(null, new RouteEndpointBuilder(requestDelegate: null, RoutePatternFactory.Parse("/"), order: 0))); Assert.Throws<ArgumentNullException>("builder", () => PopulateMetadata<AcceptedAtRoute>(((Delegate)PopulateMetadata_ThrowsArgumentNullException_WhenMethodOrBuilderAreNull).GetMethodInfo(), null)); } [Fact] public void AcceptedAtRouteResult_Implements_IStatusCodeHttpResult_Correctly() { // Act & Assert var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new AcceptedAtRoute(null)); Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode); } private static void PopulateMetadata<TResult>(MethodInfo method, EndpointBuilder builder) where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(method, builder); private static HttpContext GetHttpContext(LinkGenerator linkGenerator) { var httpContext = new DefaultHttpContext(); httpContext.RequestServices = CreateServices(linkGenerator); return httpContext; } private static IServiceProvider CreateServices(LinkGenerator linkGenerator) { var services = new ServiceCollection(); services.AddLogging(); services.AddSingleton(linkGenerator); return services.BuildServiceProvider(); } }