diff --git a/.editorconfig b/.editorconfig index edf4a53c0..6739b69fb 100644 --- a/.editorconfig +++ b/.editorconfig @@ -504,3 +504,5 @@ dotnet_diagnostic.S125.severity = none # S125: Sections of code should not be co dotnet_diagnostic.S3459.severity = none # S3459: Unassigned members should be removed dotnet_diagnostic.S3871.severity = none # S3871: Exception types should be "public" dotnet_diagnostic.S1186.severity = none # S1186: Methods should not be empty + +dotnet_diagnostic.S4457.severity = none \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d3dac0d86..11fcf6938 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,7 +155,7 @@ List of added functionality in this release. ```csharp // component uses - var cut = RenderComponent(); + var cut = await RenderComponent(); // Verifies that called it's JavaScript function var invocation = JSInterop.VerifyFocusOnNavigateInvoke(); @@ -455,7 +455,7 @@ List of new features. - Added support for components that call `ElementReference.FocusAsync`. These calls are handled by the bUnits JSInterop, that also allows you to verify that `FocusAsync` has been called for a specific element. For example, if a component has rendered an `` element, then the following code will verify that it has been focused using `FocusAsync`: ```csharp - var cut = RenderComponent(); + var cut = await RenderComponent(); var input = cut.Find("input"); @@ -854,7 +854,7 @@ This has changed with the _bUnit.xUnit_ library, that now includes a way for it If you prefer writing your tests in C# only, you will be happy to know that there is now a new strongly typed way to pass parameters to components, using a builder. E.g., to render a `ContactInfo` component: ```c# -var cut = RenderComponent(parameters => parameters +var cut = await RenderComponent(parameters => parameters .Add(p => p.Name, "Egil Hansen") .Add(p => p.Country, "Iceland") ); @@ -976,7 +976,7 @@ The latest version of the library is availble on NuGet: public void WaitForStateExample() { // Arrange - var cut = RenderComponent(); + var cut = await RenderComponent(); // Act cut.Find("button").Click(); @@ -999,7 +999,7 @@ The latest version of the library is availble on NuGet: public void WaitForAssertionExample() { // Arrange - var cut = RenderComponent(); + var cut = await RenderComponent(); // Act cut.Find("button").Click(); @@ -1071,7 +1071,7 @@ The latest version of the library is availble on NuGet: And the test code: ```csharp - var cut = RenderComponent>( + var cut = await RenderComponent>( ("Data", new int[] { 1, 2 }), Template("Template", num => $"

{num}

") ); @@ -1082,7 +1082,7 @@ The latest version of the library is availble on NuGet: Using the more general `Template` helper methods, you need to write the `RenderTreeBuilder` logic yourself, e.g.: ```csharp - var cut = RenderComponent>( + var cut = await RenderComponent>( ("Data", new int[] { 1, 2 }), Template("Template", num => builder => builder.AddMarkupContent(0, $"

{num}

")) ); @@ -1130,7 +1130,7 @@ The latest version of the library is availble on NuGet: ```csharp public void AutoRefreshQueriesForNewElementsAutomatically() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var liElements = cut.FindAll("li", enableAutoRefresh: true); liElements.Count.ShouldBe(0); @@ -1145,7 +1145,7 @@ The latest version of the library is availble on NuGet: ```csharp public void RefreshQueriesForNewElements() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var liElements = cut.FindAll("li"); liElements.Count.ShouldBe(0); diff --git a/Directory.Build.props b/Directory.Build.props index e001a52a5..303c0d978 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -6,6 +6,9 @@ 5.0.0 6.0.0 7.0.0-* + false + false + false @@ -45,13 +48,6 @@ true - - - - - - - diff --git a/benchmark/bunit.benchmarks/Benchmark.cs b/benchmark/bunit.benchmarks/Benchmark.cs index 2e24e459c..911d50fb9 100644 --- a/benchmark/bunit.benchmarks/Benchmark.cs +++ b/benchmark/bunit.benchmarks/Benchmark.cs @@ -7,8 +7,8 @@ namespace Bunit; public class Benchmark : BenchmarkBase { [Benchmark] - public IRenderedComponentBase RenderCounter() + public Task> RenderCounter() { return RenderComponent(); } -} \ No newline at end of file +} diff --git a/benchmark/bunit.benchmarks/BenchmarkBase.cs b/benchmark/bunit.benchmarks/BenchmarkBase.cs index 59afd8934..6ed3e4c91 100644 --- a/benchmark/bunit.benchmarks/BenchmarkBase.cs +++ b/benchmark/bunit.benchmarks/BenchmarkBase.cs @@ -10,14 +10,14 @@ public abstract class BenchmarkBase { private static readonly ComponentParameterCollection EmptyParameter = new(); private readonly ServiceCollection services = new(); - + protected TestRenderer Renderer { get; private set; } = default!; [GlobalSetup] public void Setup() { RegisterServices(services); - + var serviceProvider = services.BuildServiceProvider(); Renderer = new TestRenderer( new RenderedComponentActivator(serviceProvider), @@ -32,7 +32,7 @@ public void Cleanup() Renderer.Dispose(); } - protected IRenderedComponentBase RenderComponent() + protected Task> RenderComponent() where TComponent : IComponent => Renderer.RenderComponent(EmptyParameter); @@ -44,4 +44,4 @@ protected virtual void RegisterServices(IServiceCollection serviceCollection) { services.AddSingleton(); } -} \ No newline at end of file +} diff --git a/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs b/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs index 51f411fcd..7808fe408 100644 --- a/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs +++ b/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs @@ -1,5 +1,3 @@ -using System.Runtime.ExceptionServices; - namespace Bunit; /// @@ -12,7 +10,7 @@ public static class RenderedComponentRenderExtensions /// /// The rendered component to re-render. /// The type of the component. - public static void Render(this IRenderedComponentBase renderedComponent) + public static Task Render(this IRenderedComponentBase renderedComponent) where TComponent : IComponent => SetParametersAndRender(renderedComponent, ParameterView.Empty); @@ -22,30 +20,14 @@ public static void Render(this IRenderedComponentBase re /// The rendered component to re-render with new parameters. /// Parameters to pass to the component upon rendered. /// The type of the component. - public static void SetParametersAndRender(this IRenderedComponentBase renderedComponent, ParameterView parameters) + public static Task SetParametersAndRender(this IRenderedComponentBase renderedComponent, ParameterView parameters) where TComponent : IComponent { if (renderedComponent is null) throw new ArgumentNullException(nameof(renderedComponent)); - var result = renderedComponent.InvokeAsync(() => + return renderedComponent.InvokeAsync(() => renderedComponent.Instance.SetParametersAsync(parameters)); - - if (result.IsFaulted && result.Exception is not null) - { - if (result.Exception.InnerExceptions.Count == 1) - { - ExceptionDispatchInfo.Capture(result.Exception.InnerExceptions[0]).Throw(); - } - else - { - ExceptionDispatchInfo.Capture(result.Exception).Throw(); - } - } - else if (!result.IsCompleted) - { - result.GetAwaiter().GetResult(); - } } /// @@ -54,7 +36,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas /// The rendered component to re-render with new parameters. /// Parameters to pass to the component upon rendered. /// The type of the component. - public static void SetParametersAndRender(this IRenderedComponentBase renderedComponent, params ComponentParameter[] parameters) + public static Task SetParametersAndRender(this IRenderedComponentBase renderedComponent, params ComponentParameter[] parameters) where TComponent : IComponent { if (renderedComponent is null) @@ -62,7 +44,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas if (parameters is null) throw new ArgumentNullException(nameof(parameters)); - SetParametersAndRender(renderedComponent, ToParameterView(parameters)); + return SetParametersAndRender(renderedComponent, ToParameterView(parameters)); } /// @@ -71,7 +53,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas /// The rendered component to re-render with new parameters. /// An action that receives a . /// The type of the component. - public static void SetParametersAndRender(this IRenderedComponentBase renderedComponent, Action> parameterBuilder) + public static Task SetParametersAndRender(this IRenderedComponentBase renderedComponent, Action> parameterBuilder) where TComponent : IComponent { if (renderedComponent is null) @@ -80,7 +62,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas throw new ArgumentNullException(nameof(parameterBuilder)); var builder = new ComponentParameterCollectionBuilder(parameterBuilder); - SetParametersAndRender(renderedComponent, ToParameterView(builder.Build())); + return SetParametersAndRender(renderedComponent, ToParameterView(builder.Build())); } private static ParameterView ToParameterView(IReadOnlyCollection parameters) diff --git a/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs b/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs index be5f03782..e5271b22e 100644 --- a/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs +++ b/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs @@ -14,13 +14,13 @@ public static class TestContextBaseRenderExtensions /// Test context to use to render with. /// The that contains a declaration of the component. /// A . - public static IRenderedComponentBase RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment) + public static async Task> RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment) where TComponent : IComponent { if (testContext is null) throw new ArgumentNullException(nameof(testContext)); - var baseResult = RenderInsideRenderTree(testContext, renderFragment); + var baseResult = await RenderInsideRenderTree(testContext, renderFragment); return testContext.Renderer.FindComponent(baseResult); } @@ -30,7 +30,7 @@ public static IRenderedComponentBase RenderInsideRenderTreeTest context to use to render with. /// The to render. /// A . - public static IRenderedFragmentBase RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment) + public static async Task RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment) { if (testContext is null) throw new ArgumentNullException(nameof(testContext)); @@ -40,7 +40,7 @@ public static IRenderedFragmentBase RenderInsideRenderTree(this TestContextBase // added to the test context. var wrappedInFragmentContainer = FragmentContainer.Wrap(renderFragment); var wrappedInRenderTree = testContext.RenderTree.Wrap(wrappedInFragmentContainer); - var resultBase = testContext.Renderer.RenderFragment(wrappedInRenderTree); + var resultBase = await testContext.Renderer.RenderFragment(wrappedInRenderTree); return testContext.Renderer.FindComponent(resultBase); } diff --git a/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs b/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs index 2bf12d6e5..4a0e8d5f4 100644 --- a/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs +++ b/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs @@ -20,25 +20,11 @@ public static class RenderedFragmentWaitForHelperExtensions /// The predicate to invoke after each render, which must returns true when the desired state has been reached. /// The maximum time to wait for the desired state. /// Thrown if the throw an exception during invocation, or if the timeout has been reached. See the inner exception for details. - public static void WaitForState(this IRenderedFragmentBase renderedFragment, Func statePredicate, TimeSpan? timeout = null) + public static async Task WaitForState(this IRenderedFragmentBase renderedFragment, Func statePredicate, TimeSpan? timeout = null) { using var waiter = new WaitForStateHelper(renderedFragment, statePredicate, timeout); - try - { - waiter.WaitTask.GetAwaiter().GetResult(); - } - catch (Exception e) - { - if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1) - { - ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw(); - } - else - { - ExceptionDispatchInfo.Capture(e).Throw(); - } - } + await waiter.WaitTask; } /// @@ -52,24 +38,10 @@ public static void WaitForState(this IRenderedFragmentBase renderedFragment, Fun /// The maximum time to attempt the verification. /// Thrown if the timeout has been reached. See the inner exception to see the captured assertion exception. [AssertionMethod] - public static void WaitForAssertion(this IRenderedFragmentBase renderedFragment, Action assertion, TimeSpan? timeout = null) + public static async Task WaitForAssertion(this IRenderedFragmentBase renderedFragment, Action assertion, TimeSpan? timeout = null) { using var waiter = new WaitForAssertionHelper(renderedFragment, assertion, timeout); - try - { - waiter.WaitTask.GetAwaiter().GetResult(); - } - catch (Exception e) - { - if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1) - { - ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw(); - } - else - { - ExceptionDispatchInfo.Capture(e).Throw(); - } - } + await waiter.WaitTask; } } diff --git a/src/bunit.core/Rendering/ITestRenderer.cs b/src/bunit.core/Rendering/ITestRenderer.cs index ec8bb5357..1ce473020 100644 --- a/src/bunit.core/Rendering/ITestRenderer.cs +++ b/src/bunit.core/Rendering/ITestRenderer.cs @@ -47,7 +47,7 @@ Task DispatchEventAsync( /// /// The to render. /// A that provides access to the rendered . - IRenderedFragmentBase RenderFragment(RenderFragment renderFragment); + Task RenderFragment(RenderFragment renderFragment); /// /// Renders a with the passed to it. @@ -55,7 +55,7 @@ Task DispatchEventAsync( /// The type of component to render. /// The parameters to pass to the component. /// A that provides access to the rendered component. - IRenderedComponentBase RenderComponent(ComponentParameterCollection parameters) + Task> RenderComponent(ComponentParameterCollection parameters) where TComponent : IComponent; /// diff --git a/src/bunit.core/Rendering/TestRenderer.cs b/src/bunit.core/Rendering/TestRenderer.cs index 2997b8e15..88bdfe95a 100644 --- a/src/bunit.core/Rendering/TestRenderer.cs +++ b/src/bunit.core/Rendering/TestRenderer.cs @@ -44,11 +44,11 @@ public TestRenderer(IRenderedComponentActivator renderedComponentActivator, Test #endif /// - public IRenderedFragmentBase RenderFragment(RenderFragment renderFragment) + public Task RenderFragment(RenderFragment renderFragment) => Render(renderFragment, id => activator.CreateRenderedFragment(id)); /// - public IRenderedComponentBase RenderComponent(ComponentParameterCollection parameters) + public Task> RenderComponent(ComponentParameterCollection parameters) where TComponent : IComponent { if (parameters is null) @@ -206,10 +206,10 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } - private TResult Render(RenderFragment renderFragment, Func activator) + private async Task Render(RenderFragment renderFragment, Func activator) where TResult : IRenderedFragmentBase { - var renderTask = Dispatcher.InvokeAsync(() => + var result = await Dispatcher.InvokeAsync(() => { ResetUnhandledException(); @@ -222,18 +222,6 @@ private TResult Render(RenderFragment renderFragment, Func logger, int internal static void LogChangedComponentsMarkupUpdated(this ILogger logger) => ChangedComponentsMarkupUpdated(logger, null); - internal static void LogAsyncInitialRender(this ILogger logger) - => AsyncInitialRender(logger, null); - internal static void LogInitialRenderCompleted(this ILogger logger, int componentId) => InitialRenderCompleted(logger, componentId, null); diff --git a/src/bunit.template/template/Company.BlazorTests1.csproj b/src/bunit.template/template/Company.BlazorTests1.csproj index 500c1aaac..84995eabb 100644 --- a/src/bunit.template/template/Company.BlazorTests1.csproj +++ b/src/bunit.template/template/Company.BlazorTests1.csproj @@ -9,6 +9,7 @@ + diff --git a/src/bunit.template/template/CounterCSharpTests.cs b/src/bunit.template/template/CounterCSharpTests.cs index 020dfabbd..70775935e 100644 --- a/src/bunit.template/template/CounterCSharpTests.cs +++ b/src/bunit.template/template/CounterCSharpTests.cs @@ -20,10 +20,10 @@ public class CounterCSharpTests : BunitTestContext #elif (testFramework_mstest) [TestMethod] #endif - public void CounterStartsAtZero() + public async Task CounterStartsAtZero() { // Arrange - var cut = RenderComponent(); + var cut = await RenderComponent(); // Assert that content of the paragraph shows counter at zero cut.Find("p").MarkupMatches("

Current count: 0

"); @@ -36,10 +36,10 @@ public void CounterStartsAtZero() #elif (testFramework_mstest) [TestMethod] #endif - public void ClickingButtonIncrementsCounter() + public async Task ClickingButtonIncrementsCounter() { // Arrange - var cut = RenderComponent(); + var cut = await RenderComponent(); // Act - click button to increment counter cut.Find("button").Click(); diff --git a/src/bunit.template/template/CounterRazorTests.razor b/src/bunit.template/template/CounterRazorTests.razor index 7992eda2d..8fa0f1037 100644 --- a/src/bunit.template/template/CounterRazorTests.razor +++ b/src/bunit.template/template/CounterRazorTests.razor @@ -19,10 +19,10 @@ Learn more at https://bunit.dev/docs/getting-started/writing-tests.html#creating @*#elif (testFramework_mstest)*@ [TestMethod] @*#endif*@ - public void CounterStartsAtZero() + public async Task CounterStartsAtZero() { // Arrange - var cut = Render(@); + var cut = await Render(@); // Assert that content of the paragraph shows counter at zero cut.Find("p").MarkupMatches(@

Current count: 0

); @@ -34,10 +34,10 @@ Learn more at https://bunit.dev/docs/getting-started/writing-tests.html#creating @*#elif (testFramework_mstest)*@ [TestMethod] @*#endif*@ - public void ClickingButtonIncrementsCounter() + public async Task ClickingButtonIncrementsCounter() { // Arrange - var cut = Render(@); + var cut = await Render(@); // Act - click button to increment counter cut.Find("button").Click(); diff --git a/src/bunit.template/template/_Imports.razor b/src/bunit.template/template/_Imports.razor index 054402d02..884c768fa 100644 --- a/src/bunit.template/template/_Imports.razor +++ b/src/bunit.template/template/_Imports.razor @@ -1,6 +1,7 @@ @using Microsoft.AspNetCore.Components.Web @using Microsoft.JSInterop @using Microsoft.Extensions.DependencyInjection +@using System.Threading.Tasks @using Bunit @using Bunit.TestDoubles @*#if (testFramework_xunit)*@ diff --git a/src/bunit.web.testcomponents/RazorTesting/Fixture.cs b/src/bunit.web.testcomponents/RazorTesting/Fixture.cs index 0ee9555d9..0438d9494 100644 --- a/src/bunit.web.testcomponents/RazorTesting/Fixture.cs +++ b/src/bunit.web.testcomponents/RazorTesting/Fixture.cs @@ -10,19 +10,16 @@ public class Fixture : FixtureBase private readonly Dictionary renderedFragments = new(StringComparer.Ordinal); private IReadOnlyList? testData; - private IReadOnlyList TestData + private async Task> TestData() { - get + if (testData is null) { - if (testData is null) - { - var renderedFragment = Renderer.RenderFragment(ChildContent!); - var comps = Renderer.FindComponents(renderedFragment); - testData = comps.Select(x => x.Instance).ToArray(); - } - - return testData; + var renderedFragment = await Renderer.RenderFragment(ChildContent!); + var comps = Renderer.FindComponents(renderedFragment); + testData = comps.Select(x => x.Instance).ToArray(); } + + return testData; } /// @@ -45,7 +42,10 @@ public Fixture() /// The HTML/component is only rendered the first this method is called. /// /// A . - public IRenderedFragment GetComponentUnderTest() => GetOrRenderFragment(nameof(GetComponentUnderTest), SelectComponentUnderTest, Factory); + public async Task GetComponentUnderTest() + { + return await GetOrRenderFragment(nameof(GetComponentUnderTest), async s => await SelectComponentUnderTest(s), async fragment => await Factory(fragment)); + } /// /// Gets (and renders) the component of type defined in the @@ -55,10 +55,10 @@ public Fixture() /// /// The type of component to render. /// A . - public IRenderedComponent GetComponentUnderTest() + public async Task> GetComponentUnderTest() where TComponent : IComponent { - var result = GetOrRenderFragment(nameof(GetComponentUnderTest), SelectComponentUnderTest, Factory); + var result = await GetOrRenderFragment(nameof(GetComponentUnderTest), async s => await SelectComponentUnderTest(s), async fragment => await Factory(fragment)); return TryCastTo(result); } @@ -73,11 +73,10 @@ public IRenderedComponent GetComponentUnderTest() ///
/// The id of the fragment where the HTML/component is defined in Razor syntax. /// A . - public IRenderedFragment GetFragment(string? id = null) + public async Task GetFragment(string? id = null) { - var key = id ?? SelectFirstFragment().Id; - var result = GetOrRenderFragment(key, SelectFragmentById, Factory); - return result; + var key = id ?? (await SelectFirstFragment()).Id; + return await GetOrRenderFragment(key, async s => await SelectFragmentById(s), async fragment => await Factory(fragment)); } /// @@ -92,11 +91,11 @@ public IRenderedFragment GetFragment(string? id = null) /// The type of component to render. /// The id of the fragment where the component is defined in Razor syntax. /// A . - public IRenderedComponent GetFragment(string? id = null) + public async Task> GetFragment(string? id = null) where TComponent : IComponent { - var key = id ?? SelectFirstFragment().Id; - var result = GetOrRenderFragment(key, SelectFragmentById, Factory); + var key = id ?? (await SelectFirstFragment()).Id; + var result = await GetOrRenderFragment(key, async s => await SelectFragmentById(s), async fragment => await Factory(fragment)); return TryCastTo(result); } @@ -104,43 +103,43 @@ public IRenderedComponent GetFragment(string? id = null) /// Gets or renders the fragment specified in the id. /// For internal use mainly. /// - private IRenderedFragment GetOrRenderFragment(string id, Func fragmentSelector, Func renderedFragmentFactory) + private async Task GetOrRenderFragment(string id, Func> fragmentSelector, Func> renderedFragmentFactory) { if (renderedFragments.TryGetValue(id, out var renderedFragment)) { return renderedFragment; } - var fragment = fragmentSelector(id); - var result = renderedFragmentFactory(fragment.ChildContent); + var fragment = await fragmentSelector(id); + var result = await renderedFragmentFactory(fragment.ChildContent); renderedFragments.Add(id, result); return result; } - private Fragment SelectFirstFragment() + private async Task SelectFirstFragment() { - return TestData.OfType().First(); + return (await TestData()).OfType().First(); } - private Fragment SelectFragmentById(string id) + private async Task SelectFragmentById(string id) { - return TestData.OfType().Single(x => x.Id.Equals(id, StringComparison.Ordinal)); + return (await TestData()).OfType().Single(x => x.Id.Equals(id, StringComparison.Ordinal)); } - private ComponentUnderTest SelectComponentUnderTest(string name) + private async Task SelectComponentUnderTest(string name) { - return TestData.OfType().Single(); + return (await TestData()).OfType().Single(); } - private IRenderedComponent Factory(RenderFragment fragment) + private async Task> Factory(RenderFragment fragment) where TComponent : IComponent { - return (IRenderedComponent)this.RenderInsideRenderTree(fragment); + return (IRenderedComponent) await this.RenderInsideRenderTree(fragment); } - private IRenderedFragment Factory(RenderFragment fragment) + private async Task Factory(RenderFragment fragment) { - return (IRenderedFragment)this.RenderInsideRenderTree(fragment); + return (IRenderedFragment) await this.RenderInsideRenderTree(fragment); } private static IRenderedComponent TryCastTo(IRenderedFragment target, [System.Runtime.CompilerServices.CallerMemberName] string sourceMethod = "") diff --git a/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs b/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs index 2f47b0b06..0e0b9c03a 100644 --- a/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs +++ b/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs @@ -61,10 +61,11 @@ protected override async Task RunAsync() if (SetupAsync is not null) await TryRunAsync(SetupAsync, this).ConfigureAwait(false); - var renderedTestInput = (IRenderedFragment)this.RenderInsideRenderTree(TestInput!); + var fragmentBase = await this.RenderInsideRenderTree(TestInput!); + var renderedTestInput = (IRenderedFragment)fragmentBase; var inputHtml = renderedTestInput.Markup; - var renderedExpectedRender = (IRenderedFragment)this.RenderInsideRenderTree(ExpectedOutput!); + var renderedExpectedRender = (IRenderedFragment)await this.RenderInsideRenderTree(ExpectedOutput!); var expectedHtml = renderedExpectedRender.Markup; VerifySnapshot(inputHtml, expectedHtml); diff --git a/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs b/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs index 3474c61ef..fcd0f3faa 100644 --- a/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs +++ b/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs @@ -292,7 +292,7 @@ public static void MarkupMatches(this INode actual, INodeList expected, string? /// The render fragment whose output to compare against. /// A custom user message to display in case the verification fails. [AssertionMethod] - public static void MarkupMatches(this IRenderedFragment actual, RenderFragment expected, string? userMessage = null) + public static async Task MarkupMatches(this IRenderedFragment actual, RenderFragment expected, string? userMessage = null) { if (actual is null) throw new ArgumentNullException(nameof(actual)); @@ -300,7 +300,7 @@ public static void MarkupMatches(this IRenderedFragment actual, RenderFragment e throw new ArgumentNullException(nameof(expected)); var testContext = actual.Services.GetRequiredService(); - var renderedFragment = (IRenderedFragment)testContext.RenderInsideRenderTree(expected); + var renderedFragment = (IRenderedFragment)await testContext.RenderInsideRenderTree(expected); MarkupMatches(actual, renderedFragment, userMessage); } @@ -313,15 +313,24 @@ public static void MarkupMatches(this IRenderedFragment actual, RenderFragment e /// The render fragment whose output to compare against. /// A custom user message to display in case the verification fails. [AssertionMethod] - public static void MarkupMatches(this INode actual, RenderFragment expected, string? userMessage = null) + public static async Task MarkupMatches(this INode actual, RenderFragment expected, string? userMessage = null) { if (actual is null) throw new ArgumentNullException(nameof(actual)); if (expected is null) throw new ArgumentNullException(nameof(expected)); - var renderedFragment = actual.GetTestContext()?.RenderInsideRenderTree(expected) as IRenderedFragment - ?? AdhocRenderRenderFragment(expected); + var testContext = actual.GetTestContext(); + IRenderedFragment? renderedFragment; + if (testContext is null) + { + renderedFragment = await AdhocRenderRenderFragment(expected); + } + else + { + renderedFragment = (IRenderedFragment) await testContext.RenderInsideRenderTree(expected); + } + MarkupMatches(actual, renderedFragment, userMessage); } @@ -334,15 +343,24 @@ public static void MarkupMatches(this INode actual, RenderFragment expected, str /// The render fragment whose output to compare against. /// A custom user message to display in case the verification fails. [AssertionMethod] - public static void MarkupMatches(this INodeList actual, RenderFragment expected, string? userMessage = null) + public static async Task MarkupMatches(this INodeList actual, RenderFragment expected, string? userMessage = null) { if (actual is null) throw new ArgumentNullException(nameof(actual)); if (expected is null) throw new ArgumentNullException(nameof(expected)); - var renderedFragment = actual.GetTestContext()?.RenderInsideRenderTree(expected) as IRenderedFragment - ?? AdhocRenderRenderFragment(expected); + var testContext = actual.GetTestContext(); + IRenderedFragment renderedFragment; + if (testContext is null) + { + renderedFragment = await AdhocRenderRenderFragment(expected); + } + else + { + renderedFragment = (IRenderedFragment) await testContext.RenderInsideRenderTree(expected); + } + MarkupMatches(actual, renderedFragment, userMessage); } @@ -447,10 +465,10 @@ public static void MarkupMatches(this IEnumerable actual, IEnumerable< MarkupMatches(actual.ToNodeList(), expectedNodes, userMessage); } - private static IRenderedFragment AdhocRenderRenderFragment(this RenderFragment renderFragment) + private static async Task AdhocRenderRenderFragment(this RenderFragment renderFragment) { using var ctx = new TestContext(); - return (IRenderedFragment)ctx.RenderInsideRenderTree(renderFragment); + return (IRenderedFragment)await ctx.RenderInsideRenderTree(renderFragment); } private static INodeList ToNodeList(this string markup, BunitHtmlParser? htmlParser) diff --git a/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs b/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs index 588693c83..669b7d899 100644 --- a/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs +++ b/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs @@ -13,7 +13,7 @@ public static class InputFileExtensions ///
/// The component which will upload the files. /// Files to upload. - public static void UploadFiles( + public static async Task UploadFiles( this IRenderedComponent inputFileComponent, params InputFileContent[] files) { @@ -31,11 +31,7 @@ public static void UploadFiles( file.Content)); var args = new InputFileChangeEventArgs(browserFiles.ToArray()); - var uploadTask = inputFileComponent.InvokeAsync(() => inputFileComponent.Instance.OnChange.InvokeAsync(args)); - if (!uploadTask.IsCompleted) - { - uploadTask.GetAwaiter().GetResult(); - } + await inputFileComponent.InvokeAsync(() => inputFileComponent.Instance.OnChange.InvokeAsync(args)); } } -#endif \ No newline at end of file +#endif diff --git a/src/bunit.web/Extensions/TestRendererExtensions.cs b/src/bunit.web/Extensions/TestRendererExtensions.cs index 14b4965c3..3bc43f8ce 100644 --- a/src/bunit.web/Extensions/TestRendererExtensions.cs +++ b/src/bunit.web/Extensions/TestRendererExtensions.cs @@ -15,13 +15,13 @@ public static class TestRendererExtensions /// The renderer to use. /// The parameters to pass to the component. /// A that provides access to the rendered component. - public static IRenderedComponent RenderComponent(this ITestRenderer renderer, params ComponentParameter[] parameters) + public static async Task> RenderComponent(this ITestRenderer renderer, params ComponentParameter[] parameters) where TComponent : IComponent { if (renderer is null) throw new ArgumentNullException(nameof(renderer)); - var resultBase = renderer.RenderComponent(new ComponentParameterCollection { parameters }); + var resultBase = await renderer.RenderComponent(new ComponentParameterCollection { parameters }); if (resultBase is IRenderedComponent result) return result; @@ -35,7 +35,7 @@ public static IRenderedComponent RenderComponent(this IT /// The renderer to use. /// The a builder to create parameters to pass to the component. /// A that provides access to the rendered component. - public static IRenderedComponent RenderComponent(this ITestRenderer renderer, Action> parameterBuilder) + public static async Task> RenderComponent(this ITestRenderer renderer, Action> parameterBuilder) where TComponent : IComponent { if (renderer is null) @@ -44,7 +44,7 @@ public static IRenderedComponent RenderComponent(this IT throw new ArgumentNullException(nameof(parameterBuilder)); var builder = new ComponentParameterCollectionBuilder(parameterBuilder); - var resultBase = renderer.RenderComponent(builder.Build()); + var resultBase = await renderer.RenderComponent(builder.Build()); if (resultBase is IRenderedComponent result) return result; diff --git a/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs b/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs index 3b6bcccea..87c35e7f2 100644 --- a/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs +++ b/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs @@ -17,7 +17,7 @@ public static class RenderedFragmentWaitForHelperExtensions /// The CSS selector to use to search for the element. /// Thrown if no elements is found matching the within the default timeout. See the inner exception for details. /// The . - public static IElement WaitForElement(this IRenderedFragment renderedFragment, string cssSelector) + public static Task WaitForElement(this IRenderedFragment renderedFragment, string cssSelector) => WaitForElementCore(renderedFragment, cssSelector, timeout: null); /// @@ -29,7 +29,7 @@ public static IElement WaitForElement(this IRenderedFragment renderedFragment, s /// The maximum time to wait for the element to appear. /// Thrown if no elements is found matching the within the default timeout. See the inner exception for details. /// The . - public static IElement WaitForElement(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout) + public static Task WaitForElement(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout) => WaitForElementCore(renderedFragment, cssSelector, timeout: timeout); /// @@ -40,7 +40,7 @@ public static IElement WaitForElement(this IRenderedFragment renderedFragment, s /// The CSS selector to use to search for elements. /// Thrown if no elements is found matching the within the default timeout. /// The . - public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector) + public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector) => WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: null, timeout: null); /// @@ -52,7 +52,7 @@ public static IRefreshableElementCollection WaitForElements(this IRend /// The exact number of elements to that the should match. /// Thrown if no elements is found matching the within the default timeout. /// The . - public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount) + public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount) => WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: matchElementCount, timeout: null); /// @@ -64,7 +64,7 @@ public static IRefreshableElementCollection WaitForElements(this IRend /// The maximum time to wait for elements to appear. /// Thrown if no elements is found matching the within the default timeout. /// The . - public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout) + public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout) => WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: null, timeout: timeout); /// @@ -77,34 +77,17 @@ public static IRefreshableElementCollection WaitForElements(this IRend /// The maximum time to wait for elements to appear. /// Thrown if no elements is found matching the within the default timeout. /// The . - public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount, TimeSpan timeout) + public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount, TimeSpan timeout) => WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: matchElementCount, timeout: timeout); - private static IElement WaitForElementCore(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan? timeout) + private static async Task WaitForElementCore(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan? timeout) { using var waiter = new WaitForElementHelper(renderedFragment, cssSelector, timeout); - try - { - return waiter.WaitTask.GetAwaiter().GetResult(); - } - catch (Exception e) - { - if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1) - { - ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw(); - } - else - { - ExceptionDispatchInfo.Capture(e).Throw(); - } - - // Unreachable code. Only here because compiler does not know that ExceptionDispatchInfo throws an exception - throw; - } + return await waiter.WaitTask; } - private static IRefreshableElementCollection WaitForElementsCore( + private static async Task> WaitForElementsCore( this IRenderedFragment renderedFragment, string cssSelector, int? matchElementCount, @@ -112,23 +95,7 @@ private static IRefreshableElementCollection WaitForElementsCore( { using var waiter = new WaitForElementsHelper(renderedFragment, cssSelector, matchElementCount, timeout); - try - { - return waiter.WaitTask.GetAwaiter().GetResult(); - } - catch (Exception e) - { - if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1) - { - ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw(); - } - else - { - ExceptionDispatchInfo.Capture(e).Throw(); - } + return await waiter.WaitTask; - // Unreachable code. Only here because compiler does not know that ExceptionDispatchInfo throws an exception - throw; - } } } diff --git a/src/bunit.web/TestContext.cs b/src/bunit.web/TestContext.cs index cee429321..6e9d30e8a 100644 --- a/src/bunit.web/TestContext.cs +++ b/src/bunit.web/TestContext.cs @@ -27,7 +27,7 @@ public TestContext() /// Type of the component to render. /// Parameters to pass to the component when it is rendered. /// The rendered . - public virtual IRenderedComponent RenderComponent(params ComponentParameter[] parameters) + public virtual Task> RenderComponent(params ComponentParameter[] parameters) where TComponent : IComponent { var renderFragment = new ComponentParameterCollection { parameters } @@ -42,7 +42,7 @@ public virtual IRenderedComponent RenderComponent(params /// Type of the component to render. /// The ComponentParameterBuilder action to add type safe parameters to pass to the component when it is rendered. /// The rendered . - public virtual IRenderedComponent RenderComponent(Action> parameterBuilder) + public virtual Task> RenderComponent(Action> parameterBuilder) where TComponent : IComponent { var renderFragment = new ComponentParameterCollectionBuilder(parameterBuilder) @@ -61,17 +61,20 @@ public virtual IRenderedComponent RenderComponent(Action /// The type of component to find in the render tree. /// The render fragment to render. /// The . - public virtual IRenderedComponent Render(RenderFragment renderFragment) + public virtual async Task> Render(RenderFragment renderFragment) where TComponent : IComponent - => (IRenderedComponent)this.RenderInsideRenderTree(renderFragment); + { + var renderInsideRenderTree = await this.RenderInsideRenderTree(renderFragment); + return (IRenderedComponent)renderInsideRenderTree; + } /// /// Renders the and returns it as a . /// /// The render fragment to render. /// The . - public virtual IRenderedFragment Render(RenderFragment renderFragment) - => (IRenderedFragment)this.RenderInsideRenderTree(renderFragment); + public virtual async Task Render(RenderFragment renderFragment) + => (IRenderedFragment)await this.RenderInsideRenderTree(renderFragment); /// /// Dummy method required to allow Blazor's compiler to generate diff --git a/src/bunit.web/TestContextWrapper.cs b/src/bunit.web/TestContextWrapper.cs index a6a9c57c0..e5def1673 100644 --- a/src/bunit.web/TestContextWrapper.cs +++ b/src/bunit.web/TestContextWrapper.cs @@ -43,9 +43,16 @@ public abstract class TestContextWrapper /// Type of the component to render. /// Parameters to pass to the component when it is rendered. /// The rendered . - public virtual IRenderedComponent RenderComponent(params ComponentParameter[] parameters) + public virtual Task> RenderComponent(params ComponentParameter[] parameters) where TComponent : IComponent - => TestContext?.RenderComponent(parameters) ?? throw new InvalidOperationException("The TestContext has not been initialized."); + { + if (TestContext == null) + { + throw new InvalidOperationException("The TestContext has not been initialized."); + } + + return TestContext.RenderComponent(parameters); + } /// /// Instantiates and performs a first render of a component of type . @@ -53,9 +60,16 @@ public virtual IRenderedComponent RenderComponent(params /// Type of the component to render. /// The ComponentParameterBuilder action to add type safe parameters to pass to the component when it is rendered. /// The rendered . - public virtual IRenderedComponent RenderComponent(Action> parameterBuilder) + public virtual Task> RenderComponent(Action> parameterBuilder) where TComponent : IComponent - => TestContext?.RenderComponent(parameterBuilder) ?? throw new InvalidOperationException("The TestContext has not been initialized."); + { + if (TestContext == null) + { + throw new InvalidOperationException("The TestContext has not been initialized."); + } + + return TestContext.RenderComponent(parameterBuilder); + } /// /// Renders the and returns the first in the resulting render tree. @@ -66,17 +80,31 @@ public virtual IRenderedComponent RenderComponent(Action /// The type of component to find in the render tree. /// The render fragment to render. /// The . - public virtual IRenderedComponent Render(RenderFragment renderFragment) + public virtual Task> Render(RenderFragment renderFragment) where TComponent : IComponent - => TestContext?.Render(renderFragment) ?? throw new InvalidOperationException("The TestContext has not been initialized."); + { + if (TestContext == null) + { + throw new InvalidOperationException("The TestContext has not been initialized."); + } + + return TestContext.Render(renderFragment); + } /// /// Renders the and returns it as a . /// /// The render fragment to render. /// The . - public virtual IRenderedFragment Render(RenderFragment renderFragment) - => TestContext?.Render(renderFragment) ?? throw new InvalidOperationException("The TestContext has not been initialized."); + public virtual Task Render(RenderFragment renderFragment) + { + if (TestContext == null) + { + throw new InvalidOperationException("The TestContext has not been initialized."); + } + + return TestContext.Render(renderFragment); + } /// /// Disposes all components rendered via this . diff --git a/src/bunit.web/bunit.web.csproj b/src/bunit.web/bunit.web.csproj index eb11df92e..57231abff 100644 --- a/src/bunit.web/bunit.web.csproj +++ b/src/bunit.web/bunit.web.csproj @@ -61,7 +61,7 @@ - <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/> + <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))" /> @@ -69,7 +69,7 @@ - + diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index bae8632f1..fbf2f3c4f 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -9,7 +9,6 @@ annotations false - true true diff --git a/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs index 05b278e87..ab13b88a2 100644 --- a/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs +++ b/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs @@ -20,28 +20,28 @@ public void Test003() () => ComponentFactories.Add(t => true, default(Func))); [Fact(DisplayName = "Component is replaced in render tree with component from factory when matches returns true")] - public void Test010() + public async Task Test010() { var mockComponent = Mock.Of(); ComponentFactories.Add(type => type == typeof(Simple1), type => mockComponent); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.FindComponent() .Instance.ShouldBeSameAs(mockComponent); } [Fact(DisplayName = "Component is replaced in render tree with component from factory when matches returns true")] - public void Test011() + public async Task Test011() { var mockRepo = new MockRepository(MockBehavior.Loose); ComponentFactories.Add( type => type != typeof(TwoComponentWrapper), mockRepo.CreateComponent); - var cut = RenderComponent(ps => ps - .Add(p => p.First) - .Add(p => p.Second)); + var cut = await RenderComponent(ps => ps + .Add(p => p.First) + .Add(p => p.Second)); cut.FindComponents().ShouldAllBe(x => Mock.Get(x.Instance)); cut.FindComponents().ShouldAllBe(x => Mock.Get(x.Instance)); diff --git a/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs index ff6c83343..dafe3cfc1 100644 --- a/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs +++ b/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs @@ -16,11 +16,11 @@ public void Test001() => Should.Throw(() => ComponentFactoryCollectionExtensions.Add(factories: default)); [Fact(DisplayName = "Add replaces components of type TComponent with TReplacementComponent")] - public void Test002() + public async Task Test002() { ComponentFactories.Add(); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.MarkupMatches(@"
Has ref = True
"); } diff --git a/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs index 77b559ed0..6113f4e2d 100644 --- a/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs +++ b/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs @@ -13,12 +13,12 @@ public void Test002() => Should.Throw(() => ComponentFactories.Add(default(Simple1))); [Fact(DisplayName = "Factory replaces one TComponent with instance in the render tree")] - public void Test010() + public async Task Test010() { var simple1Mock = new Mock(); ComponentFactories.Add(simple1Mock.Object); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.FindComponent() .Instance.ShouldBeSameAs(simple1Mock.Object); @@ -31,8 +31,8 @@ public void Test020() ComponentFactories.Add(simple1Mock.Object); Should.Throw(() => RenderComponent(ps => ps - .Add(p => p.First) - .Add(p => p.Second))); + .Add(p => p.First) + .Add(p => p.Second))); } [Fact(DisplayName = "Factory throws if component instance is requested twice for TComponent that implements from IComponent")] diff --git a/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs index 6c9aa11aa..e897aed6b 100644 --- a/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs +++ b/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs @@ -14,26 +14,26 @@ public void Test002() => Should.Throw(() => ComponentFactories.Add(default(Func))); [Fact(DisplayName = "TComponent replaced in render tree with component from factory method")] - public void Test010() + public async Task Test010() { var simple1Mock = Mock.Of(); ComponentFactories.Add(() => simple1Mock); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.FindComponent() .Instance.ShouldBeSameAs(simple1Mock); } [Fact(DisplayName = "Multiple TComponent replaced in render tree with component from factory method")] - public void Test011() + public async Task Test011() { var mockRepo = new MockRepository(MockBehavior.Loose); ComponentFactories.Add(() => mockRepo.Create().Object); - var cut = RenderComponent(ps => ps - .Add(p => p.First) - .Add(p => p.Second)); + var cut = await RenderComponent(ps => ps + .Add(p => p.First) + .Add(p => p.Second)); cut.FindComponents() .ShouldAllBe( diff --git a/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs b/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs index fabe0a764..6da1bbc46 100644 --- a/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs +++ b/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs @@ -35,15 +35,15 @@ private async Task VerifyEventCallbackAsync(string expectedName) EventCallbackCalled.ShouldBeTrue(); } - private IRenderedFragment RenderWithRenderFragment(RenderFragment renderFragment) + private async Task RenderWithRenderFragment(RenderFragment renderFragment) { - return (IRenderedFragment)Renderer.RenderFragment(renderFragment); + return (IRenderedFragment)await Renderer.RenderFragment(renderFragment); } - private IRenderedComponent RenderWithRenderFragment(RenderFragment renderFragment) + private async Task> RenderWithRenderFragment(RenderFragment renderFragment) where TComponent : IComponent { - var res = (IRenderedFragment)Renderer.RenderFragment(renderFragment); + var res = (IRenderedFragment)await Renderer.RenderFragment(renderFragment); return res.FindComponent(); } @@ -239,70 +239,70 @@ public void Test031() } [Fact(DisplayName = "ChildContent can be passed as a nested component parameter builder")] - public void Test032() + public async Task Test032() { Builder.AddChildContent(parameters => parameters.Add(p => p.ValueTypeParam, 42)); var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter("ChildContent", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual); + var actualComponent = await RenderWithRenderFragment(actual); actualComponent.Instance.ValueTypeParam.ShouldBe(42); } [Fact(DisplayName = "ChildContent can be passed as a child component without parameters")] - public void Test033() + public async Task Test033() { Builder.AddChildContent(); var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter("ChildContent", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual); + var actualComponent = await RenderWithRenderFragment(actual); actualComponent.Instance.ShouldBeOfType(); } [Fact(DisplayName = "ChildContent can be passed as a markup string")] - public void Test034() + public async Task Test034() { var input = "

42

"; Builder.AddChildContent(input); var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter("ChildContent", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual); + var actualComponent = await RenderWithRenderFragment(actual); actualComponent.Markup.ShouldBe(input); } [Fact(DisplayName = "RenderFragment can be passed as a nested component parameter builder")] - public void Test040() + public async Task Test040() { Builder.Add(x => x.OtherFragment, parameters => parameters.Add(p => p.ValueTypeParam, 42)); var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter("OtherFragment", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual); + var actualComponent = await RenderWithRenderFragment(actual); actualComponent.Instance.ValueTypeParam.ShouldBe(42); } [Fact(DisplayName = "RenderFragment can be passed as a child component without parameters")] - public void Test041() + public async Task Test041() { Builder.Add(x => x.OtherFragment); var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter("OtherFragment", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual); + var actualComponent = await RenderWithRenderFragment(actual); actualComponent.Instance.ShouldBeOfType(); } [Fact(DisplayName = "RenderFragment can be passed as a markup string")] - public void Test042() + public async Task Test042() { var input = "

42

"; Builder.Add(x => x.OtherFragment, input); var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter("OtherFragment", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual); + var actualComponent = await RenderWithRenderFragment(actual); actualComponent.Markup.ShouldBe(input); } @@ -318,18 +318,22 @@ public void Test043() } [Fact(DisplayName = "RenderFragment can be passed multiple times")] - public void Test044() + public async Task Test044() { var input = "FOO"; Builder.Add(x => x.OtherFragment, input); Builder.Add(x => x.OtherFragment, b => b.AddMarkupContent(0, input)); - Builder.Build().ShouldAllBe(VerifyTemplate, VerifyTemplate); + foreach (var item in Builder.Build()) + { + await VerifyTemplate(item); + await VerifyTemplate(item); + } - void VerifyTemplate(ComponentParameter template) + async Task VerifyTemplate(ComponentParameter template) { var actual = template.ShouldBeParameter("OtherFragment", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual); + var actualComponent = await RenderWithRenderFragment(actual); actualComponent.Markup.ShouldBe(input); } } @@ -346,19 +350,19 @@ public void Test050() } [Fact(DisplayName = "RenderFragment? can be passed lambda builder")] - public void Test051() + public async Task Test051() { var input = "FOO"; Builder.Add(x => x.Template, value => value); var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter>("Template", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual(input)); + var actualComponent = await RenderWithRenderFragment(actual(input)); actualComponent.Markup.ShouldBe(input); } [Fact(DisplayName = "RenderFragment? can be passed as nested object builder")] - public void Test052() + public async Task Test052() { var input = "FOO"; Builder.Add( @@ -368,23 +372,26 @@ public void Test052() var actual = Builder.Build().ShouldHaveSingleItem() .ShouldBeParameter>("Template", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(actual(input)); + var actualComponent = await RenderWithRenderFragment(actual(input)); actualComponent.Instance.Param.ShouldBe(input); } [Fact(DisplayName = "RenderFragment can be passed multiple times")] - public void Test053() + public async Task Test053() { Builder.Add(x => x.Template, value => value); Builder.Add(x => x.Template, s => b => b.AddMarkupContent(0, s)); - Builder.Build().ShouldAllBe(VerifyTemplate, VerifyTemplate); + foreach (var item in Builder.Build()) + { + await VerifyTemplate(item); + } - void VerifyTemplate(ComponentParameter template) + async Task VerifyTemplate(ComponentParameter template) { var input = "FOO"; var rf = template.ShouldBeParameter>("Template", isCascadingValue: false); - var actualComponent = RenderWithRenderFragment(rf(input)); + var actualComponent = await RenderWithRenderFragment(rf(input)); actualComponent.Markup.ShouldBe(input); } } @@ -408,7 +415,7 @@ public void Test060() x => { var rf = x.ShouldBeParameter(null, isCascadingValue: true); - RenderWithRenderFragment(rf).Markup.ShouldBe("BAZ"); + RenderWithRenderFragment(rf).GetAwaiter().GetResult().Markup.ShouldBe("BAZ"); }); } diff --git a/tests/bunit.core.tests/ComponentParameterCollectionTest.cs b/tests/bunit.core.tests/ComponentParameterCollectionTest.cs index 8879e7dbd..e904b8dfe 100644 --- a/tests/bunit.core.tests/ComponentParameterCollectionTest.cs +++ b/tests/bunit.core.tests/ComponentParameterCollectionTest.cs @@ -2,9 +2,9 @@ namespace Bunit; public class ComponentParameterCollectionTest : TestContext { - private IRenderedComponent RenderWithRenderFragment(RenderFragment renderFragment) + private async Task> RenderWithRenderFragment(RenderFragment renderFragment) { - var res = (IRenderedFragment)Renderer.RenderFragment(renderFragment); + var res = (IRenderedFragment)await Renderer.RenderFragment(renderFragment); return res.FindComponent(); } @@ -30,18 +30,18 @@ public void Test002() } [Fact(DisplayName = "ToComponentRenderFragment creates RenderFragment for component when empty")] - public void Test010() + public async Task Test010() { var sut = new ComponentParameterCollection(); var rf = sut.ToRenderFragment(); - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.VerifyParamsHaveDefaultValues(); } [Fact(DisplayName = "ToComponentRenderFragment passes regular params to component in RenderFragment")] - public void Test011() + public async Task Test011() { var sut = new ComponentParameterCollection { @@ -52,14 +52,14 @@ public void Test011() var rf = sut.ToRenderFragment(); - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.Param.ShouldBe("FOO"); c.ValueTypeParam.ShouldBe(42); c.NullableValueTypeParam.ShouldBe(1337); } [Fact(DisplayName = "ToComponentRenderFragment passes single ChildContent param to component in RenderFragment")] - public void Test012() + public async Task Test012() { var sut = new ComponentParameterCollection { @@ -68,12 +68,12 @@ public void Test012() var rf = sut.ToRenderFragment(); - var rc = RenderWithRenderFragment(rf); + var rc = await RenderWithRenderFragment(rf); rc.Markup.ShouldBe("FOO"); } [Fact(DisplayName = "ToComponentRenderFragment passes multiple ChildContent params to component in RenderFragment")] - public void Test013() + public async Task Test013() { var sut = new ComponentParameterCollection { @@ -84,12 +84,12 @@ public void Test013() var rf = sut.ToRenderFragment(); - var rc = RenderWithRenderFragment(rf); + var rc = await RenderWithRenderFragment(rf); rc.Markup.ShouldBe("FOOBARBAZ"); } [Fact(DisplayName = "ToComponentRenderFragment passes single RenderFragment param to component in RenderFragment")] - public void Test014() + public async Task Test014() { var sut = new ComponentParameterCollection { @@ -98,12 +98,12 @@ public void Test014() var rf = sut.ToRenderFragment(); - var rc = RenderWithRenderFragment(rf); + var rc = await RenderWithRenderFragment(rf); rc.Markup.ShouldBe("FOO"); } [Fact(DisplayName = "ToComponentRenderFragment passes multiple RenderFragment params to component in RenderFragment")] - public void Test015() + public async Task Test015() { var sut = new ComponentParameterCollection { @@ -114,12 +114,12 @@ public void Test015() var rf = sut.ToRenderFragment(); - var rc = RenderWithRenderFragment(rf); + var rc = await RenderWithRenderFragment(rf); rc.Markup.ShouldBe("FOOBARBAZ"); } [Fact(DisplayName = "ToComponentRenderFragment passes unmatched attributes to component in RenderFragment")] - public void Test016() + public async Task Test016() { var sut = new ComponentParameterCollection { @@ -128,12 +128,12 @@ public void Test016() var rf = sut.ToRenderFragment(); - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.Attributes?.ContainsKey("attr").ShouldBeTrue(); } [Fact(DisplayName = "ToComponentRenderFragment passes EventCallback params to component in RenderFragment")] - public void Test017() + public async Task Test017() { // arrange var ec1 = EventCallback.Factory.Create(this, () => { }); @@ -152,7 +152,7 @@ public void Test017() var rf = sut.ToRenderFragment(); // assert - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.NullableEC.ShouldBe(ec1); c.EC.ShouldBe(ec2); c.NullableECWithArgs.ShouldBe(ec3); @@ -160,7 +160,7 @@ public void Test017() } [Fact(DisplayName = "ToComponentRenderFragment passes single template param to component in RenderFragment")] - public void Test018() + public async Task Test018() { var sut = new ComponentParameterCollection { @@ -169,12 +169,12 @@ public void Test018() var rf = sut.ToRenderFragment(); - var rc = RenderWithRenderFragment(rf); + var rc = await RenderWithRenderFragment(rf); rc.Markup.ShouldBe(Params.TemplateContent); } [Fact(DisplayName = "ToComponentRenderFragment passes multiple template params to component in RenderFragment")] - public void Test019() + public async Task Test019() { var sut = new ComponentParameterCollection { @@ -184,7 +184,7 @@ public void Test019() var rf = sut.ToRenderFragment(); - var rc = RenderWithRenderFragment(rf); + var rc = await RenderWithRenderFragment(rf); rc.Markup.ShouldBe($"{Params.TemplateContent}1{Params.TemplateContent}2"); } @@ -203,7 +203,7 @@ public void Test020() } [Fact(DisplayName = "ToComponentRenderFragment passes skips null RenderFragment params")] - public void Test030() + public async Task Test030() { var sut = new ComponentParameterCollection { @@ -213,7 +213,7 @@ public void Test030() var rf = sut.ToRenderFragment(); - var rc = RenderWithRenderFragment(rf); + var rc = await RenderWithRenderFragment(rf); rc.Markup.ShouldBe("BAR"); } @@ -246,7 +246,7 @@ public void Test041() } [Fact(DisplayName = "ToComponentRenderFragment wraps component in unnamed cascading values in RenderFragment")] - public void Test050() + public async Task Test050() { var sut = new ComponentParameterCollection { @@ -255,12 +255,12 @@ public void Test050() var rf = sut.ToRenderFragment(); - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.NullableCC.ShouldBe("FOO"); } [Fact(DisplayName = "ToComponentRenderFragment wraps component in multiple unnamed cascading values in RenderFragment")] - public void Test051() + public async Task Test051() { var sut = new ComponentParameterCollection { @@ -270,7 +270,7 @@ public void Test051() var rf = sut.ToRenderFragment(); - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.NullableCC.ShouldBe("FOO"); c.CC.ShouldBe(42); } @@ -290,7 +290,7 @@ public void Test052() } [Fact(DisplayName = "ToComponentRenderFragment wraps component in named cascading values in RenderFragment")] - public void Test053() + public async Task Test053() { var sut = new ComponentParameterCollection { @@ -299,12 +299,12 @@ public void Test053() var rf = sut.ToRenderFragment(); - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.NullableNamedCC.ShouldBe("FOO"); } [Fact(DisplayName = "ToComponentRenderFragment wraps component in multiple named cascading values in RenderFragment")] - public void Test054() + public async Task Test054() { var sut = new ComponentParameterCollection { @@ -315,7 +315,7 @@ public void Test054() var rf = sut.ToRenderFragment(); - var c = RenderWithRenderFragment(rf).Instance; + var c = (await RenderWithRenderFragment(rf)).Instance; c.NullableNamedCC.ShouldBe("FOO"); c.NamedCC.ShouldBe(42); c.AnotherNamedCC.ShouldBe(1337); diff --git a/tests/bunit.core.tests/ComponentParameterFactoryTest.cs b/tests/bunit.core.tests/ComponentParameterFactoryTest.cs index 987818a0b..60cb64ce7 100644 --- a/tests/bunit.core.tests/ComponentParameterFactoryTest.cs +++ b/tests/bunit.core.tests/ComponentParameterFactoryTest.cs @@ -8,9 +8,9 @@ public class ComponentParameterFactoryTest private const string EXPECTED = nameof(EXPECTED); private static readonly TestContext Context = new(); - private static IRenderedFragment RenderWithRenderFragment(RenderFragment renderFragment) + private static async Task RenderWithRenderFragment(RenderFragment renderFragment) { - return (IRenderedFragment)Context.Renderer.RenderFragment(renderFragment); + return (IRenderedFragment)await Context.Renderer.RenderFragment(renderFragment); } private string? Actual { get; set; } @@ -153,103 +153,103 @@ public void Test031() } [Fact(DisplayName = "ChildContent(string markup) creates a parameter with a RenderFragment that renders the provided markup")] - public void Test040() + public async Task Test040() { var cp = ChildContent(EXPECTED); cp.Name.ShouldBe("ChildContent"); cp.IsCascadingValue.ShouldBeFalse(); var renderFragment = cp.Value.ShouldBeOfType(); - var renderedFragment = RenderWithRenderFragment(renderFragment); + var renderedFragment = await RenderWithRenderFragment(renderFragment); renderedFragment.Markup.ShouldBe(EXPECTED); } [Fact(DisplayName = "ChildContent() creates a parameter with a RenderFragment that renders a component of type TComponent")] - public void Test041() + public async Task Test041() { var cp = ChildContent(); cp.Name.ShouldBe("ChildContent"); cp.IsCascadingValue.ShouldBeFalse(); var renderFragment = cp.Value.ShouldBeOfType(); - var renderedFragment = RenderWithRenderFragment(renderFragment); + var renderedFragment = await RenderWithRenderFragment(renderFragment); renderedFragment.Markup.ShouldBe(nameof(TestComponent)); } [Fact(DisplayName = "ChildContent(component parameters) creates a parameter with a RenderFragment that renders a component of type TComponent")] - public void Test042() + public async Task Test042() { var cp = ChildContent((nameof(TestComponent.Input), EXPECTED)); cp.Name.ShouldBe("ChildContent"); cp.IsCascadingValue.ShouldBeFalse(); var renderFragment = cp.Value.ShouldBeOfType(); - var renderedFragment = RenderWithRenderFragment(renderFragment); + var renderedFragment = await RenderWithRenderFragment(renderFragment); renderedFragment.Markup.ShouldBe(nameof(TestComponent) + EXPECTED); } [Fact(DisplayName = "ChildContent(RenderFragment) creates a parameter with a RenderFragment passed to ChildContent")] - public void Test043() + public async Task Test043() { var cp = ChildContent(b => b.AddMarkupContent(0, EXPECTED)); cp.Name.ShouldBe("ChildContent"); cp.IsCascadingValue.ShouldBeFalse(); var renderFragment = cp.Value.ShouldBeOfType(); - var renderedFragment = RenderWithRenderFragment(renderFragment); + var renderedFragment = await RenderWithRenderFragment(renderFragment); renderedFragment.Markup.ShouldBe(EXPECTED); } [Fact(DisplayName = "RenderFragment(name, markup) creates a parameter with a RenderFragment that renders a component of type TComponent")] - public void Test051() + public async Task Test051() { var cp = RenderFragment(NAME, EXPECTED); cp.Name.ShouldBe(NAME); cp.IsCascadingValue.ShouldBeFalse(); var renderFragment = cp.Value.ShouldBeOfType(); - var renderedFragment = RenderWithRenderFragment(renderFragment); + var renderedFragment = await RenderWithRenderFragment(renderFragment); renderedFragment.Markup.ShouldBe(EXPECTED); } [Fact(DisplayName = "RenderFragment(name, component parameters) creates a parameter with a RenderFragment that renders a component of type TComponent")] - public void Test052() + public async Task Test052() { var cp = RenderFragment(NAME, (nameof(TestComponent.Input), EXPECTED)); cp.Name.ShouldBe(NAME); cp.IsCascadingValue.ShouldBeFalse(); var renderFragment = cp.Value.ShouldBeOfType(); - var renderedFragment = RenderWithRenderFragment(renderFragment); + var renderedFragment = await RenderWithRenderFragment(renderFragment); renderedFragment.Markup.ShouldBe(nameof(TestComponent) + EXPECTED); } [Fact(DisplayName = "Template(string, RenderFragment) creates a parameter with a Template")] - public void Test061() + public async Task Test061() { var cp = Template(NAME, s => b => b.AddMarkupContent(0, s)); cp.Name.ShouldBe(NAME); cp.IsCascadingValue.ShouldBeFalse(); var template = cp.Value.ShouldBeOfType>(); - var renderedFragment = RenderWithRenderFragment(template(EXPECTED)); + var renderedFragment = await RenderWithRenderFragment(template(EXPECTED)); renderedFragment.Markup.ShouldBe(EXPECTED); } [Fact(DisplayName = "Template(string, Func) creates a parameter with a Template")] - public void Test062() + public async Task Test062() { var cp = Template(NAME, s => s); cp.Name.ShouldBe(NAME); cp.IsCascadingValue.ShouldBeFalse(); var template = cp.Value.ShouldBeOfType>(); - var renderedFragment = RenderWithRenderFragment(template(EXPECTED)); + var renderedFragment = await RenderWithRenderFragment(template(EXPECTED)); renderedFragment.Markup.ShouldBe(EXPECTED); } [Fact(DisplayName = "Template(string, Func) creates a parameter with a Template")] - public void Test063() + public async Task Test063() { var cp = Template(NAME, value => new ComponentParameter[] { @@ -259,7 +259,7 @@ public void Test063() cp.Name.ShouldBe(NAME); cp.IsCascadingValue.ShouldBeFalse(); var template = cp.Value.ShouldBeOfType>(); - var renderedFragment = RenderWithRenderFragment(template(EXPECTED)); + var renderedFragment = await RenderWithRenderFragment(template(EXPECTED)); renderedFragment.Markup.ShouldBe(nameof(TestComponent) + EXPECTED); } diff --git a/tests/bunit.core.tests/Extensions/RenderedComponentInvokeAsyncExtensionsTest.cs b/tests/bunit.core.tests/Extensions/RenderedComponentInvokeAsyncExtensionsTest.cs index 7a994375f..161309b7c 100644 --- a/tests/bunit.core.tests/Extensions/RenderedComponentInvokeAsyncExtensionsTest.cs +++ b/tests/bunit.core.tests/Extensions/RenderedComponentInvokeAsyncExtensionsTest.cs @@ -6,7 +6,7 @@ public class RenderedComponentInvokeAsyncExtensionsTest : TestContext public async Task Test003() { // Arrange - var cut = RenderComponent(); + var cut = await RenderComponent(); bool delegateFinished = false; async Task Callback() @@ -26,7 +26,7 @@ async Task Callback() public async Task Test004() { // Arrange - var cut = RenderComponent(); + var cut = await RenderComponent(); bool delegateFinished = false; async void Callback() diff --git a/tests/bunit.core.tests/Extensions/RenderedComponentRenderExtensionsTest.cs b/tests/bunit.core.tests/Extensions/RenderedComponentRenderExtensionsTest.cs index 1c18202f0..eeff4a653 100644 --- a/tests/bunit.core.tests/Extensions/RenderedComponentRenderExtensionsTest.cs +++ b/tests/bunit.core.tests/Extensions/RenderedComponentRenderExtensionsTest.cs @@ -3,11 +3,11 @@ namespace Bunit; public class RenderedComponentRenderExtensionsTest : TestContext { [Fact(DisplayName = "SetParametersAndRender rethrows exceptions from SetParameterAsync")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent(); + var cut = await RenderComponent(); - var exception = Should.Throw( + var exception = await Should.ThrowAsync( () => cut.SetParametersAndRender(ps => ps.Add(qt => qt.Value, "something"))); exception.InnerException.ShouldBeOfType(); } diff --git a/tests/bunit.core.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensionsTest.cs b/tests/bunit.core.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensionsTest.cs index 6a19a20e2..3357f764f 100644 --- a/tests/bunit.core.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensionsTest.cs +++ b/tests/bunit.core.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensionsTest.cs @@ -11,10 +11,10 @@ public RenderedFragmentWaitForHelperExtensionsTest(ITestOutputHelper testOutput) } [Fact(DisplayName = "WaitForAssertion can wait for multiple renders and changes to occur")] - public void Test110() + public async Task Test110() { // Initial state is stopped - var cut = RenderComponent(); + var cut = await RenderComponent(); var stateElement = cut.Find("#state"); stateElement.TextContent.ShouldBe("Stopped"); @@ -25,40 +25,40 @@ public void Test110() // Clicking 'tock' completes the task, which updates the state // This click causes two renders, thus something is needed to await here. cut.Find("#tock").Click(); - cut.WaitForAssertion(() => cut.Find("#state").TextContent.ShouldBe("Stopped")); + await cut.WaitForAssertion(() => cut.Find("#state").TextContent.ShouldBe("Stopped")); } [Fact(DisplayName = "WaitForAssertion throws assertion exception after timeout")] - public void Test011() + public async Task Test011() { - var cut = RenderComponent(); + var cut = await RenderComponent(); - var expected = Should.Throw(() => + var expected = await Should.ThrowAsync(() => cut.WaitForAssertion(() => cut.Markup.ShouldBeEmpty(), TimeSpan.FromMilliseconds(10))); expected.Message.ShouldBe(WaitForAssertionHelper.TimeoutMessage); } [Fact(DisplayName = "WaitForState throws exception after timeout")] - public void Test012() + public async Task Test012() { - var cut = RenderComponent(); + var cut = await RenderComponent(); - var expected = Should.Throw(() => + var expected = await Should.ThrowAsync(() => cut.WaitForState(() => string.IsNullOrEmpty(cut.Markup), TimeSpan.FromMilliseconds(100))); expected.Message.ShouldBe(WaitForStateHelper.TimeoutBeforePassMessage); } [Fact(DisplayName = "WaitForState throws exception if statePredicate throws on a later render")] - public void Test013() + public async Task Test013() { const string expectedInnerMessage = "INNER MESSAGE"; - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("#tick").Click(); cut.Find("#tock").Click(); - var expected = Should.Throw(() => + var expected = await Should.ThrowAsync(() => cut.WaitForState(() => { if (cut.Find("#state").TextContent == "Stopped") @@ -72,10 +72,10 @@ public void Test013() } [Fact(DisplayName = "WaitForState can wait for multiple renders and changes to occur")] - public void Test100() + public async Task Test100() { // Initial state is stopped - var cut = RenderComponent(); + var cut = await RenderComponent(); // Clicking 'tick' changes the state, and starts a task cut.Find("#tick").Click(); @@ -84,7 +84,7 @@ public void Test100() // Clicking 'tock' completes the task, which updates the state // This click causes two renders, thus something is needed to await here. cut.Find("#tock").Click(); - cut.WaitForState(() => + await cut.WaitForState(() => { var elm = cut.Nodes.QuerySelector("#state"); return elm?.TextContent == "Stopped"; @@ -92,9 +92,9 @@ public void Test100() } [Fact(DisplayName = "WaitForState can detect async changes to properties in the CUT")] - public void Test200() + public async Task Test200() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Instance.Counter.ShouldBe(0); // Clicking 'tick' changes the counter, and starts a task @@ -104,28 +104,28 @@ public void Test200() // Clicking 'tock' completes the task, which updates the counter // This click causes two renders, thus something is needed to await here. cut.Find("#tock").Click(); - cut.WaitForState(() => cut.Instance.Counter == 2); + await cut.WaitForState(() => cut.Instance.Counter == 2); cut.Instance.Counter.ShouldBe(2); } [Fact(DisplayName = "WaitForAssertion rethrows unhandled exception from a components async operation's methods")] - public void Test300() + public async Task Test300() { - var cut = RenderComponent(); + var cut = await RenderComponent(); // Adding additional wait time to deal with tests sometimes failing for timeout on Windows. - Should.Throw( + await Should.ThrowAsync( () => cut.WaitForAssertion(() => false.ShouldBeTrue(), TimeSpan.FromSeconds(5))); } [Fact(DisplayName = "WaitForState rethrows unhandled exception from components async operation's methods")] - public void Test301() + public async Task Test301() { - var cut = RenderComponent(); + var cut = await RenderComponent(); // Adding additional wait time to deal with tests sometimes failing for timeout on Windows. - Should.Throw( + await Should.ThrowAsync( () => cut.WaitForState(() => false, TimeSpan.FromSeconds(5))); } diff --git a/tests/bunit.core.tests/Rendering/RootRenderTreeTest.cs b/tests/bunit.core.tests/Rendering/RootRenderTreeTest.cs index fef9e9a6b..bc623e8fc 100644 --- a/tests/bunit.core.tests/Rendering/RootRenderTreeTest.cs +++ b/tests/bunit.core.tests/Rendering/RootRenderTreeTest.cs @@ -29,89 +29,89 @@ public void Test011() } [Fact(DisplayName = "RenderTree.Add throws when T doesn't have a ChildContent or Body parameter")] - public void Test100() + public async Task Test100() { - Should.Throw(() => + await Should.ThrowAsync(async () => { RenderTree.Add(); - RenderComponent(); + await RenderComponent(); }); } [Fact(DisplayName = "RenderTree.Add adds T to render tree which CUT is rendered as child of")] - public void Test110() + public async Task Test110() { RenderTree.Add(); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Markup.ShouldBe($"
LAYOUT VALUE
"); } [Fact(DisplayName = "RenderTree.Add allows passing parameters to render tree components")] - public void Test111() + public async Task Test111() { RenderTree.Add(parameters => parameters.Add(p => p.Value, "ANOTHER VALUE")); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Markup.ShouldBe($"
ANOTHER VALUE
"); } [Fact(DisplayName = "RenderTree.Add can be called multiple times")] - public void Test112() + public async Task Test112() { RenderTree.Add>(parameters => parameters.Add(p => p.Value, "VALUE")); RenderTree.Add>(parameters => parameters.Add(p => p.Value, 42)); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Markup.ShouldBe($"
VALUE42
"); } [Fact(DisplayName = "RenderComponent finds correct component when T is also added to render tree")] - public void Test113() + public async Task Test113() { RenderTree.Add>(parameters => parameters.Add(p => p.Value, "VALUE")); RenderTree.Add(); RenderTree.Add>(parameters => parameters.Add(p => p.Value, 42)); RenderTree.Add(); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Markup.ShouldBe($"
VALUE42
"); } [Fact(DisplayName = "RenderComponent finds correct component when T is also added to render tree")] - public void Test113_2() + public async Task Test113_2() { RenderTree.Add>(parameters => parameters.Add(p => p.Value, "VALUE")); RenderTree.Add>(parameters => parameters.Add(p => p.Value, 42)); - var cut = RenderComponent>(parameters => parameters + var cut = await RenderComponent>(parameters => parameters .Add(p => p.Value, "FOO")); cut.Instance.Value.ShouldBe("FOO"); } [Fact(DisplayName = "Multiple RenderTree.Add calls are added to render tree in call order")] - public void Test114() + public async Task Test114() { RenderTree.Add(parameters => parameters.Add(p => p.Value, "FOO")); RenderTree.Add(parameters => parameters.Add(p => p.Value, "BAR")); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Markup.ShouldBe($"
BAR
"); } [Fact(DisplayName = "RenderTree.TryAdd only adds T if it hasn't already been added")] - public void Test120() + public async Task Test120() { RenderTree.Add(parameters => parameters.Add(p => p.Value, "FOO")); RenderTree.TryAdd(parameters => parameters.Add(p => p.Value, "BAR")); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Markup.ShouldBe($"
FOO
"); } diff --git a/tests/bunit.core.tests/Rendering/TestRendererTest.cs b/tests/bunit.core.tests/Rendering/TestRendererTest.cs index fe153cff2..695d38299 100644 --- a/tests/bunit.core.tests/Rendering/TestRendererTest.cs +++ b/tests/bunit.core.tests/Rendering/TestRendererTest.cs @@ -12,13 +12,13 @@ public TestRendererTest(ITestOutputHelper outputHelper) } [Fact(DisplayName = "RenderFragment re-throws exception from component")] - public void Test004() + public async Task Test004() { var sut = Services.GetRequiredService(); RenderFragment thowingFragment = b => { b.OpenComponent(0); b.CloseComponent(); }; - Should.Throw(() => sut.RenderFragment(thowingFragment)) - .Message.ShouldBe(ThrowsDuringSetParams.EXCEPTION.Message); + var exception = await Should.ThrowAsync(() => sut.RenderFragment(thowingFragment)); + exception.Message.ShouldBe(ThrowsDuringSetParams.EXCEPTION.Message); } [Fact(DisplayName = "RenderComponent re-throws exception from component")] @@ -31,23 +31,23 @@ public void Test003() } [Fact(DisplayName = "Can render fragment without children and no parameters")] - public void Test001() + public async Task Test001() { const string MARKUP = "

hello world

"; var sut = Services.GetRequiredService(); - var cut = (IRenderedFragment)sut.RenderFragment(builder => builder.AddMarkupContent(0, MARKUP)); + var cut = (IRenderedFragment)await sut.RenderFragment(builder => builder.AddMarkupContent(0, MARKUP)); cut.RenderCount.ShouldBe(1); cut.Markup.ShouldBe(MARKUP); } [Fact(DisplayName = "Can render component without children and no parameters")] - public void Test002() + public async Task Test002() { var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent(); + var cut = await sut.RenderComponent(); cut.RenderCount.ShouldBe(1); cut.Markup.ShouldBe(NoChildNoParams.MARKUP); @@ -55,25 +55,25 @@ public void Test002() } [Fact(DisplayName = "Can render component with parameters")] - public void Test005() + public async Task Test005() { const string VALUE = "FOO BAR"; var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent((nameof(HasParams.Value), VALUE)); + var cut = await sut.RenderComponent((nameof(HasParams.Value), VALUE)); cut.Instance.Value.ShouldBe(VALUE); } [Fact(DisplayName = "Can render component with child component")] - public void Test006() + public async Task Test006() { const string PARENT_VALUE = "PARENT"; const string CHILD_VALUE = "CHILD"; var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( (nameof(HasParams.Value), PARENT_VALUE), ChildContent((nameof(HasParams.Value), CHILD_VALUE))); @@ -86,7 +86,7 @@ public async Task Test010() { var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent(); + var cut = await sut.RenderComponent(); cut.RenderCount.ShouldBe(1); @@ -101,7 +101,7 @@ public async Task Test011() // arrange const string EXPECTED = "NOW VALUE"; var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent(); + var cut = await sut.RenderComponent(); cut.RenderCount.ShouldBe(1); @@ -114,7 +114,7 @@ public async Task Test011() } [Fact(DisplayName = "FindComponent returns first component nested inside another rendered component")] - public void Test020() + public async Task Test020() { // arrange const string PARENT_VALUE = "PARENT"; @@ -122,7 +122,7 @@ public void Test020() var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( (nameof(HasParams.Value), PARENT_VALUE), ChildContent((nameof(HasParams.Value), CHILD_VALUE))); @@ -143,20 +143,20 @@ public void Test021() } [Fact(DisplayName = "FindComponent throws if component is not found")] - public void Test022() + public async Task Test022() { var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent(); + var cut = await sut.RenderComponent(); Should.Throw(() => sut.FindComponent(cut)); } [Fact(DisplayName = "FindComponent returns same rendered component when called multiple times")] - public void Test023() + public async Task Test023() { var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( ChildContent()); var child1 = sut.FindComponent(cut); @@ -166,7 +166,7 @@ public void Test023() } [Fact(DisplayName = "FindComponents returns all components nested inside another rendered component")] - public void Test030() + public async Task Test030() { // arrange const string GRAND_PARENT_VALUE = nameof(GRAND_PARENT_VALUE); @@ -175,7 +175,7 @@ public void Test030() var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( (nameof(HasParams.Value), GRAND_PARENT_VALUE), ChildContent( (nameof(HasParams.Value), PARENT_VALUE), @@ -204,11 +204,11 @@ public void Test031() } [Fact(DisplayName = "FindComponents returns same rendered components when called multiple times")] - public void Test032() + public async Task Test032() { // arrange var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( ChildContent( ChildContent())); @@ -225,7 +225,7 @@ public async Task Test040() { var sut = Services.GetRequiredService(); - var parent = sut.RenderComponent( + var parent = await sut.RenderComponent( ChildContent()); // act @@ -244,7 +244,7 @@ public async Task Test041() { var sut = Services.GetRequiredService(); - var parent = sut.RenderComponent( + var parent = await sut.RenderComponent( ChildContent()); // act @@ -264,7 +264,7 @@ public async Task Test050() // arrange var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( ChildContent()); var child = (IRenderedComponent)sut.FindComponent(cut); @@ -282,7 +282,7 @@ public async Task Test060() // arrange var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( ChildContent()); var child = (IRenderedComponent)sut.FindComponent(cut); @@ -300,7 +300,7 @@ public async Task Test061() // arrange var sut = Services.GetRequiredService(); - var cut = sut.RenderComponent( + var cut = await sut.RenderComponent( ChildContent( ChildContent())); var child = (IRenderedComponent)sut.FindComponent(cut); @@ -315,10 +315,10 @@ public async Task Test061() } [Fact(DisplayName = "When test renderer is disposed, so is all rendered components")] - public void Test070() + public async Task Test070() { var sut = (TestRenderer)Services.GetRequiredService(); - var cut = sut.RenderComponent(); + var cut = await sut.RenderComponent(); sut.Dispose(); @@ -326,29 +326,29 @@ public void Test070() } [Fact(DisplayName = "Can render component that awaits uncompleted task in OnInitializedAsync")] - public void Test100() + public async Task Test100() { var tcs = new TaskCompletionSource(); - var cut = RenderComponent(parameters => + var cut = await RenderComponent(parameters => parameters.Add(p => p.EitherOr, tcs.Task)); cut.Find("h1").TextContent.ShouldBe("FIRST"); } [Fact(DisplayName = "Can render component that awaits yielding task in OnInitializedAsync")] - public void Test101() + public async Task Test101() { - var cut = RenderComponent(parameters => + var cut = await RenderComponent(parameters => parameters.Add(p => p.EitherOr, Task.Delay(1))); - cut.WaitForAssertion(() => cut.Find("h1").TextContent.ShouldBe("SECOND")); + await cut.WaitForAssertion(() => cut.Find("h1").TextContent.ShouldBe("SECOND")); } [Fact(DisplayName = "Can render component that awaits completed task in OnInitializedAsync")] - public void Test102() + public async Task Test102() { - var cut = RenderComponent(parameters => + var cut = await RenderComponent(parameters => parameters.Add(p => p.EitherOr, Task.CompletedTask)); cut.Find("h1").TextContent.ShouldBe("SECOND"); @@ -369,7 +369,7 @@ public async Task Test201() { var tsc = new TaskCompletionSource(); var expectedException = new AsyncOperationThrows.AsyncOperationThrowsException(); - RenderComponent(ps => ps.Add(p => p.Awaitable, tsc.Task)); + await RenderComponent(ps => ps.Add(p => p.Awaitable, tsc.Task)); tsc.SetException(expectedException); @@ -381,14 +381,14 @@ public async Task Test201() public async Task Test202() { var tsc1 = new TaskCompletionSource(); - RenderComponent(ps => ps.Add(p => p.Awaitable, tsc1.Task)); + await RenderComponent(ps => ps.Add(p => p.Awaitable, tsc1.Task)); tsc1.SetException(new AsyncOperationThrows.AsyncOperationThrowsException()); var firstExceptionReported = await Renderer.UnhandledException; var secondException = new AsyncOperationThrows.AsyncOperationThrowsException(); var tsc2 = new TaskCompletionSource(); - RenderComponent(ps => ps.Add(p => p.Awaitable, tsc2.Task)); + await RenderComponent(ps => ps.Add(p => p.Awaitable, tsc2.Task)); tsc2.SetException(secondException); var secondExceptionReported = await Renderer.UnhandledException; @@ -397,11 +397,11 @@ public async Task Test202() } [Fact(DisplayName = "UnhandledException has a reference to latest unhandled exception thrown by a component during OnAfterRenderAsync")] - public void Test203() + public async Task Test203() { // Arrange var planned = JSInterop.SetupVoid("foo"); - RenderComponent(); + await RenderComponent(); // Act planned.SetVoidResult(); // <-- After here the `OnAfterRenderAsync` progresses and throws an exception. diff --git a/tests/bunit.core.tests/Rendering/TestRendererTest.net5.cs b/tests/bunit.core.tests/Rendering/TestRendererTest.net5.cs index 83b76c64d..e98e6ec22 100644 --- a/tests/bunit.core.tests/Rendering/TestRendererTest.net5.cs +++ b/tests/bunit.core.tests/Rendering/TestRendererTest.net5.cs @@ -17,7 +17,7 @@ public partial class TestRendererTest : TestContext [Fact(DisplayName = "given a IComponentActivator, " + "when passed to constructor," + "then it used to create components")] - public void Test1000() + public async Task Test1000() { var activatorMock = new Mock(); activatorMock.Setup(x => x.CreateInstance(typeof(Wrapper))).Returns(new Wrapper()); @@ -27,7 +27,7 @@ public void Test1000() NullLoggerFactory.Instance, activatorMock.Object); - renderer.RenderComponent(new ComponentParameterCollection()); + await renderer.RenderComponent(new ComponentParameterCollection()); activatorMock.Verify(x => x.CreateInstance(typeof(Wrapper)), Times.Once()); } diff --git a/tests/bunit.core.tests/TestContextBaseTest.cs b/tests/bunit.core.tests/TestContextBaseTest.cs index e82ddbec8..490675f38 100644 --- a/tests/bunit.core.tests/TestContextBaseTest.cs +++ b/tests/bunit.core.tests/TestContextBaseTest.cs @@ -5,10 +5,10 @@ namespace Bunit; public partial class TestContextBaseTest : TestContext { [Fact(DisplayName = "DisposeComponents disposes rendered components in parent to child order")] - public void Test101() + public async Task Test101() { var callStack = new List(); - RenderComponent(ps => ps.Add(p => p.CallStack, callStack)); + await RenderComponent(ps => ps.Add(p => p.CallStack, callStack)); DisposeComponents(); @@ -18,11 +18,11 @@ public void Test101() } [Fact(DisplayName = "DisposeComponents disposes multiple rendered components")] - public void Test102() + public async Task Test102() { var callStack = new List(); - RenderComponent(ps => ps.Add(p => p.CallStack, callStack)); - RenderComponent(ps => ps.Add(p => p.CallStack, callStack)); + await RenderComponent(ps => ps.Add(p => p.CallStack, callStack)); + await RenderComponent(ps => ps.Add(p => p.CallStack, callStack)); DisposeComponents(); @@ -30,19 +30,19 @@ public void Test102() } [Fact(DisplayName = "DisposeComponents rethrows exceptions from Dispose methods in components")] - public void Test103() + public async Task Test103() { - RenderComponent(); + await RenderComponent(); var action = () => DisposeComponents(); action.ShouldThrow(); } [Fact(DisplayName = "DisposeComponents disposes components nested in render fragments")] - public void Test104() + public async Task Test104() { var callStack = new List(); - Render(DisposeFragments.ChildDisposeAsFragment(callStack)); + await Render(DisposeFragments.ChildDisposeAsFragment(callStack)); DisposeComponents(); diff --git a/tests/bunit.core.tests/TestContextBaseTest.net5.cs b/tests/bunit.core.tests/TestContextBaseTest.net5.cs index 417156fa8..f29dcba04 100644 --- a/tests/bunit.core.tests/TestContextBaseTest.net5.cs +++ b/tests/bunit.core.tests/TestContextBaseTest.net5.cs @@ -8,38 +8,38 @@ namespace Bunit; public partial class TestContextBaseTest : TestContext { [Fact(DisplayName = "ComponentFactories CanCreate() method are checked during component instantiation")] - public void Test0001() + public async Task Test0001() { var mock = CreateMockComponentFactory(canCreate: _ => false, create: _ => null); ComponentFactories.Add(mock.Object); - RenderComponent(); + await RenderComponent(); mock.Verify(x => x.CanCreate(typeof(Simple1)), Times.Once); mock.Verify(x => x.Create(It.IsAny()), Times.Never); } [Fact(DisplayName = "ComponentFactories Create() method is called when their CanCreate() method returns true")] - public void Test0002() + public async Task Test0002() { var mock = CreateMockComponentFactory(canCreate: _ => true, create: _ => new Simple1()); ComponentFactories.Add(mock.Object); - RenderComponent(); + await RenderComponent(); mock.Verify(x => x.CanCreate(typeof(Simple1)), Times.Once); mock.Verify(x => x.Create(typeof(Simple1)), Times.Once); } [Fact(DisplayName = "ComponentFactories is used in last added order")] - public void Test0003() + public async Task Test0003() { var firstMock = CreateMockComponentFactory(canCreate: _ => true, create: _ => new Simple1()); var secondMock = CreateMockComponentFactory(canCreate: _ => true, create: _ => new Simple1()); ComponentFactories.Add(firstMock.Object); ComponentFactories.Add(secondMock.Object); - RenderComponent(); + await RenderComponent(); firstMock.Verify(x => x.CanCreate(It.IsAny()), Times.Never); firstMock.Verify(x => x.Create(It.IsAny()), Times.Never); @@ -50,7 +50,7 @@ public void Test0003() [Fact(DisplayName = "DisposeComponents captures exceptions from DisposeAsync in Renderer.UnhandledException")] public async Task Test201() { - RenderComponent(); + await RenderComponent(); DisposeComponents(); @@ -61,7 +61,7 @@ public async Task Test201() [Fact(DisplayName = "DisposeComponents calls DisposeAsync on rendered components")] public async Task Test202() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var wasDisposedTask = cut.Instance.DisposedTask; DisposeComponents(); @@ -70,10 +70,10 @@ public async Task Test202() } [Fact(DisplayName = "DisposeComponents should dispose components added via ComponentFactory")] - public void Test203() + public async Task Test203() { ComponentFactories.Add(); - var cut = RenderComponent(ps => ps.Add(p => p.CallStack, new List())); + var cut = await RenderComponent(ps => ps.Add(p => p.CallStack, new List())); var instance = cut.FindComponent().Instance; DisposeComponents(); diff --git a/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs b/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs index 2756c96a7..bdd886130 100644 --- a/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs +++ b/tests/bunit.core.tests/TestDoubles/PersistentComponentState/FakePersistentComponentStateTest.cs @@ -27,11 +27,11 @@ public void Test001() } [Fact(DisplayName = "AddFakePersistentComponentState enables PersistentComponentState injection into components")] - public void Test002() + public async Task Test002() { this.AddFakePersistentComponentState(); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Instance.State.ShouldNotBeNull(); } @@ -50,10 +50,10 @@ public void Test011(string key, string data) } [Fact(DisplayName = "TryTake returns true if key contains data saved in store")] - public void Test012() + public async Task Test012() { var fakeState = this.AddFakePersistentComponentState(); - var cut = RenderComponent(); + var cut = await RenderComponent(); fakeState.TriggerOnPersisting(); diff --git a/tests/bunit.web.testcomponents.tests/RazorTesting/AuthorizationInRazorTest.razor b/tests/bunit.web.testcomponents.tests/RazorTesting/AuthorizationInRazorTest.razor index de174bf9a..21f75f932 100644 --- a/tests/bunit.web.testcomponents.tests/RazorTesting/AuthorizationInRazorTest.razor +++ b/tests/bunit.web.testcomponents.tests/RazorTesting/AuthorizationInRazorTest.razor @@ -1,18 +1,18 @@ @inherits TestComponentBase - + @code { - void CanAddFakeAuthToContext(Fixture fixture) + async Task CanAddFakeAuthToContext(Fixture fixture) { var authContext = fixture.AddTestAuthorization(); authContext.SetAuthorized("TestUser", AuthorizationState.Authorized); - var cut = fixture.GetComponentUnderTest(); + var cut = await fixture.GetComponentUnderTest(); cut.MarkupMatches("Authorized!"); } diff --git a/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureBaseTest.cs b/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureBaseTest.cs index c8d50e9de..056a18e0f 100644 --- a/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureBaseTest.cs +++ b/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureBaseTest.cs @@ -11,7 +11,7 @@ private class FixtureComponent : FixtureBase public async Task Test001() { var callLog = new List(3); - var cut = RenderComponent(builder => builder + var cut = await RenderComponent(builder => builder .Add(p => p.Setup, Setup) .Add(p => p.SetupAsync, SetupAsync) .Add(p => p.Test, Test) @@ -37,7 +37,7 @@ Task SetupAsync(FixtureComponent fixture) public async Task Test002() { var callLog = new List(3); - var cut = RenderComponent(builder => builder + var cut = await RenderComponent(builder => builder .Add(p => p.Setup, Setup) .Add(p => p.SetupAsync, SetupAsync) .Add(p => p.TestAsync, TestAsync) @@ -64,9 +64,9 @@ Task TestAsync(FixtureComponent fixture) } [Fact(DisplayName = "Run fails when no ChildContent is provided")] - public void Test010() + public async Task Test010() { - var cut = RenderComponent(builder => builder + var cut = await RenderComponent(builder => builder .Add(p => p.Test, _ => { })); Should.Throw(() => cut.Instance.RunTestAsync()) @@ -74,9 +74,9 @@ public void Test010() } [Fact(DisplayName = "Run fails when both Test or TestAsync is missing")] - public void Test011() + public async Task Test011() { - var cut = RenderComponent(builder => builder + var cut = await RenderComponent(builder => builder .AddChildContent("FOO")); Should.Throw(() => cut.Instance.RunTestAsync()) @@ -84,9 +84,9 @@ public void Test011() } [Fact(DisplayName = "Run fails when both Test or TestAsync is missing")] - public void Test012() + public async Task Test012() { - var cut = RenderComponent(builder => builder + var cut = await RenderComponent(builder => builder .Add(p => p.Test, _ => { }) .Add(p => p.TestAsync, _ => Task.CompletedTask) .AddChildContent("FOO")); diff --git a/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureTest.razor b/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureTest.razor index 6ea5f3208..bc64972e1 100644 --- a/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureTest.razor +++ b/tests/bunit.web.testcomponents.tests/RazorTesting/FixtureTest.razor @@ -1,6 +1,6 @@ @inherits TestComponentBase - + @@ -9,41 +9,41 @@ @code { - void CanGetComponentInsideCascadingValue(Fixture fixture) + async Task CanGetComponentInsideCascadingValue(Fixture fixture) { - var cut = fixture.GetComponentUnderTest(); + var cut = await fixture.GetComponentUnderTest(); cut.ShouldNotBeNull(); } } - + CUT @code { - void Test004(Fixture f) + async Task Test004(Fixture f) { - var cut1 = f.GetComponentUnderTest(); - var cut2 = f.GetComponentUnderTest(); + var cut1 = await f.GetComponentUnderTest(); + var cut2 = await f.GetComponentUnderTest(); cut1.ShouldBe(cut2); } } - + first second @code { - void Test005(Fixture f) + async Task Test005(Fixture f) { - var firstFragmentNoId1 = f.GetFragment(); - var firstFragmentNoId2 = f.GetFragment(); - var firstFragmentId1 = f.GetFragment("first"); - var firstFragmentId2 = f.GetFragment("first"); + var firstFragmentNoId1 = await f.GetFragment(); + var firstFragmentNoId2 = await f.GetFragment(); + var firstFragmentId1 = await f.GetFragment("first"); + var firstFragmentId2 = await f.GetFragment("first"); firstFragmentNoId1.ShouldBe(firstFragmentNoId2); firstFragmentId1.ShouldBe(firstFragmentId2); @@ -51,28 +51,28 @@ } - + first second @code { - void Test006(Fixture f) + async Task Test006(Fixture f) { - var firstFragmentNoId1 = f.GetFragment(); - var firstFragmentId1 = f.GetFragment("first"); + var firstFragmentNoId1 = await f.GetFragment(); + var firstFragmentId1 = await f.GetFragment("first"); firstFragmentNoId1.ShouldBe(firstFragmentId1); } } - + @code { - void Test007(Fixture f) + async Task Test007(Fixture f) { - var fragment = f.GetFragment(); + var fragment = await f.GetFragment(); fragment.ShouldBeAssignableTo>() .Instance.ShouldNotBeNull(); @@ -80,13 +80,13 @@ } - + @code { - void Test008(Fixture f) + async Task Test008(Fixture f) { - var cut = f.GetComponentUnderTest(); + var cut = await f.GetComponentUnderTest(); cut.ShouldBeAssignableTo>() .Instance.ShouldNotBeNull(); @@ -94,26 +94,26 @@ } - + @code { - void Test009(Fixture f) + async Task Test009(Fixture f) { - var fragment = f.GetFragment(); + var fragment = await f.GetFragment(); fragment.ShouldBeAssignableTo(); } } - + @code { - void Test010(Fixture f) + async Task Test010(Fixture f) { - var cut = f.GetComponentUnderTest(); + var cut = await f.GetComponentUnderTest(); cut.ShouldBeAssignableTo(); } @@ -121,7 +121,7 @@ - + CUT @@ -130,22 +130,22 @@ @code { - void Test011(Fixture f) + async Task Test011(Fixture f) { - f.GetComponentUnderTest(); + await f.GetComponentUnderTest(); // It should not be possible to call the generic GetComponentUnderTest after the non-generic has been called - Assert.Throws(() => f.GetComponentUnderTest()); + await Assert.ThrowsAsync(() => f.GetComponentUnderTest()); - f.GetFragment(); + await f.GetFragment(); // It should not be possible to call the generic GetFragment after the non-generic has been called - Assert.Throws(() => f.GetFragment()); + await Assert.ThrowsAsync(() => f.GetFragment()); } } - + @@ -154,15 +154,15 @@ @code { - void Test012(Fixture f) + async Task Test012(Fixture f) { - Assert.Throws(() => f.GetComponentUnderTest()); - Assert.Throws(() => f.GetFragment()); + await Assert.ThrowsAsync(() => f.GetComponentUnderTest()); + await Assert.ThrowsAsync(() => f.GetFragment()); } } - + @@ -174,14 +174,15 @@ f.RenderTree.Add(); } - void Test020(Fixture f) + async Task Test020(Fixture f) { - f.GetComponentUnderTest().MarkupMatches("

FOO

"); + var component = await f.GetComponentUnderTest(); + component.MarkupMatches("

FOO

"); } }
- + @@ -193,22 +194,24 @@ f.RenderTree.Add(); } - void Test021(Fixture f) + async Task Test021(Fixture f) { - f.GetComponentUnderTest().MarkupMatches("

FOO

"); + var component = await f.GetComponentUnderTest(); + component.MarkupMatches("

FOO

"); } }
- + @code { - void Test030(Fixture f) + async Task Test030(Fixture f) { - f.GetComponentUnderTest() + var component = await f.GetComponentUnderTest(); + component .Find("button") .Click(); } diff --git a/tests/bunit.web.tests/Asserting/CompareToDiffingExtensionsTest.cs b/tests/bunit.web.tests/Asserting/CompareToDiffingExtensionsTest.cs index 8cc456a63..ea172e199 100644 --- a/tests/bunit.web.tests/Asserting/CompareToDiffingExtensionsTest.cs +++ b/tests/bunit.web.tests/Asserting/CompareToDiffingExtensionsTest.cs @@ -38,38 +38,38 @@ public void Test001(MethodInfo methodInfo, string argName, object[] args) } [Fact(DisplayName = "CompareTo with rendered fragment and string")] - public void Test002() + public async Task Test002() { - var rf1 = RenderComponent((nameof(Simple1.Header), "FOO")); - var rf2 = RenderComponent((nameof(Simple1.Header), "BAR")); + var rf1 = await RenderComponent((nameof(Simple1.Header), "FOO")); + var rf2 = await RenderComponent((nameof(Simple1.Header), "BAR")); rf1.CompareTo(rf2.Markup).Count.ShouldBe(1); } [Fact(DisplayName = "CompareTo with rendered fragment and rendered fragment")] - public void Test003() + public async Task Test003() { - var rf1 = RenderComponent((nameof(Simple1.Header), "FOO")); - var rf2 = RenderComponent((nameof(Simple1.Header), "BAR")); + var rf1 = await RenderComponent((nameof(Simple1.Header), "FOO")); + var rf2 = await RenderComponent((nameof(Simple1.Header), "BAR")); rf1.CompareTo(rf2).Count.ShouldBe(1); } [Fact(DisplayName = "CompareTo with INode and INodeList")] - public void Test004() + public async Task Test004() { - var rf1 = RenderComponent((nameof(Simple1.Header), "FOO")); - var rf2 = RenderComponent((nameof(Simple1.Header), "BAR")); + var rf1 = await RenderComponent((nameof(Simple1.Header), "FOO")); + var rf2 = await RenderComponent((nameof(Simple1.Header), "BAR")); var elm = rf1.Find("h1"); elm.CompareTo(rf2.Nodes).Count.ShouldBe(1); } [Fact(DisplayName = "CompareTo with INodeList and INode")] - public void Test005() + public async Task Test005() { - var rf1 = RenderComponent((nameof(Simple1.Header), "FOO")); - var rf2 = RenderComponent((nameof(Simple1.Header), "BAR")); + var rf1 = await RenderComponent((nameof(Simple1.Header), "FOO")); + var rf2 = await RenderComponent((nameof(Simple1.Header), "BAR")); var elm = rf1.Find("h1"); rf2.Nodes.CompareTo(elm).Count.ShouldBe(1); diff --git a/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.cs b/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.cs index 8fd5a9d69..0e547d6a2 100644 --- a/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.cs +++ b/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.cs @@ -8,51 +8,51 @@ public partial class MarkupMatchesAssertExtensionsTest : TestContext private const string ExpectedMarkup = "
BAR
"; private static readonly RenderFragment ActualRenderFragment = b => b.AddMarkupContent(0, ActualMarkup); private static readonly RenderFragment ExpectedRenderFragment = b => b.AddMarkupContent(0, ExpectedMarkup); - private IRenderedFragment ActualRenderedFragment => Render(ActualRenderFragment); - private IRenderedFragment ExpectedRenderedFragment => Render(ExpectedRenderFragment); - private INodeList ActualNodeList => ActualRenderedFragment.Nodes; - private INodeList ExpectedNodeList => ExpectedRenderedFragment.Nodes; - private INode ActualNode => ActualNodeList[0]; - private INode ExpectedNode => ExpectedNodeList[0]; + private Task ActualRenderedFragment => Render(ActualRenderFragment); + private Task ExpectedRenderedFragment => Render(ExpectedRenderFragment); + private async Task ActualNodeList() => (await ActualRenderedFragment).Nodes; + private async Task ExpectedNodeList() => (await ExpectedRenderedFragment).Nodes; + private async Task ActualNode() => (await ActualNodeList())[0]; + private async Task ExpectedNode() => (await ExpectedNodeList())[0]; [Fact(DisplayName = "MarkupMatches with null arguments throws ArgumentNullException")] - public void Test001() + public async Task Test001() { Should.Throw(() => default(string)!.MarkupMatches(ExpectedMarkup)); Should.Throw(() => ActualMarkup.MarkupMatches(default(string)!)); Should.Throw(() => default(string)!.MarkupMatches(default(string)!)); - Should.Throw(() => default(string)!.MarkupMatches(ExpectedRenderedFragment)); + await Should.ThrowAsync(async () => default(string)!.MarkupMatches(await ExpectedRenderedFragment)); Should.Throw(() => ActualMarkup.MarkupMatches(default(IRenderedFragment)!)); Should.Throw(() => default(string)!.MarkupMatches(default(IRenderedFragment)!)); - Should.Throw(() => default(string)!.MarkupMatches(ExpectedNodeList)); + await Should.ThrowAsync(async () => default(string)!.MarkupMatches(await ExpectedNodeList())); Should.Throw(() => ActualMarkup.MarkupMatches(default(INodeList)!)); Should.Throw(() => default(string)!.MarkupMatches(default(INodeList)!)); - Should.Throw(() => default(INodeList)!.MarkupMatches(ExpectedNodeList)); - Should.Throw(() => ActualNodeList.MarkupMatches(default(INodeList)!)); + await Should.ThrowAsync(async () => default(INodeList)!.MarkupMatches(await ExpectedNodeList())); + await Should.ThrowAsync(async () => (await ActualNodeList()).MarkupMatches(default(INodeList)!)); Should.Throw(() => default(INodeList)!.MarkupMatches(default(INodeList)!)); - Should.Throw(() => default(INodeList)!.MarkupMatches(ExpectedNode)); - Should.Throw(() => ActualNodeList.MarkupMatches(default(INode)!)); + await Should.ThrowAsync(async () => default(INodeList)!.MarkupMatches(await ExpectedNode())); + await Should.ThrowAsync(async () => (await ActualNodeList()).MarkupMatches(default(INode)!)); Should.Throw(() => default(INodeList)!.MarkupMatches(default(INode)!)); - Should.Throw(() => default(INode)!.MarkupMatches(ExpectedNodeList)); - Should.Throw(() => ActualNode.MarkupMatches(default(INodeList)!)); + await Should.ThrowAsync(async () => default(INode)!.MarkupMatches(await ExpectedNodeList())); + await Should.ThrowAsync(async () => (await ActualNode()).MarkupMatches(default(INodeList)!)); Should.Throw(() => default(INode)!.MarkupMatches(default(INodeList)!)); - Should.Throw(() => default(IRenderedFragment)!.MarkupMatches(ExpectedRenderFragment)); - Should.Throw(() => ActualRenderedFragment.MarkupMatches(default(RenderFragment)!)); - Should.Throw(() => default(IRenderedFragment)!.MarkupMatches(default(RenderFragment)!)); + await Should.ThrowAsync(async () => await default(IRenderedFragment)!.MarkupMatches(ExpectedRenderFragment)); + await Should.ThrowAsync(async () => await (await ActualRenderedFragment).MarkupMatches(default(RenderFragment)!)); + await Should.ThrowAsync(async () => await default(IRenderedFragment)!.MarkupMatches(default(RenderFragment)!)); Should.Throw(() => default(INode)!.MarkupMatches(ExpectedRenderFragment)); - Should.Throw(() => ActualNode.MarkupMatches(default(RenderFragment)!)); + await Should.ThrowAsync(async () => await (await ActualNode()).MarkupMatches(default(RenderFragment)!)); Should.Throw(() => default(INode)!.MarkupMatches(default(RenderFragment)!)); - Should.Throw(() => default(INodeList)!.MarkupMatches(ExpectedRenderFragment)); - Should.Throw(() => ActualNodeList.MarkupMatches(default(RenderFragment)!)); - Should.Throw(() => default(INodeList)!.MarkupMatches(default(RenderFragment)!)); + await Should.ThrowAsync(() => default(INodeList)!.MarkupMatches(ExpectedRenderFragment)); + await Should.ThrowAsync(async () => await (await ActualNodeList()).MarkupMatches(default(RenderFragment)!)); + await Should.ThrowAsync(async () => await default(INodeList)!.MarkupMatches(default(RenderFragment)!)); } [Fact(DisplayName = "MarkupMatches(string, string) correctly diffs markup")] @@ -60,66 +60,66 @@ public void Test002() => Should.Throw(() => ActualMarkup.MarkupMatches(ExpectedMarkup)); [Fact(DisplayName = "MarkupMatches(string, IRenderedFragment) correctly diffs markup")] - public void Test003() - => Should.Throw(() => ActualMarkup.MarkupMatches(ExpectedRenderedFragment)); + public Task Test003() + => Should.ThrowAsync(async () => ActualMarkup.MarkupMatches(await ExpectedRenderedFragment)); [Fact(DisplayName = "MarkupMatches(string, INodeList) correctly diffs markup")] - public void Test004() - => Should.Throw(() => ActualMarkup.MarkupMatches(ExpectedNodeList)); + public Task Test004() + => Should.ThrowAsync(async () => ActualMarkup.MarkupMatches(await ExpectedNodeList())); [Fact(DisplayName = "MarkupMatches(INodeList, INodeList) correctly diffs markup")] - public void Test005() - => Should.Throw(() => ActualNodeList.MarkupMatches(ExpectedNodeList)); + public Task Test005() + => Should.ThrowAsync(async () => (await ActualNodeList()).MarkupMatches(await ExpectedNodeList())); [Fact(DisplayName = "MarkupMatches(INodeList, INode) correctly diffs markup")] - public void Test006() - => Should.Throw(() => ActualNodeList.MarkupMatches(ExpectedNode)); + public Task Test006() + => Should.ThrowAsync(async () => (await ActualNodeList()).MarkupMatches(await ExpectedNode())); [Fact(DisplayName = "MarkupMatches(INode, INodeList) correctly diffs markup")] - public void Test007() - => Should.Throw(() => ActualNode.MarkupMatches(ExpectedNodeList)); + public Task Test007() + => Should.ThrowAsync(async () => (await ActualNode()).MarkupMatches(await ExpectedNodeList())); [Fact(DisplayName = "MarkupMatches(IRenderedFragment, RenderFragment) correctly diffs markup")] - public void Test008() - => Should.Throw(() => ActualRenderedFragment.MarkupMatches(ExpectedRenderFragment)); + public Task Test008() + => Should.ThrowAsync(async () => await (await ActualRenderedFragment).MarkupMatches(ExpectedRenderFragment)); [Fact(DisplayName = "MarkupMatches(INode, RenderFragment) correctly diffs markup")] - public void Test009() - => Should.Throw(() => ActualNode.MarkupMatches(ExpectedRenderFragment)); + public Task Test009() + => Should.ThrowAsync(async () => await (await ActualNode()).MarkupMatches(ExpectedRenderFragment)); [Fact(DisplayName = "MarkupMatches(INodeList, RenderFragment) correctly diffs markup")] - public void Test0010() - => Should.Throw(() => ActualNodeList.MarkupMatches(ExpectedRenderFragment)); + public Task Test0010() + => Should.ThrowAsync(async () => await (await ActualNodeList()).MarkupMatches(ExpectedRenderFragment)); - private IRenderedFragment FindAllRenderedFragment => Render(b => b.AddMarkupContent(0, "

test

")); + private Task FindAllRenderedFragment => Render(b => b.AddMarkupContent(0, "

test

")); private readonly string findAllExpectedRenderFragment = "

test

"; [Fact(DisplayName = "MarkupMatches combination works with IRenderedFragment's FindAll extension method")] - public void Test011() + public async Task Test011() { - FindAllRenderedFragment.FindAll("p").MarkupMatches(findAllExpectedRenderFragment); + (await FindAllRenderedFragment).FindAll("p").MarkupMatches(findAllExpectedRenderFragment); } [Fact(DisplayName = "MarkupMatches combination works with FindAll and FindComponents")] - public void Test012() + public async Task Test012() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.FindAll("h1").MarkupMatches(cut.FindComponents()); } [Fact(DisplayName = "MarkupMatches combination works with FindAll and a markup string")] - public void Test013() + public async Task Test013() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.FindAll("h1").MarkupMatches("

Hello world

"); } [Fact(DisplayName = "MarkupMatches combination works with Find and FindAll")] - public void Test014() + public async Task Test014() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("div").MarkupMatches(cut.FindAll("div")); } diff --git a/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.net5.cs b/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.net5.cs index 4e241932e..ee09ad44e 100644 --- a/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.net5.cs +++ b/tests/bunit.web.tests/Asserting/MarkupMatchesAssertExtensionsTest.net5.cs @@ -8,9 +8,9 @@ namespace Bunit.Asserting; public partial class MarkupMatchesAssertExtensionsTest : TestContext { [Fact(DisplayName = "MarkupMatches correctly ignores scoped CSS attributes")] - public void Test_net5_001() + public async Task Test_net5_001() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.MarkupMatches("

Hello Pink World!

"); } diff --git a/tests/bunit.web.tests/BlazorE2E/ComponentRenderingTest.cs b/tests/bunit.web.tests/BlazorE2E/ComponentRenderingTest.cs index a2322c6c8..ff1a0fae8 100644 --- a/tests/bunit.web.tests/BlazorE2E/ComponentRenderingTest.cs +++ b/tests/bunit.web.tests/BlazorE2E/ComponentRenderingTest.cs @@ -25,27 +25,27 @@ public ComponentRenderingTest(ITestOutputHelper outputHelper) } [Fact] - public void CanRenderTextOnlyComponent() + public async Task CanRenderTextOnlyComponent() { - var cut = RenderComponent(); + var cut = await RenderComponent(); Assert.Equal("Hello from TextOnlyComponent", cut.Markup); } // This verifies that we've correctly configured the Razor language version via MSBuild. // See #974 [Fact] - public void CanRenderComponentWithDataDash() + public async Task CanRenderComponentWithDataDash() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var element = cut.Find("#cool_beans"); Assert.Equal("17", element.GetAttribute("data-tab")); Assert.Equal("17", element.TextContent); } [Fact] - public void CanRenderComponentWithAttributes() + public async Task CanRenderComponentWithAttributes() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var styledElement = cut.Find("h1"); Assert.Equal("Hello, world!", styledElement.TextContent); Assert.Equal("color: red;", styledElement.GetAttribute("style")); @@ -53,10 +53,10 @@ public void CanRenderComponentWithAttributes() } [Fact] - public void CanTriggerEvents() + public async Task CanTriggerEvents() { // Initial count is zero - var cut = RenderComponent(); + var cut = await RenderComponent(); var countDisplayElement = cut.Find("p"); Assert.Equal("Current count: 0", countDisplayElement.TextContent); @@ -66,10 +66,10 @@ public void CanTriggerEvents() } [Fact] - public void CanTriggerAsyncEventHandlers() + public async Task CanTriggerAsyncEventHandlers() { // Initial state is stopped - var cut = RenderComponent(); + var cut = await RenderComponent(); var stateElement = cut.Find("#state"); Assert.Equal("Stopped", stateElement.TextContent); @@ -78,14 +78,14 @@ public void CanTriggerAsyncEventHandlers() Assert.Equal("Started", stateElement.TextContent); cut.Find("#tock").Click(); - cut.WaitForAssertion(() => Assert.Equal("Stopped", stateElement.TextContent)); + await cut.WaitForAssertion(() => Assert.Equal("Stopped", stateElement.TextContent)); } [Fact] - public void CanTriggerKeyPressEvents() + public async Task CanTriggerKeyPressEvents() { // List is initially empty - var cut = RenderComponent(); + var cut = await RenderComponent(); var inputElement = cut.Find("input"); var liElements = cut.FindAll("li", enableAutoRefresh: true); liElements.ShouldBeEmpty(); @@ -102,9 +102,9 @@ public void CanTriggerKeyPressEvents() } [Fact] - public void CanAddAndRemoveEventHandlersDynamically() + public async Task CanAddAndRemoveEventHandlersDynamically() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var countDisplayElement = cut.Find("p"); var incrementButton = cut.Find("button"); var toggleClickHandlerCheckbox = cut.Find("[type=checkbox]"); @@ -128,9 +128,9 @@ public void CanAddAndRemoveEventHandlersDynamically() } [Fact] - public void CanRenderChildComponents() + public async Task CanRenderChildComponents() { - var cut = RenderComponent(); + var cut = await RenderComponent(); Assert.Equal("Parent component", cut.Find("fieldset > legend").TextContent); var styledElement = cut.Find("fieldset > h1"); @@ -140,16 +140,16 @@ public void CanRenderChildComponents() } [Fact(DisplayName = "Verifies we can render HTML content as a single block")] - public void CanRenderChildContent_StaticHtmlBlock() + public async Task CanRenderChildContent_StaticHtmlBlock() { - var cut = RenderComponent(); + var cut = await RenderComponent(); Assert.Equal("

Some-Static-Text

", cut.Find("#foo").InnerHtml); } [Fact(DisplayName = "Verifies we can rewite more complex HTML content into blocks")] - public void CanRenderChildContent_MixedHtmlBlock() + public async Task CanRenderChildContent_MixedHtmlBlock() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var one = cut.Find("#one"); Assert.Equal("

Some-Static-Text

", one.InnerHtml); @@ -165,9 +165,9 @@ public void CanRenderChildContent_MixedHtmlBlock() } [Fact(DisplayName = "Verifies we can rewrite HTML blocks with encoded HTML")] - public void CanRenderChildContent_EncodedHtmlInBlock() + public async Task CanRenderChildContent_EncodedHtmlInBlock() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var one = cut.Find("#one"); Assert.Equal("

Some-Static-Text

", one.InnerHtml); @@ -183,10 +183,10 @@ public void CanRenderChildContent_EncodedHtmlInBlock() } [Fact] - public void CanTriggerEventsOnChildComponents() + public async Task CanTriggerEventsOnChildComponents() { // Counter is displayed as child component. Initial count is zero. - var cut = RenderComponent(); + var cut = await RenderComponent(); // Clicking increments count in child component cut.Find("button").Click(); @@ -195,10 +195,10 @@ public void CanTriggerEventsOnChildComponents() } [Fact] - public void ChildComponentsRerenderWhenPropertiesChanged() + public async Task ChildComponentsRerenderWhenPropertiesChanged() { // Count value is displayed in child component with initial value zero - var cut = RenderComponent(); + var cut = await RenderComponent(); var wholeCounterElement = cut.Find("p"); var messageElementInChild = cut.Find("p .message"); Assert.Equal("Current count: 0", wholeCounterElement.TextContent); @@ -210,10 +210,10 @@ public void ChildComponentsRerenderWhenPropertiesChanged() } [Fact] - public void CanAddAndRemoveChildComponentsDynamically() + public async Task CanAddAndRemoveChildComponentsDynamically() { // Initially there are zero child components - var cut = RenderComponent(); + var cut = await RenderComponent(); var addButton = cut.Find(".addChild"); var removeButton = cut.Find(".removeChild"); Assert.Empty(cut.FindAll("p")); @@ -243,10 +243,10 @@ public void CanAddAndRemoveChildComponentsDynamically() } [Fact] - public void ChildComponentsNotifiedWhenPropertiesChanged() + public async Task ChildComponentsNotifiedWhenPropertiesChanged() { // Child component receives notification that lets it compute a property before first render - var cut = RenderComponent(); + var cut = await RenderComponent(); var suppliedValueElement = cut.Find(".supplied"); var computedValueElement = cut.Find(".computed"); var incrementButton = cut.Find("button"); @@ -260,10 +260,10 @@ public void ChildComponentsNotifiedWhenPropertiesChanged() } [Fact] - public void CanRenderFragmentsWhilePreservingSurroundingElements() + public async Task CanRenderFragmentsWhilePreservingSurroundingElements() { // Initially, the region isn't shown - var cut = RenderComponent(); + var cut = await RenderComponent(); var originalButton = cut.Find("button"); var fragmentElements = cut.FindAll("p[name=fragment-element]", enableAutoRefresh: true); @@ -283,11 +283,11 @@ public void CanRenderFragmentsWhilePreservingSurroundingElements() } [Fact] - public void CanUseViewImportsHierarchically() + public async Task CanUseViewImportsHierarchically() { // The component is able to compile and output these type names only because // of the _ViewImports.cshtml files at the same and ancestor levels - var cut = RenderComponent(); + var cut = await RenderComponent(); Assert.Collection( cut.FindAll("p"), elem => Assert.Equal(typeof(Complex).FullName, elem.TextContent), @@ -295,9 +295,9 @@ public void CanUseViewImportsHierarchically() } [Fact] - public void CanRenderSvgWithCorrectNamespace() + public async Task CanRenderSvgWithCorrectNamespace() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var svgElement = cut.Find("svg"); Assert.NotNull(svgElement); @@ -311,9 +311,9 @@ public void CanRenderSvgWithCorrectNamespace() } [Fact] - public void CanRenderSvgChildComponentWithCorrectNamespace() + public async Task CanRenderSvgChildComponentWithCorrectNamespace() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var svgElement = cut.Find("svg"); Assert.NotNull(svgElement); @@ -323,18 +323,18 @@ public void CanRenderSvgChildComponentWithCorrectNamespace() } [Fact] - public void LogicalElementInsertionWorksHierarchically() + public async Task LogicalElementInsertionWorksHierarchically() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.MarkupMatches("First Second Third"); } [Fact] - public void CanUseJSInteropToReferenceElements() + public async Task CanUseJSInteropToReferenceElements() { // NOTE: This test required JS to modify the DOM. Test rewritten to use MockJSRuntime // The original test code is here: - // var cut = RenderComponent(); + // var cut = await RenderComponent(); // var inputElement = cut.Find("#capturedElement"); // var buttonElement = cut.Find("button"); @@ -345,7 +345,7 @@ public void CanUseJSInteropToReferenceElements() // buttonElement.Click(); // Assert.Equal("Clicks: 2", inputElement.GetAttribute("value")); - var cut = RenderComponent(); + var cut = await RenderComponent(); var inputElement = cut.Find("#capturedElement"); var refId = inputElement.GetAttribute(Htmlizer.ElementReferenceAttrName); var buttonElement = cut.Find("button"); @@ -358,11 +358,11 @@ public void CanUseJSInteropToReferenceElements() } [Fact] - public void CanCaptureReferencesToDynamicallyAddedElements() + public async Task CanCaptureReferencesToDynamicallyAddedElements() { // NOTE: This test required JS to modify the DOM. Test rewritten to use MockJSRuntime // The original test code is here: - // var cut = RenderComponent(); + // var cut = await RenderComponent(); // var buttonElement = cut.Find("button"); // var checkbox = cut.Find("input[type=checkbox]"); // @@ -383,7 +383,7 @@ public void CanCaptureReferencesToDynamicallyAddedElements() // buttonElement.Click(); // Assert.Equal("Clicks: 1", () => inputElement.GetAttribute("value")); - var cut = RenderComponent(); + var cut = await RenderComponent(); var buttonElement = cut.Find("button"); var checkbox = cut.Find("input[type=checkbox]"); @@ -410,9 +410,9 @@ public void CanCaptureReferencesToDynamicallyAddedElements() } [Fact] - public void CanCaptureReferencesToDynamicallyAddedComponents() + public async Task CanCaptureReferencesToDynamicallyAddedComponents() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var incrementButton = cut.Find("#child-component button"); var resetButton = cut.Find("#reset-child"); var toggleChildCheckbox = cut.Find("#toggle-child"); @@ -443,14 +443,14 @@ public void CanCaptureReferencesToDynamicallyAddedComponents() // [Fact] // public void CanUseJSInteropForRefElementsDuringOnAfterRender() // { - // var cut = RenderComponent(); + // var cut = await RenderComponent(); // Assert.Equal("Value set after render", () => Browser.Find("input").GetAttribute("value")); // } [Fact] - public void CanRenderMarkupBlocks() + public async Task CanRenderMarkupBlocks() { - var cut = RenderComponent(); + var cut = await RenderComponent(); // Static markup Assert.Equal("attributes", cut.Find("p span#attribute-example").TextContent); @@ -470,9 +470,9 @@ public void CanRenderMarkupBlocks() } [Fact] - public void CanRenderRazorTemplates() + public async Task CanRenderRazorTemplates() { - var cut = RenderComponent(); + var cut = await RenderComponent(); // code block template (component parameter) var element = cut.Find("div#codeblocktemplate ol"); @@ -484,9 +484,9 @@ public void CanRenderRazorTemplates() } [Fact] - public void CanRenderMultipleChildContent() + public async Task CanRenderMultipleChildContent() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var table = cut.Find("table"); @@ -510,13 +510,13 @@ public void CanRenderMultipleChildContent() } [Fact] - public void CanAcceptSimultaneousRenderRequests() + public async Task CanAcceptSimultaneousRenderRequests() { var expectedOutput = string.Join( string.Empty, Enumerable.Range(0, 100).Select(_ => "😊")); - var cut = RenderComponent(); + var cut = await RenderComponent(); // It's supposed to pause the rendering for this long. The WaitAssert below // allows it to take up extra time if needed. @@ -524,37 +524,37 @@ public void CanAcceptSimultaneousRenderRequests() var outputElement = cut.Find("#concurrent-render-output"); - cut.WaitForAssertion( + await cut.WaitForAssertion( () => Assert.Equal(expectedOutput, outputElement.TextContent.Trim()), timeout: TimeSpan.FromMilliseconds(2000)); } [Fact] - public void CanDispatchRenderToSyncContext() + public async Task CanDispatchRenderToSyncContext() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var result = cut.Find("#result"); cut.Find("#run-with-dispatch").Click(); - cut.WaitForAssertion(() => Assert.Equal("Success (completed synchronously)", result.TextContent.Trim())); + await cut.WaitForAssertion(() => Assert.Equal("Success (completed synchronously)", result.TextContent.Trim())); } [Fact] - public void CanDoubleDispatchRenderToSyncContext() + public async Task CanDoubleDispatchRenderToSyncContext() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var result = cut.Find("#result"); cut.Find("#run-with-double-dispatch").Click(); - cut.WaitForAssertion(() => Assert.Equal("Success (completed synchronously)", result.TextContent.Trim())); + await cut.WaitForAssertion(() => Assert.Equal("Success (completed synchronously)", result.TextContent.Trim())); } [Fact] - public void CanUseAddMultipleAttributes() + public async Task CanUseAddMultipleAttributes() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var element = cut.Find("#duplicate-on-element > div"); Assert.True(element.HasAttribute("bool")); // attribute is present @@ -568,9 +568,9 @@ public void CanUseAddMultipleAttributes() } [Fact] - public void CanPatchRenderTreeToMatchLatestDOMState() + public async Task CanPatchRenderTreeToMatchLatestDOMState() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var incompleteItemsSelector = ".incomplete-items li"; var completeItemsSelector = ".complete-items li"; @@ -590,24 +590,24 @@ public void CanPatchRenderTreeToMatchLatestDOMState() } [Fact] - public void CanHandleRemovedParentObjects() + public async Task CanHandleRemovedParentObjects() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("button").Click(); - cut.WaitForState(() => !cut.FindAll("div").Any()); + await cut.WaitForState(() => !cut.FindAll("div").Any()); cut.FindAll("div").Count.ShouldBe(0); } [Fact] public async Task CanHandleRemovedParentObjectsAsync() { - var cut = RenderComponent(); + var cut = await RenderComponent(); await cut.Find("button").ClickAsync(new MouseEventArgs()); - cut.WaitForState(() => !cut.FindAll("div").Any()); + await cut.WaitForState(() => !cut.FindAll("div").Any()); cut.FindAll("div").Count.ShouldBe(0); } } diff --git a/tests/bunit.web.tests/ComponentFactories/StubComponentFactoryTest.cs b/tests/bunit.web.tests/ComponentFactories/StubComponentFactoryTest.cs index 0249728c2..64be95b82 100644 --- a/tests/bunit.web.tests/ComponentFactories/StubComponentFactoryTest.cs +++ b/tests/bunit.web.tests/ComponentFactories/StubComponentFactoryTest.cs @@ -10,32 +10,32 @@ public void Test101() => Should.Throw(() => ComponentFactories.AddStub(componentTypePredicate: default, string.Empty)); [Fact(DisplayName = "AddStub replaces T with Stub")] - public void Test001() + public async Task Test001() { ComponentFactories.AddStub(); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.HasComponent>().ShouldBeTrue(); } [Fact(DisplayName = "AddStub replaces U:T with Stub")] - public void Test002() + public async Task Test002() { ComponentFactories.AddStub(); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.HasComponent>().ShouldBeTrue(); } [Theory(DisplayName = "AddStub(markup) replaces types with markup")] [AutoData] - public void Test010(string randomText) + public async Task Test010(string randomText) { ComponentFactories.AddStub($"

{randomText}

"); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.HasComponent>().ShouldBeTrue(); cut.MarkupMatches($"

{randomText}

"); @@ -43,11 +43,11 @@ public void Test010(string randomText) [Theory(DisplayName = "AddStub(renderFragment) replaces types with markup")] [AutoData] - public void Test011(string randomText) + public async Task Test011(string randomText) { ComponentFactories.AddStub(b => b.AddMarkupContent(0, $"

{randomText}

")); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.HasComponent>().ShouldBeTrue(); cut.MarkupMatches($"

{randomText}

"); @@ -55,11 +55,11 @@ public void Test011(string randomText) [Theory(DisplayName = "AddStub(Func) replaces types with Stub that output from render fragment")] [AutoData] - public void Test0042(string regularParamValue) + public async Task Test0042(string regularParamValue) { ComponentFactories.AddStub>(ps => $"
{ps.Get(x => x.RegularParam)}
"); - var cut = RenderComponent(parameters => parameters + var cut = await RenderComponent(parameters => parameters .AddChildContent>(ps => ps.Add(p => p.RegularParam, regularParamValue))); cut.MarkupMatches($"
{regularParamValue}
"); @@ -67,35 +67,35 @@ public void Test0042(string regularParamValue) [Theory(DisplayName = "AddStub(renderFragment) replaces types with Stub that output from render fragment")] [AutoData] - public void Test004(string regularParamValue) + public async Task Test004(string regularParamValue) { ComponentFactories.AddStub>(ps => builder => builder.AddMarkupContent(0, $"
{ps.Get(x => x.RegularParam)}
")); - var cut = RenderComponent(parameters => parameters + var cut = await RenderComponent(parameters => parameters .AddChildContent>(ps => ps.Add(p => p.RegularParam, regularParamValue))); cut.MarkupMatches($"
{regularParamValue}
"); } [Fact(DisplayName = "AddStub(predicate) replaces types that matches predicate")] - public void Test003() + public async Task Test003() { ComponentFactories.AddStub(componentType => componentType == typeof(CompA)); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.HasComponent>().ShouldBeTrue(); } [Theory(DisplayName = "AddStub(predicate, markup) replaces types that matches predicate with markup")] [AutoData] - public void Test023(string randomText) + public async Task Test023(string randomText) { ComponentFactories.AddStub(componentType => componentType == typeof(CompA), $"

{randomText}

"); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.HasComponent>().ShouldBeTrue(); cut.MarkupMatches($"

{randomText}

"); @@ -103,11 +103,11 @@ public void Test023(string randomText) [Theory(DisplayName = "AddStub(predicate, markup) replaces types that matches predicate with markup")] [AutoData] - public void Test024(string randomText) + public async Task Test024(string randomText) { ComponentFactories.AddStub(componentType => componentType == typeof(CompA), b => b.AddMarkupContent(1, $"

{randomText}

")); - var cut = RenderComponent(ps => ps.AddChildContent()); + var cut = await RenderComponent(ps => ps.AddChildContent()); cut.HasComponent>().ShouldBeTrue(); cut.MarkupMatches($"

{randomText}

"); diff --git a/tests/bunit.web.tests/EventDispatchExtensions/ClipboardEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/ClipboardEventDispatchExtensionsTest.cs index cab97885b..21265451f 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/ClipboardEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/ClipboardEventDispatchExtensionsTest.cs @@ -6,13 +6,13 @@ public class ClipboardEventDispatchExtensionsTest : EventDispatchExtensionsTest< [Theory(DisplayName = "Clipboard events are raised correctly through helpers")] [MemberData(nameof(GetEventHelperMethods), typeof(ClipboardEventDispatchExtensions))] - public void CanRaiseEvents(MethodInfo helper) + public async Task CanRaiseEvents(MethodInfo helper) { var expected = new ClipboardEventArgs() { Type = "SOME TYPE", }; - VerifyEventRaisesCorrectly(helper, expected); + await VerifyEventRaisesCorrectly(helper, expected); } } diff --git a/tests/bunit.web.tests/EventDispatchExtensions/DetailsElementEventDispatcherExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/DetailsElementEventDispatcherExtensionsTest.cs index 4b5fe904c..b1732b108 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/DetailsElementEventDispatcherExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/DetailsElementEventDispatcherExtensionsTest.cs @@ -8,9 +8,9 @@ namespace Bunit.EventDispatchExtensions; public class DetailsElementEventDispatcherExtensionsTest : TestContext { [Fact(DisplayName = "Toggle raises ontoggle events")] - public void Test200() + public async Task Test200() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.FindAll("div > p").Count.ShouldBe(0); cut.Find("details").Toggle(); diff --git a/tests/bunit.web.tests/EventDispatchExtensions/DragEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/DragEventDispatchExtensionsTest.cs index 19bbd1dcd..8e465f822 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/DragEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/DragEventDispatchExtensionsTest.cs @@ -6,7 +6,7 @@ public class DragEventDispatchExtensionsTest : EventDispatchExtensionsTest CreateTriggerSpy(string element, string eve protected TriggerEventSpy CreateTriggerSpy(string element, string eventName) where T : EventArgs, new() => new(p => RenderComponent>(p), element, eventName); - protected void VerifyEventRaisesCorrectly(MethodInfo helper, TEventArgs expected, params (string MethodName, string EventName)[] methodNameEventMap) + protected async Task VerifyEventRaisesCorrectly(MethodInfo helper, TEventArgs expected, params (string MethodName, string EventName)[] methodNameEventMap) { if (helper is null) throw new ArgumentNullException(nameof(helper)); @@ -30,7 +30,7 @@ protected void VerifyEventRaisesCorrectly(MethodInfo helper, TEventArgs expected if (helper.GetParameters().Any(p => p.ParameterType == EventArgsType)) { // Matches methods like: public static void Xxxx(this IElement element, TEventArgs args) - spy.Trigger(element => + await spy.Trigger(element => { helper.Invoke(null, new object[] { element, evtArg }); }); @@ -39,7 +39,7 @@ protected void VerifyEventRaisesCorrectly(MethodInfo helper, TEventArgs expected else if (helper.GetParameters().Length == 1) { // Matches methods like: public static void Xxxx(this IElement element) - spy.Trigger(element => + await spy.Trigger(element => { helper.Invoke(null, new object[] { element }); }); @@ -50,7 +50,7 @@ protected void VerifyEventRaisesCorrectly(MethodInfo helper, TEventArgs expected // Matches methods like: public static void Xxxx(this IElement element, other params, goes here) var args = EventArgsType.GetProperties().ToDictionary(x => x.Name.ToUpperInvariant(), x => x.GetValue(expected, index: null), StringComparer.Ordinal); - spy.Trigger(element => + await spy.Trigger(element => { args.Add("ELEMENT", element); diff --git a/tests/bunit.web.tests/EventDispatchExtensions/FocusEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/FocusEventDispatchExtensionsTest.cs index 0043433ca..c95373b13 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/FocusEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/FocusEventDispatchExtensionsTest.cs @@ -6,13 +6,13 @@ public class FocusEventDispatchExtensionsTest : EventDispatchExtensionsTest(); + var cut = await RenderComponent(); Should.Throw(() => cut.Find("h1").Click()); } @@ -54,9 +54,9 @@ public void Test003() [Fact(DisplayName = "When clicking on an element with an event handler, " + "event handlers higher up the DOM tree is also triggered")] - public void Test100() + public async Task Test100() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("span").Click(); @@ -66,9 +66,9 @@ public void Test100() [Fact(DisplayName = "When clicking on an element without an event handler attached, " + "event handlers higher up the DOM tree is triggered")] - public void Test101() + public async Task Test101() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("button").Click(); @@ -100,7 +100,7 @@ public void Test101() [InlineData("onselectionchange")] public async Task Test110(string eventName) { - var cut = RenderComponent(ps => ps.Add(p => p.EventName, eventName)); + var cut = await RenderComponent(ps => ps.Add(p => p.EventName, eventName)); await cut.Find("#child").TriggerEventAsync(eventName, EventArgs.Empty); @@ -112,7 +112,7 @@ public async Task Test110(string eventName) [Fact(DisplayName = "When event has StopPropergation modifier, events does not bubble from target")] public async Task Test111() { - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.EventName, "onclick") .Add(p => p.ChildStopPropergation, true)); @@ -126,7 +126,7 @@ public async Task Test111() [Fact(DisplayName = "When event has StopPropergation modifier, events does not bubble from parent of target")] public async Task Test112() { - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.EventName, "onclick") .Add(p => p.ParentStopPropergation, true)); @@ -142,7 +142,7 @@ public async Task Test113( [CombinatorialValues("onclick", "ondblclick", "onmousedown", "onmousemove", "onmouseup")] string eventName, [CombinatorialValues("button", "input", "textarea", "select")] string elementType) { - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.EventName, eventName) .Add(p => p.ChildElementType, elementType) .Add(p => p.ChildElementDisabled, true)); @@ -159,7 +159,7 @@ public async Task Test114( [CombinatorialValues("onclick", "ondblclick", "onmousedown", "onmousemove", "onmouseup")] string eventName, [CombinatorialValues("button", "input", "textarea", "select")] string elementType) { - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.EventName, eventName) .Add(p => p.ChildElementType, elementType) .Add(p => p.ChildElementDisabled, false)); @@ -173,9 +173,9 @@ public async Task Test114( #if NET6_0_OR_GREATER [Fact(DisplayName = "TriggerEvent can trigger custom events")] - public void Test201() + public async Task Test201() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("input").TriggerEvent("oncustompaste", new CustomPasteEventArgs { @@ -188,9 +188,9 @@ public void Test201() #endif [Fact(DisplayName = "TriggerEventAsync throws NoEventHandlerException when invoked with an unknown event handler ID")] - public void Test300() + public async Task Test300() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var buttons = cut.FindAll("button"); buttons[0].Click(); @@ -198,9 +198,9 @@ public void Test300() } [Fact(DisplayName = "Removed bubbled event handled NoEventHandlerException are ignored")] - public void Test301() + public async Task Test301() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("button").Click(); @@ -214,9 +214,9 @@ public void Test301() [Theory(DisplayName = "When bubbling event throws, no other event handlers are triggered")] [AutoData] - public void Test302(string exceptionMessage) + public async Task Test302(string exceptionMessage) { - var cut = RenderComponent(ps => ps.Add(p => p.ExceptionMessage, exceptionMessage)); + var cut = await RenderComponent(ps => ps.Add(p => p.ExceptionMessage, exceptionMessage)); Should.Throw(() => cut.Find("button").Click()) .Message.ShouldBe(exceptionMessage); @@ -228,18 +228,18 @@ public void Test302(string exceptionMessage) [Theory(DisplayName = "When event handler throws, the exception is passed up to test")] [AutoData] - public void Test303(string exceptionMessage) + public async Task Test303(string exceptionMessage) { - var cut = RenderComponent(ps => ps.Add(p => p.ExceptionMessage, exceptionMessage)); + var cut = await RenderComponent(ps => ps.Add(p => p.ExceptionMessage, exceptionMessage)); Should.Throw(() => cut.Find("button").Click()) .Message.ShouldBe(exceptionMessage); } [Fact(DisplayName = "Should handle click event first and submit form afterwards for button")] - public void Test304() + public async Task Test304() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("button").Click(); @@ -248,9 +248,9 @@ public void Test304() } [Fact(DisplayName = "Should handle click event first and submit form afterwards for input when type button")] - public void Test305() + public async Task Test305() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("#inside-form-input").Click(); @@ -259,9 +259,9 @@ public void Test305() } [Fact(DisplayName = "Should throw exception when invoking onsubmit from non form")] - public void Test306() + public async Task Test306() { - var cut = RenderComponent(); + var cut = await RenderComponent(); Should.Throw(() => cut.Find("button").Submit()); } @@ -274,14 +274,14 @@ public static IEnumerable GetTenNumbers() => Enumerable.Range(0, 10) [SuppressMessage("Style", "IDE0060:Remove unused parameter", Justification = "Needed to trigger multiple reruns of test.")] [Theory(DisplayName = "TriggerEventAsync avoids race condition with DOM tree updates")] [MemberData(nameof(GetTenNumbers))] - public void Test400(int i) + public async Task Test400(int i) { - var cut = RenderComponent(); + var cut = await RenderComponent(); - cut.WaitForAssertion(() => cut.Find("[data-id=1]")); + await cut.WaitForAssertion(() => cut.Find("[data-id=1]")); - cut.InvokeAsync(() => cut.Find("[data-id=1]").Click()); + await cut.InvokeAsync(() => cut.Find("[data-id=1]").Click()); - cut.WaitForAssertion(() => cut.Find("[data-id=2]")); + await cut.WaitForAssertion(() => cut.Find("[data-id=2]")); } } diff --git a/tests/bunit.web.tests/EventDispatchExtensions/InputEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/InputEventDispatchExtensionsTest.cs index dc611e31b..787ac2d85 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/InputEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/InputEventDispatchExtensionsTest.cs @@ -13,266 +13,266 @@ public class InputEventDispatchExtensionsTest : EventDispatchExtensionsTest VerifySingleBindValue(value); + public Task Test000(string value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test001(string? value) + public async Task Test001(string? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(string)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(string)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test002(bool value) => VerifySingleBindValue(value); + public Task Test002(bool value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test003(bool? value) + public async Task Test003(bool? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(bool)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(bool)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test004(int value) => VerifySingleBindValue(value); + public Task Test004(int value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test005(int? value) + public async Task Test005(int? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(int)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(int)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test006(long value) => VerifySingleBindValue(value); + public Task Test006(long value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test007(long? value) + public async Task Test007(long? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(long)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(long)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test008(short value) => VerifySingleBindValue(value); + public Task Test008(short value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test009(short? value) + public async Task Test009(short? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(short)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(short)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test010(float value) => VerifySingleBindValue(value); + public Task Test010(float value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test011(float? value) + public async Task Test011(float? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(float)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(float)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test012(double value) => VerifySingleBindValue(value); + public Task Test012(double value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test013(double? value) + public async Task Test013(double? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(double)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(double)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test014(decimal value) => VerifySingleBindValue(value); + public Task Test014(decimal value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test015(decimal? value) + public async Task Test015(decimal? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(decimal)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(decimal)); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test016(DateTime value) => VerifySingleBindValue(DateTimeWithoutMillisecond(value)); + public Task Test016(DateTime value) => VerifySingleBindValue(DateTimeWithoutMillisecond(value)); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test017(DateTime? value) + public async Task Test017(DateTime? value) { - VerifySingleBindValue(DateTimeWithoutMillisecond(value)); - VerifySingleBindValue(default(DateTime)); + await VerifySingleBindValue(DateTimeWithoutMillisecond(value)); + await VerifySingleBindValue(default(DateTime)); } #if NET6_0_OR_GREATER [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test018(DateTimeOffset value) => VerifySingleBindValue(DateTimeWithoutMillisecond(value)); + public Task Test018(DateTimeOffset value) => VerifySingleBindValue(DateTimeWithoutMillisecond(value)); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test019(DateTimeOffset? value) + public async Task Test019(DateTimeOffset? value) { - VerifySingleBindValue(DateTimeWithoutMillisecond(value)); - VerifySingleBindValue(default(DateTimeOffset)); + await VerifySingleBindValue(DateTimeWithoutMillisecond(value)); + await VerifySingleBindValue(default(DateTimeOffset)); } #endif [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test020(Foo value) => VerifySingleBindValue(value); + public Task Test020(Foo value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test021(Foo? value) + public Task Test021(Foo? value) => VerifySingleBindValue(value); #if NET6_0_OR_GREATER [Fact(DisplayName = "Change and Input events are raised correctly for null object")] - public void Test022() + public Task Test022() => VerifySingleBindValue(default(Foo)); #endif [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test023(Cars value) => VerifySingleBindValue(value); + public Task Test023(Cars value) => VerifySingleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test024(Cars? value) + public async Task Test024(Cars? value) { - VerifySingleBindValue(value); - VerifySingleBindValue(default(Cars)); + await VerifySingleBindValue(value); + await VerifySingleBindValue(default(Cars)); } #if NET6_0_OR_GREATER [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test100(string[] values) => VerifyMultipleBindValue(values); + public Task Test100(string[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test101(string?[] values) + public async Task Test101(string?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new string?[] { default(string), default(string) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new string?[] { default(string), default(string) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test102(bool[] values) => VerifyMultipleBindValue(values); + public Task Test102(bool[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test103(bool?[] values) + public async Task Test103(bool?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new bool?[] { default(bool), default(bool) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new bool?[] { default(bool), default(bool) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test104(int[] value) => VerifyMultipleBindValue(value); + public Task Test104(int[] value) => VerifyMultipleBindValue(value); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test105(int?[] values) + public async Task Test105(int?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new int?[] { default(int), default(int) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new int?[] { default(int), default(int) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test106(long[] values) => VerifyMultipleBindValue(values); + public Task Test106(long[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test107(long?[] values) + public async Task Test107(long?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new long?[] { default(long), default(long) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new long?[] { default(long), default(long) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test108(short[] values) => VerifyMultipleBindValue(values); + public Task Test108(short[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test109(short?[] values) + public async Task Test109(short?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new short?[] { default(short), default(short) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new short?[] { default(short), default(short) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test110(float[] values) => VerifyMultipleBindValue(values); + public Task Test110(float[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test111(float?[] values) + public async Task Test111(float?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new float?[] { default(float), default(float) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new float?[] { default(float), default(float) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test112(double[] values) => VerifyMultipleBindValue(values); + public Task Test112(double[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test113(double?[] values) + public async Task Test113(double?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new double?[] { default(double), default(double) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new double?[] { default(double), default(double) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test114(decimal[] values) => VerifyMultipleBindValue(values); + public Task Test114(decimal[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test115(decimal?[] values) + public async Task Test115(decimal?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new decimal?[] { default(decimal), default(decimal) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new decimal?[] { default(decimal), default(decimal) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test116(DateTime[] values) => VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); + public Task Test116(DateTime[] values) => VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test117(DateTime?[] values) + public async Task Test117(DateTime?[] values) { - VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); - VerifyMultipleBindValue(new DateTime?[] { default(DateTime), default(DateTime) }); + await VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); + await VerifyMultipleBindValue(new DateTime?[] { default(DateTime), default(DateTime) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test118(DateTimeOffset[] values) => VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); + public Task Test118(DateTimeOffset[] values) => VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] [UseCulture("en-US")] - public void Test119(DateTimeOffset?[] values) + public async Task Test119(DateTimeOffset?[] values) { - VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); - VerifyMultipleBindValue(new DateTimeOffset?[] { default(DateTimeOffset), default(DateTimeOffset) }); + await VerifyMultipleBindValue(DateTimeWithoutMillisecond(values)); + await VerifyMultipleBindValue(new DateTimeOffset?[] { default(DateTimeOffset), default(DateTimeOffset) }); } [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test123(Cars[] values) => VerifyMultipleBindValue(values); + public Task Test123(Cars[] values) => VerifyMultipleBindValue(values); [Theory(DisplayName = "Change and Input events are raised correctly"), AutoData] - public void Test124(Cars?[] values) + public async Task Test124(Cars?[] values) { - VerifyMultipleBindValue(values); - VerifyMultipleBindValue(new Cars?[] { default(Cars), default(Cars) }); + await VerifyMultipleBindValue(values); + await VerifyMultipleBindValue(new Cars?[] { default(Cars), default(Cars) }); } - private void VerifyMultipleBindValue(T[] values) + private async Task VerifyMultipleBindValue(T[] values) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.Options, values)); cut.Find("#bind").Change(values); @@ -285,11 +285,11 @@ private void VerifyMultipleBindValue(T[] values) } #endif - private void VerifySingleBindValue(T value) + private async Task VerifySingleBindValue(T value) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.BindValue, Fixture.Create()) - .Add(p => p.OnChangeValue, Fixture.Create()) + .Add(p => p.OnChangeValue, Fixture.Create()) .Add(p => p.OnInputValue, Fixture.Create())); cut.Find("#bind").Change(value); diff --git a/tests/bunit.web.tests/EventDispatchExtensions/KeyboardEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/KeyboardEventDispatchExtensionsTest.cs index 1c10c457e..61f3853d4 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/KeyboardEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/KeyboardEventDispatchExtensionsTest.cs @@ -8,7 +8,7 @@ public class KeyboardEventDispatchExtensionsTest : EventDispatchExtensionsTest + await spy.Trigger(element => { element.KeyDown(Key.Enter + Key.Control); }); @@ -45,10 +45,10 @@ public void CanRaiseKeyDownWithCtrlEnter() } [Fact(DisplayName = "KeyDown event is raised correctly through helper using character key")] - public void CanRaiseKeyDownWithAKey() + public async Task CanRaiseKeyDownWithAKey() { var spy = CreateTriggerSpy(ElementName, "onkeydown"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyDown('A'); }); @@ -62,10 +62,10 @@ public void CanRaiseKeyDownWithAKey() } [Fact(DisplayName = "KeyDown event is raised correctly through helper specifying repeat and type")] - public void CanRaiseKeyDownWithRepeatAndType() + public async Task CanRaiseKeyDownWithRepeatAndType() { var spy = CreateTriggerSpy(ElementName, "onkeydown"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyDown(Key.Up + Key.Command, true, "Test Down"); }); @@ -82,10 +82,10 @@ public void CanRaiseKeyDownWithRepeatAndType() } [Fact(DisplayName = "KeyUp event is raised correctly through helper using special key")] - public void CanRaiseKeyUpWithShiftSpace() + public async Task CanRaiseKeyUpWithShiftSpace() { var spy = CreateTriggerSpy(ElementName, "onkeyup"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyUp(Key.Space + Key.Shift + Key.Alt); }); @@ -101,10 +101,10 @@ public void CanRaiseKeyUpWithShiftSpace() } [Fact(DisplayName = "KeyUp event is raised correctly through helper using character key")] - public void CanRaiseKeyUpWithBKey() + public async Task CanRaiseKeyUpWithBKey() { var spy = CreateTriggerSpy(ElementName, "onkeyup"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyUp(Key.Alt + 'B'); }); @@ -119,10 +119,10 @@ public void CanRaiseKeyUpWithBKey() } [Fact(DisplayName = "KeyUp event is raised correctly through helper specifying repeat and type")] - public void CanRaiseKeyUpWithWithRepeatAndType() + public async Task CanRaiseKeyUpWithWithRepeatAndType() { var spy = CreateTriggerSpy(ElementName, "onkeyup"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyUp(Key.Down + Key.Shift + Key.Command, true, "Test Up"); }); @@ -140,10 +140,10 @@ public void CanRaiseKeyUpWithWithRepeatAndType() } [Fact(DisplayName = "KeyPress event is raised correctly through helper using special key")] - public void CanRaiseKeyPressWithNum8Key() + public async Task CanRaiseKeyPressWithNum8Key() { var spy = CreateTriggerSpy(ElementName, "onkeypress"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyPress(Key.NumberPad8); }); @@ -157,10 +157,10 @@ public void CanRaiseKeyPressWithNum8Key() } [Fact(DisplayName = "KeyPress event is raised correctly through helper using character key")] - public void CanRaiseKeyPressWith8Key() + public async Task CanRaiseKeyPressWith8Key() { var spy = CreateTriggerSpy(ElementName, "onkeypress"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyPress('8'); }); @@ -174,10 +174,10 @@ public void CanRaiseKeyPressWith8Key() } [Fact(DisplayName = "KeyPress event is raised correctly through specifying repeat and type")] - public void CanRaiseKeyPressWithRepeatAndType() + public async Task CanRaiseKeyPressWithRepeatAndType() { var spy = CreateTriggerSpy(ElementName, "onkeypress"); - spy.Trigger(element => + await spy.Trigger(element => { element.KeyPress(Key.Shift + "P", true, "Press Test"); }); diff --git a/tests/bunit.web.tests/EventDispatchExtensions/MediaEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/MediaEventDispatchExtensionsTest.cs index bb2fd5578..65a6325cc 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/MediaEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/MediaEventDispatchExtensionsTest.cs @@ -6,8 +6,8 @@ public class MediaEventDispatchExtensionsTest : EventDispatchExtensionsTest("button", "onclick"); - spy.Trigger(x => x.Click()); + await spy.Trigger(x => x.Click()); spy.RaisedEvent.Detail.ShouldBe(1); } [Fact(DisplayName = "DoubleClick sets MouseEventArgs.Detail to 2 by default")] - public void Test002() + public async Task Test002() { var spy = CreateTriggerSpy("button", "ondblclick"); - spy.Trigger(x => x.DoubleClick()); + await spy.Trigger(x => x.DoubleClick()); spy.RaisedEvent.Detail.ShouldBe(2); } [Fact(DisplayName = "DoubleClick events are raised correctly through helpers")] - public void Test003() + public async Task Test003() { var expected = new MouseEventArgs { @@ -77,13 +77,13 @@ public void Test003() }; var spy = CreateTriggerSpy("button", "ondblclick"); - spy.Trigger(x => x.DoubleClick(expected)); + await spy.Trigger(x => x.DoubleClick(expected)); spy.RaisedEvent.ShouldBe(expected); } [Fact(DisplayName = "DoubleClickAsync events are raised correctly through helpers")] - public void Test004() + public async Task Test004() { var expected = new MouseEventArgs { @@ -102,7 +102,7 @@ public void Test004() }; var spy = CreateTriggerSpy("button", "ondblclick"); - spy.Trigger(x => x.DoubleClickAsync(expected)); + await spy.Trigger(x => x.DoubleClickAsync(expected)); spy.RaisedEvent.ShouldBe(expected); } diff --git a/tests/bunit.web.tests/EventDispatchExtensions/PointerEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/PointerEventDispatchExtensionsTest.cs index 9905fc740..811a2bb38 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/PointerEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/PointerEventDispatchExtensionsTest.cs @@ -6,7 +6,7 @@ public class PointerEventDispatchExtensionsTest : EventDispatchExtensionsTest where TEventArgs : EventArgs, new() { - private readonly IRenderedComponent> renderedComponent; + private readonly Task>> renderedComponent; private readonly string element; private TEventArgs? receivedEvent; public TEventArgs RaisedEvent => receivedEvent!; - public TriggerEventSpy(Func>> componentRenderer, string element, string eventName) + public TriggerEventSpy(Func>>> componentRenderer, string element, string eventName) { if (componentRenderer is null) throw new ArgumentNullException(nameof(componentRenderer)); @@ -25,20 +25,20 @@ public TriggerEventSpy(Func trigger) + public async Task Trigger(Action trigger) { if (trigger is null) throw new ArgumentNullException(nameof(trigger)); - trigger(renderedComponent.Find(element)); + trigger((await renderedComponent).Find(element)); } - public Task Trigger(Func trigger) + public async Task Trigger(Func trigger) { if (trigger is null) throw new ArgumentNullException(nameof(trigger)); - return trigger(renderedComponent.Find(element)); + await trigger((await renderedComponent).Find(element)); } private void CallbackHandler(TEventArgs args) => receivedEvent = args; diff --git a/tests/bunit.web.tests/EventDispatchExtensions/WheelEventDispatchExtensionsTest.cs b/tests/bunit.web.tests/EventDispatchExtensions/WheelEventDispatchExtensionsTest.cs index cd4a7ff20..580445486 100644 --- a/tests/bunit.web.tests/EventDispatchExtensions/WheelEventDispatchExtensionsTest.cs +++ b/tests/bunit.web.tests/EventDispatchExtensions/WheelEventDispatchExtensionsTest.cs @@ -9,7 +9,7 @@ public class WheelEventDispatchExtensionsTest : EventDispatchExtensionsTest(); + var cut = await RenderComponent(); var lastModified = new DateTime(1991, 5, 17); var file = InputFileContent.CreateFromText("Hello World", "Hey.txt", lastModified); - - cut.FindComponent().UploadFiles(file); - + + await cut.FindComponent().UploadFiles(file); + cut.Instance.Content.ShouldBe("Hello World"); cut.Instance.Filename.ShouldBe("Hey.txt"); cut.Instance.Size.ShouldBe(11); cut.Instance.LastChanged.ShouldBe(lastModified); } - + [Fact(DisplayName = "InputFile can upload a single byte file")] - public void Test002() + public async Task Test002() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var file = InputFileContent.CreateFromBinary(Encoding.Default.GetBytes("Hello World")); - - cut.FindComponent().UploadFiles(file); - + + await cut.FindComponent().UploadFiles(file); + cut.Instance.Content.ShouldBe("Hello World"); } [Fact(DisplayName = "InputFile can upload multiple files")] - public void Test003() + public async Task Test003() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var lastModified = new DateTime(1991, 5, 17); var file1 = InputFileContent.CreateFromText("Hello World", "Hey.txt", lastModified, "test"); var file2 = InputFileContent.CreateFromText("World Hey", "Test.txt", lastModified, "unit"); - - cut.FindComponent().UploadFiles(file1, file2); - + + await cut.FindComponent().UploadFiles(file1, file2); + cut.Instance.Files.Count.ShouldBe(2); cut.Instance.Files[0].FileContent.ShouldBe("Hello World"); cut.Instance.Files[0].Filename.ShouldBe("Hey.txt"); @@ -59,50 +59,50 @@ public void Test003() } [Fact(DisplayName = "UploadFile throws exception when InputFile is null")] - public void Test004() + public async Task Test004() { - Action action = () => ((IRenderedComponent)null).UploadFiles(); + var action = () => ((IRenderedComponent)null).UploadFiles(); - action.ShouldThrow(); + await action.ShouldThrowAsync(); } [Fact(DisplayName = "Creating InputFileContent with null text throws exception")] public void Test005() { Action action = () => InputFileContent.CreateFromText(null); - + action.ShouldThrow(); } - + [Fact(DisplayName = "Creating InputFileContent with null binary throws exception")] public void Test006() { Action action = () => InputFileContent.CreateFromBinary(null); - + action.ShouldThrow(); } [Fact(DisplayName = "Upload no files will result in Exception")] - public void Test007() + public async Task Test007() { - var cut = RenderComponent(); - - Action act = () => cut.FindComponent().UploadFiles(); + var cut = await RenderComponent(); + + var act = () => cut.FindComponent().UploadFiles(); - act.ShouldThrow(); + await act.ShouldThrowAsync(); } [Fact(DisplayName = "Setting up InputFile will not overwrite bUnit default")] - public void Test008() + public async Task Test008() { JSInterop.SetupVoid("Blazor._internal.InputFile.init").SetException(new Exception()); - var cut = RenderComponent(); - - Action act = () => cut.FindComponent().UploadFiles(InputFileContent.CreateFromText("Hello")); - - act.ShouldNotThrow(); + var cut = await RenderComponent(); + + var act = () => cut.FindComponent().UploadFiles(InputFileContent.CreateFromText("Hello")); + + await act.ShouldNotThrowAsync(); } - + private class InputFileComponent : ComponentBase { public string? Filename { get; private set; } @@ -131,7 +131,7 @@ private void OnChange(InputFileChangeEventArgs args) Content = stream.ReadToEnd(); } } - + private class MultipleInputFileComponent : ComponentBase { public readonly List Files = new(); @@ -161,4 +161,4 @@ private void OnChange(InputFileChangeEventArgs args) public record File(string Filename, string FileContent, DateTimeOffset LastChanged, long Size, string Type); } } -#endif \ No newline at end of file +#endif diff --git a/tests/bunit.web.tests/Extensions/RefreshableQueryCollectionTest.cs b/tests/bunit.web.tests/Extensions/RefreshableQueryCollectionTest.cs index 29d1f1714..07b4a1429 100644 --- a/tests/bunit.web.tests/Extensions/RefreshableQueryCollectionTest.cs +++ b/tests/bunit.web.tests/Extensions/RefreshableQueryCollectionTest.cs @@ -3,9 +3,9 @@ namespace Bunit; public class RefreshableQueryCollectionTest : TestContext { [Fact(DisplayName = "When the query returns no elements, the collection is empty")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var sut = new RefreshableElementCollection(cut, ".foo"); @@ -13,9 +13,9 @@ public void Test001() } [Fact(DisplayName = "When the query returns elements, the collection contains those elements")] - public void Test002() + public async Task Test002() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var sut = new RefreshableElementCollection(cut, "h1"); @@ -24,9 +24,9 @@ public void Test002() } [Fact(DisplayName = "When Refresh is called, the query is run again and new elements are made available")] - public void Test003() + public async Task Test003() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var sut = new RefreshableElementCollection(cut, "li"); sut.Count.ShouldBe(0); @@ -37,9 +37,9 @@ public void Test003() } [Fact(DisplayName = "Enabling auto refresh automatically refreshes query when the rendered fragment renders and has changes")] - public void Test004() + public async Task Test004() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var sut = new RefreshableElementCollection(cut, "li") { EnableAutoRefresh = true }; sut.Count.ShouldBe(0); @@ -49,9 +49,9 @@ public void Test004() } [Fact(DisplayName = "Disabling auto refresh turns off automatic refreshing queries on when rendered fragment changes")] - public void Test005() + public async Task Test005() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var sut = new RefreshableElementCollection(cut, "li") { EnableAutoRefresh = true }; sut.EnableAutoRefresh = false; diff --git a/tests/bunit.web.tests/Extensions/RefreshingWrappedElementTest.cs b/tests/bunit.web.tests/Extensions/RefreshingWrappedElementTest.cs index 7d2475ade..4e4becd71 100644 --- a/tests/bunit.web.tests/Extensions/RefreshingWrappedElementTest.cs +++ b/tests/bunit.web.tests/Extensions/RefreshingWrappedElementTest.cs @@ -3,18 +3,18 @@ namespace Bunit.Extensions; public class RefreshingWrappedElementTest : TestContext { [Fact(DisplayName = "Find() throws when element doesn't exist in DOM")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent(ps => ps.Add(p => p.Base, "None")); + var cut = await RenderComponent(ps => ps.Add(p => p.Base, "None")); Should.Throw(() => cut.Find("div")); } [Fact(DisplayName = "Find() returns the single matching element in DOM")] - public void Test010() + public async Task Test010() { var expected = "
foo
"; - var cut = RenderComponent(ps => ps.Add(p => p.Base, expected)); + var cut = await RenderComponent(ps => ps.Add(p => p.Base, expected)); var actual = cut.Find("div"); @@ -22,10 +22,10 @@ public void Test010() } [Fact(DisplayName = "Find() returns first matching element in DOM")] - public void Test011() + public async Task Test011() { var expected = "
foo
"; - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.Base, expected) .Add(p => p.Optional, "
bar
") .Add(p => p.ShowOptional, true)); @@ -36,9 +36,9 @@ public void Test011() } [Fact(DisplayName = "Find() refreshes the found element on re-renders")] - public void Test020() + public async Task Test020() { - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.Base, "
foo
") .Add(p => p.Optional, "
bar
") .Add(p => p.ShowOptional, false)); @@ -48,7 +48,7 @@ public void Test020() // initially only foo div is rendered elm.TextContent.ShouldBe("foo"); - cut.SetParametersAndRender(ps => ps.Add(p => p.ShowOptional, true)); + await cut.SetParametersAndRender(ps => ps.Add(p => p.ShowOptional, true)); // after optional markup is included, the refreshed query // returns new div as it is now last child @@ -56,9 +56,9 @@ public void Test020() } [Fact(DisplayName = "Found element doesn't throw when it's removed from DOM")] - public void Test030() + public async Task Test030() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var btn = cut.Find("button"); @@ -66,9 +66,9 @@ public void Test030() } [Fact(DisplayName = "Found element throws when its properties or methods are used after it's removed from DOM")] - public void Test031() + public async Task Test031() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var btn = cut.Find("button"); btn.Click(); // remove from dom diff --git a/tests/bunit.web.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForElementsHelperExtensionsTest.cs b/tests/bunit.web.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForElementsHelperExtensionsTest.cs index e9b7b05f7..d0ff692d2 100644 --- a/tests/bunit.web.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForElementsHelperExtensionsTest.cs +++ b/tests/bunit.web.tests/Extensions/WaitForHelpers/RenderedFragmentWaitForElementsHelperExtensionsTest.cs @@ -11,42 +11,42 @@ public RenderedFragmentWaitForElementsHelperExtensionsTest(ITestOutputHelper tes } [Fact(DisplayName = "WaitForElement waits until cssSelector returns at a element")] - public void Test001() + public async Task Test001() { var expectedMarkup = "

child content

"; - var cut = RenderComponent(ps => ps.AddChildContent(expectedMarkup)); + var cut = await RenderComponent(ps => ps.AddChildContent(expectedMarkup)); - var elm = cut.WaitForElement("main > p"); + var elm = await cut.WaitForElement("main > p"); elm.MarkupMatches(expectedMarkup); } [Fact(DisplayName = "WaitForElement throws exception after timeout when cssSelector does not result in matching element")] - public void Test002() + public async Task Test002() { - var cut = RenderComponent(); + var cut = await RenderComponent(); - var expected = Should.Throw(() => + var expected = await Should.ThrowAsync(() => cut.WaitForElement("#notHereElm", TimeSpan.FromMilliseconds(10))); expected.Message.ShouldBe(WaitForElementHelper.TimeoutBeforeFoundMessage); } [Fact(DisplayName = "WaitForElements waits until cssSelector returns at least one element")] - public void Test021() + public async Task Test021() { var expectedMarkup = "

child content

"; - var cut = RenderComponent(ps => ps.AddChildContent(expectedMarkup)); + var cut = await RenderComponent(ps => ps.AddChildContent(expectedMarkup)); - var elms = cut.WaitForElements("main > p"); + var elms = await cut.WaitForElements("main > p"); elms.MarkupMatches(expectedMarkup); } [Fact(DisplayName = "WaitForElements throws exception after timeout when cssSelector does not result in matching elements")] - public void Test022() + public async Task Test022() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var expected = Should.Throw(() => cut.WaitForElements("#notHereElm", TimeSpan.FromMilliseconds(30))); @@ -56,11 +56,11 @@ public void Test022() } [Fact(DisplayName = "WaitForElements with specific count N throws exception after timeout when cssSelector does not result in N matching elements")] - public void Test023() + public async Task Test023() { - var cut = RenderComponent(); + var cut = await RenderComponent(); - var expected = Should.Throw(() => + var expected = await Should.ThrowAsync(() => cut.WaitForElements("#notHereElm", 2, TimeSpan.FromMilliseconds(30))); expected.Message.ShouldBe(string.Format(CultureInfo.InvariantCulture, WaitForElementsHelper.TimeoutBeforeFoundWithCountMessage, 2)); @@ -68,23 +68,23 @@ public void Test023() } [Fact(DisplayName = "WaitForElements with specific count N waits until cssSelector returns at exact N elements")] - public void Test024() + public async Task Test024() { var expectedMarkup = "

child content

child content

child content

"; - var cut = RenderComponent(ps => ps.AddChildContent(expectedMarkup)); + var cut = await RenderComponent(ps => ps.AddChildContent(expectedMarkup)); - var elms = cut.WaitForElements("main > p", matchElementCount: 3); + var elms = await cut.WaitForElements("main > p", matchElementCount: 3); elms.MarkupMatches(expectedMarkup); } [Fact(DisplayName = "WaitForElements with specific count 0 waits until cssSelector returns at exact zero elements")] - public void Test025() + public async Task Test025() { var expectedMarkup = "

child content

"; - var cut = RenderComponent(ps => ps.AddChildContent(expectedMarkup)); + var cut = await RenderComponent(ps => ps.AddChildContent(expectedMarkup)); - var elms = cut.WaitForElements("main > p", matchElementCount: 0); + var elms = await cut.WaitForElements("main > p", matchElementCount: 0); elms.ShouldBeEmpty(); } diff --git a/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusAsyncInvocationHandlerTest.cs b/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusAsyncInvocationHandlerTest.cs index b9103e89b..ae7dc4663 100644 --- a/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusAsyncInvocationHandlerTest.cs +++ b/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusAsyncInvocationHandlerTest.cs @@ -10,17 +10,17 @@ namespace Bunit.JSInterop.InvocationHandlers; public class FocusAsyncInvocationHandlerTest : TestContext { [Fact(DisplayName = "Can render components that calls FocusAsync")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var input = cut.Find("input"); JSInterop.VerifyFocusAsyncInvoke().Arguments[0].ShouldBeElementReferenceTo(input); } [Fact(DisplayName = "Can capture two FocusAsync calls")] - public void Test002() + public async Task Test002() { - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .AddChildContent() .AddChildContent()); @@ -32,9 +32,9 @@ public void Test002() } [Fact(DisplayName = "Will return completed task")] - public void Test003() + public async Task Test003() { - var cut = RenderComponent(); + var cut = await RenderComponent(); Assert.True(cut.Instance.AfterFirstRender); } diff --git a/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusOnNavigateHandlerTest.cs b/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusOnNavigateHandlerTest.cs index a93bc4bfa..0a9018e26 100644 --- a/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusOnNavigateHandlerTest.cs +++ b/tests/bunit.web.tests/JSInterop/InvocationHandlers/FocusOnNavigateHandlerTest.cs @@ -15,10 +15,10 @@ namespace Bunit.JSInterop.InvocationHandlers; public class FocusOnNavigateHandlerTest : TestContext { [Fact(DisplayName = "Can render components that calls FocusOnNavigate")] - public void Test001() + public async Task Test001() { // - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.FoundTemplate, routeData => cps => cps .Add(x => x.RouteData, routeData) .Add(x => x.Selector, "h1"))); @@ -32,9 +32,9 @@ public void Test001() } [Fact(DisplayName = "Will return completed task")] - public void Test002() + public async Task Test002() { - var cut = RenderComponent(ps => ps + var cut = await RenderComponent(ps => ps .Add(p => p.FoundTemplate, routeData => cps => cps .Add(x => x.RouteData, routeData) .Add(x => x.Selector, "h1"))); diff --git a/tests/bunit.web.tests/JSInterop/InvocationHandlers/VirtualizeJSRuntimeInvocationHandlerTest.cs b/tests/bunit.web.tests/JSInterop/InvocationHandlers/VirtualizeJSRuntimeInvocationHandlerTest.cs index 7df771ecb..b1145936d 100644 --- a/tests/bunit.web.tests/JSInterop/InvocationHandlers/VirtualizeJSRuntimeInvocationHandlerTest.cs +++ b/tests/bunit.web.tests/JSInterop/InvocationHandlers/VirtualizeJSRuntimeInvocationHandlerTest.cs @@ -18,9 +18,9 @@ public class VirtualizeJSRuntimeInvocationHandlerTest : TestContext [Theory(DisplayName = "Can render component using with ChildContent")] [MemberData(nameof(ItemsInCollection))] - public void Test001(int itemsInDataSource) + public async Task Test001(int itemsInDataSource) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.Items, CreateItems(itemsInDataSource)) .Add(p => p.ChildContent, item => $"

{item}

")); @@ -29,9 +29,9 @@ public void Test001(int itemsInDataSource) [Theory(DisplayName = "Can render component using with ItemContent")] [MemberData(nameof(ItemsInCollection))] - public void Test002(int itemsInDataSource) + public async Task Test002(int itemsInDataSource) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.Items, CreateItems(itemsInDataSource)) .Add(p => p.ItemContent, item => $"

{item}

")); @@ -40,9 +40,9 @@ public void Test002(int itemsInDataSource) [Theory(DisplayName = "Can render component using with ChildContent")] [MemberData(nameof(ItemsInCollection))] - public void Test010(int itemsInDataSource) + public async Task Test010(int itemsInDataSource) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.ItemsProvider, CreateItemsProvider(itemsInDataSource)) .Add(p => p.ChildContent, item => $"

{item}

")); @@ -51,9 +51,9 @@ public void Test010(int itemsInDataSource) [Theory(DisplayName = "Can render component using with ItemContent")] [MemberData(nameof(ItemsInCollection))] - public void Test011(int itemsInDataSource) + public async Task Test011(int itemsInDataSource) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.ItemsProvider, CreateItemsProvider(itemsInDataSource)) .Add(p => p.ItemContent, item => $"

{item}

")); @@ -73,9 +73,9 @@ public void Test011(int itemsInDataSource) [Theory(DisplayName = "Can render component using and different ItemSize and OverscanCount")] [MemberData(nameof(ItemCountItemSizeOverscanCount))] - public void Test030(int itemsInDataSource, float itemSize, int overscanCount) + public async Task Test030(int itemsInDataSource, float itemSize, int overscanCount) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.ItemsProvider, CreateItemsProvider(itemsInDataSource)) .Add(p => p.ItemContent, item => $"

{item}

") .Add(p => p.ItemSize, itemSize) @@ -86,9 +86,9 @@ public void Test030(int itemsInDataSource, float itemSize, int overscanCount) [Theory(DisplayName = "Can render placeholder from ")] [MemberData(nameof(ItemsInCollection))] - public void Test040(int itemsInDataSource) + public async Task Test040(int itemsInDataSource) { - var cut = RenderComponent>(ps => ps + var cut = await RenderComponent>(ps => ps .Add(p => p.ItemsProvider, _ => ValueTask.FromResult(new ItemsProviderResult(Array.Empty(), itemsInDataSource))) .Add(p => p.ItemContent, item => @$"

{item}

") .Add(p => p.Placeholder, _ => @"

")); diff --git a/tests/bunit.web.tests/Rendering/Internal/HtmlizerTests.cs b/tests/bunit.web.tests/Rendering/Internal/HtmlizerTests.cs index 13aafd1b6..1162f8e73 100644 --- a/tests/bunit.web.tests/Rendering/Internal/HtmlizerTests.cs +++ b/tests/bunit.web.tests/Rendering/Internal/HtmlizerTests.cs @@ -6,9 +6,9 @@ public partial class HtmlizerTests : TestContext [InlineData(false, true)] [InlineData(true, false)] [InlineData(true, true)] - public void Test002(bool stopPropagation, bool preventDefault) + public async Task Test002(bool stopPropagation, bool preventDefault) { - var component = RenderComponent(parameters => parameters + var component = await RenderComponent(parameters => parameters .Add(p => p.OnClick, (MouseEventArgs _) => { }) .Add(p => p.OnClickStopPropagation, stopPropagation) .Add(p => p.OnClickPreventDefault, preventDefault)); @@ -20,9 +20,9 @@ public void Test002(bool stopPropagation, bool preventDefault) } [Fact(DisplayName = "Blazor ElementReferences are included in rendered markup")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var elmRefValue = cut.Find("button").GetAttribute("blazor:elementreference"); @@ -30,12 +30,12 @@ public void Test001() } [Fact(DisplayName = "Blazor ElementReferences start in markup on rerenders")] - public void Test003() + public async Task Test003() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("button").HasAttribute("blazor:elementreference").ShouldBeTrue(); - cut.SetParametersAndRender(parameters => parameters.Add(p => p.OnClick, (MouseEventArgs _) => { })); + await cut.SetParametersAndRender(parameters => parameters.Add(p => p.OnClick, (MouseEventArgs _) => { })); cut.Find("button").HasAttribute("blazor:elementreference").ShouldBeTrue(); } diff --git a/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs b/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs index a4dd4a0d9..d8169a627 100644 --- a/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs +++ b/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs @@ -5,55 +5,55 @@ namespace Bunit; public class RenderedComponentTest : TestContext { [Fact(DisplayName = "Call to Render() results in a render of component")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent(parameters => parameters.AddChildContent("

")); + var cut = await RenderComponent(parameters => parameters.AddChildContent("
")); var initialRenderCount = cut.RenderCount; - cut.Render(); + await cut.Render(); cut.RenderCount.ShouldBe(initialRenderCount + 1); } [Fact(DisplayName = "Call to SetParametersAndRender(builder) provides the parameters to component")] - public void Test004() + public async Task Test004() { - var cut = RenderComponent(parameters => parameters.AddChildContent("
")); + var cut = await RenderComponent(parameters => parameters.AddChildContent("
")); - cut.SetParametersAndRender(parameters => parameters.AddChildContent("

")); + await cut.SetParametersAndRender(parameters => parameters.AddChildContent("

")); cut.Find("p").ShouldNotBeNull(); } [Fact(DisplayName = "Call to SetParametersAndRender(params) provides the parameters to component")] - public void Test0041() + public async Task Test0041() { - var cut = RenderComponent(parameters => parameters.AddChildContent("

")); + var cut = await RenderComponent(parameters => parameters.AddChildContent("
")); - cut.SetParametersAndRender(ComponentParameterFactory.ChildContent("

")); + await cut.SetParametersAndRender(ComponentParameterFactory.ChildContent("

")); cut.Find("p").ShouldNotBeNull(); } [Fact(DisplayName = "Trying to set CascadingValue during SetParametersAndRender throws")] - public void Test003() + public async Task Test003() { // arrange - var cut = RenderComponent>(); + var cut = await RenderComponent>(); // assert - Should.Throw(() => cut.SetParametersAndRender(ps => ps.Add(p => p.UnnamedCascadingValue, 42))); - Should.Throw(() => cut.SetParametersAndRender(ps => ps.Add(p => p.NamedCascadingValue, 1337))); + await Should.ThrowAsync(() => cut.SetParametersAndRender(ps => ps.Add(p => p.UnnamedCascadingValue, 42))); + await Should.ThrowAsync(() => cut.SetParametersAndRender(ps => ps.Add(p => p.NamedCascadingValue, 1337))); } [Fact(DisplayName = "Getting Instance from a RenderedComponent based on a disposed component throws")] - public void Test020() + public async Task Test020() { - var cut = RenderComponent(ps => ps.Add(p => p.ShowChild, true)); + var cut = await RenderComponent(ps => ps.Add(p => p.ShowChild, true)); var target = cut.FindComponent(); // Disposes of - cut.SetParametersAndRender(ps => ps.Add(p => p.ShowChild, false)); + await cut.SetParametersAndRender(ps => ps.Add(p => p.ShowChild, false)); Should.Throw(() => target.Instance); } diff --git a/tests/bunit.web.tests/Rendering/RenderedFragmentTest.cs b/tests/bunit.web.tests/Rendering/RenderedFragmentTest.cs index c231d7d2c..0faa5bbea 100644 --- a/tests/bunit.web.tests/Rendering/RenderedFragmentTest.cs +++ b/tests/bunit.web.tests/Rendering/RenderedFragmentTest.cs @@ -11,25 +11,25 @@ public RenderedFragmentTest(ITestOutputHelper output) } [Fact(DisplayName = "Find throws an exception if no element matches the css selector")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent(); + var cut = await RenderComponent(); Should.Throw(() => cut.Find("div")); } [Fact(DisplayName = "Find returns expected element that matches the css selector")] - public void Test002() + public async Task Test002() { - var cut = RenderComponent(x => x.AddChildContent("

")); + var cut = await RenderComponent(x => x.AddChildContent("
")); var result = cut.Find("div"); result.ShouldNotBeNull(); } [Fact(DisplayName = "Nodes should return new instance " + "when a event handler trigger has caused changes to DOM tree")] - public void Test006() + public async Task Test006() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var initialNodes = cut.Nodes; cut.Find("button").Click(); @@ -39,9 +39,9 @@ public void Test006() [Fact(DisplayName = "Nodes should return new instance " + "when a nested component has caused the DOM tree to change")] - public void Test007() + public async Task Test007() { - var cut = RenderComponent>(builder => builder + var cut = await RenderComponent>(builder => builder .Add(p => p.Value, "FOO") .AddChildContent()); @@ -54,9 +54,9 @@ public void Test007() [Fact(DisplayName = "Nodes should return the same instance " + "when a re-render does not causes the DOM to change")] - public void Test008() + public async Task Test008() { - var cut = RenderComponent(); + var cut = await RenderComponent(); var initialNodes = cut.Nodes; cut.Find("button").Click(); @@ -66,14 +66,14 @@ public void Test008() } [Fact(DisplayName = "Changes to event handler should return a new instance of DOM tree")] - public void Test009() + public async Task Test009() { - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("#btn").Click(); cut.Instance.Counter.ShouldBe(1); - cut.SetParametersAndRender((nameof(ToggleClickHandler.HandleClicks), false)); + await cut.SetParametersAndRender((nameof(ToggleClickHandler.HandleClicks), false)); cut.Find("#btn").Click(); @@ -81,9 +81,9 @@ public void Test009() } [Fact(DisplayName = "FindComponent returns component from first branch of tree in first depth first search")] - public void Test100() + public async Task Test100() { - var wrapper = RenderComponent(builder => builder + var wrapper = await RenderComponent(builder => builder .Add(p => p.First, wrapper => wrapper .AddChildContent(simple1 => simple1 .Add(p => p.Header, "First"))) @@ -96,9 +96,9 @@ public void Test100() } [Fact(DisplayName = "FindComponent finds components when first tree branch is empty")] - public void Test101() + public async Task Test101() { - var wrapper = RenderComponent(builder => builder + var wrapper = await RenderComponent(builder => builder .Add(p => p.First) .Add(p => p.Second, simple1 => simple1 .Add(p => p.Header, "Second"))); @@ -109,17 +109,17 @@ public void Test101() } [Fact(DisplayName = "GetComponent throws when component of requested type is not in the render tree")] - public void Test102() + public async Task Test102() { - var wrapper = RenderComponent(); + var wrapper = await RenderComponent(); Should.Throw(() => wrapper.FindComponent()); } [Fact(DisplayName = "GetComponents returns all components of requested type using a depth first order")] - public void Test103() + public async Task Test103() { - var wrapper = RenderComponent(builder => builder + var wrapper = await RenderComponent(builder => builder .Add(p => p.First, wrapper => wrapper .AddChildContent(simple1 => simple1 .Add(p => p.Header, "First"))) @@ -134,9 +134,9 @@ public void Test103() } [Fact(DisplayName = "Render events for non-rendered sub components are not emitted")] - public void Test010() + public async Task Test010() { - var wrapper = RenderComponent(parameters => parameters + var wrapper = await RenderComponent(parameters => parameters .Add(p => p.First) .Add(p => p.Second)); var cuts = wrapper.FindComponents(); @@ -147,13 +147,13 @@ public void Test010() first.RenderCount.ShouldBe(1); second.RenderCount.ShouldBe(1); - first.Render(); + await first.Render(); wrapper.RenderCount.ShouldBe(2); first.RenderCount.ShouldBe(2); second.RenderCount.ShouldBe(1); - second.Render(); + await second.Render(); wrapper.RenderCount.ShouldBe(3); first.RenderCount.ShouldBe(2); @@ -161,13 +161,13 @@ public void Test010() } [Fact(DisplayName = "Getting Markup from a RenderedFragment based on a disposed component throws")] - public void Test020() + public async Task Test020() { - var cut = RenderComponent(ps => ps.Add(p => p.ShowChild, true)); + var cut = await RenderComponent(ps => ps.Add(p => p.ShowChild, true)); var target = cut.FindComponent(); // Disposes of - cut.SetParametersAndRender(ps => ps.Add(p => p.ShowChild, false)); + await cut.SetParametersAndRender(ps => ps.Add(p => p.ShowChild, false)); Should.Throw(() => target.Markup); } diff --git a/tests/bunit.web.tests/TestContextTest.cs b/tests/bunit.web.tests/TestContextTest.cs index ca4664ef2..7f8502a5e 100644 --- a/tests/bunit.web.tests/TestContextTest.cs +++ b/tests/bunit.web.tests/TestContextTest.cs @@ -17,10 +17,10 @@ public void Test026() } [Fact(DisplayName = "Render() renders fragment inside RenderTree")] - public void Test030() + public async Task Test030() { RenderTree.Add>(ps => ps.Add(p => p.Value, "FOO")); - var cut = Render(b => + var cut = await Render(b => { b.OpenComponent(0); b.CloseComponent(); @@ -33,10 +33,10 @@ public void Test030() } [Fact(DisplayName = "Render() renders fragment inside RenderTreee")] - public void Test031() + public async Task Test031() { RenderTree.Add>(ps => ps.Add(p => p.Value, "FOO")); - var cut = Render(b => + var cut = await Render(b => { b.OpenComponent(0); b.CloseComponent(); @@ -48,10 +48,10 @@ public void Test031() } [Fact(DisplayName = "RenderComponent(builder) renders TComponent inside RenderTreee")] - public void Test032() + public async Task Test032() { RenderTree.Add>(ps => ps.Add(p => p.Value, "FOO")); - var cut = RenderComponent(ps => ps.Add(p => p.Dummy, null)); + var cut = await RenderComponent(ps => ps.Add(p => p.Dummy, null)); cut.Instance .Value @@ -59,10 +59,10 @@ public void Test032() } [Fact(DisplayName = "RenderComponent(factories) renders TComponent inside RenderTreee")] - public void Test033() + public async Task Test033() { RenderTree.Add>(ps => ps.Add(p => p.Value, "FOO")); - var cut = RenderComponent(("Dummy", null)); + var cut = await RenderComponent(("Dummy", null)); cut.Instance .Value @@ -72,7 +72,11 @@ public void Test033() [Fact(DisplayName = "Can raise events from markup rendered with TestContext")] public void Test040() { - Should.NotThrow(() => RenderComponent().Find("button").Click()); + Should.NotThrowAsync(async () => + { + var component = await RenderComponent(); + component.Find("button").Click(); + }); } private class ReceivesCascadinValue : ComponentBase diff --git a/tests/bunit.web.tests/TestDoubles/Authorization/AuthorizationTest.cs b/tests/bunit.web.tests/TestDoubles/Authorization/AuthorizationTest.cs index a2665a954..08d04e189 100644 --- a/tests/bunit.web.tests/TestDoubles/Authorization/AuthorizationTest.cs +++ b/tests/bunit.web.tests/TestDoubles/Authorization/AuthorizationTest.cs @@ -5,90 +5,90 @@ namespace Bunit.TestDoubles.Authorization; public class AuthorizationTest : TestContext { [Fact(DisplayName = "AuthorizeView with unauthenticated user")] - public void Test001() + public async Task Test001() { // Arrange this.AddTestAuthorization(); // Act - var cut = RenderComponent(); + var cut = await RenderComponent(); // Assert cut.MarkupMatches("Not authorized?"); } [Fact(DisplayName = "AuthorizeView with authenticated and authorized user")] - public void Test002() + public async Task Test002() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser", AuthorizationState.Authorized); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches("Authorized!"); } [Fact(DisplayName = "AuthorizeView with authenticated but unauthorized user")] - public void Test003() + public async Task Test003() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser", AuthorizationState.Unauthorized); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches("Not authorized?"); } [Fact(DisplayName = "AuthorizeView switch from unauthorized to authorized.")] - public void Test004() + public async Task Test004() { // arrange var authContext = this.AddTestAuthorization(); // start off unauthenticated. - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.MarkupMatches("Not authorized?"); // act authContext.SetAuthorized("TestUser004", AuthorizationState.Authorized); - cut.Render(); + await cut.Render(); // assert - cut.WaitForAssertion(() => cut.MarkupMatches("Authorized!")); + await cut.WaitForAssertion(() => cut.MarkupMatches("Authorized!")); } [Fact(DisplayName = "AuthorizeView switch from authorized to unauthorized.")] - public void Test005() + public async Task Test005() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser005", AuthorizationState.Authorized); // start off unauthenticated. - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.MarkupMatches("Authorized!"); // act authContext.SetNotAuthorized(); - cut.Render(); + await cut.Render(); // assert cut.MarkupMatches("Not authorized?"); } [Fact(DisplayName = "AuthorizeView rendering without authorization services registered")] - public void Test006() + public async Task Test006() { // act - var ex = Assert.Throws(() => RenderComponent()); + var ex = await Assert.ThrowsAsync(() => RenderComponent()); // assert Assert.Equal("AuthenticationStateProvider", ex.ServiceName); @@ -96,105 +96,105 @@ public void Test006() } [Fact(DisplayName = "AuthorizeView with set policy with authenticated and authorized user")] - public void Test007() + public async Task Test007() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser").SetPolicies("ContentViewer"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches("Authorized for content viewers."); } [Fact(DisplayName = "AuthorizeView without policy set")] - public void Test008() + public async Task Test008() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches(string.Empty); } [Fact(DisplayName = "AuthorizeView with wrong policy set")] - public void Test0081() + public async Task Test0081() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser").SetPolicies("OtherPolicy"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches(string.Empty); } [Fact(DisplayName = "SimpleAuthViewWithRole with set role")] - public void Test009() + public async Task Test009() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser").SetRoles("Admin"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches("Authorized content for admins."); } [Fact(DisplayName = "AuthorizeView without set role")] - public void Test010() + public async Task Test010() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches(string.Empty); } [Fact(DisplayName = "AuthorizeView with wrong role set")] - public void Test011() + public async Task Test011() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser").SetRoles("NotAdmin"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches(string.Empty); } [Fact(DisplayName = "AuthorizeView in authorizing state")] - public void Test012() + public async Task Test012() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorizing(); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches("Authorizing..."); } [Fact(DisplayName = "AuthorizeView with claims")] - public void Test013() + public async Task Test013() { // arrange var userId = new Guid("{5d5fa9c1-abf9-4ed6-8fb0-3365382b629c}"); @@ -204,7 +204,7 @@ public void Test013() authContext.SetAuthorized("TestUser").SetClaims(uuidClaim, emailClaim); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches(@$"
Authorized!
@@ -214,14 +214,14 @@ public void Test013() } [Fact(DisplayName = "AuthorizeView without defined claims")] - public void Test014() + public async Task Test014() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches(@$"
Authorized!
@@ -229,20 +229,20 @@ public void Test014() } [Fact(DisplayName = "IsInRole can resolve role assigned to auth context")] - public void Test020() + public async Task Test020() { var role = "myTestRole"; var authCtx = this.AddTestAuthorization(); authCtx.SetAuthorized("FooBar"); authCtx.SetRoles(role); - var cut = RenderComponent(ps => ps.Add(p => p.ExpectedRole, role)); + var cut = await RenderComponent(ps => ps.Add(p => p.ExpectedRole, role)); cut.MarkupMatches("

True

"); } [Fact(DisplayName = "SimpleAuthViewWithCustomAuthType with set auth type")] - public void Test021() + public async Task Test021() { // arrange var authContext = this.AddTestAuthorization(); @@ -250,21 +250,21 @@ public void Test021() authContext.SetAuthenticationType("custom-auth-type"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches("

Authorized content with custom auth type.

"); } [Fact(DisplayName = "SimpleAuthViewWithCustomAuthType without set auth type")] - public void Test022() + public async Task Test022() { // arrange var authContext = this.AddTestAuthorization(); authContext.SetAuthorized("TestUser"); // act - var cut = RenderComponent(); + var cut = await RenderComponent(); // assert cut.MarkupMatches(string.Empty); diff --git a/tests/bunit.web.tests/TestDoubles/Components/ComponentDoubleBaseTest.cs b/tests/bunit.web.tests/TestDoubles/Components/ComponentDoubleBaseTest.cs index cde222f8d..e97193307 100644 --- a/tests/bunit.web.tests/TestDoubles/Components/ComponentDoubleBaseTest.cs +++ b/tests/bunit.web.tests/TestDoubles/Components/ComponentDoubleBaseTest.cs @@ -9,9 +9,9 @@ private class ComponentDouble : ComponentDoubleBase [Theory(DisplayName = "Double captures unmatched parameters")] [AutoData] - public void Test022(string attrName, string attrValue) + public async Task Test022(string attrName, string attrValue) { - var cut = RenderComponent>>((attrName, attrValue)); + var cut = await RenderComponent>>((attrName, attrValue)); cut.Instance.Parameters[attrName].ShouldBe(attrValue); } diff --git a/tests/bunit.web.tests/TestDoubles/Components/StubTest.cs b/tests/bunit.web.tests/TestDoubles/Components/StubTest.cs index f6492e588..6aad3059d 100644 --- a/tests/bunit.web.tests/TestDoubles/Components/StubTest.cs +++ b/tests/bunit.web.tests/TestDoubles/Components/StubTest.cs @@ -4,18 +4,18 @@ namespace Bunit.TestDoubles.Components; public class StubTest : TestContext { [Fact(DisplayName = "Stub renders nothing without a replacement template")] - public void Test001() + public async Task Test001() { - var cut = RenderComponent>(); + var cut = await RenderComponent>(); cut.Nodes.Length.ShouldBe(0); } [Theory(DisplayName = "Stub captures parameters passed to TComponent")] [AutoData] - public void Test002(string header, string attrValue) + public async Task Test002(string header, string attrValue) { - var cut = RenderComponent>( + var cut = await RenderComponent>( (nameof(Simple1.Header), header), (nameof(Simple1.AttrValue), attrValue)); diff --git a/tests/bunit.web.tests/TestDoubles/FakeSignOutSessionStateManagerTest.cs b/tests/bunit.web.tests/TestDoubles/FakeSignOutSessionStateManagerTest.cs index fbe71d8bc..94ec9d0b7 100644 --- a/tests/bunit.web.tests/TestDoubles/FakeSignOutSessionStateManagerTest.cs +++ b/tests/bunit.web.tests/TestDoubles/FakeSignOutSessionStateManagerTest.cs @@ -3,10 +3,10 @@ public class FakeSignOutSessionStateManagerTest : TestContext { [Theory, AutoData] - public void ShouldSignOut(string randomUserName) + public async Task ShouldSignOut(string randomUserName) { this.AddTestAuthorization().SetAuthorized(randomUserName); - var cut = RenderComponent(); + var cut = await RenderComponent(); cut.Find("button").Click(); diff --git a/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs b/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs index fe7534aa5..b6c33ac1f 100644 --- a/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs +++ b/tests/bunit.web.tests/TestDoubles/NavigationManager/FakeNavigationManagerTest.cs @@ -77,10 +77,10 @@ void Sut_LocationChanged(object? sender, LocationChangedEventArgs e) } [Fact(DisplayName = "LocationChanged is raised on the test renderer's dispatcher")] - public void Test006() + public async Task Test006() { var sut = CreateFakeNavigationMananger(); - var cut = RenderComponent(); + var cut = await RenderComponent(); sut.NavigateTo("foo"); @@ -164,4 +164,4 @@ public void Test009() locationChangedInvoked.ShouldBeFalse(); } } -} \ No newline at end of file +}