File: RouteHandlerTest.cs
Web Access
Project: src\src\Http\Routing\test\FunctionalTests\Microsoft.AspNetCore.Routing.FunctionalTests.csproj (Microsoft.AspNetCore.Routing.FunctionalTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable enable
 
using System.Net;
using System.Net.Http.Json;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Primitives;
 
namespace Microsoft.AspNetCore.Routing.FunctionalTests;
 
public class RouteHandlerTest
{
    [Fact]
    public async Task MapPost_FromBodyWorksWithJsonPayload()
    {
        using var host = new HostBuilder()
            .ConfigureWebHost(webHostBuilder =>
            {
                webHostBuilder
                    .Configure(app =>
                    {
                        app.UseRouting();
                        app.UseEndpoints(b =>
                            b.MapPost("/EchoTodo/{id}",
                                (int id, Todo todo) => todo with { Id = id }));
                    })
                    .UseTestServer();
            })
            .ConfigureServices(services =>
            {
                services.AddRouting();
            })
            .Build();
 
        using var server = host.GetTestServer();
        await host.StartAsync();
        var client = server.CreateClient();
 
        var todo = new Todo
        {
            Name = "Write tests!"
        };
 
        var response = await client.PostAsJsonAsync("/EchoTodo/42", todo);
        response.EnsureSuccessStatusCode();
 
        var echoedTodo = await response.Content.ReadFromJsonAsync<Todo>();
 
        Assert.NotNull(echoedTodo);
        Assert.Equal(todo.Name, echoedTodo?.Name);
        Assert.Equal(42, echoedTodo?.Id);
    }
 
    [Fact]
    public async Task CustomEndpointDataSource_IsDisposedIfResolved()
    {
        var testDisposeDataSource = new TestDisposeEndpointDataSource();
        var testGroupDisposeDataSource = new TestDisposeEndpointDataSource();
 
        using var host = new HostBuilder()
            .ConfigureWebHost(webHostBuilder =>
            {
                webHostBuilder
                    .Configure(app =>
                    {
                        app.UseRouting();
                        app.UseEndpoints(b =>
                        {
                            b.DataSources.Add(testDisposeDataSource);
 
                            var group = b.MapGroup("");
                            ((IEndpointRouteBuilder)group).DataSources.Add(testGroupDisposeDataSource);
                        });
                    })
                    .UseTestServer();
            })
            .ConfigureServices(services =>
            {
                services.AddRouting();
            })
            .Build();
 
        using var server = host.GetTestServer();
        await host.StartAsync();
 
        // Make a request to ensure data sources are resolved.
        var client = server.CreateClient();
        var response = await client.GetAsync("/");
        // We didn't define any endpoints.
        Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
 
        Assert.False(testDisposeDataSource.IsDisposed);
        Assert.False(testGroupDisposeDataSource.IsDisposed);
 
        await host.StopAsync();
        host.Dispose();
 
        Assert.True(testDisposeDataSource.IsDisposed);
        Assert.True(testGroupDisposeDataSource.IsDisposed);
    }
 
    private record Todo
    {
        public int Id { get; set; }
        public string Name { get; set; } = "Todo";
        public bool IsComplete { get; set; }
    }
 
    private class TestDisposeEndpointDataSource : EndpointDataSource, IDisposable
    {
        public bool IsDisposed { get; private set; }
 
        public override IReadOnlyList<Endpoint> Endpoints => Array.Empty<Endpoint>();
 
        public override IChangeToken GetChangeToken() => NullChangeToken.Singleton;
 
        public void Dispose()
        {
            IsDisposed = true;
        }
    }
}