using System.Text.RegularExpressions; using HrynCo.NotificationService.DAL.Abstract.Repositories; using HrynCo.NotificationService.DAL.Abstract.Templates; using Microsoft.Extensions.DependencyInjection; namespace HrynCo.NotificationService.Web.IntegrationTests; public sealed class EditorLayoutTests(TemplateDatabaseFixture fixture) : IClassFixture { [Fact] public async Task ServiceAndTemplateEditorsRenderOneBreadcrumbBeforeTheCard_IncludingValidationErrors() { var connection = await fixture.CreateDatabaseAsync(); await using var app = new TemplateWebApplicationFactory(connection); using var client = app.CreateClient(); using var scope = app.Services.CreateScope(); var service = (await scope.ServiceProvider.GetRequiredService().GetAllAsync()).Single(); var definition = new EmailTemplateDefinition { ServiceName = service.Name, Key = "Layout" }; await scope.ServiceProvider.GetRequiredService().SaveDefinitionAsync(definition, true); var root = $"/admin/services/{service.Id}"; var editors = new[] { (Url: "/admin/services/create", Title: "Create Service", Form: "serviceForm"), (Url: root + "/edit", Title: "Edit Service", Form: "serviceForm"), (Url: root + "/templates/create", Title: "Create Template", Form: "templateForm"), (Url: root + "/templates/" + definition.Id, Title: "Template: Layout", Form: "templateForm") }; foreach (var editor in editors) AssertEditorLayout(await client.GetStringAsync(editor.Url), editor.Title, editor.Form); var fields = TemplateEditorTestFields.Read(await client.GetStringAsync(root + "/templates/create")); fields["Key"] = "InvalidDraft"; fields["VariablesJson"] = "{invalid"; var errorHtml = await (await client.PostAsync(root + "/templates/save", new FormUrlEncodedContent(fields))).Content.ReadAsStringAsync(); Assert.Contains("Invalid variables JSON", errorHtml); AssertEditorLayout(errorHtml, "Create Template", "templateForm"); Assert.Contains("
", errorHtml); Assert.Contains("
Service
", errorHtml); Assert.Contains("
TestService
", errorHtml); Assert.DoesNotContain("form-control-plaintext", errorHtml); Assert.Equal(service.Name, TemplateEditorTestFields.Read(errorHtml)["ServiceName"]); } [Fact] public async Task ChannelEditorWorksWithoutTheOptionalBreadcrumbSection() { var connection = await fixture.CreateDatabaseAsync(); await using var app = new TemplateWebApplicationFactory(connection); using var client = app.CreateClient(); var html = await client.GetStringAsync("/admin/channels/create"); Assert.Contains("

", html); Assert.Contains("Create Channel", html); Assert.Contains("id=\"channelForm\"", html); Assert.DoesNotContain("aria-label=\"Breadcrumb\"", html); } private static void AssertEditorLayout(string html, string title, string form) { Assert.Single(Regex.Matches(html, "aria-label=\"Breadcrumb\"")); var breadcrumb = html.IndexOf("