1
0
mirror of https://github.com/bitwarden/server.git synced 2025-02-13 01:21:29 +01:00

Add unit test coverage for AmazonSesMailDeliveryService (#783)

* Parameterize AmazonSimpleEmailServiceClient to allow testing

* Add unit test coverage for AmazonSesMailDeliveryService
This commit is contained in:
Mike Hanson 2020-06-18 06:55:46 -07:00 committed by GitHub
parent f7e5f1f15e
commit dc42be710a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 10 deletions

View File

@ -16,7 +16,7 @@ namespace Bit.Core.Services
private readonly GlobalSettings _globalSettings; private readonly GlobalSettings _globalSettings;
private readonly IWebHostEnvironment _hostingEnvironment; private readonly IWebHostEnvironment _hostingEnvironment;
private readonly ILogger<AmazonSesMailDeliveryService> _logger; private readonly ILogger<AmazonSesMailDeliveryService> _logger;
private readonly AmazonSimpleEmailServiceClient _client; private readonly IAmazonSimpleEmailService _client;
private readonly string _source; private readonly string _source;
private readonly string _senderTag; private readonly string _senderTag;
private readonly string _configSetName; private readonly string _configSetName;
@ -25,6 +25,18 @@ namespace Bit.Core.Services
GlobalSettings globalSettings, GlobalSettings globalSettings,
IWebHostEnvironment hostingEnvironment, IWebHostEnvironment hostingEnvironment,
ILogger<AmazonSesMailDeliveryService> logger) ILogger<AmazonSesMailDeliveryService> 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<AmazonSesMailDeliveryService> logger,
IAmazonSimpleEmailService amazonSimpleEmailService)
{ {
if (string.IsNullOrWhiteSpace(globalSettings.Amazon?.AccessKeyId)) if (string.IsNullOrWhiteSpace(globalSettings.Amazon?.AccessKeyId))
{ {
@ -42,8 +54,7 @@ namespace Bit.Core.Services
_globalSettings = globalSettings; _globalSettings = globalSettings;
_hostingEnvironment = hostingEnvironment; _hostingEnvironment = hostingEnvironment;
_logger = logger; _logger = logger;
_client = new AmazonSimpleEmailServiceClient(globalSettings.Amazon.AccessKeyId, _client = amazonSimpleEmailService;
globalSettings.Amazon.AccessKeySecret, RegionEndpoint.GetBySystemName(globalSettings.Amazon.Region));
_source = $"\"{globalSettings.SiteName}\" <{globalSettings.Mail.ReplyToEmail}>"; _source = $"\"{globalSettings.SiteName}\" <{globalSettings.Mail.ReplyToEmail}>";
_senderTag = $"Server_{globalSettings.ProjectName}"; _senderTag = $"Server_{globalSettings.ProjectName}";
if (!string.IsNullOrWhiteSpace(_globalSettings.Mail.AmazonConfigSetName)) if (!string.IsNullOrWhiteSpace(_globalSettings.Mail.AmazonConfigSetName))

View File

@ -1,4 +1,10 @@
using System; 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 Bit.Core.Services;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -14,16 +20,29 @@ namespace Bit.Core.Test.Services
private readonly GlobalSettings _globalSettings; private readonly GlobalSettings _globalSettings;
private readonly IWebHostEnvironment _hostingEnvironment; private readonly IWebHostEnvironment _hostingEnvironment;
private readonly ILogger<AmazonSesMailDeliveryService> _logger; private readonly ILogger<AmazonSesMailDeliveryService> _logger;
private readonly IAmazonSimpleEmailService _amazonSimpleEmailService;
public AmazonSesMailDeliveryServiceTests() public AmazonSesMailDeliveryServiceTests()
{ {
_globalSettings = new GlobalSettings(); _globalSettings = new GlobalSettings
{
Amazon =
{
AccessKeyId = "AccessKeyId-AmazonSesMailDeliveryServiceTests",
AccessKeySecret = "AccessKeySecret-AmazonSesMailDeliveryServiceTests",
Region = "Region-AmazonSesMailDeliveryServiceTests"
}
};
_hostingEnvironment = Substitute.For<IWebHostEnvironment>(); _hostingEnvironment = Substitute.For<IWebHostEnvironment>();
_logger = Substitute.For<ILogger<AmazonSesMailDeliveryService>>(); _logger = Substitute.For<ILogger<AmazonSesMailDeliveryService>>();
_amazonSimpleEmailService = Substitute.For<IAmazonSimpleEmailService>();
_sut = new AmazonSesMailDeliveryService( _sut = new AmazonSesMailDeliveryService(
_globalSettings, _globalSettings,
_hostingEnvironment, _hostingEnvironment,
_logger _logger,
_amazonSimpleEmailService
); );
} }
@ -32,12 +51,40 @@ namespace Bit.Core.Test.Services
_sut?.Dispose(); _sut?.Dispose();
} }
// Remove this test when we add actual tests. It only proves that [Fact]
// we've properly constructed the system under test. public async Task SendEmailAsync_CallsSendEmailAsync_WhenMessageIsValid()
[Fact(Skip = "Needs additional work")]
public void ServiceExists()
{ {
Assert.NotNull(_sut); var mailMessage = new MailMessage
{
ToEmails = new List<string> { "ToEmails" },
BccEmails = new List<string> { "BccEmails" },
Subject = "Subject",
HtmlContent = "HtmlContent",
TextContent = "TextContent",
Category = "Category"
};
await _sut.SendEmailAsync(mailMessage);
await _amazonSimpleEmailService.Received(1).SendEmailAsync(
Arg.Do<SendEmailRequest>(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");
}));
} }
} }
} }