Skip to content

Commit 96287a4

Browse files
committed
unit test exception.
1 parent 60995b7 commit 96287a4

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.EventDispatch.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private Task ReturnErrorResponse(string detailedMessage)
7979
: Task.CompletedTask;
8080
}
8181

82-
private async Task SetNotFoundResponseAsync(string baseUri, NotFoundEventArgs args)
82+
internal async Task SetNotFoundResponseAsync(string baseUri, NotFoundEventArgs args)
8383
{
8484
if (_httpContext.Response.HasStarted)
8585
{

src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public EndpointHtmlRenderer(IServiceProvider serviceProvider, ILoggerFactory log
6464

6565
internal HttpContext? HttpContext => _httpContext;
6666

67-
private void SetHttpContext(HttpContext httpContext)
67+
internal void SetHttpContext(HttpContext httpContext)
6868
{
6969
if (_httpContext is null)
7070
{
@@ -87,7 +87,8 @@ internal async Task InitializeStandardComponentServicesAsync(
8787

8888
if (navigationManager != null)
8989
{
90-
navigationManager.OnNotFound += async (sender, args) => await SetNotFoundResponseAsync(navigationManager.BaseUri, args);
90+
navigationManager.OnNotFound += async (sender, args) =>
91+
await GetErrorHandledTask(SetNotFoundResponseAsync(navigationManager.BaseUri, args));
9192
}
9293

9394
var authenticationStateProvider = httpContext.RequestServices.GetService<AuthenticationStateProvider>();

src/Components/Endpoints/test/EndpointHtmlRendererTest.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System;
45
using System.Text.Encodings.Web;
56
using System.Text.Json;
67
using System.Text.RegularExpressions;
8+
using Microsoft.AspNetCore.Builder;
79
using Microsoft.AspNetCore.Components.Endpoints.Forms;
810
using Microsoft.AspNetCore.Components.Endpoints.Tests.TestComponents;
911
using Microsoft.AspNetCore.Components.Forms;
@@ -12,6 +14,7 @@
1214
using Microsoft.AspNetCore.Components.Reflection;
1315
using Microsoft.AspNetCore.Components.Rendering;
1416
using Microsoft.AspNetCore.Components.RenderTree;
17+
using Microsoft.AspNetCore.Components.Routing;
1518
using Microsoft.AspNetCore.Components.Test.Helpers;
1619
using Microsoft.AspNetCore.Components.Web;
1720
using Microsoft.AspNetCore.DataProtection;
@@ -934,6 +937,28 @@ await renderer.PrerenderComponentAsync(
934937
Assert.Equal("http://localhost/redirect", ctx.Response.Headers.Location);
935938
}
936939

940+
[Fact]
941+
public async Task Renderer_WhenNoNotFoundPathProvided_Throws()
942+
{
943+
// Arrange
944+
var httpContext = GetHttpContext();
945+
var responseMock = new Mock<IHttpResponseFeature>();
946+
responseMock.Setup(r => r.HasStarted).Returns(true);
947+
responseMock.Setup(r => r.Headers).Returns(new HeaderDictionary());
948+
httpContext.Features.Set(responseMock.Object);
949+
var renderer = GetEndpointHtmlRenderer();
950+
httpContext.Items[nameof(StatusCodePagesOptions)] = null; // simulate missing re-execution route
951+
952+
var component = new NotFoundComponent();
953+
var id = renderer.AssignRootComponentId(component);
954+
var exception = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
955+
await renderer.SetNotFoundResponseAsync(httpContext, new NotFoundEventArgs(""))
956+
);
957+
string expectedError = "The NotFoundPage route must be specified or re-execution middleware has to be set to render NotFoundPage when the response has started.";
958+
959+
Assert.Equal(expectedError, exception.Message);
960+
}
961+
937962
[Fact]
938963
public async Task CanRender_AsyncComponent()
939964
{
@@ -1802,6 +1827,12 @@ protected override void ProcessPendingRender()
18021827
_rendererIsStopped = true;
18031828
base.SignalRendererToFinishRendering();
18041829
}
1830+
1831+
public async Task SetNotFoundResponseAsync(HttpContext httpContext, NotFoundEventArgs args)
1832+
{
1833+
SetHttpContext(httpContext);
1834+
await SetNotFoundResponseAsync(httpContext.Request.PathBase, args);
1835+
}
18051836
}
18061837

18071838
private HttpContext GetHttpContext(HttpContext context = null)

0 commit comments

Comments
 (0)