using e_suite.API.Common.exceptions; using e_suite.Database.Core.Tables.Mail; using e_suite.Database.Core.Tables.UserManager; using eSuite.Core.MailService; using Moq; using NUnit.Framework; using System.Net; using System.Net.Mail; using System.Threading; using e_suite.Service.Mail.Facade; namespace e_suite.Service.Mail.UnitTests.MailService; [TestFixture] public class RequestEMailAsyncUnitTests : MailServiceTestBase { [SetUp] public override async Task Setup() { await base.Setup(); } [Test] public async Task RequestEMailAsync_WhenNoDestination_DoesNotSendAnyMails() { //Arrange var mailRequest = new MailRequest(); //Act await mailService.RequestEMailAsync(mailRequest, CancellationToken.None); //Assert MailClientFactoryMock.Verify( x => x.CreateSmtpClient( It.IsAny(), It.IsAny()), Times.Never); } [Test] public void RequestEMailAsync_EmailDestinationNotFound_ThrowsExpectedNotFoundException() { //Arrange var mailRequest = new MailRequest(); var user = new User { Email = "test@test.test", FirstName = "Testy", LastName = "McTester" }; mailRequest.To.Add(user); mailRequest.EmailType = MailType.ConfirmEmailAddress; mailRequest.Parameters.Add("url", "http://test.com/emailsstuff/testing"); //Assert var result = Assert.ThrowsAsync(async () => { //Act await mailService.RequestEMailAsync(mailRequest, CancellationToken.None); }); Assert.That(result!.Message, Is.EqualTo($"Unable to find user for e-mail {user.Email}")); } [Test] public void RequestEMailAsync_EmailDestinationFound_AttemptsToPrepareMessageBody() { //Arrange var mailRequest = new MailRequest(); var user = new User { Email = "test@test.test", FirstName = "Testy", LastName = "McTester", DomainId = 1 }; mailRequest.To.Add(user); mailRequest.EmailType = MailType.ConfirmEmailAddress; mailRequest.Parameters.Add("url", "http://test.com/emailsstuff/testing"); UserManagerRepositoryMock.Setup(x => x.GetUserByEmail(user.Email, It.IsAny())).ReturnsAsync(user); //Assert var result = Assert.ThrowsAsync(async () => { //Act await mailService.RequestEMailAsync(mailRequest, CancellationToken.None); }); MailServiceRepositoryMock.Verify( x => x.GetMailTemplate(It.IsAny(), It.IsAny(), It.IsAny()), Times.AtLeastOnce); } [Test] public async Task RequestEMailAsync_CanCreateEmail_SendsEmailSuccessfully() { //Arrange var mailRequest = new MailRequest(); var user = new User { Email = "test@test.test", FirstName = "Testy", LastName = "McTester", DomainId = 1 }; mailRequest.To.Add(user); mailRequest.EmailType = MailType.ConfirmEmailAddress; mailRequest.Parameters.Add("url", "http://test.com/emailsstuff/testing"); UserManagerRepositoryMock.Setup(x => x.GetUserByEmail(user.Email, It.IsAny())).ReturnsAsync(user); var mailTemplate = new MailTemplate(); MailServiceRepositoryMock.Setup(x => x.GetMailTemplate(It.IsAny(), mailRequest.EmailType, It.IsAny())).ReturnsAsync(mailTemplate); var smtpClientMock = new Mock(); MailClientFactoryMock.Setup(x => x.CreateSmtpClient(It.IsAny(), It.IsAny())).Returns(smtpClientMock.Object); //Act await mailService.RequestEMailAsync(mailRequest, CancellationToken.None); //Assert smtpClientMock.Verify( x=> x.SendMailAsync(It.IsAny(), It.IsAny()), Times.Once); } [Test] public void RequestEMailAsync_WhenEmailClientFailsToSend_ThrowsExceptionFromMailClient() { //Arrange var mailRequest = new MailRequest(); var user = new User { Email = "test@test.test", FirstName = "Testy", LastName = "McTester", DomainId = 1 }; mailRequest.To.Add(user); mailRequest.EmailType = MailType.ConfirmEmailAddress; mailRequest.Parameters.Add("url", "http://test.com/emailsstuff/testing"); UserManagerRepositoryMock.Setup(x => x.GetUserByEmail(user.Email, It.IsAny())).ReturnsAsync(user); var mailTemplate = new MailTemplate(); MailServiceRepositoryMock.Setup(x => x.GetMailTemplate(It.IsAny(), mailRequest.EmailType, It.IsAny())).ReturnsAsync(mailTemplate); var smtpClientMock = new Mock(); MailClientFactoryMock.Setup(x => x.CreateSmtpClient(It.IsAny(), It.IsAny())).Returns(smtpClientMock.Object); smtpClientMock.Setup(x => x.SendMailAsync(It.IsAny(), It.IsAny())) .Throws(new Exception("Test error")); //Assert var result = Assert.ThrowsAsync(async () => { //Act await mailService.RequestEMailAsync(mailRequest, CancellationToken.None); }); Assert.That(result!.Message, Is.EqualTo("Test error")); } }