Loading StockAdvisory.Tests/StockEmailSenderTests.cs +51 −15 Original line number Diff line number Diff line Loading @@ -14,33 +14,69 @@ namespace StockAdvisory.Tests; public class StockEmailSenderTests { [Test] public async Task Test_When_SubscriberEmailsAndRecordsArePassed_EmailsGetSent() private ISender _sender = A.Fake<ISender>(); private IFluentEmailFactory _factory = A.Fake<IFluentEmailFactory>(); private IStockFormatter _formatter = A.Fake<IStockFormatter>(); private StockEmailSender _stockSender; [SetUp] public void SetUp() { _factory = A.Fake<IFluentEmailFactory>(); _sender = A.Fake<ISender>(); _formatter = A.Fake<IStockFormatter>(); A.CallTo(() => _factory.Create()) .ReturnsLazily(_ => new Email(new ReplaceRenderer(), _sender)); A.CallTo(() => _formatter.Format(A<IEnumerable<StockDifferenceRecord>>._)) .Returns("Mock format"); _stockSender = new StockEmailSender(_factory, _formatter); } public void SendNoErrorsOnSend() { var sender = A.Fake<ISender>(); A.CallTo(() => sender.SendAsync(A<IFluentEmail>.Ignored, A<CancellationToken?>.Ignored)) A.CallTo(() => _sender.SendAsync(A<IFluentEmail>.Ignored, A<CancellationToken?>.Ignored)) .WithAnyArguments() .Returns(Task.FromResult(new SendResponse())); A.CallTo(() => _sender.Send(A<IFluentEmail>.Ignored, A<CancellationToken?>.Ignored)) .WithAnyArguments() .Returns(new SendResponse()); } var factory = A.Fake<IFluentEmailFactory>(); A.CallTo(() => factory.Create()) .ReturnsLazily(_ => new Email(new ReplaceRenderer(), sender)); var formatter = A.Fake<IStockFormatter>(); var records = new List<StockDifferenceRecord>() {new StockDifferenceRecord()}; A.CallTo(() => formatter.Format(records)).Returns("Mock Format"); [Test] public async Task Test_When_SubscriberEmailsAndRecordsArePassed_Then_EmailsGetSent() { SendNoErrorsOnSend(); var records = new List<StockDifferenceRecord>() {new StockDifferenceRecord()}; var clients = new List<string>() {"t@e.sting", "sample@email"}; var stockSender = new StockEmailSender(factory, formatter); await stockSender.SendReports(clients, records); await _stockSender.SendReports(clients, records); // Makes sure that two emails were sent, each separately for each address A.CallTo(() => sender.SendAsync( _sender.SendAsync( A<IFluentEmail>.That.Matches(e => e.Data.ToAddresses.Select(a => a.EmailAddress).Intersect(clients).Count() == 1), A<CancellationToken?>.Ignored)) .MustHaveHappenedTwiceExactly(); } [Test] public async Task Test_WhenNoStockDifferencesArePassed_Then_NoEmailsAreSent() { SendNoErrorsOnSend(); var clients = new List<string>() {"t@e.sting", "sample@email"}; var records = new List<StockDifferenceRecord>(); A.CallTo(() => _formatter.Format(A<IEnumerable<StockDifferenceRecord>>._)) .Returns(String.Empty); await _stockSender.SendReports(clients, records); A.CallTo(() => _sender.SendAsync(A<IFluentEmail>._, A<CancellationToken>._)) .WithAnyArguments() .MustNotHaveHappened(); } } No newline at end of file StockAdvisory/StockEmailSender.cs +5 −0 Original line number Diff line number Diff line using System.ComponentModel.DataAnnotations; using FluentEmail.Core; using FluentEmail.Core.Models; using Microsoft.VisualBasic; namespace StockAdvisory; Loading @@ -20,6 +21,10 @@ public class StockEmailSender IEnumerable<StockDifferenceRecord> records) { var formattedRecords = _formatter.Format(records); if (formattedRecords == String.Empty) { return new List<SendResponse>(); } IEnumerable<Task<SendResponse>> tasks = subscriberEmails.Select(subscriber => _emailFactory.Create() .SetFrom("noreply@stockanalysis.testing") Loading Loading
StockAdvisory.Tests/StockEmailSenderTests.cs +51 −15 Original line number Diff line number Diff line Loading @@ -14,33 +14,69 @@ namespace StockAdvisory.Tests; public class StockEmailSenderTests { [Test] public async Task Test_When_SubscriberEmailsAndRecordsArePassed_EmailsGetSent() private ISender _sender = A.Fake<ISender>(); private IFluentEmailFactory _factory = A.Fake<IFluentEmailFactory>(); private IStockFormatter _formatter = A.Fake<IStockFormatter>(); private StockEmailSender _stockSender; [SetUp] public void SetUp() { _factory = A.Fake<IFluentEmailFactory>(); _sender = A.Fake<ISender>(); _formatter = A.Fake<IStockFormatter>(); A.CallTo(() => _factory.Create()) .ReturnsLazily(_ => new Email(new ReplaceRenderer(), _sender)); A.CallTo(() => _formatter.Format(A<IEnumerable<StockDifferenceRecord>>._)) .Returns("Mock format"); _stockSender = new StockEmailSender(_factory, _formatter); } public void SendNoErrorsOnSend() { var sender = A.Fake<ISender>(); A.CallTo(() => sender.SendAsync(A<IFluentEmail>.Ignored, A<CancellationToken?>.Ignored)) A.CallTo(() => _sender.SendAsync(A<IFluentEmail>.Ignored, A<CancellationToken?>.Ignored)) .WithAnyArguments() .Returns(Task.FromResult(new SendResponse())); A.CallTo(() => _sender.Send(A<IFluentEmail>.Ignored, A<CancellationToken?>.Ignored)) .WithAnyArguments() .Returns(new SendResponse()); } var factory = A.Fake<IFluentEmailFactory>(); A.CallTo(() => factory.Create()) .ReturnsLazily(_ => new Email(new ReplaceRenderer(), sender)); var formatter = A.Fake<IStockFormatter>(); var records = new List<StockDifferenceRecord>() {new StockDifferenceRecord()}; A.CallTo(() => formatter.Format(records)).Returns("Mock Format"); [Test] public async Task Test_When_SubscriberEmailsAndRecordsArePassed_Then_EmailsGetSent() { SendNoErrorsOnSend(); var records = new List<StockDifferenceRecord>() {new StockDifferenceRecord()}; var clients = new List<string>() {"t@e.sting", "sample@email"}; var stockSender = new StockEmailSender(factory, formatter); await stockSender.SendReports(clients, records); await _stockSender.SendReports(clients, records); // Makes sure that two emails were sent, each separately for each address A.CallTo(() => sender.SendAsync( _sender.SendAsync( A<IFluentEmail>.That.Matches(e => e.Data.ToAddresses.Select(a => a.EmailAddress).Intersect(clients).Count() == 1), A<CancellationToken?>.Ignored)) .MustHaveHappenedTwiceExactly(); } [Test] public async Task Test_WhenNoStockDifferencesArePassed_Then_NoEmailsAreSent() { SendNoErrorsOnSend(); var clients = new List<string>() {"t@e.sting", "sample@email"}; var records = new List<StockDifferenceRecord>(); A.CallTo(() => _formatter.Format(A<IEnumerable<StockDifferenceRecord>>._)) .Returns(String.Empty); await _stockSender.SendReports(clients, records); A.CallTo(() => _sender.SendAsync(A<IFluentEmail>._, A<CancellationToken>._)) .WithAnyArguments() .MustNotHaveHappened(); } } No newline at end of file
StockAdvisory/StockEmailSender.cs +5 −0 Original line number Diff line number Diff line using System.ComponentModel.DataAnnotations; using FluentEmail.Core; using FluentEmail.Core.Models; using Microsoft.VisualBasic; namespace StockAdvisory; Loading @@ -20,6 +21,10 @@ public class StockEmailSender IEnumerable<StockDifferenceRecord> records) { var formattedRecords = _formatter.Format(records); if (formattedRecords == String.Empty) { return new List<SendResponse>(); } IEnumerable<Task<SendResponse>> tasks = subscriberEmails.Select(subscriber => _emailFactory.Create() .SetFrom("noreply@stockanalysis.testing") Loading