61 lines
1.9 KiB
C#
61 lines
1.9 KiB
C#
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<IConfiguration>();
|
|
private readonly ISmtpClient _smtpClient = Substitute.For<ISmtpClient>();
|
|
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", "<p>Hello</p>");
|
|
|
|
_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<MimeMessage>());
|
|
_smtpClient.Received(1).Disconnect(true);
|
|
}
|
|
|
|
[Fact]
|
|
public void SendEmailAsync_ShouldSendMessageWithCorrectDetails()
|
|
{
|
|
var request = new EmailRequest("recipient@example.com", "Welcome!", "<h1>Hi</h1>");
|
|
|
|
_sut.SendEmailAsync(request);
|
|
|
|
_smtpClient.Received(1).Send(Arg.Is<MimeMessage>(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();
|
|
}
|
|
}
|