Skip to content

Commit 70dd508

Browse files
committed
Add stopping renderer tests.
1 parent 96f1e6e commit 70dd508

File tree

6 files changed

+151
-38
lines changed

6 files changed

+151
-38
lines changed

src/Components/test/E2ETest/ServerExecutionTests/PrerenderingTest.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,6 @@ public void CanReadUrlHashOnlyOnceConnected()
9797
() => Browser.Exists(By.TagName("strong")).Text);
9898
}
9999

100-
[Fact]
101-
public async Task CannotRedirectWhenExceptionIsThrownDuringPrerendering()
102-
{
103-
var requestUri = new Uri(
104-
_serverFixture.RootUri,
105-
"prerendered/prerendered-redirection?destination=base/relative");
106-
107-
var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
108-
var response = await httpClient.GetAsync(requestUri);
109-
110-
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
111-
}
112-
113100
[Theory]
114101
[InlineData(null, null)]
115102
[InlineData(null, "Bert")]

src/Components/test/E2ETest/ServerRenderingTests/RenderingTest.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,53 @@ public void PostRequestRendersEndStateOfComponentsOnSSRPage()
6666

6767
Browser.Equal("loaded child", () => Browser.Exists(By.Id("child")).Text);
6868
}
69+
70+
[Theory]
71+
[InlineData(false, "ServerPrerendered", true)]
72+
[InlineData(false, "ServerPrerendered", false)]
73+
[InlineData(true, "ServerPrerendered", false)]
74+
[InlineData(true, "ServerNonPrerendered", false)]
75+
[InlineData(true, "WebAssemblyPrerendered", false)]
76+
[InlineData(true, "WebAssemblyNonPrerendered", false)]
77+
public async Task RenderBatchQueuedAfterRedirectionIsNotProcessed(bool redirect, string renderMode, bool throwSync)
78+
{
79+
string relativeUri = $"subdir/stopping-renderer?renderMode={renderMode}";
80+
if (redirect)
81+
{
82+
relativeUri += $"&destination=redirect";
83+
}
84+
85+
// async operation forces the next render batch
86+
if (throwSync)
87+
{
88+
relativeUri += $"&delay=0";
89+
}
90+
else
91+
{
92+
relativeUri += $"&delay=1";
93+
}
94+
95+
var requestUri = new Uri(_serverFixture.RootUri, relativeUri);
96+
var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
97+
var response = await httpClient.GetAsync(requestUri);
98+
99+
if (redirect)
100+
{
101+
var expectedUri = new Uri(_serverFixture.RootUri, "subdir/redirect");
102+
Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
103+
Assert.Equal(expectedUri, response.Headers.Location);
104+
}
105+
else
106+
{
107+
// the status code cannot be changed after it got set, so async throwing returns OK
108+
if (throwSync)
109+
{
110+
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
111+
}
112+
else
113+
{
114+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
115+
}
116+
}
117+
}
69118
}

src/Components/test/testassets/Components.TestServer/RazorComponents/Components/InteractiveStreamingRenderingComponent.razor

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ else
5959
object key = DisableKeys ? null : counter.Id;
6060

6161
<Counter
62-
@rendermode="@GetRenderMode(counter.RenderModeId)"
62+
@rendermode="@RenderModeHelper.GetRenderMode(counter.RenderModeId)"
6363
@key="@key"
6464
IdSuffix="@counter.Id.ToString()"
6565
IncrementAmount="counter.IncrementAmount"
@@ -201,30 +201,6 @@ else
201201
$"&{nameof(DisableKeys)}={disableKeys}";
202202
}
203203

204-
private static IComponentRenderMode GetRenderMode(RenderModeId renderMode)
205-
{
206-
return renderMode switch
207-
{
208-
RenderModeId.ServerPrerendered => RenderMode.InteractiveServer,
209-
RenderModeId.ServerNonPrerendered => new InteractiveServerRenderMode(false),
210-
RenderModeId.WebAssemblyPrerendered => RenderMode.InteractiveWebAssembly,
211-
RenderModeId.WebAssemblyNonPrerendered => new InteractiveWebAssemblyRenderMode(false),
212-
RenderModeId.AutoPrerendered => RenderMode.InteractiveAuto,
213-
RenderModeId.AutoNonPrerendered => new InteractiveAutoRenderMode(false),
214-
_ => throw new InvalidOperationException($"Unknown render mode: {renderMode}"),
215-
};
216-
}
217-
218-
private enum RenderModeId
219-
{
220-
ServerPrerendered = 0,
221-
ServerNonPrerendered = 1,
222-
WebAssemblyPrerendered = 2,
223-
WebAssemblyNonPrerendered = 3,
224-
AutoPrerendered = 4,
225-
AutoNonPrerendered = 5,
226-
}
227-
228204
private record struct CounterInfo(int Id, int IncrementAmount, RenderModeId RenderModeId);
229205

230206
private record ComponentState(ImmutableArray<CounterInfo> Counters, int NextCounterId)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
@if(throwException)
2+
{
3+
throw new InvalidOperationException("Child component UI exception: redirection should have stopped renderer.");
4+
}
5+
6+
@code {
7+
[Parameter]
8+
public int Delay { get; set; }
9+
10+
private bool throwException { get; set; }
11+
12+
private string message = string.Empty;
13+
14+
protected override async Task OnInitializedAsync()
15+
{
16+
await Task.Yield();
17+
_ = ScheduleRenderingExceptionAfterDelay();
18+
}
19+
20+
private async Task ScheduleRenderingExceptionAfterDelay()
21+
{
22+
// This update should not happen if the renderer is stopped
23+
await Task.Delay(Delay);
24+
throwException = true;
25+
StateHasChanged();
26+
}
27+
}
28+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
@page "/stopping-renderer"
2+
@inject NavigationManager NavigationManager
3+
4+
<p>Parent content</p>
5+
<AsyncComponent @rendermode="@RenderModeHelper.GetRenderMode(CurrentRenderMode)" Delay="@Delay" />
6+
7+
@code {
8+
[Parameter, SupplyParameterFromQuery(Name = "destination")]
9+
public string Destination { get; set; } = string.Empty;
10+
11+
[Parameter, SupplyParameterFromQuery(Name = "renderMode")]
12+
public string? RenderModeStr { get; set; }
13+
14+
[Parameter, SupplyParameterFromQuery(Name = "delay")]
15+
public int Delay { get; set; }
16+
17+
private RenderModeId CurrentRenderMode => RenderModeHelper.ParseRenderMode(RenderModeStr);
18+
19+
protected override Task OnInitializedAsync()
20+
{
21+
if (!string.IsNullOrEmpty(Destination))
22+
{
23+
NavigationManager.NavigateTo(Destination);
24+
}
25+
return Task.CompletedTask;
26+
}
27+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
2+
// Licensed to the .NET Foundation under one or more agreements.
3+
// The .NET Foundation licenses this file to you under the MIT license.
4+
5+
using Microsoft.AspNetCore.Components;
6+
using Microsoft.AspNetCore.Components.Web;
7+
8+
namespace TestServer;
9+
10+
public static class RenderModeHelper
11+
{
12+
public static IComponentRenderMode GetRenderMode(RenderModeId renderMode)
13+
{
14+
return renderMode switch
15+
{
16+
RenderModeId.ServerPrerendered => RenderMode.InteractiveServer,
17+
RenderModeId.ServerNonPrerendered => new InteractiveServerRenderMode(false),
18+
RenderModeId.WebAssemblyPrerendered => RenderMode.InteractiveWebAssembly,
19+
RenderModeId.WebAssemblyNonPrerendered => new InteractiveWebAssemblyRenderMode(false),
20+
RenderModeId.AutoPrerendered => RenderMode.InteractiveAuto,
21+
RenderModeId.AutoNonPrerendered => new InteractiveAutoRenderMode(false),
22+
_ => throw new InvalidOperationException($"Unknown render mode: {renderMode}"),
23+
};
24+
}
25+
26+
public static RenderModeId ParseRenderMode(string? renderModeStr)
27+
{
28+
if (!string.IsNullOrEmpty(renderModeStr) &&
29+
Enum.TryParse<RenderModeId>(renderModeStr, ignoreCase: true, out var result))
30+
{
31+
return result;
32+
}
33+
return RenderModeId.AutoNonPrerendered;
34+
}
35+
36+
}
37+
38+
public enum RenderModeId
39+
{
40+
ServerPrerendered = 0,
41+
ServerNonPrerendered = 1,
42+
WebAssemblyPrerendered = 2,
43+
WebAssemblyNonPrerendered = 3,
44+
AutoPrerendered = 4,
45+
AutoNonPrerendered = 5,
46+
}

0 commit comments

Comments
 (0)