using Diligent.WebAPI.Business.Services; using Diligent.WebAPI.Business.Services.Interfaces; using Diligent.WebAPI.Business.Settings; using Diligent.WebAPI.Contracts.Exceptions; using Diligent.WebAPI.Contracts.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NSubstitute.ExceptionExtensions; using System.Net.Mail; namespace Diligent.WebAPI.Tests.Services { public class EmailerTests { private readonly IOptions _settings; private readonly ILogger _logger = Substitute.For>(); private readonly DiligEmail _email; private readonly MailMessage _message; private readonly List _emailAddresses; private readonly List _emailAddressesCC; private readonly MailSettings _mailSettings; public EmailerTests() { _emailAddresses = new List { "dzenis@dilig.net", "meris@dilig.net" }; _emailAddressesCC = new List { "ermin@dilig.net", "safet@dilig.net" }; _email = new DiligEmail { To = "dzenis@dilig.net;meris@dilig.net", Subject = "Forget password", Body = "Forget password", }; _message = new MailMessage { Subject = "Forget password", Body = "Forget password", IsBodyHtml = false, Sender = new MailAddress("htcenter@dilig.net", "hrcenter"), From = new MailAddress("htcenter@dilig.net") }; _message.To.Add(string.Join(",", _emailAddresses)); _message.CC.Add(string.Join(",", _emailAddressesCC)); _mailSettings = new MailSettings { SmtpFrom = "htcenter@dilig.net", SmtpFromName = "hrcenter", SmtpServer = "gmail", SmtpPassword = "Password123?", SmtpPort = 5000, SmtpUsername = "hrcenter", SmtpUseSSL = true }; _settings = Options.Create(_mailSettings); } [Fact] public void CreateEmail_ShouldReturnDiligEmail_WhenArgumentsAreSent() { Emailer emailer = new Emailer(_settings, _logger); var result = emailer.CreateEmail(new List() { "dzenis@dilig.net","meris@dilig.net"}, "Forget password","Forget password"); result.Should().Be(_email); } [Fact] public void CreateEmail_ShouldThrowArgumentException_WhenListOfReceiveresIsEmpty() { Emailer emailer = new Emailer(_settings, _logger); Assert.Throws( () => emailer.CreateEmail(new List(), "Forget password", "Forget password")); } [Fact] public void GetMailMessage_ShouldReturnMailMessage_WhenArgumentsAreSent() { Emailer emailer = new Emailer(_settings, _logger); var result = emailer.GetMailMessage(_emailAddresses, "Forget password","Forget password",false,_emailAddressesCC); result.Subject.Should().Be(_message.Subject); result.Body.Should().Be(_message.Body); result.IsBodyHtml.Should().Be(_message.IsBodyHtml); result.Sender.Should().Be(_message.Sender); result.From.Should().Be(_message.From); result.To.Should().HaveCount(_message.To.Count()); result.CC.Should().HaveCount(_message.CC.Count()); } [Fact] public void GetMailMessage_ShouldThrowArgumentException_WhenListOfReceiveresIsEmpty() { Emailer emailer = new Emailer(_settings, _logger); Assert.Throws(() => emailer.GetMailMessage(new List(), "Forget password", "Forget password")); } [Fact] public void GetSmtpClient_ShouldReturnGetSmtpClient_WhenSettingsArePresent() { Emailer emailer = new Emailer(_settings, _logger); var result = emailer.GetSmtpClient(); result.EnableSsl.Should().Be(_mailSettings.SmtpUseSSL); result.Port.Should().Be(_mailSettings.SmtpPort); result.Host.Should().Be(_mailSettings.SmtpServer); } [Fact] public void SendEmailAsync_ShouldThrowArgumentException_WhenListOfReceiveresIsEmpty() { Emailer emailer = new Emailer(_settings, _logger); Assert.ThrowsAsync(async () => await emailer.SendEmailAsync(new List(), "Forget password", "Forget password")); } //[Fact] //public async Task SendEmailAndWriteToDbAsync_ShouldReturnDiligEmail_WhenArgumentsAreSent() //{ // Emailer emailer = new Emailer(_settings, _logger); // emailer.When(x => x.SendEmailAsync(Arg.Any>(),Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any>())).ReturnsForAll(true); // var result = emailer.SendEmailAndWriteToDbAsync(new List() { "dzenis@dilig.net", "meris@dilig.net" }, // "Forget password", "Forget password"); // result.Should().Be(_email); //} } }