namespace ZB.MOM.WW.Theme.Tests; public sealed class TechButtonExtensionsTests : BunitContext { [Theory] [InlineData(ButtonSize.Default, null)] [InlineData(ButtonSize.Small, "btn-sm")] [InlineData(ButtonSize.Large, "btn-lg")] public void Size_preserves_variant_and_composes_both_class_inputs(ButtonSize size, string? expected) { var cut = Render(p => p .Add(x => x.Variant, ButtonVariant.Secondary) .Add(x => x.Size, size) .Add(x => x.Class, "explicit-action") .Add(x => x.AdditionalAttributes, new Dictionary { ["class"] = "caller-action", ["aria-label"] = "Save changes" }) .AddChildContent("Save")); var button = cut.Find("button"); foreach (var cls in new[] { "btn", "btn-outline-secondary", "explicit-action", "caller-action" }) Assert.Contains(cls, button.ClassList); Assert.Equal("Save changes", button.GetAttribute("aria-label")); if (expected is not null) Assert.Contains(expected, button.ClassList); else { Assert.DoesNotContain("btn-sm", button.ClassList); Assert.DoesNotContain("btn-lg", button.ClassList); } } [Fact] public void Class_composition_keeps_busy_type_and_click_behavior() { var clicks = 0; var attributes = new Dictionary { ["class"] = "caller", ["disabled"] = false, ["onclick"] = EventCallback.Factory.Create(this, () => clicks++) }; var cut = Render(p => p .Add(x => x.Class, "extra") .Add(x => x.Type, "submit") .Add(x => x.Busy, true) .Add(x => x.AdditionalAttributes, attributes) .AddChildContent("Save")); Assert.True(cut.Find("button").HasAttribute("disabled")); Assert.Equal("submit", cut.Find("button").GetAttribute("type")); Assert.NotNull(cut.Find(".spinner-border")); Assert.Equal("caller", attributes["class"]); cut.Render(p => p.Add(x => x.Busy, false)); cut.Find("button").Click(); Assert.Equal(1, clicks); Assert.DoesNotContain(cut.FindAll("span"), x => x.ClassList.Contains("spinner-border")); } [Fact] public void Lowercase_class_attribute_preserves_required_button_classes() { var cut = Render(p => p.AddUnmatched("class", "caller").AddChildContent("Go")); foreach (var cls in new[] { "btn", "btn-primary", "caller" }) Assert.Contains(cls, cut.Find("button").ClassList); } }