-
Notifications
You must be signed in to change notification settings - Fork 10.6k
Expand file tree
/
Copy pathRouteHandlerTest.cs
More file actions
130 lines (108 loc) · 3.99 KB
/
RouteHandlerTest.cs
File metadata and controls
130 lines (108 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// 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;
}
}
}