Skip to content

Commit 4976961

Browse files
committed
Fix tests
1 parent 7e11bad commit 4976961

File tree

9 files changed

+108
-51
lines changed

9 files changed

+108
-51
lines changed

src/Components/Authorization/test/AuthorizeRouteViewTest.cs

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Security.Claims;
55
using Microsoft.AspNetCore.Authorization;
6+
using Microsoft.AspNetCore.Components.Binding;
67
using Microsoft.AspNetCore.Components.Rendering;
78
using Microsoft.AspNetCore.Components.RenderTree;
89
using Microsoft.AspNetCore.Components.Test.Helpers;
@@ -33,8 +34,10 @@ public AuthorizeRouteViewTest()
3334
serviceCollection.AddSingleton<IAuthorizationService>(_testAuthorizationService);
3435
serviceCollection.AddSingleton<NavigationManager, TestNavigationManager>();
3536

36-
_renderer = new TestRenderer(serviceCollection.BuildServiceProvider());
37-
_authorizeRouteViewComponent = new AuthorizeRouteView();
37+
var services = serviceCollection.BuildServiceProvider();
38+
_renderer = new TestRenderer(services);
39+
var componentFactory = new ComponentFactory(new DefaultComponentActivator());
40+
_authorizeRouteViewComponent = (AuthorizeRouteView)componentFactory.InstantiateComponent(services, typeof(AuthorizeRouteView));
3841
_authorizeRouteViewComponentId = _renderer.AssignRootComponentId(_authorizeRouteViewComponent);
3942
}
4043

@@ -63,10 +66,26 @@ public void WhenAuthorized_RendersPageInsideLayout()
6366
edit =>
6467
{
6568
Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
66-
AssertFrame.Component<TestPageRequiringAuthorization>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
69+
AssertFrame.Component<CascadingModelBinder>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
6770
},
6871
edit => AssertPrependText(batch, edit, "Layout ends here"));
6972

73+
var cascadingModelBinderDiff = batch.GetComponentDiffs<CascadingModelBinder>().Single();
74+
Assert.Collection(cascadingModelBinderDiff.Edits,
75+
edit =>
76+
{
77+
Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
78+
AssertFrame.Component<CascadingValue<ModelBindingContext>>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
79+
});
80+
81+
var cascadingValueDiff = batch.GetComponentDiffs<CascadingValue<ModelBindingContext>>().Single();
82+
Assert.Collection(cascadingValueDiff.Edits,
83+
edit =>
84+
{
85+
Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
86+
AssertFrame.Component<TestPageRequiringAuthorization>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
87+
});
88+
7089
// Assert: renders page
7190
var pageDiff = batch.GetComponentDiffs<TestPageRequiringAuthorization>().Single();
7291
Assert.Collection(pageDiff.Edits,
@@ -100,10 +119,26 @@ public void AuthorizesWhenResourceIsSet()
100119
edit =>
101120
{
102121
Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
103-
AssertFrame.Component<TestPageRequiringAuthorization>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
122+
AssertFrame.Component<CascadingModelBinder>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
104123
},
105124
edit => AssertPrependText(batch, edit, "Layout ends here"));
106125

126+
var cascadingModelBinderDiff = batch.GetComponentDiffs<CascadingModelBinder>().Single();
127+
Assert.Collection(cascadingModelBinderDiff.Edits,
128+
edit =>
129+
{
130+
Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
131+
AssertFrame.Component<CascadingValue<ModelBindingContext>>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
132+
});
133+
134+
var cascadingValueDiff = batch.GetComponentDiffs<CascadingValue<ModelBindingContext>>().Single();
135+
Assert.Collection(cascadingValueDiff.Edits,
136+
edit =>
137+
{
138+
Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
139+
AssertFrame.Component<TestPageRequiringAuthorization>(batch.ReferenceFrames[edit.ReferenceFrameIndex]);
140+
});
141+
107142
// Assert: renders page
108143
var pageDiff = batch.GetComponentDiffs<TestPageRequiringAuthorization>().Single();
109144
Assert.Collection(pageDiff.Edits,
@@ -291,6 +326,8 @@ public void WithoutCascadedAuthenticationState_WrapsOutputInCascadingAuthenticat
291326
component => Assert.IsType<CascadingValue<Task<AuthenticationState>>>(component),
292327
component => Assert.IsAssignableFrom<AuthorizeViewCore>(component),
293328
component => Assert.IsType<LayoutView>(component),
329+
component => Assert.IsType<CascadingModelBinder>(component),
330+
component => Assert.IsType<CascadingValue<ModelBindingContext>>(component),
294331
component => Assert.IsType<TestPageWithNoAuthorization>(component));
295332
}
296333

@@ -322,6 +359,8 @@ public void WithCascadedAuthenticationState_DoesNotWrapOutputInCascadingAuthenti
322359
// further CascadingAuthenticationState
323360
component => Assert.IsAssignableFrom<AuthorizeViewCore>(component),
324361
component => Assert.IsType<LayoutView>(component),
362+
component => Assert.IsType<CascadingModelBinder>(component),
363+
component => Assert.IsType<CascadingValue<ModelBindingContext>>(component),
325364
component => Assert.IsType<TestPageWithNoAuthorization>(component));
326365
}
327366

@@ -424,5 +463,9 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
424463

425464
class TestNavigationManager : NavigationManager
426465
{
466+
public TestNavigationManager()
467+
{
468+
Initialize("https://localhost:85/subdir/", "https://localhost:85/subdir/path?query=value#hash");
469+
}
427470
}
428471
}

src/Components/Components/src/Rendering/RenderTreeBuilder.cs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -557,30 +557,6 @@ public void AddComponentParameter(int sequence, string name, object? value)
557557
_entries.AppendAttribute(sequence, name, value);
558558
}
559559

560-
/// <summary>
561-
/// Appends a frame representing a component parameter.
562-
/// </summary>
563-
/// <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
564-
/// <param name="name">The name of the attribute.</param>
565-
/// <param name="value">The value of the attribute.</param>
566-
public void AddComponentParameter(int sequence, string name, RenderFragment? value)
567-
{
568-
AssertCanAddComponentParameter();
569-
_entries.AppendAttribute(sequence, name, value);
570-
}
571-
572-
/// <summary>
573-
/// Appends a frame representing a component parameter.
574-
/// </summary>
575-
/// <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
576-
/// <param name="name">The name of the attribute.</param>
577-
/// <param name="value">The value of the attribute.</param>
578-
public void AddComponentParameter<TContext>(int sequence, string name, RenderFragment<TContext>? value)
579-
{
580-
AssertCanAddComponentParameter();
581-
_entries.AppendAttribute(sequence, name, value);
582-
}
583-
584560
/// <summary>
585561
/// Assigns the specified key value to the current element or component.
586562
/// </summary>

src/Components/Components/src/RouteView.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
using System.Diagnostics.CodeAnalysis;
77
using System.Reflection;
8+
using Microsoft.AspNetCore.Components.Binding;
89
using Microsoft.AspNetCore.Components.Rendering;
910
using Microsoft.AspNetCore.Components.Routing;
1011

@@ -70,7 +71,7 @@ protected virtual void Render(RenderTreeBuilder builder)
7071

7172
builder.OpenComponent<LayoutView>(0);
7273
builder.AddComponentParameter(1, nameof(LayoutView.Layout), pageLayoutType);
73-
builder.AddComponentParameter(2, nameof(LayoutView.ChildContent), RenderPageWithParameters);
74+
builder.AddComponentParameter(2, nameof(LayoutView.ChildContent), (RenderFragment)RenderPageWithParameters);
7475
builder.CloseComponent();
7576
}
7677

@@ -85,9 +86,15 @@ private void RenderPageWithParameters(RenderTreeBuilder builder)
8586
var index => index - pathStart
8687
});
8788

89+
builder.OpenComponent<CascadingModelBinder>(0);
8890
builder.AddComponentParameter(1, nameof(CascadingModelBinder.Name), "");
89-
builder.AddComponentParameter(1, nameof(CascadingModelBinder.BindingId), bindingId);
90-
builder.AddComponentParameter(2, nameof(CascadingModelBinder.ChildContent), builder =>
91+
builder.AddComponentParameter(2, nameof(CascadingModelBinder.BindingId), bindingId);
92+
builder.AddComponentParameter(3, nameof(CascadingModelBinder.ChildContent), (RenderFragment<ModelBindingContext>)RenderPageWithContext);
93+
builder.CloseComponent();
94+
95+
RenderFragment RenderPageWithContext(ModelBindingContext context) => RenderPageCore;
96+
97+
void RenderPageCore(RenderTreeBuilder builder)
9198
{
9299
builder.OpenComponent(0, RouteData.PageType);
93100

@@ -113,7 +120,6 @@ private void RenderPageWithParameters(RenderTreeBuilder builder)
113120
}
114121

115122
builder.CloseComponent();
116-
});
117-
builder.CloseComponent();
123+
}
118124
}
119125
}

src/Components/Components/test/RenderTreeDiffBuilderTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1793,7 +1793,7 @@ public void AlwaysRegardsRenderFragmentAsPossiblyChanged()
17931793

17941794
using var batchBuilder = new RenderBatchBuilder();
17951795
using var renderTreeBuilder = new RenderTreeBuilder();
1796-
RenderTreeDiffBuilder.ComputeDiff(renderer, batchBuilder, 0, oldTree.GetFrames(), renderTreeBuilder.GetFrames(), renderTreeBuilder.GetNamedEvents());
1796+
RenderTreeDiffBuilder.ComputeDiff(renderer, batchBuilder, 0, renderTreeBuilder.GetFrames(), oldTree.GetFrames(), renderTreeBuilder.GetNamedEvents());
17971797
var componentInstance = (CaptureSetParametersComponent)oldTree.GetFrames().Array[0].Component;
17981798
Assert.Equal(1, componentInstance.SetParametersCallCount);
17991799

src/Components/Components/test/RouteViewTest.cs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +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 Microsoft.AspNetCore.Components.Binding;
45
using Microsoft.AspNetCore.Components.Rendering;
56
using Microsoft.AspNetCore.Components.Test.Helpers;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using static Microsoft.AspNetCore.Components.Routing.RouterTest;
69

710
namespace Microsoft.AspNetCore.Components.Test;
811

@@ -14,8 +17,14 @@ public class RouteViewTest
1417

1518
public RouteViewTest()
1619
{
17-
_renderer = new TestRenderer();
18-
_routeViewComponent = new RouteView();
20+
var serviceCollection = new ServiceCollection();
21+
serviceCollection.AddSingleton<NavigationManager, TestNavigationManager>();
22+
var services = serviceCollection.BuildServiceProvider();
23+
_renderer = new TestRenderer(services);
24+
25+
var componentFactory = new ComponentFactory(new DefaultComponentActivator());
26+
_routeViewComponent = (RouteView)componentFactory.InstantiateComponent(services, typeof(RouteView));
27+
1928
_routeViewComponentId = _renderer.AssignRootComponentId(_routeViewComponent);
2029
}
2130

@@ -62,24 +71,43 @@ public void RendersPageInsideLayoutView()
6271
frame => AssertFrame.Component<TestLayout>(frame, subtreeLength: 2, sequence: 0),
6372
frame => AssertFrame.Attribute(frame, nameof(LayoutComponentBase.Body), sequence: 1));
6473

65-
// Assert: TestLayout renders page
74+
// Assert: TestLayout renders cascading model binder
6675
var testLayoutComponentId = batch.GetComponentFrames<TestLayout>().Single().ComponentId;
6776
var testLayoutFrames = _renderer.GetCurrentRenderTreeFrames(testLayoutComponentId).AsEnumerable();
6877
Assert.Collection(testLayoutFrames,
6978
frame => AssertFrame.Text(frame, "Layout starts here", sequence: 0),
70-
frame => AssertFrame.Region(frame, subtreeLength: 3),
71-
frame => AssertFrame.Component<ComponentWithLayout>(frame, sequence: 0, subtreeLength: 2),
72-
frame => AssertFrame.Attribute(frame, nameof(ComponentWithLayout.Message), "Test message", sequence: 1),
79+
frame => AssertFrame.Region(frame, subtreeLength: 5),
80+
frame => AssertFrame.Component<CascadingModelBinder>(frame, sequence: 0, subtreeLength: 4),
81+
frame => AssertFrame.Attribute(frame, nameof(CascadingModelBinder.Name), "", sequence: 1),
82+
frame => AssertFrame.Attribute(frame, nameof(CascadingModelBinder.BindingId), "jan", sequence: 2),
83+
frame => AssertFrame.Attribute(frame, nameof(CascadingModelBinder.ChildContent), typeof(RenderFragment<ModelBindingContext>), sequence: 3),
7384
frame => AssertFrame.Text(frame, "Layout ends here", sequence: 2));
7485

86+
// Assert: Cascading model binder renders CascadingValue<ModelBindingContext>
87+
var cascadingModelBinderComponentId = batch.GetComponentFrames<CascadingModelBinder>().Single().ComponentId;
88+
var cascadingModelBinderFrames = _renderer.GetCurrentRenderTreeFrames(cascadingModelBinderComponentId).AsEnumerable();
89+
Assert.Collection(cascadingModelBinderFrames,
90+
frame => AssertFrame.Component<CascadingValue<ModelBindingContext>>(frame, sequence: 0, subtreeLength: 4),
91+
frame => AssertFrame.Attribute(frame, nameof(CascadingValue<ModelBindingContext>.IsFixed), true, sequence: 1),
92+
frame => AssertFrame.Attribute(frame, nameof(CascadingValue<ModelBindingContext>.Value), typeof(ModelBindingContext), sequence: 2),
93+
frame => AssertFrame.Attribute(frame, nameof(CascadingValue<ModelBindingContext>.ChildContent), typeof(RenderFragment), sequence: 3));
94+
95+
// Assert: CascadingValue<ModelBindingContext> renders page
96+
var cascadingValueComponentId = batch.GetComponentFrames<CascadingValue<ModelBindingContext>>().Single().ComponentId;
97+
var cascadingValueFrames = _renderer.GetCurrentRenderTreeFrames(cascadingValueComponentId).AsEnumerable();
98+
Assert.Collection(cascadingValueFrames,
99+
frame => AssertFrame.Region(frame, sequence: 0, subtreeLength: 3),
100+
frame => AssertFrame.Component<ComponentWithLayout>(frame, sequence: 0, subtreeLength: 2),
101+
frame => AssertFrame.Attribute(frame, nameof(ComponentWithLayout.Message), "Test message", sequence: 1));
102+
75103
// Assert: page itself is rendered, having received parameters from the original route data
76104
var pageComponentId = batch.GetComponentFrames<ComponentWithLayout>().Single().ComponentId;
77105
var pageFrames = _renderer.GetCurrentRenderTreeFrames(pageComponentId).AsEnumerable();
78106
Assert.Collection(pageFrames,
79107
frame => AssertFrame.Text(frame, "Hello from the page with message 'Test message'", sequence: 0));
80108

81109
// Assert: nothing else was rendered
82-
Assert.Equal(4, batch.DiffsInOrder.Count);
110+
Assert.Equal(6, batch.DiffsInOrder.Count);
83111
}
84112

85113
[Fact]

src/Components/Samples/BlazorUnitedApp/Pages/Index.razor

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
<h1>Hello, world!</h1>
66

7-
<CascadingModelBinder Name="Page" Context="pageContext">
7+
@* <CascadingModelBinder Name="Page" Context="pageContext">
88
<CascadingModelBinder Name="Navigation" Context="bindingContext">
9-
<EditForm Name="Action" method="POST" Model="new object()" OnValidSubmit="Submit">
9+
<EditForm FormHandlerName="Action" method="POST" Model="new object()" OnValidSubmit="Submit">
1010
<input type="submit" value="Process form" />
1111
</EditForm>
1212
</CascadingModelBinder>
13-
</CascadingModelBinder>
13+
</CascadingModelBinder> *@
1414

1515

1616
@if (_submitted)

src/Components/Web/src/Forms/EditForm.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,11 @@ public EditContext? EditContext
8686
/// <summary>
8787
/// Gets or sets the form name.
8888
/// </summary>
89-
[Parameter] public string Name { get; set; }
89+
/// <remarks>
90+
/// The <c>name</c> attribute on the <c>form</c> element will default to
91+
/// the <see cref="FormHandlerName"/> unless an explicit name is provided.
92+
/// </remarks>
93+
[Parameter] public string FormHandlerName { get; set; }
9094

9195
/// <inheritdoc />
9296
protected override void OnParametersSet()
@@ -130,11 +134,11 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
130134
// optimizing for the common case where _editContext never changes.
131135
builder.OpenRegion(_editContext.GetHashCode());
132136

133-
if (Name != null)
137+
if (FormHandlerName != null)
134138
{
135139
builder.OpenComponent<CascadingModelBinder>(0);
136-
builder.AddComponentParameter(1, nameof(CascadingModelBinder.Name), Name);
137-
builder.AddComponentParameter<ModelBindingContext>(2, nameof(CascadingModelBinder.ChildContent), RenderWithNamedContext);
140+
builder.AddComponentParameter(1, nameof(CascadingModelBinder.Name), FormHandlerName);
141+
builder.AddComponentParameter(2, nameof(CascadingModelBinder.ChildContent), (RenderFragment<ModelBindingContext>)RenderWithNamedContext);
138142
builder.CloseComponent();
139143
}
140144
else

src/Components/Web/test/Forms/EditFormTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ void RenderForm(RenderTreeBuilder builder)
420420
{
421421
builder.AddComponentParameter(4, "OnValidSubmit", new EventCallback<EditContext>(null, SubmitHandler));
422422
}
423-
builder.AddComponentParameter(5, "Name", FormName);
423+
builder.AddComponentParameter(5, "FormHandlerName", FormName);
424424

425425
builder.CloseComponent();
426426
}

src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/FormStreamingRendering.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
<h1>Streaming Rendering</h1>
66

77
@* This just sets the context for the binding, this happens normally inside RouteView *@
8-
<CascadingModelBinder Name="/form-streaming">
8+
@* <CascadingModelBinder Name="/form-streaming">
99
<EditForm id="process" method="POST" OnValidSubmit="ProcessForm">
1010
<input type="submit" value="Process form" />
1111
</EditForm>
12-
</CascadingModelBinder>
12+
</CascadingModelBinder> *@
1313

1414
<p id="status">
1515
@if (_processing)

0 commit comments

Comments
 (0)