using System.Security.Claims; using Bunit; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.DependencyInjection; using NSubstitute; using ScadaLink.Commons.Entities.Notifications; using ScadaLink.Commons.Interfaces.Repositories; using SmtpConfigurationPage = ScadaLink.CentralUI.Components.Pages.Notifications.SmtpConfiguration; namespace ScadaLink.CentralUI.Tests.Pages; /// /// bUnit rendering tests for the SMTP Configuration page — specifically the TlsMode /// field added so the UI exposes all five user-relevant SmtpConfiguration fields. /// public class SmtpConfigurationPageTests : BunitContext { private void WireAuth() { var claims = new[] { new Claim("Username", "tester"), new Claim(ClaimTypes.Role, "Admin"), }; var user = new ClaimsPrincipal(new ClaimsIdentity(claims, "TestAuth")); Services.AddSingleton(new TestAuthStateProvider(user)); Services.AddAuthorizationCore(); } private static SmtpConfiguration Sample() => new("smtp.example.com", "Basic", "noreply@example.com") { Id = 1, Port = 587, TlsMode = "StartTLS", Credentials = "user:pass", }; [Fact] public void EditForm_RendersTlsModeSelectWithAllThreeModes() { var repo = Substitute.For(); repo.GetAllSmtpConfigurationsAsync() .Returns(Task.FromResult>( new List { Sample() })); Services.AddSingleton(repo); WireAuth(); var cut = Render(); cut.WaitForState(() => cut.Markup.Contains("smtp.example.com")); cut.FindAll("button").First(b => b.TextContent.Contains("Edit")).Click(); cut.WaitForAssertion(() => { var selects = cut.FindAll("select"); var tlsSelect = selects.Single(s => s.QuerySelectorAll("option") .Any(o => o.TextContent == "StartTLS")); var modes = tlsSelect.QuerySelectorAll("option").Select(o => o.TextContent).ToList(); Assert.Equal(new[] { "None", "StartTLS", "SSL" }, modes); }); } [Fact] public void ReadOnlyView_ShowsTlsMode() { var repo = Substitute.For(); repo.GetAllSmtpConfigurationsAsync() .Returns(Task.FromResult>( new List { Sample() })); Services.AddSingleton(repo); WireAuth(); var cut = Render(); cut.WaitForAssertion(() => { Assert.Contains("TLS Mode", cut.Markup); Assert.Contains("StartTLS", cut.Markup); }); } [Fact] public void SavingEdit_PersistsChosenTlsMode() { var config = Sample(); var repo = Substitute.For(); repo.GetAllSmtpConfigurationsAsync() .Returns(Task.FromResult>( new List { config })); Services.AddSingleton(repo); WireAuth(); var cut = Render(); cut.WaitForState(() => cut.Markup.Contains("smtp.example.com")); cut.FindAll("button").First(b => b.TextContent.Contains("Edit")).Click(); var tlsSelect = cut.FindAll("select") .Single(s => s.QuerySelectorAll("option").Any(o => o.TextContent == "StartTLS")); tlsSelect.Change("SSL"); cut.FindAll("button").First(b => b.TextContent.Contains("Save")).Click(); cut.WaitForAssertion(() => { repo.Received().UpdateSmtpConfigurationAsync( Arg.Is(c => c.TlsMode == "SSL")); repo.Received().SaveChangesAsync(); }); } }