using System.Security.Claims; using Bunit; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.DependencyInjection; using ZB.MOM.WW.ScadaBridge.CentralUI.Components.Pages; namespace ZB.MOM.WW.ScadaBridge.CentralUI.Tests; /// /// bUnit rendering tests for CentralUI Blazor components. /// Verifies that pages render their expected markup structure. /// public class ComponentRenderingTests : BunitContext { [Fact] public void LoginPage_RendersForm_WithUsernameAndPasswordFields() { var cut = Render(); // Verify the form action var form = cut.Find("form"); Assert.Equal("/auth/login", form.GetAttribute("action")); // Verify username field var usernameInput = cut.Find("input#username"); Assert.Equal("text", usernameInput.GetAttribute("type")); Assert.Equal("username", usernameInput.GetAttribute("name")); // Verify password field var passwordInput = cut.Find("input#password"); Assert.Equal("password", passwordInput.GetAttribute("type")); Assert.Equal("password", passwordInput.GetAttribute("name")); // Verify submit button var submitButton = cut.Find("button[type='submit']"); Assert.Contains("Sign in", submitButton.TextContent); } [Fact] public void LoginPage_WithoutError_DoesNotRenderAlert() { var cut = Render(); Assert.Throws(() => cut.Find("div.panel.notice.login-error")); } [Fact] public void Dashboard_RequiresAuthorizeAttribute() { var authorizeAttrs = typeof(Dashboard) .GetCustomAttributes(typeof(AuthorizeAttribute), true); Assert.NotEmpty(authorizeAttrs); } [Fact] public void TemplateEditor_RequiresDesignPolicy() { var authorizeAttrs = typeof(ZB.MOM.WW.ScadaBridge.CentralUI.Components.Pages.Design.Templates) .GetCustomAttributes(typeof(AuthorizeAttribute), true); Assert.NotEmpty(authorizeAttrs); var attr = (AuthorizeAttribute)authorizeAttrs[0]; Assert.Equal("RequireDesign", attr.Policy); } [Fact] public void LoginPage_RendersScadaBridgeTitle() { var cut = Render(); var title = cut.Find("h1.login-title"); Assert.Contains("ScadaBridge", title.TextContent); } }