first commit

This commit is contained in:
2026-05-18 15:53:59 +03:30
commit 2c100028a1
534 changed files with 94240 additions and 0 deletions
+213
View File
@@ -0,0 +1,213 @@
using Microsoft.AspNetCore.Components;
using Bunit;
using SufiChain.SufiBlazor.Components.Feedback;
using Xunit;
namespace SufiChain.SufiBlazor.Tests.Components.Feedback;
public class SbAlertTests : BunitContext
{
private IRenderedComponent<SbAlert> RenderAlert(
Action<ComponentParameterCollectionBuilder<SbAlert>>? configure = null)
{
return Render<SbAlert>(p =>
{
p.AddChildContent("<span>Alert message</span>");
configure?.Invoke(p);
});
}
[Fact]
public void RendersAlertStructure()
{
// Arrange & Act
var cut = RenderAlert();
// Assert
var alert = cut.Find(".sb-alert");
Assert.NotNull(alert);
Assert.NotNull(cut.Find(".sb-alert__icon"));
Assert.NotNull(cut.Find(".sb-alert__content"));
Assert.NotNull(cut.Find(".sb-alert__message"));
}
[Fact]
public void RendersChildContent()
{
// Arrange & Act
var cut = RenderAlert();
// Assert
Assert.Contains("Alert message", cut.Markup);
}
[Fact]
public void RendersTitleWhenProvided()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Title, "Heads up"));
// Assert
var title = cut.Find(".sb-alert__title");
Assert.NotNull(title);
Assert.Contains("Heads up", title.TextContent);
}
[Fact]
public void DoesNotRenderTitleWhenEmpty()
{
// Arrange & Act
var cut = RenderAlert();
// Assert
Assert.Empty(cut.FindAll(".sb-alert__title"));
}
[Fact]
public void AppliesInfoSeverityByDefault()
{
// Arrange & Act
var cut = RenderAlert();
// Assert
var alert = cut.Find(".sb-alert");
Assert.Contains("sb-alert--info", alert.ClassList);
Assert.Contains("", cut.Markup);
}
[Fact]
public void AppliesSuccessSeverity()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Severity, SbAlertSeverity.Success));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Contains("sb-alert--success", alert.ClassList);
Assert.Contains("✓", cut.Markup);
}
[Fact]
public void AppliesWarningSeverity()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Severity, SbAlertSeverity.Warning));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Contains("sb-alert--warning", alert.ClassList);
Assert.Contains("⚠", cut.Markup);
}
[Fact]
public void AppliesDangerSeverity()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Severity, SbAlertSeverity.Danger));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Contains("sb-alert--danger", alert.ClassList);
Assert.Contains("✕", cut.Markup);
}
[Fact]
public void HasRoleAlertWhenDanger()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Severity, SbAlertSeverity.Danger));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Equal("alert", alert.GetAttribute("role"));
}
[Fact]
public void HasRoleStatusWhenNotDanger()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Severity, SbAlertSeverity.Info));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Equal("status", alert.GetAttribute("role"));
}
[Fact]
public void RendersDismissButtonWhenDismissible()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Dismissible, true));
// Assert
var dismissBtn = cut.Find(".sb-alert__dismiss");
Assert.NotNull(dismissBtn);
Assert.Equal("button", dismissBtn.TagName.ToLowerInvariant());
Assert.Equal("Dismiss", dismissBtn.GetAttribute("aria-label"));
Assert.Contains("×", dismissBtn.TextContent);
}
[Fact]
public void DoesNotRenderDismissButtonWhenNotDismissible()
{
// Arrange & Act
var cut = RenderAlert();
// Assert
Assert.Empty(cut.FindAll(".sb-alert__dismiss"));
}
[Fact]
public async Task InvokesOnDismissWhenDismissButtonClicked()
{
// Arrange
var dismissed = false;
var cut = RenderAlert(p => p
.Add(x => x.Dismissible, true)
.Add(x => x.OnDismiss, EventCallback.Factory.Create(this, () => dismissed = true)));
var dismissBtn = cut.Find(".sb-alert__dismiss");
// Act
await cut.InvokeAsync(() => dismissBtn!.Click());
cut.WaitForState(() => dismissed);
// Assert
Assert.True(dismissed);
}
[Fact]
public void AppliesDenseClass()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Dense, true));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Contains("sb-alert--dense", alert.ClassList);
}
[Fact]
public void AppliesCustomClass()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Class, "my-alert"));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Contains("my-alert", alert.ClassList);
}
[Fact]
public void AppliesInlineStyle()
{
// Arrange & Act
var cut = RenderAlert(p => p.Add(x => x.Style, "margin-top: 10px;"));
// Assert
var alert = cut.Find(".sb-alert");
Assert.Contains("margin-top: 10px", alert.GetAttribute("style"));
}
}