using System.Net; using System.Net.Http.Json; using HrynCo.NotificationService.DAL.Abstract.Repositories; using HrynCo.NotificationService.DAL.Abstract.Templates; using Microsoft.Extensions.DependencyInjection; namespace HrynCo.NotificationService.Web.IntegrationTests; public sealed class TemplateKeyFilterTests(TemplateDatabaseFixture fixture) : IClassFixture { [Theory] [InlineData("contact", true, false)] [InlineData(" CONTACT ", true, false)] [InlineData("", true, true)] [InlineData(" ", true, true)] [InlineData("missing", false, false)] [InlineData("%", false, false)] public async Task AdminFilterMatchesLiteralSubstringAcrossBothChannels(string filter, bool contacts, bool other) { await using var c = await DefinitionApiTestContext.CreateAsync(fixture); await c.UpsertAsync(DefinitionApiTestContext.Body(null, "en"), "TrustedContactAdded"); await c.UpsertAsync(DefinitionApiTestContext.Body(null, "en"), "PasswordReset"); using var scope = c.App.Services.CreateScope(); var pushes = scope.ServiceProvider.GetRequiredService(); await pushes.SaveAsync(new PushTemplateDefinition { ServiceId = c.ServiceId, Key = "TrustedContactRemoved" }, true); var html = await c.Client.GetStringAsync($"/admin/services/{c.ServiceId}?key={Uri.EscapeDataString(filter)}"); Assert.Equal(contacts, html.Contains(">TrustedContactAdded<", StringComparison.Ordinal)); Assert.Equal(contacts, html.Contains(">TrustedContactRemoved<", StringComparison.Ordinal)); Assert.Equal(other, html.Contains(">PasswordReset<", StringComparison.Ordinal)); Assert.Contains("Clear", html); Assert.Equal(HttpStatusCode.NotFound, (await c.Client.GetAsync(c.DefinitionUrl("contact"))).StatusCode); } }