first commit
This commit is contained in:
@@ -0,0 +1,238 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
using Bunit;
|
||||
using SufiChain.SufiBlazor.Components.Surfaces;
|
||||
using Xunit;
|
||||
|
||||
namespace SufiChain.SufiBlazor.Tests.Components.Surfaces;
|
||||
|
||||
public class SbCardTests : BunitContext
|
||||
{
|
||||
private IRenderedComponent<SbCard> RenderCard(
|
||||
Action<ComponentParameterCollectionBuilder<SbCard>>? configure = null)
|
||||
{
|
||||
return Render<SbCard>(p =>
|
||||
{
|
||||
p.Add(x => x.ChildContent, (RenderFragment)(b => b.AddMarkupContent(0, "<span>Card body</span>")));
|
||||
configure?.Invoke(p);
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersAsDivByDefault()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard();
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.NotNull(card);
|
||||
Assert.Equal("div", card.TagName.ToLowerInvariant());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersChildContent()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard();
|
||||
|
||||
// Assert
|
||||
Assert.Contains("Card body", cut.Markup);
|
||||
var body = cut.Find(".sb-card__body");
|
||||
Assert.NotNull(body);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersHeaderWhenProvided()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Header, (RenderFragment)(b => b.AddMarkupContent(0, "<h2>Card Title</h2>"))));
|
||||
|
||||
// Assert
|
||||
var header = cut.Find(".sb-card__header");
|
||||
Assert.NotNull(header);
|
||||
Assert.Contains("Card Title", cut.Markup);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersFooterWhenProvided()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Footer, (RenderFragment)(b => b.AddMarkupContent(0, "<button>Action</button>"))));
|
||||
|
||||
// Assert
|
||||
var footer = cut.Find(".sb-card__footer");
|
||||
Assert.NotNull(footer);
|
||||
Assert.Contains("Action", cut.Markup);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesElevationClass()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Elevation, 2));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains("sb-card--elevation-2", card.ClassList);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(1, "1")]
|
||||
[InlineData(3, "3")]
|
||||
[InlineData(5, "5")]
|
||||
public void AppliesCorrectElevationClass(int elevation, string expectedSuffix)
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Elevation, elevation));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains($"sb-card--elevation-{expectedSuffix}", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ClampsElevationToFive()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Elevation, 10));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains("sb-card--elevation-5", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesOutlinedClassWhenOutlinedTrue()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Outlined, true));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains("sb-card--outlined", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void OutlinedSkipsElevationClass()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p
|
||||
.Add(x => x.Elevation, 2)
|
||||
.Add(x => x.Outlined, true));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains("sb-card--outlined", card.ClassList);
|
||||
Assert.DoesNotContain("sb-card--elevation", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesNoPaddingClass()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.NoPadding, true));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains("sb-card--no-padding", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesClassParameter()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Class, "my-card"));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains("my-card", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesStyleParameter()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Style, "width: 300px"));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Contains("width: 300px", card.GetAttribute("style") ?? "");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersAsLinkWhenHrefSet()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Href, "/details"));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Equal("a", card.TagName.ToLowerInvariant());
|
||||
Assert.Equal("/details", card.GetAttribute("href"));
|
||||
Assert.Contains("sb-card--clickable", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersAsButtonWhenOnClickSet()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.OnClick, EventCallback.Factory.Create<MouseEventArgs>(this, _ => { })));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Equal("button", card.TagName.ToLowerInvariant());
|
||||
Assert.Contains("sb-card--clickable", card.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HrefTakesPrecedenceOverOnClick()
|
||||
{
|
||||
// When both Href and OnClick, renders as link
|
||||
var cut = RenderCard(p => p
|
||||
.Add(x => x.Href, "/page")
|
||||
.Add(x => x.OnClick, EventCallback.Factory.Create<MouseEventArgs>(this, _ => { })));
|
||||
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Equal("a", card.TagName.ToLowerInvariant());
|
||||
Assert.Equal("/page", card.GetAttribute("href"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task OnClickInvokesCallback()
|
||||
{
|
||||
// Arrange
|
||||
var clicked = false;
|
||||
var cut = RenderCard(p => p.Add(x => x.OnClick, EventCallback.Factory.Create<MouseEventArgs>(this, _ => clicked = true)));
|
||||
|
||||
// Act
|
||||
var button = cut.Find("button.sb-card");
|
||||
await cut.InvokeAsync(() => button.Click());
|
||||
|
||||
// Assert
|
||||
Assert.True(clicked);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PassesAdditionalAttributes()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p
|
||||
.Add(x => x.AdditionalAttributes, new Dictionary<string, object> { ["data-test"] = "card" }));
|
||||
|
||||
// Assert
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.Equal("card", card.GetAttribute("data-test"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NoElevationClassWhenElevationZero()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderCard(p => p.Add(x => x.Elevation, 0));
|
||||
|
||||
// Assert - Elevation > 0 check means no elevation class
|
||||
var card = cut.Find(".sb-card");
|
||||
Assert.DoesNotContain("sb-card--elevation", card.ClassList);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Bunit;
|
||||
using SufiChain.SufiBlazor.Components;
|
||||
using SufiChain.SufiBlazor.Components.Layout;
|
||||
using SufiChain.SufiBlazor.Components.Surfaces;
|
||||
using Xunit;
|
||||
|
||||
namespace SufiChain.SufiBlazor.Tests.Components.Surfaces;
|
||||
|
||||
public class SbDividerTests : BunitContext
|
||||
{
|
||||
private IRenderedComponent<SbDivider> RenderDivider(
|
||||
Action<ComponentParameterCollectionBuilder<SbDivider>>? configure = null)
|
||||
{
|
||||
return Render<SbDivider>(p => configure?.Invoke(p));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersAsHrWhenNoContent()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider();
|
||||
|
||||
// Assert
|
||||
var hr = cut.Find("hr.sb-divider");
|
||||
Assert.NotNull(hr);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersAsDivWithContentWhenChildContentProvided()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p.Add(x => x.ChildContent, (RenderFragment)(b => b.AddMarkupContent(0, "OR"))));
|
||||
|
||||
// Assert
|
||||
Assert.Empty(cut.FindAll("hr"));
|
||||
var div = cut.Find("div.sb-divider");
|
||||
Assert.NotNull(div);
|
||||
Assert.Contains("OR", cut.Markup);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HasSeparatorRole()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider();
|
||||
|
||||
// Assert
|
||||
var hr = cut.Find("hr.sb-divider");
|
||||
Assert.Equal("separator", hr.GetAttribute("role"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HasWithLabelRoleWhenContentProvided()
|
||||
{
|
||||
var cut = RenderDivider(p => p.Add(x => x.ChildContent, (RenderFragment)(b => b.AddMarkupContent(0, "Label"))));
|
||||
var div = cut.Find("div.sb-divider");
|
||||
Assert.Equal("separator", div.GetAttribute("role"));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(SbOrientation.Horizontal, "horizontal")]
|
||||
[InlineData(SbOrientation.Vertical, "vertical")]
|
||||
public void AppliesOrientationClass(SbOrientation orientation, string expectedClass)
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p.Add(x => x.Orientation, orientation));
|
||||
|
||||
// Assert
|
||||
var element = cut.Find(".sb-divider");
|
||||
Assert.Contains($"sb-divider--{expectedClass}", element.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesWithLabelAndLabelCenterWhenContentProvided()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p.Add(x => x.ChildContent, (RenderFragment)(b => b.AddMarkupContent(0, "OR"))));
|
||||
|
||||
// Assert
|
||||
var div = cut.Find("div.sb-divider");
|
||||
Assert.Contains("sb-divider--with-label", div.ClassList);
|
||||
Assert.Contains("sb-divider--label-center", div.ClassList);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(SbAlign.Start, "start")]
|
||||
[InlineData(SbAlign.Center, "center")]
|
||||
[InlineData(SbAlign.End, "end")]
|
||||
public void AppliesLabelAlignClass(SbAlign align, string expectedClass)
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p
|
||||
.Add(x => x.ChildContent, (RenderFragment)(b => b.AddMarkupContent(0, "Label")))
|
||||
.Add(x => x.LabelAlign, align));
|
||||
|
||||
// Assert
|
||||
var div = cut.Find("div.sb-divider");
|
||||
Assert.Contains($"sb-divider--label-{expectedClass}", div.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersLabelInContentSpan()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p.Add(x => x.ChildContent, (RenderFragment)(b => b.AddMarkupContent(0, "Custom Label"))));
|
||||
|
||||
// Assert
|
||||
var content = cut.Find(".sb-divider__content");
|
||||
Assert.NotNull(content);
|
||||
Assert.Equal("Custom Label", content.TextContent.Trim());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesClassParameter()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p.Add(x => x.Class, "my-divider"));
|
||||
|
||||
// Assert
|
||||
var element = cut.Find(".sb-divider");
|
||||
Assert.Contains("my-divider", element.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesStyleParameter()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p.Add(x => x.Style, "margin: 16px"));
|
||||
|
||||
// Assert
|
||||
var element = cut.Find(".sb-divider");
|
||||
Assert.Contains("margin: 16px", element.GetAttribute("style") ?? "");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PassesAdditionalAttributes()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderDivider(p => p
|
||||
.Add(x => x.AdditionalAttributes, new Dictionary<string, object> { ["data-test"] = "divider" }));
|
||||
|
||||
// Assert
|
||||
var element = cut.Find(".sb-divider");
|
||||
Assert.Equal("divider", element.GetAttribute("data-test"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Bunit;
|
||||
using SufiChain.SufiBlazor.Components.Surfaces;
|
||||
using Xunit;
|
||||
|
||||
namespace SufiChain.SufiBlazor.Tests.Components.Surfaces;
|
||||
|
||||
public class SbSurfaceTests : BunitContext
|
||||
{
|
||||
private IRenderedComponent<SbSurface> RenderSurface(
|
||||
Action<ComponentParameterCollectionBuilder<SbSurface>>? configure = null)
|
||||
{
|
||||
return Render<SbSurface>(p =>
|
||||
{
|
||||
p.Add(x => x.ChildContent, (RenderFragment)(b => b.AddMarkupContent(0, "<span>Surface content</span>")));
|
||||
configure?.Invoke(p);
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersSurfaceStructure()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface();
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
Assert.NotNull(surface);
|
||||
Assert.Equal("div", surface.TagName.ToLowerInvariant());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RendersChildContent()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface();
|
||||
|
||||
// Assert
|
||||
Assert.Contains("Surface content", cut.Markup);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesElevationClass()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p.Add(x => x.Elevation, 2));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
Assert.Contains("sb-surface--elevation-2", surface.ClassList);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0, "0")]
|
||||
[InlineData(1, "1")]
|
||||
[InlineData(3, "3")]
|
||||
[InlineData(5, "5")]
|
||||
public void AppliesCorrectElevationClass(int elevation, string expectedSuffix)
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p.Add(x => x.Elevation, elevation));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
Assert.Contains($"sb-surface--elevation-{expectedSuffix}", surface.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesClassParameter()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p.Add(x => x.Class, "my-surface"));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
Assert.Contains("my-surface", surface.ClassList);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesBackgroundStyle()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p.Add(x => x.Background, "#f0f0f0"));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
var style = surface.GetAttribute("style") ?? "";
|
||||
Assert.Contains("background-color: #f0f0f0", style);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesBorderRadiusStyle()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p.Add(x => x.BorderRadius, "8px"));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
var style = surface.GetAttribute("style") ?? "";
|
||||
Assert.Contains("border-radius: 8px", style);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesPaddingStyle()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p.Add(x => x.Padding, "16px"));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
var style = surface.GetAttribute("style") ?? "";
|
||||
Assert.Contains("padding: 16px", style);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesBorderWhenOutlined()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p.Add(x => x.Outlined, true));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
var style = surface.GetAttribute("style") ?? "";
|
||||
Assert.Contains("border: 1px solid var(--sb-color-border)", style);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CombinesMultipleStyles()
|
||||
{
|
||||
// Arrange & Act
|
||||
var cut = RenderSurface(p => p
|
||||
.Add(x => x.Background, "var(--sb-color-primary)")
|
||||
.Add(x => x.Padding, "24px")
|
||||
.Add(x => x.Outlined, true));
|
||||
|
||||
// Assert
|
||||
var surface = cut.Find(".sb-surface");
|
||||
var style = surface.GetAttribute("style") ?? "";
|
||||
Assert.Contains("background-color: var(--sb-color-primary)", style);
|
||||
Assert.Contains("padding: 24px", style);
|
||||
Assert.Contains("border: 1px solid var(--sb-color-border)", style);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user