Skip to content

Commit 5d6f8ff

Browse files
committed
Application builder now prepares default HTTP features extracted by the middleware, which are injected in every HttpContextMock (#358)
1 parent db740df commit 5d6f8ff

File tree

7 files changed

+72
-24
lines changed

7 files changed

+72
-24
lines changed

src/MyTested.AspNetCore.Mvc.Abstractions/Internal/Application/ApplicationBuilderMock.cs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Collections.Generic;
55
using System.Linq;
66
using System.Threading.Tasks;
7+
using Http;
78
using Microsoft.AspNetCore.Builder;
89
using Microsoft.AspNetCore.Http;
910
using Microsoft.AspNetCore.Http.Features;
@@ -45,13 +46,6 @@ public ApplicationBuilderMock(IServiceProvider serviceProvider)
4546
this.CheckForEndpointRouting(serviceProvider);
4647
}
4748

48-
/// <summary>
49-
/// Initializes a new instance of the <see cref="ApplicationBuilderMock"/> class.
50-
/// </summary>
51-
/// <param name="builder">Application builder to copy properties from.</param>
52-
public ApplicationBuilderMock(IApplicationBuilder builder)
53-
=> this.Properties = builder.Properties;
54-
5549
/// <summary>
5650
/// Gets or sets the current application services.
5751
/// </summary>
@@ -87,9 +81,6 @@ public IServiceProvider ApplicationServices
8781
/// <returns>The same <see cref="IApplicationBuilder"/>.</returns>
8882
public IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)
8983
{
90-
this.ExtractEndpointRoutes(middleware);
91-
this.ExtractLegacyRoutes(middleware);
92-
9384
this.components.Add(middleware);
9485

9586
return this;
@@ -99,10 +90,10 @@ public IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware
9990
/// Returns new instance of <see cref="IApplicationBuilder"/>. Not used in the actual testing.
10091
/// </summary>
10192
/// <returns>Result of <see cref="IApplicationBuilder"/> type.</returns>
102-
public IApplicationBuilder New() => new ApplicationBuilderMock(this);
93+
public IApplicationBuilder New() => new ApplicationBuilderMock(this.ApplicationServices);
10394

10495
/// <summary>
105-
/// Builds the application delegate, which will process the incoming HTTP requests. Not used in the actual testing.
96+
/// Builds the application delegate, which will process the incoming HTTP requests. Prepares the HTTP context used in the tests.
10697
/// </summary>
10798
/// <returns>Result of <see cref="RequestDelegate"/> type.</returns>
10899
public RequestDelegate Build()
@@ -121,6 +112,17 @@ public RequestDelegate Build()
121112
return app;
122113
}
123114

115+
public void ExtractRouteConfiguration()
116+
{
117+
this.Routes = new RouteCollection();
118+
119+
this.components.ForEach(component =>
120+
{
121+
this.ExtractEndpointRoutes(component);
122+
this.ExtractLegacyRoutes(component);
123+
});
124+
}
125+
124126
private T GetProperty<T>(string key)
125127
=> this.Properties.TryGetValue(key, out var value) ? (T)value : default;
126128

@@ -178,11 +180,8 @@ private void ExtractEndpointRoutes(Func<RequestDelegate, RequestDelegate> middle
178180
}
179181
});
180182

181-
foreach (var routeEndpointData in routeEndpoints)
183+
foreach (var (routeName, routeEndpoint) in routeEndpoints)
182184
{
183-
var routeName = routeEndpointData.Key;
184-
var routeEndpoint = routeEndpointData.Value;
185-
186185
var routePattern = routeEndpoint.RoutePattern;
187186
var rawRouteText = routePattern.RawText;
188187

src/MyTested.AspNetCore.Mvc.Abstractions/Internal/Application/TestApplicationRouter.cs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@
33
using System;
44
using System.Collections.Generic;
55
using System.Linq;
6+
using Http;
67
using Routing;
78
using Microsoft.AspNetCore.Builder;
89
using Microsoft.AspNetCore.Hosting;
10+
using Microsoft.AspNetCore.Http;
11+
using Microsoft.AspNetCore.Http.Features;
912
using Microsoft.AspNetCore.Routing;
1013
using Microsoft.Extensions.DependencyInjection;
1114
using Utilities.Extensions;
1215

1316
public static partial class TestApplication
1417
{
1518
private static volatile IRouter router;
19+
private static volatile RequestDelegate pipeline;
1620

1721
public static IRouter Router
1822
{
@@ -23,6 +27,15 @@ public static IRouter Router
2327
}
2428
}
2529

30+
public static RequestDelegate Pipeline
31+
{
32+
get
33+
{
34+
TryLockedInitialization();
35+
return pipeline;
36+
}
37+
}
38+
2639
internal static Action<IRouteBuilder> AdditionalRouting { get; set; }
2740

2841
private static void PrepareApplicationAndRouting()
@@ -44,6 +57,38 @@ private static void PrepareApplicationAndRouting()
4457

4558
AdditionalApplicationConfiguration?.Invoke(applicationBuilder);
4659

60+
PreparePipelineAndFeatures(applicationBuilder);
61+
PrepareRouter(applicationBuilder);
62+
}
63+
64+
private static void PreparePipelineAndFeatures(IApplicationBuilder applicationBuilder)
65+
{
66+
pipeline = applicationBuilder.Build();
67+
68+
var httpContext = new DefaultHttpContext();
69+
70+
var featuresToRemove = new FeatureCollection(httpContext.Features);
71+
72+
pipeline(httpContext);
73+
74+
var defaultFeatures = new FeatureCollection();
75+
76+
httpContext.Features.ForEach(feature =>
77+
{
78+
var (type, value) = feature;
79+
if (featuresToRemove[type] == null)
80+
{
81+
defaultFeatures[type] = value;
82+
}
83+
});
84+
85+
TestHelper.DefaultHttpFeatures = defaultFeatures;
86+
}
87+
88+
private static void PrepareRouter(ApplicationBuilderMock applicationBuilder)
89+
{
90+
applicationBuilder.ExtractRouteConfiguration();
91+
4792
var routeBuilder = new RouteBuilder(applicationBuilder)
4893
{
4994
DefaultHandler = RouteHandlerMock.Null
@@ -54,7 +99,7 @@ private static void PrepareApplicationAndRouting()
5499
var route = applicationBuilder.Routes[i];
55100
routeBuilder.Routes.Add(route);
56101
}
57-
102+
58103
AdditionalRouting?.Invoke(routeBuilder);
59104

60105
var routeBuilderRoutes = routeBuilder.Routes;

src/MyTested.AspNetCore.Mvc.Abstractions/Internal/Server/TestWebServer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System;
44
using Configuration;
55
using Microsoft.AspNetCore.Hosting;
6+
using Microsoft.Extensions.FileProviders;
67

78
public static partial class TestWebServer
89
{
@@ -18,7 +19,8 @@ private static IWebHostEnvironment PrepareEnvironment()
1819
{
1920
ApplicationName = ApplicationName,
2021
EnvironmentName = ServerTestConfiguration.General.EnvironmentName,
21-
ContentRootPath = AppContext.BaseDirectory
22+
ContentRootPath = AppContext.BaseDirectory,
23+
WebRootFileProvider = new NullFileProvider()
2224
};
2325

2426
internal static void ResetConfigurationAndAssemblies()

src/MyTested.AspNetCore.Mvc.Abstractions/Internal/TestHelper.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
public static class TestHelper
1616
{
1717
public static Action GlobalTestCleanup { get; set; }
18-
18+
19+
public static IFeatureCollection DefaultHttpFeatures { get; set; } = new FeatureCollection();
20+
1921
public static ISet<IHttpFeatureRegistrationPlugin> HttpFeatureRegistrationPlugins { get; }
2022
= new HashSet<IHttpFeatureRegistrationPlugin>();
2123

@@ -26,7 +28,8 @@ public static HttpContextMock CreateHttpContextMock()
2628
{
2729
var httpContextFactory = TestServiceProvider.GetService<IHttpContextFactory>();
2830
var httpContext = httpContextFactory != null
29-
? HttpContextMock.From(httpContextFactory.Create(new FeatureCollection()))
31+
? HttpContextMock.From(httpContextFactory
32+
.Create(new FeatureCollection(DefaultHttpFeatures)))
3033
: new HttpContextMock();
3134

3235
SetHttpContextToAccessor(httpContext);

test/MyTested.AspNetCore.Mvc.Abstractions.Test/ServicesTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ public void StartupFiltersShouldBeRegisteredAndConsidered()
854854
var sameStartupFilter = TestServiceProvider.GetService<IStartupFilter>() as CustomStartupFilter;
855855

856856
Assert.NotNull(sameStartupFilter);
857-
Assert.True(sameStartupFilter.ConfigurationRegistered);
857+
Assert.True(sameStartupFilter.Registered);
858858

859859
MyApplication.StartsFrom<DefaultStartup>();
860860
}

test/MyTested.AspNetCore.Mvc.Test.Setups/Http/CustomHttpFeature.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22
{
33
public class CustomHttpFeature
44
{
5-
65
}
76
}

test/MyTested.AspNetCore.Mvc.Test.Setups/StartupFilters/CustomStartupFilter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77

88
public class CustomStartupFilter : IStartupFilter
99
{
10-
public bool ConfigurationRegistered { get; private set; }
10+
public bool Registered { get; private set; }
1111

1212
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
1313
=> app =>
1414
{
15-
this.ConfigurationRegistered = true;
15+
this.Registered = true;
1616

1717
app.Use(async (context, nextMiddleware) =>
1818
{

0 commit comments

Comments
 (0)