From dc42be710a959fa4398bf6fd5fd10a2f06046283 Mon Sep 17 00:00:00 2001 From: Mike Hanson <8196328+themikecom@users.noreply.github.com> Date: Thu, 18 Jun 2020 06:55:46 -0700 Subject: [PATCH] Add unit test coverage for AmazonSesMailDeliveryService (#783) * Parameterize AmazonSimpleEmailServiceClient to allow testing * Add unit test coverage for AmazonSesMailDeliveryService --- .../AmazonSesMailDeliveryService.cs | 17 +++++- .../AmazonSesMailDeliveryServiceTests.cs | 61 ++++++++++++++++--- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/Core/Services/Implementations/AmazonSesMailDeliveryService.cs b/src/Core/Services/Implementations/AmazonSesMailDeliveryService.cs index 451369821a..8b88845363 100644 --- a/src/Core/Services/Implementations/AmazonSesMailDeliveryService.cs +++ b/src/Core/Services/Implementations/AmazonSesMailDeliveryService.cs @@ -16,7 +16,7 @@ namespace Bit.Core.Services private readonly GlobalSettings _globalSettings; private readonly IWebHostEnvironment _hostingEnvironment; private readonly ILogger _logger; - private readonly AmazonSimpleEmailServiceClient _client; + private readonly IAmazonSimpleEmailService _client; private readonly string _source; private readonly string _senderTag; private readonly string _configSetName; @@ -25,6 +25,18 @@ namespace Bit.Core.Services GlobalSettings globalSettings, IWebHostEnvironment hostingEnvironment, ILogger logger) + : this(globalSettings, hostingEnvironment, logger, new AmazonSimpleEmailServiceClient( + globalSettings.Amazon.AccessKeyId, + globalSettings.Amazon.AccessKeySecret, + RegionEndpoint.GetBySystemName(globalSettings.Amazon.Region))) + { + } + + public AmazonSesMailDeliveryService( + GlobalSettings globalSettings, + IWebHostEnvironment hostingEnvironment, + ILogger logger, + IAmazonSimpleEmailService amazonSimpleEmailService) { if (string.IsNullOrWhiteSpace(globalSettings.Amazon?.AccessKeyId)) { @@ -42,8 +54,7 @@ namespace Bit.Core.Services _globalSettings = globalSettings; _hostingEnvironment = hostingEnvironment; _logger = logger; - _client = new AmazonSimpleEmailServiceClient(globalSettings.Amazon.AccessKeyId, - globalSettings.Amazon.AccessKeySecret, RegionEndpoint.GetBySystemName(globalSettings.Amazon.Region)); + _client = amazonSimpleEmailService; _source = $"\"{globalSettings.SiteName}\" <{globalSettings.Mail.ReplyToEmail}>"; _senderTag = $"Server_{globalSettings.ProjectName}"; if (!string.IsNullOrWhiteSpace(_globalSettings.Mail.AmazonConfigSetName)) diff --git a/test/Core.Test/Services/AmazonSesMailDeliveryServiceTests.cs b/test/Core.Test/Services/AmazonSesMailDeliveryServiceTests.cs index b1c0a4988e..4d5913bc3f 100644 --- a/test/Core.Test/Services/AmazonSesMailDeliveryServiceTests.cs +++ b/test/Core.Test/Services/AmazonSesMailDeliveryServiceTests.cs @@ -1,4 +1,10 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Amazon.SimpleEmail; +using Amazon.SimpleEmail.Model; +using Bit.Core.Models.Mail; using Bit.Core.Services; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; @@ -14,16 +20,29 @@ namespace Bit.Core.Test.Services private readonly GlobalSettings _globalSettings; private readonly IWebHostEnvironment _hostingEnvironment; private readonly ILogger _logger; + private readonly IAmazonSimpleEmailService _amazonSimpleEmailService; public AmazonSesMailDeliveryServiceTests() { - _globalSettings = new GlobalSettings(); + _globalSettings = new GlobalSettings + { + Amazon = + { + AccessKeyId = "AccessKeyId-AmazonSesMailDeliveryServiceTests", + AccessKeySecret = "AccessKeySecret-AmazonSesMailDeliveryServiceTests", + Region = "Region-AmazonSesMailDeliveryServiceTests" + } + }; + _hostingEnvironment = Substitute.For(); _logger = Substitute.For>(); + _amazonSimpleEmailService = Substitute.For(); + _sut = new AmazonSesMailDeliveryService( _globalSettings, _hostingEnvironment, - _logger + _logger, + _amazonSimpleEmailService ); } @@ -32,12 +51,40 @@ namespace Bit.Core.Test.Services _sut?.Dispose(); } - // Remove this test when we add actual tests. It only proves that - // we've properly constructed the system under test. - [Fact(Skip = "Needs additional work")] - public void ServiceExists() + [Fact] + public async Task SendEmailAsync_CallsSendEmailAsync_WhenMessageIsValid() { - Assert.NotNull(_sut); + var mailMessage = new MailMessage + { + ToEmails = new List { "ToEmails" }, + BccEmails = new List { "BccEmails" }, + Subject = "Subject", + HtmlContent = "HtmlContent", + TextContent = "TextContent", + Category = "Category" + }; + + await _sut.SendEmailAsync(mailMessage); + + await _amazonSimpleEmailService.Received(1).SendEmailAsync( + Arg.Do(request => + { + Assert.False(string.IsNullOrEmpty(request.Source)); + + Assert.Single(request.Destination.ToAddresses); + Assert.Equal(mailMessage.ToEmails.First(), request.Destination.ToAddresses.First()); + + Assert.Equal(mailMessage.Subject, request.Message.Subject.Data); + Assert.Equal(mailMessage.HtmlContent, request.Message.Body.Html.Data); + Assert.Equal(mailMessage.TextContent, request.Message.Body.Text.Data); + + Assert.Single(request.Destination.BccAddresses); + Assert.Equal(mailMessage.BccEmails.First(), request.Destination.BccAddresses.First()); + + Assert.Contains(request.Tags, x => x.Name == "Environment"); + Assert.Contains(request.Tags, x => x.Name == "Sender"); + Assert.Contains(request.Tags, x => x.Name == "Category"); + })); } } }