namespace HrynCo.NotificationService.Services.Tests; using HrynCo.NotificationService.DAL.Abstract.Providers; using HrynCo.NotificationService.DAL.Abstract.Repositories; using HrynCo.NotificationService.DAL.Abstract.Templates; using HrynCo.NotificationService.Migrator; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; public sealed class DevelopmentDataSeederTests { private readonly IEmailChannelRepository _channels = Substitute.For(); private readonly IEmailTemplateRepository _templates = Substitute.For(); [Fact] public async Task SeedAsync_WhenConfigurationIsMissing_CreatesMailpitChannelAndTestTemplate() { _channels.GetByServiceAsync("TestService", Arg.Any()) .Returns(Array.Empty()); _templates.GetAsync("TestService", "TestEmail", "en", Arg.Any()) .Returns((EmailTemplate?)null); DevelopmentDataSeeder seeder = CreateSeeder(); await seeder.SeedAsync("TestService", CancellationToken.None); await _channels.Received(1).AddAsync( Arg.Is(channel => IsMailpitChannel(channel)), Arg.Any()); await _templates.Received(1).AddAsync( Arg.Is(template => template.ServiceName == "TestService" && template.Key == "TestEmail" && template.Variables.Any(variable => variable.Name == "Message" && variable.Required)), Arg.Any()); } [Fact] public async Task SeedAsync_WhenConfigurationExists_DoesNotDuplicateOrOverwriteIt() { _channels.GetByServiceAsync("TestService", Arg.Any()) .Returns([new EmailChannel { ServiceName = "TestService", EmailChannelType = EmailChannelType.Smtp, Settings = new SmtpChannelSettings() }]); _templates.GetAsync("TestService", "TestEmail", "en", Arg.Any()) .Returns(new EmailTemplate { ServiceName = "TestService", Key = "TestEmail", LanguageCode = "en", Subject = "Existing", HtmlBody = "Existing", TextBody = "Existing" }); DevelopmentDataSeeder seeder = CreateSeeder(); await seeder.SeedAsync("TestService", CancellationToken.None); await _channels.DidNotReceive().AddAsync(Arg.Any(), Arg.Any()); await _templates.DidNotReceive().AddAsync(Arg.Any(), Arg.Any()); await _channels.DidNotReceive().UpdateAsync(Arg.Any(), Arg.Any()); await _templates.DidNotReceive().UpdateAsync(Arg.Any(), Arg.Any()); } private DevelopmentDataSeeder CreateSeeder() => new( _channels, _templates, NullLogger.Instance); private static bool IsMailpitChannel(EmailChannel channel) { return channel.ServiceName == "TestService" && channel.IsActive && channel.Settings is SmtpChannelSettings smtp && smtp.Host == "mailpit" && smtp.Port == 1025 && !smtp.UseSsl; } }