diff --git a/CHANGELOG.md b/CHANGELOG.md index 51081c37a..887959bbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ All notable changes to **bUnit** will be documented in this file. The project ad ## [Unreleased] +### Fixed + +- Do not set the `Uri` or `BaseUri` property on the `FakeNavigationManager` if navigation is prevented by a handler on `net7.0` or greater. Reported and fixed by [@ayyron-dev](https://github.com/ayyron-dev) in [#1647](https://github.com/bUnit-dev/bUnit/issues/1647) +- Use default renderer properties for AngleSharp. Reported by [@jtleaming](https://github.com/jtleaming) in [#1692]. +- `FindComponents` throws an exception, when a base and derived class was searched for. Reported by [@BlueDragon709](https://github.com/BlueDragon709) in [#1691]. + ## [1.38.5] - 2025-01-12 ### Added diff --git a/Directory.Packages.props b/Directory.Packages.props index 2ea5bcd6f..7c79b36a3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,7 +6,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -97,16 +97,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -122,7 +122,7 @@ - + diff --git a/README.md b/README.md index 691daaa00..2d9170d9f 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ A huge thank you to the [sponsors of bUnit](https://github.com/sponsors/egil). T
- + @syncfusion
Syncfusion diff --git a/src/bunit.core/Rendering/TestRenderer.cs b/src/bunit.core/Rendering/TestRenderer.cs index f26e77fd0..18625e39e 100644 --- a/src/bunit.core/Rendering/TestRenderer.cs +++ b/src/bunit.core/Rendering/TestRenderer.cs @@ -610,7 +610,13 @@ private IRenderedComponentBase GetOrCreateRenderedComponent)renderedComponent; + if (renderedComponent is IRenderedComponentBase typedComponent) + { + return typedComponent; + } + + renderedComponent.Dispose(); + renderedComponents.Remove(componentId); } LoadRenderTreeFrames(componentId, framesCollection); diff --git a/src/bunit.web/Rendering/BunitHtmlParser.cs b/src/bunit.web/Rendering/BunitHtmlParser.cs index 6f8edb5f7..08093cc0a 100644 --- a/src/bunit.web/Rendering/BunitHtmlParser.cs +++ b/src/bunit.web/Rendering/BunitHtmlParser.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Diagnostics; using AngleSharp; +using AngleSharp.Css; using AngleSharp.Dom; using AngleSharp.Html.Parser; using Bunit.Diffing; @@ -28,7 +29,8 @@ public sealed class BunitHtmlParser : IDisposable /// with a AngleSharp context without a registered. /// public BunitHtmlParser() - : this(Configuration.Default.WithCss().With(new HtmlComparer())) { } + : this(Configuration.Default.WithCss() + .With(new HtmlComparer())) { } /// /// Initializes a new instance of the class @@ -43,7 +45,13 @@ public BunitHtmlParser(HtmlComparer htmlComparer, TestContextBase testContext) private BunitHtmlParser(IConfiguration angleSharpConfiguration) { - var config = angleSharpConfiguration.With(this); + var config = angleSharpConfiguration + .With(this) + .WithRenderDevice(new DefaultRenderDevice + { + ViewPortWidth = 1920, + ViewPortHeight = 1080, + }); context = BrowsingContext.New(config); var parseOptions = new HtmlParserOptions { diff --git a/src/bunit.web/TestDoubles/NavigationManager/FakeNavigationManager.cs b/src/bunit.web/TestDoubles/NavigationManager/FakeNavigationManager.cs index 574807cf3..85a27b1b4 100644 --- a/src/bunit.web/TestDoubles/NavigationManager/FakeNavigationManager.cs +++ b/src/bunit.web/TestDoubles/NavigationManager/FakeNavigationManager.cs @@ -75,13 +75,6 @@ protected override void NavigateToCore(string uri, NavigationOptions options) var absoluteUri = GetNewAbsoluteUri(uri); var changedBaseUri = HasDifferentBaseUri(absoluteUri); - if (changedBaseUri) - { - BaseUri = GetBaseUri(absoluteUri); - } - - Uri = ToAbsoluteUri(uri).OriginalString; - if (options.ReplaceHistoryEntry && history.Count > 0) history.Pop(); @@ -92,7 +85,6 @@ protected override void NavigateToCore(string uri, NavigationOptions options) testContextBase.Renderer.Dispatcher.InvokeAsync(() => #endif { - Uri = absoluteUri.OriginalString; #if NET7_0_OR_GREATER var shouldContinueNavigation = false; @@ -116,6 +108,12 @@ protected override void NavigateToCore(string uri, NavigationOptions options) history.Push(new NavigationHistory(uri, options)); #endif + if (changedBaseUri) + { + BaseUri = GetBaseUri(absoluteUri); + } + + Uri = absoluteUri.OriginalString; // Only notify of changes if user navigates within the same // base url (domain). Otherwise, the user navigated away @@ -125,17 +123,13 @@ protected override void NavigateToCore(string uri, NavigationOptions options) { NotifyLocationChanged(isInterceptedLink: false); } - else - { - BaseUri = GetBaseUri(absoluteUri); - } }); } #endif #if NET7_0_OR_GREATER /// - protected override void SetNavigationLockState(bool value) {} + protected override void SetNavigationLockState(bool value) { } /// protected override void HandleLocationChangingHandlerException(Exception ex, LocationChangingContext context) diff --git a/tests/bunit.core.tests/Rendering/RenderModeTests.razor b/tests/bunit.core.tests/Rendering/RenderModeTests.razor index 0bded05f6..557b3386e 100644 --- a/tests/bunit.core.tests/Rendering/RenderModeTests.razor +++ b/tests/bunit.core.tests/Rendering/RenderModeTests.razor @@ -168,7 +168,7 @@ ); - act.ShouldThrow(); // todo: figure out good exception to use + act.ShouldThrow(); } } @code{ diff --git a/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs b/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs index cb3d256a2..f54aa345c 100644 --- a/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs +++ b/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs @@ -67,7 +67,7 @@ public void Test013(string key) { var fakeState = this.AddFakePersistentComponentState(); - fakeState.TryTake(key, out var actual).ShouldBeFalse(); + fakeState.TryTake(key, out _).ShouldBeFalse(); } [Fact(DisplayName = "TriggerOnPersisting triggers OnPersisting callbacks added to store")] diff --git a/tests/bunit.testassets/BlazorE2E/AddRemoveChildComponents.razor b/tests/bunit.testassets/BlazorE2E/AddRemoveChildComponents.razor index 1c05a7166..ba4bca194 100644 --- a/tests/bunit.testassets/BlazorE2E/AddRemoveChildComponents.razor +++ b/tests/bunit.testassets/BlazorE2E/AddRemoveChildComponents.razor @@ -10,7 +10,7 @@ Child components follow. @code { int numAdded = 0; - List currentChildrenMessages = new List(); + private readonly List currentChildrenMessages = new List(); void AddChild() { diff --git a/tests/bunit.testassets/BlazorE2E/DataDashComponent.razor b/tests/bunit.testassets/BlazorE2E/DataDashComponent.razor index 435ef0fc0..06567bb4a 100644 --- a/tests/bunit.testassets/BlazorE2E/DataDashComponent.razor +++ b/tests/bunit.testassets/BlazorE2E/DataDashComponent.razor @@ -1,5 +1,5 @@
@TabId
@code { - string TabId = "17"; + private readonly string TabId = "17"; } diff --git a/tests/bunit.testassets/BlazorE2E/DuplicateAttributesComponent.razor b/tests/bunit.testassets/BlazorE2E/DuplicateAttributesComponent.razor index 20899324f..837da0f95 100644 --- a/tests/bunit.testassets/BlazorE2E/DuplicateAttributesComponent.razor +++ b/tests/bunit.testassets/BlazorE2E/DuplicateAttributesComponent.razor @@ -13,7 +13,7 @@ @functions { - Dictionary elementValues = new Dictionary + private readonly Dictionary elementValues = new Dictionary { { "bool", true }, { "string", "middle-value" }, diff --git a/tests/bunit.testassets/BlazorE2E/KeyPressEventComponent.razor b/tests/bunit.testassets/BlazorE2E/KeyPressEventComponent.razor index dd96e41d5..d5931408d 100644 --- a/tests/bunit.testassets/BlazorE2E/KeyPressEventComponent.razor +++ b/tests/bunit.testassets/BlazorE2E/KeyPressEventComponent.razor @@ -9,7 +9,7 @@ Type here: @code { - List keysPressed = new List(); + private readonly List keysPressed = new List(); void OnKeyPressed(KeyboardEventArgs eventArgs) { diff --git a/tests/bunit.testassets/BlazorE2E/MarkupBlockComponent.razor b/tests/bunit.testassets/BlazorE2E/MarkupBlockComponent.razor index ee7f9a185..1b9597319 100644 --- a/tests/bunit.testassets/BlazorE2E/MarkupBlockComponent.razor +++ b/tests/bunit.testassets/BlazorE2E/MarkupBlockComponent.razor @@ -28,7 +28,7 @@ #nullable disable bool changeOutput; - string myMarkup = "

This is a markup string.

"; + private readonly string myMarkup = "

This is a markup string.

"; void EmitMarkupBlock(RenderTreeBuilder builder) { diff --git a/tests/bunit.testassets/BlazorE2E/MovingCheckboxesComponent.razor b/tests/bunit.testassets/BlazorE2E/MovingCheckboxesComponent.razor index fbb1f4cf5..872b35bc2 100644 --- a/tests/bunit.testassets/BlazorE2E/MovingCheckboxesComponent.razor +++ b/tests/bunit.testassets/BlazorE2E/MovingCheckboxesComponent.razor @@ -41,7 +41,7 @@ @code { #nullable disable - List items = new List + private readonly List items = new List { new TodoItem { Text = "Alpha" }, new TodoItem { Text = "Beta" }, @@ -49,7 +49,7 @@ new TodoItem { Text = "Delta", IsDone = true }, }; - class TodoItem + private sealed class TodoItem { public bool IsDone { get; set; } public string Text { get; set; } diff --git a/tests/bunit.testassets/BlazorE2E/OrderedList.razor b/tests/bunit.testassets/BlazorE2E/OrderedList.razor index 96130629b..f7a712635 100644 --- a/tests/bunit.testassets/BlazorE2E/OrderedList.razor +++ b/tests/bunit.testassets/BlazorE2E/OrderedList.razor @@ -6,7 +6,7 @@ } @foreach (var item in Items) { - @Template(new Context { Index = index++, Item = item, }); + @Template(new Context { Index = index++, Item = item, }) } diff --git a/tests/bunit.testassets/SampleComponents/AsyncRenderChangesProperty.razor b/tests/bunit.testassets/SampleComponents/AsyncRenderChangesProperty.razor index e4368832a..4e68b7eb6 100644 --- a/tests/bunit.testassets/SampleComponents/AsyncRenderChangesProperty.razor +++ b/tests/bunit.testassets/SampleComponents/AsyncRenderChangesProperty.razor @@ -1,7 +1,7 @@ @code { - private TaskCompletionSource _tcs = new TaskCompletionSource(); + private readonly TaskCompletionSource _tcs = new TaskCompletionSource(); public int Counter; private Task Tick() diff --git a/tests/bunit.testassets/SampleComponents/ComponentWithRelativeUnitAsWidth.razor b/tests/bunit.testassets/SampleComponents/ComponentWithRelativeUnitAsWidth.razor new file mode 100644 index 000000000..69e5a86c7 --- /dev/null +++ b/tests/bunit.testassets/SampleComponents/ComponentWithRelativeUnitAsWidth.razor @@ -0,0 +1,2 @@ +
+
\ No newline at end of file diff --git a/tests/bunit.testassets/SampleComponents/InvokeAsyncInsideContinueWith.razor b/tests/bunit.testassets/SampleComponents/InvokeAsyncInsideContinueWith.razor index 9be4161b2..1abdf2cd8 100644 --- a/tests/bunit.testassets/SampleComponents/InvokeAsyncInsideContinueWith.razor +++ b/tests/bunit.testassets/SampleComponents/InvokeAsyncInsideContinueWith.razor @@ -22,13 +22,13 @@ { registeredTask = task; delegatedTask = task == null ? null : DelegateTo(task); - RenderWhenDone(); + _ = RenderWhenDone(); } base.OnParametersSet(); } - private async void RenderWhenDone() + private async Task RenderWhenDone() { var task = delegatedTask; if (task != null) @@ -44,7 +44,7 @@ private static async Task DelegateTo(Task task) { - await task;//.ConfigureAwait(false); + await task; return null; } } diff --git a/tests/bunit.testassets/SampleComponents/RenderOnClick.razor b/tests/bunit.testassets/SampleComponents/RenderOnClick.razor index d5ed71b16..b42b04388 100644 --- a/tests/bunit.testassets/SampleComponents/RenderOnClick.razor +++ b/tests/bunit.testassets/SampleComponents/RenderOnClick.razor @@ -2,8 +2,11 @@ @code { public int RenderCount { get; private set; } - - void IncreaseCount() { } + + void IncreaseCount() + { + // Left empty on purpose + } protected override void OnAfterRender(bool firstRender) => RenderCount++; } \ No newline at end of file diff --git a/tests/bunit.testassets/SampleComponents/SimpleUsingLocalizer.razor b/tests/bunit.testassets/SampleComponents/SimpleUsingLocalizer.razor index 9992ee117..d077d54b0 100644 --- a/tests/bunit.testassets/SampleComponents/SimpleUsingLocalizer.razor +++ b/tests/bunit.testassets/SampleComponents/SimpleUsingLocalizer.razor @@ -6,7 +6,7 @@ @code { protected override void OnInitialized() { - var localizedString = StringLocalizer["StringName"]; + _ = StringLocalizer["StringName"]; } } diff --git a/tests/bunit.testassets/SampleComponents/SimpleWithTemplate.razor b/tests/bunit.testassets/SampleComponents/SimpleWithTemplate.razor index 0ba4abec3..700fcdc83 100644 --- a/tests/bunit.testassets/SampleComponents/SimpleWithTemplate.razor +++ b/tests/bunit.testassets/SampleComponents/SimpleWithTemplate.razor @@ -1,7 +1,7 @@ @typeparam T @foreach (var d in Data) { - @Template?.Invoke(d); + @Template?.Invoke(d) } @code { diff --git a/tests/bunit.testassets/SampleComponents/ToggleableDetails.razor b/tests/bunit.testassets/SampleComponents/ToggleableDetails.razor index 5dcb306e3..b1cf9da25 100644 --- a/tests/bunit.testassets/SampleComponents/ToggleableDetails.razor +++ b/tests/bunit.testassets/SampleComponents/ToggleableDetails.razor @@ -3,7 +3,7 @@ {

Read the details carefully!

} -
+
Summary

Detailed content

diff --git a/tests/bunit.web.tests/Asserting/MarkupMatchesTests.razor b/tests/bunit.web.tests/Asserting/MarkupMatchesTests.razor index d8723291f..d4b3bf5c4 100644 --- a/tests/bunit.web.tests/Asserting/MarkupMatchesTests.razor +++ b/tests/bunit.web.tests/Asserting/MarkupMatchesTests.razor @@ -1,13 +1,9 @@ -@using Bunit.TestAssets @using Bunit.TestAssets.SampleComponents @inherits TestContext @code { - private readonly ITestOutputHelper outputHelper; - - public MarkupMatchesTests(ITestOutputHelper outputHelper) + public MarkupMatchesTests() { - this.outputHelper = outputHelper; - TestContext.DefaultWaitTimeout = TimeSpan.FromSeconds(30); + DefaultWaitTimeout = TimeSpan.FromSeconds(30); } [Fact] diff --git a/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs b/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs index 412779aad..1e9e2e806 100644 --- a/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs +++ b/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs @@ -1,3 +1,6 @@ +using AngleSharp; +using AngleSharp.Css; +using AngleSharp.Dom; using Bunit.Rendering; namespace Bunit; @@ -66,5 +69,45 @@ public void Test021() cut.Instance.JSRuntime.ShouldNotBeNull(); } + + [Fact(DisplayName = "Searching first for derived component and then base component finds correct (#1691)")] + public void Test023() + { + var cut = RenderComponent( + ps => ps.AddChildContent() + .AddChildContent()); + + Should.NotThrow(() => + { + cut.FindComponents(); + cut.FindComponents(); + }); + } + + private class BaseComponent : ComponentBase + { + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.AddContent(0, "base"); + } + } + + private sealed class DerivedComponent : BaseComponent + { + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.AddContent(0, "derived"); + } + } #endif + + [Fact(DisplayName = "Using relative units in style attribute can be retrieved")] + public void Test022() + { + var cut = RenderComponent(); + + var text = cut.Find(".my-component").GetInnerText(); + + text.ShouldNotBeNull(); + } } diff --git a/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs b/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs index ca09b9423..1578dfe28 100644 --- a/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs +++ b/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs @@ -1,5 +1,6 @@ using System.Text.Json; using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Shouldly.ShouldlyExtensionMethods; namespace Bunit.TestDoubles; @@ -106,18 +107,18 @@ public void Test007() } #if !NET6_0_OR_GREATER - [Theory(DisplayName = "NavigateTo(uri, forceLoad) is saved in history")] - [InlineData("/uri", false)] - [InlineData("/anotherUri", true)] - public void Test100(string uri, bool forceLoad) - { - var sut = CreateFakeNavigationManager(); + [Theory(DisplayName = "NavigateTo(uri, forceLoad) is saved in history")] + [InlineData("/uri", false)] + [InlineData("/anotherUri", true)] + public void Test100(string uri, bool forceLoad) + { + var sut = CreateFakeNavigationManager(); - sut.NavigateTo(uri, forceLoad); + sut.NavigateTo(uri, forceLoad); - sut.History.ShouldHaveSingleItem() - .ShouldBeEquivalentTo(new NavigationHistory(uri, new NavigationOptions(forceLoad))); - } + sut.History.ShouldHaveSingleItem() + .ShouldBeEquivalentTo(new NavigationHistory(uri, new NavigationOptions(forceLoad))); + } #endif #if NET6_0_OR_GREATER [Theory(DisplayName = "NavigateTo(uri, forceLoad, replaceHistoryEntry) is saved in history")] @@ -135,8 +136,12 @@ public void Test200(string uri, bool forceLoad, bool replaceHistoryEntry) .ShouldBeEquivalentTo(new NavigationHistory(uri, new NavigationOptions { ForceLoad = forceLoad, ReplaceHistoryEntry = replaceHistoryEntry })); #elif NET7_0_OR_GREATER - var navigationOptions = new NavigationOptions { ForceLoad = forceLoad, ReplaceHistoryEntry = - replaceHistoryEntry }; + var navigationOptions = new NavigationOptions + { + ForceLoad = forceLoad, + ReplaceHistoryEntry = + replaceHistoryEntry + }; sut.History.ShouldHaveSingleItem() .ShouldBeEquivalentTo(new NavigationHistory(uri, navigationOptions, NavigationState.Succeeded)); #endif @@ -156,8 +161,11 @@ public void Test201() new NavigationOptions { ReplaceHistoryEntry = true })); #elif NET7_0_OR_GREATER sut.History.ShouldHaveSingleItem() - .ShouldBeEquivalentTo(new NavigationHistory("/secondUrl", new NavigationOptions { ReplaceHistoryEntry = - true }, NavigationState.Succeeded)); + .ShouldBeEquivalentTo(new NavigationHistory("/secondUrl", new NavigationOptions + { + ReplaceHistoryEntry = + true + }, NavigationState.Succeeded)); #endif } #endif @@ -230,7 +238,8 @@ public void Test013() var fakeNavigationManager = CreateFakeNavigationManager(); var requestOptions = new InteractiveRequestOptions { - ReturnUrl = "return", Interaction = InteractionType.SignIn, + ReturnUrl = "return", + Interaction = InteractionType.SignIn, }; requestOptions.TryAddAdditionalParameter("library", "bunit"); @@ -264,7 +273,7 @@ public void Test015() Should.Throw( () => fakeNavigationManager.History.Last().StateFromJson()); } - + [Fact(DisplayName = "Navigate to url with state should set that state on the NavigationManager")] public void Test016() { @@ -275,7 +284,7 @@ public void Test016() sut.HistoryEntryState.ShouldBe(State); } - + [Fact(DisplayName = "Navigate to url with force reload resets state")] public void Test017() { @@ -283,11 +292,32 @@ public void Test017() var sut = CreateFakeNavigationManager(); sut.NavigateTo("/internal", new NavigationOptions { HistoryEntryState = State }); - sut.NavigateTo("/internal", new NavigationOptions { HistoryEntryState = State, ForceLoad = true}); + sut.NavigateTo("/internal", new NavigationOptions { HistoryEntryState = State, ForceLoad = true }); sut.HistoryEntryState.ShouldBe(null); } + [Theory(DisplayName = "Preventing Navigation does not change Uri or BaseUri")] + [InlineData("/prevented-path")] + [InlineData("https://bunit.dev/uri")] + public void Test018(string navToUri) + { + var sut = CreateFakeNavigationManager(); + using var handler = sut.RegisterLocationChangingHandler(LocationChangingHandler); + + sut.NavigateTo(navToUri); + + sut.History.First().State.ShouldBe(NavigationState.Prevented); + sut.BaseUri.ShouldBe("http://localhost/"); + sut.Uri.ShouldBe("http://localhost/"); + + ValueTask LocationChangingHandler(LocationChangingContext arg) + { + arg.PreventNavigation(); + return ValueTask.CompletedTask; + } + } + private sealed class InterceptNavigateToCounterComponent : ComponentBase { protected override void BuildRenderTree(RenderTreeBuilder builder) diff --git a/version.json b/version.json index 9def60208..6bec143ea 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", - "version": "1.38", + "version": "1.39", "assemblyVersion": { "precision": "revision" },