using Application.Models; using Application.Services; using MailKit.Net.Smtp; using Microsoft.Extensions.Configuration; using MimeKit; using NSubstitute; namespace Application.UnitTest.Services; public class EmailServiceTests { private readonly IConfiguration _configuration = Substitute.For(); private readonly ISmtpClient _smtpClient = Substitute.For(); private readonly EmailService _sut; public EmailServiceTests() { _configuration["EmailSettings:From"].Returns("sender@gmail.com"); _configuration["EmailSettings:SmtpServer"].Returns("smtp.gmail.com"); _configuration["EmailSettings:Password"].Returns("app-password"); _sut = new EmailService(_configuration, () => _smtpClient); } [Fact] public void SendEmailAsync_ShouldConnectAndAuthenticate() { var request = new EmailRequest("recipient@example.com", "Test Subject", "

Hello

"); _sut.SendEmailAsync(request); _smtpClient.Received(1).Connect("smtp.gmail.com", 465, true); _smtpClient.Received(1).Authenticate("sender@gmail.com", "app-password"); _smtpClient.Received(1).Send(Arg.Any()); _smtpClient.Received(1).Disconnect(true); } [Fact] public void SendEmailAsync_ShouldSendMessageWithCorrectDetails() { var request = new EmailRequest("recipient@example.com", "Welcome!", "

Hi

"); _sut.SendEmailAsync(request); _smtpClient.Received(1).Send(Arg.Is(msg => msg.To.Mailboxes.Any(m => m.Address == "recipient@example.com") && msg.Subject == "Welcome!")); } [Fact] public void SendEmailAsync_ShouldDisposeClient_AfterSending() { var request = new EmailRequest("recipient@example.com", "Subject", "Body"); _sut.SendEmailAsync(request); _smtpClient.Received(1).Disconnect(true); _smtpClient.Received(1).Dispose(); } }