From e119a55f01dd2ad7c10997397eab23932250ca92 Mon Sep 17 00:00:00 2001 From: Saleh Yusefnejad Date: Tue, 9 Dec 2025 00:55:33 +0330 Subject: [PATCH 1/2] add missing tests of BitParams #11852 --- .../Utils/Params/BitParamsTests.cs | 138 ++++++++++++++++++ .../Utils/Params/FakeParamsA.cs | 7 + .../Utils/Params/FakeParamsB.cs | 7 + .../Utils/Params/ParamsConsumer.cs | 16 ++ 4 files changed, 168 insertions(+) create mode 100644 src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs create mode 100644 src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsA.cs create mode 100644 src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsB.cs create mode 100644 src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/ParamsConsumer.cs diff --git a/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs new file mode 100644 index 0000000000..2b83964a12 --- /dev/null +++ b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs @@ -0,0 +1,138 @@ +using System.Collections.Generic; +using System.Linq; +using Bunit; +using Microsoft.AspNetCore.Components; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Bit.BlazorUI.Tests.Utils.Params; + +[TestClass] +public class BitParamsTests : BunitTestContext +{ + [TestMethod] + public void ShouldCascadeParametersToChildren() + { + var parameters = new List + { + new FakeParamsA(), + new FakeParamsB() + }; + + var component = RenderComponent(builder => + { + builder.Add(p => p.Parameters, parameters); + builder.AddChildContent(childBuilder => + { + childBuilder.OpenComponent(0); + childBuilder.CloseComponent(); + }); + }); + + component.MarkupMatches("1-Hello"); + } + + [TestMethod] + public void ShouldProvideValuesWithNamesAndFixedFlag() + { + var param = new FakeParamsA(); + + var component = RenderComponent(builder => + { + builder.Add(p => p.Parameters, new[] { param }); + builder.AddChildContent("
content
"); + }); + + var provider = component.FindComponent().Instance; + var value = provider.Values?.Single(); + + Assert.IsNotNull(value); + Assert.AreEqual(param, value!.Value); + Assert.AreEqual(param.Name, value.Name); + Assert.IsTrue(value.IsFixed); + } + + [TestMethod] + public void ShouldSkipNullParameters() + { + var component = RenderComponent(builder => + { + builder.Add(p => p.Parameters, new IBitComponentParams[] { null!, new FakeParamsB() }); + builder.AddChildContent("child"); + }); + + var provider = component.FindComponent().Instance; + var values = provider.Values?.ToList(); + + Assert.IsNotNull(values); + Assert.AreEqual(1, values!.Count); + Assert.AreEqual("B", values[0].Name); + } + + [TestMethod] + public void ShouldRenderChildContentWhenParametersNull() + { + var component = RenderComponent(builder => + { + builder.AddChildContent("

no-params

"); + }); + + component.MarkupMatches("

no-params

"); + } + + [TestMethod] + public void ShouldRenderChildContentWhenParametersEmpty() + { + var component = RenderComponent(builder => + { + builder.Add(p => p.Parameters, Enumerable.Empty()); + builder.AddChildContent("

empty

"); + }); + + component.MarkupMatches("

empty

"); + } + + [TestMethod] + public void ShouldRenderEmptyWhenNoChildAndNoParameters() + { + var component = RenderComponent(); + + component.MarkupMatches(string.Empty); + } + + [TestMethod] + public void ShouldIgnoreUnknownParametersAndNotThrow() + { + var component = RenderComponent(); + + var parameters = ParameterView.FromDictionary(new Dictionary + { + { "Unknown", 1 }, + { nameof(BitParams.Parameters), new[] { new FakeParamsA() } } + }); + + component.InvokeAsync(() => component.Instance.SetParametersAsync(parameters)).GetAwaiter().GetResult(); + + Assert.AreEqual(1, component.Instance.Parameters?.Count()); + } + + [TestMethod] + public void ShouldUpdateParametersOnRerender() + { + var first = new FakeParamsA(); + var second = new FakeParamsB(); + + var component = RenderComponent(builder => + { + builder.Add(p => p.Parameters, new IBitComponentParams[] { first }); + builder.AddChildContent(childBuilder => + { + childBuilder.OpenComponent(0); + childBuilder.CloseComponent(); + }); + }); + + component.SetParametersAndRender(builder => builder.Add(p => p.Parameters, new IBitComponentParams[] { second })); + + component.MarkupMatches("-Hello"); + } +} diff --git a/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsA.cs b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsA.cs new file mode 100644 index 0000000000..c52243193f --- /dev/null +++ b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsA.cs @@ -0,0 +1,7 @@ +namespace Bit.BlazorUI.Tests.Utils.Params; + +public sealed class FakeParamsA : IBitComponentParams +{ + public string Name => "A"; + public int Value => 1; +} diff --git a/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsB.cs b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsB.cs new file mode 100644 index 0000000000..52e0c2ed97 --- /dev/null +++ b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/FakeParamsB.cs @@ -0,0 +1,7 @@ +namespace Bit.BlazorUI.Tests.Utils.Params; + +public sealed class FakeParamsB : IBitComponentParams +{ + public string Name => "B"; + public string Text => "Hello"; +} diff --git a/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/ParamsConsumer.cs b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/ParamsConsumer.cs new file mode 100644 index 0000000000..a3ebd9e182 --- /dev/null +++ b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/ParamsConsumer.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Rendering; + +namespace Bit.BlazorUI.Tests.Utils.Params; + +public sealed class ParamsConsumer : ComponentBase +{ + [CascadingParameter(Name = "A")] public FakeParamsA? A { get; set; } + + [CascadingParameter(Name = "B")] public FakeParamsB? B { get; set; } + + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.AddContent(0, $"{A?.Value}-{B?.Text}"); + } +} From 375d3b07130afead8c9e922a66b509c8eb093b85 Mon Sep 17 00:00:00 2001 From: msynk Date: Tue, 9 Dec 2025 09:49:29 +0330 Subject: [PATCH 2/2] resolve review comments --- .../Utils/Params/BitParamsTests.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs index 2b83964a12..c6de5bfaae 100644 --- a/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs +++ b/src/BlazorUI/Bit.BlazorUI.Tests/Utils/Params/BitParamsTests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Bunit; using Microsoft.AspNetCore.Components; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -38,7 +39,7 @@ public void ShouldProvideValuesWithNamesAndFixedFlag() var component = RenderComponent(builder => { - builder.Add(p => p.Parameters, new[] { param }); + builder.Add(p => p.Parameters, [param]); builder.AddChildContent("
content
"); }); @@ -56,7 +57,7 @@ public void ShouldSkipNullParameters() { var component = RenderComponent(builder => { - builder.Add(p => p.Parameters, new IBitComponentParams[] { null!, new FakeParamsB() }); + builder.Add(p => p.Parameters, [null!, new FakeParamsB()]); builder.AddChildContent("child"); }); @@ -64,7 +65,7 @@ public void ShouldSkipNullParameters() var values = provider.Values?.ToList(); Assert.IsNotNull(values); - Assert.AreEqual(1, values!.Count); + Assert.HasCount(1, values); Assert.AreEqual("B", values[0].Name); } @@ -84,7 +85,7 @@ public void ShouldRenderChildContentWhenParametersEmpty() { var component = RenderComponent(builder => { - builder.Add(p => p.Parameters, Enumerable.Empty()); + builder.Add(p => p.Parameters, []); builder.AddChildContent("

empty

"); }); @@ -100,7 +101,7 @@ public void ShouldRenderEmptyWhenNoChildAndNoParameters() } [TestMethod] - public void ShouldIgnoreUnknownParametersAndNotThrow() + public async Task ShouldIgnoreUnknownParametersAndNotThrow() { var component = RenderComponent(); @@ -110,7 +111,7 @@ public void ShouldIgnoreUnknownParametersAndNotThrow() { nameof(BitParams.Parameters), new[] { new FakeParamsA() } } }); - component.InvokeAsync(() => component.Instance.SetParametersAsync(parameters)).GetAwaiter().GetResult(); + await component.InvokeAsync(() => component.Instance.SetParametersAsync(parameters)); Assert.AreEqual(1, component.Instance.Parameters?.Count()); } @@ -123,7 +124,7 @@ public void ShouldUpdateParametersOnRerender() var component = RenderComponent(builder => { - builder.Add(p => p.Parameters, new IBitComponentParams[] { first }); + builder.Add(p => p.Parameters, [first]); builder.AddChildContent(childBuilder => { childBuilder.OpenComponent(0); @@ -131,7 +132,7 @@ public void ShouldUpdateParametersOnRerender() }); }); - component.SetParametersAndRender(builder => builder.Add(p => p.Parameters, new IBitComponentParams[] { second })); + component.SetParametersAndRender(builder => builder.Add(p => p.Parameters, [second])); component.MarkupMatches("-Hello"); }