E2E tests for cascading parameters generally
This commit is contained in:
parent
18df30568c
commit
7530ad9a26
|
|
@ -56,4 +56,12 @@ namespace Microsoft.AspNetCore.Blazor.E2ETest.ServerExecutionTests
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ServerCascadingValueTest : CascadingValueTest
|
||||||
|
{
|
||||||
|
public ServerCascadingValueTest(BrowserFixture browserFixture, ToggleExecutionModeServerFixture<Program> serverFixture, ITestOutputHelper output)
|
||||||
|
: base(browserFixture, serverFixture.WithServerExecution(), output)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using BasicTestApp;
|
||||||
|
using Microsoft.AspNetCore.Blazor.E2ETest.Infrastructure;
|
||||||
|
using Microsoft.AspNetCore.Blazor.E2ETest.Infrastructure.ServerFixtures;
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using Xunit;
|
||||||
|
using Xunit.Abstractions;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Blazor.E2ETest.Tests
|
||||||
|
{
|
||||||
|
public class CascadingValueTest : BasicTestAppTestBase
|
||||||
|
{
|
||||||
|
public CascadingValueTest(
|
||||||
|
BrowserFixture browserFixture,
|
||||||
|
ToggleExecutionModeServerFixture<Program> serverFixture,
|
||||||
|
ITestOutputHelper output)
|
||||||
|
: base(browserFixture, serverFixture, output)
|
||||||
|
{
|
||||||
|
Navigate(ServerPathBase, noReload: !serverFixture.UsingAspNetHost);
|
||||||
|
MountTestComponent<BasicTestApp.CascadingValueTest.CascadingValueSupplier>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanUpdateValuesMatchedByType()
|
||||||
|
{
|
||||||
|
var currentCount = Browser.FindElement(By.Id("current-count"));
|
||||||
|
var incrementButton = Browser.FindElement(By.Id("increment-count"));
|
||||||
|
|
||||||
|
// We have the correct initial value
|
||||||
|
WaitAssert.Equal("100", () => currentCount.Text);
|
||||||
|
|
||||||
|
// Updates are propagated
|
||||||
|
incrementButton.Click();
|
||||||
|
WaitAssert.Equal("101", () => currentCount.Text);
|
||||||
|
incrementButton.Click();
|
||||||
|
WaitAssert.Equal("102", () => currentCount.Text);
|
||||||
|
|
||||||
|
// Didn't re-render unrelated descendants
|
||||||
|
Assert.Equal("1", Browser.FindElement(By.Id("receive-by-interface-num-renders")).Text);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanUpdateValuesMatchedByName()
|
||||||
|
{
|
||||||
|
var currentFlag1Value = Browser.FindElement(By.Id("flag-1"));
|
||||||
|
var currentFlag2Value = Browser.FindElement(By.Id("flag-2"));
|
||||||
|
|
||||||
|
WaitAssert.Equal("False", () => currentFlag1Value.Text);
|
||||||
|
WaitAssert.Equal("False", () => currentFlag2Value.Text);
|
||||||
|
|
||||||
|
// Observe that the correct cascading parameter updates
|
||||||
|
Browser.FindElement(By.Id("toggle-flag-1")).Click();
|
||||||
|
WaitAssert.Equal("True", () => currentFlag1Value.Text);
|
||||||
|
WaitAssert.Equal("False", () => currentFlag2Value.Text);
|
||||||
|
Browser.FindElement(By.Id("toggle-flag-2")).Click();
|
||||||
|
WaitAssert.Equal("True", () => currentFlag1Value.Text);
|
||||||
|
WaitAssert.Equal("True", () => currentFlag2Value.Text);
|
||||||
|
|
||||||
|
// Didn't re-render unrelated descendants
|
||||||
|
Assert.Equal("1", Browser.FindElement(By.Id("receive-by-interface-num-renders")).Text);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanUpdateFixedValuesMatchedByInterface()
|
||||||
|
{
|
||||||
|
var currentCount = Browser.FindElement(By.Id("current-count"));
|
||||||
|
var decrementButton = Browser.FindElement(By.Id("decrement-count"));
|
||||||
|
|
||||||
|
// We have the correct initial value
|
||||||
|
WaitAssert.Equal("100", () => currentCount.Text);
|
||||||
|
|
||||||
|
// Updates are propagated
|
||||||
|
decrementButton.Click();
|
||||||
|
WaitAssert.Equal("99", () => currentCount.Text);
|
||||||
|
decrementButton.Click();
|
||||||
|
WaitAssert.Equal("98", () => currentCount.Text);
|
||||||
|
|
||||||
|
// Renders the descendant the same number of times we triggered
|
||||||
|
// events on it, because we always re-render components after they
|
||||||
|
// have an event
|
||||||
|
Assert.Equal("3", Browser.FindElement(By.Id("receive-by-interface-num-renders")).Text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
@*
|
||||||
|
The only purpose of this component is to validate that cascaded value updates
|
||||||
|
can pass through entirely unrelated components that wouldn't normally rerender
|
||||||
|
their children when they themselves are being rerendered.
|
||||||
|
*@
|
||||||
|
|
||||||
|
<CascadingValueReceiveByType />
|
||||||
|
<CascadingValueReceiveByName />
|
||||||
|
<CascadingValueReceiveFixedByInterface />
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
@*
|
||||||
|
This component is to show that we can differentiate cascaded values
|
||||||
|
by name if they are of the same type.
|
||||||
|
*@
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Flag 1: <strong id="flag-1">@MyFlag1</strong>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Flag 2: <strong id="flag-2">@MyFlag2</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
@functions {
|
||||||
|
[CascadingParameter(Name = "TestFlag1")] bool MyFlag1 { get; set; }
|
||||||
|
[CascadingParameter(Name = "TestFlag2")] bool MyFlag2 { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
<p>
|
||||||
|
Current count:
|
||||||
|
<strong id="current-count">@CurrentCounter.NumClicks</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
@functions {
|
||||||
|
[CascadingParameter] CounterDTO CurrentCounter { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
@*
|
||||||
|
This component is to show that:
|
||||||
|
|
||||||
|
1. We can match a cascading parameter based on interface
|
||||||
|
2. Since the supplied value is fixed (see CascadingValueSupplier.cshtml),
|
||||||
|
ancestor renders don't trigger descendant renders even though the
|
||||||
|
supplied value type is mutable.
|
||||||
|
*@
|
||||||
|
|
||||||
|
@{ numRenders++; }
|
||||||
|
<p>
|
||||||
|
@(nameof(CascadingValueReceiveFixedByInterface)) render count:
|
||||||
|
<strong id="receive-by-interface-num-renders">@numRenders</strong>
|
||||||
|
<button id="decrement-count" onclick=@Ancestor.DecrementCount>Decrement</button>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
@functions {
|
||||||
|
int numRenders = 0;
|
||||||
|
|
||||||
|
[CascadingParameter] ICanDecrement Ancestor { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
@implements ICanDecrement
|
||||||
|
|
||||||
|
@*
|
||||||
|
While it looks somewhat ridiculous to nest so many CascadingValue components,
|
||||||
|
it simplifies the E2E test and is not intended as a representative use case.
|
||||||
|
Each of the CascadingValue components here is configured differently for the test.
|
||||||
|
*@
|
||||||
|
|
||||||
|
<CascadingValue Value=this Fixed=true>
|
||||||
|
<CascadingValue Value=counterState>
|
||||||
|
<CascadingValue Name="TestFlag1" Value="currentFlagValue1">
|
||||||
|
<CascadingValue Name="TestFlag2" Value="currentFlagValue2">
|
||||||
|
<CascadingValueIntermediary />
|
||||||
|
</CascadingValue>
|
||||||
|
</CascadingValue>
|
||||||
|
</CascadingValue>
|
||||||
|
</CascadingValue>
|
||||||
|
|
||||||
|
<p><button id="increment-count" onclick=@counterState.IncrementCount>Increment</button></p>
|
||||||
|
<p><label><input type="checkbox" id="toggle-flag-1" bind=currentFlagValue1 /> Flag 1</label></p>
|
||||||
|
<p><label><input type="checkbox" id="toggle-flag-2" bind=currentFlagValue2 /> Flag 2</label></p>
|
||||||
|
|
||||||
|
@functions {
|
||||||
|
CounterDTO counterState = new CounterDTO { NumClicks = 100 };
|
||||||
|
bool currentFlagValue1;
|
||||||
|
bool currentFlagValue2;
|
||||||
|
|
||||||
|
public void DecrementCount()
|
||||||
|
{
|
||||||
|
counterState.NumClicks--;
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace BasicTestApp.CascadingValueTest
|
||||||
|
{
|
||||||
|
public class CounterDTO
|
||||||
|
{
|
||||||
|
public int NumClicks { get; set; }
|
||||||
|
|
||||||
|
public void IncrementCount()
|
||||||
|
{
|
||||||
|
NumClicks++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ICanDecrement
|
||||||
|
{
|
||||||
|
void DecrementCount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -41,6 +41,7 @@
|
||||||
<option value="BasicTestApp.HtmlEncodedChildContent">ChildContent HTML Encoded Block</option>
|
<option value="BasicTestApp.HtmlEncodedChildContent">ChildContent HTML Encoded Block</option>
|
||||||
<option value="BasicTestApp.RazorTemplates">Razor Templates</option>
|
<option value="BasicTestApp.RazorTemplates">Razor Templates</option>
|
||||||
<option value="BasicTestApp.MultipleChildContent">Multiple child content</option>
|
<option value="BasicTestApp.MultipleChildContent">Multiple child content</option>
|
||||||
|
<option value="BasicTestApp.CascadingValueTest.CascadingValueSupplier">Cascading values</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
@if (SelectedComponentType != null)
|
@if (SelectedComponentType != null)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue