diff --git a/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj b/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj index 6848542..73d33dc 100644 --- a/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj +++ b/MessagingService.BusinessLogic.Tests/MessagingService.BusinessLogic.Tests.csproj @@ -2,7 +2,7 @@ net8.0 - None + Full false diff --git a/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs b/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs index eb5a999..7187ec3 100644 --- a/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs +++ b/MessagingService.BusinessLogic.Tests/Services/MessagingDomainServiceTests.cs @@ -57,6 +57,41 @@ public async Task MessagingDomainService_SendEmailMessage_MessageSent() result.Data.ShouldBe(TestData.MessageId); } + [Fact] + public async Task MessagingDomainService_SendEmailMessage_SecondSend_MessageNotSent() + { + Mock> emailAggregateRepository = new Mock>(); + emailAggregateRepository.Setup(a => a.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.GetSentEmailAggregate()); + emailAggregateRepository.Setup(a => a.SaveChanges(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); + Mock> smsAggregateRepository = new Mock>(); + Mock emailServiceProxy = new Mock(); + emailServiceProxy + .Setup(e => e.SendEmail(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())).ReturnsAsync(TestData.SuccessfulEmailServiceProxyResponse); + Mock smsServiceProxy = new Mock(); + + MessagingDomainService messagingDomainService = + new MessagingDomainService(emailAggregateRepository.Object, smsAggregateRepository.Object, emailServiceProxy.Object, smsServiceProxy.Object); + + var result = await messagingDomainService.SendEmailMessage(TestData.ConnectionIdentifier, + TestData.MessageId, + TestData.FromAddress, + TestData.ToAddresses, + TestData.Subject, + TestData.Body, + TestData.IsHtmlTrue, + TestData.EmailAttachmentModels, + CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + result.Data.ShouldBe(TestData.MessageId); + } + [Fact] public async Task MessagingDomainService_SendEmailMessage_SaveFailed_MessageSent() { Mock> emailAggregateRepository = new Mock>(); @@ -260,6 +295,35 @@ public async Task MessagingDomainService_SendSMSMessage_MessageSent() } + [Fact] + public async Task MessagingDomainService_SendSMSMessage_SecondTime_MessageNotSent() + { + Mock> emailAggregateRepository = new Mock>(); + Mock> smsAggregateRepository = new Mock>(); + smsAggregateRepository.Setup(a => a.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.GetSentSMSAggregate()); + smsAggregateRepository.Setup(a => a.SaveChanges(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success()); + Mock emailServiceProxy = new Mock(); + Mock smsServiceProxy = new Mock(); + smsServiceProxy + .Setup(e => e.SendSMS(It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())).ReturnsAsync(TestData.SuccessfulSMSServiceProxyResponse); + MessagingDomainService messagingDomainService = + new MessagingDomainService(emailAggregateRepository.Object, smsAggregateRepository.Object, emailServiceProxy.Object, smsServiceProxy.Object); + + var result = await messagingDomainService.SendSMSMessage(TestData.ConnectionIdentifier, + TestData.MessageId, + TestData.Sender, + TestData.Destination, + TestData.Message, + CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + result.Data.ShouldBe(TestData.MessageId); + + } + [Fact] public async Task MessagingDomainService_SendSMSMessage_SaveFailed_MessageSent() { diff --git a/MessagingService.BusinessLogic/Services/MessagingDomainService.cs b/MessagingService.BusinessLogic/Services/MessagingDomainService.cs index 2b56b8c..14b851f 100644 --- a/MessagingService.BusinessLogic/Services/MessagingDomainService.cs +++ b/MessagingService.BusinessLogic/Services/MessagingDomainService.cs @@ -120,8 +120,13 @@ public async Task> SendEmailMessage(Guid connectionIdentifier, List attachments, CancellationToken cancellationToken) { Result result = await ApplyEmailUpdates(async (EmailAggregate emailAggregate) => { + // Check if this message has been sent before + if (emailAggregate.GetMessageStatus() != EmailMessageAggregate.MessageStatus.NotSet) { + return Result.Success(); + } + // send message to provider (record event) - emailAggregate.SendRequestToProvider(fromAddress, toAddresses, subject, body, isHtml, attachments); + emailAggregate.SendRequestToProvider(fromAddress, toAddresses, subject, body, isHtml, attachments); // Make call to Email provider here EmailServiceProxyResponse emailResponse = await this.EmailServiceProxy.SendEmail(messageId, fromAddress, @@ -152,6 +157,12 @@ public async Task> SendSMSMessage(Guid connectionIdentifier, CancellationToken cancellationToken) { Result result = await ApplySMSUpdates(async (SMSAggregate smsAggregate) => { + // Check if this message has been sent before + if (smsAggregate.GetMessageStatus() != SMSMessageAggregate.MessageStatus.NotSet) + { + return Result.Success(); + } + // send message to provider (record event) smsAggregate.SendRequestToProvider(sender, destination, message); diff --git a/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs b/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs index dcfb34a..9e9cfd6 100644 --- a/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs +++ b/MessagingService.EmailAggregate.Tests/EmailAggregateTests.cs @@ -44,21 +44,6 @@ public void EmailAggregate_SendRequestToProvider_RequestSent() { } } - [Fact] - public void EmailAggregate_SendRequestToProvider_RequestAlreadySent_NoErrorThrown() { - EmailAggregate emailAggregate = EmailAggregate.Create(TestData.MessageId); - - emailAggregate.SendRequestToProvider(TestData.FromAddress, TestData.ToAddresses, TestData.Subject, TestData.Body, TestData.IsHtmlTrue, TestData.EmailAttachmentModels); - - Should.NotThrow(() => { - emailAggregate.SendRequestToProvider(TestData.FromAddress, - TestData.ToAddresses, - TestData.Subject, - TestData.Body, - TestData.IsHtmlTrue, TestData.EmailAttachmentModels); - }); - } - [Fact] public void EmailAggregate_ReceiveResponseFromProvider_ResponseReceived() { EmailAggregate emailAggregate = EmailAggregate.Create(TestData.MessageId); diff --git a/MessagingService.EmailMessageAggregate/EmailAggregate.cs b/MessagingService.EmailMessageAggregate/EmailAggregate.cs index 2abf450..74eba7f 100644 --- a/MessagingService.EmailMessageAggregate/EmailAggregate.cs +++ b/MessagingService.EmailMessageAggregate/EmailAggregate.cs @@ -79,6 +79,11 @@ public static void ReceiveBadResponseFromProvider(this EmailAggregate aggregate, aggregate.ApplyAndAppend(badResponseReceivedFromProviderEvent); } + public static MessageStatus GetMessageStatus(this EmailAggregate aggregate) + { + return aggregate.DeliveryStatusList[aggregate.ResendCount]; + } + public static void SendRequestToProvider(this EmailAggregate aggregate, String fromAddress, List toAddresses, String subject, @@ -86,10 +91,6 @@ public static void SendRequestToProvider(this EmailAggregate aggregate, String f Boolean isHtml, List attachments) { - if (aggregate.DeliveryStatusList[aggregate.ResendCount] != MessageStatus.NotSet) { - return; - } - RequestSentToEmailProviderEvent requestSentToProviderEvent = new RequestSentToEmailProviderEvent(aggregate.AggregateId, fromAddress, toAddresses, subject, body, isHtml); aggregate.ApplyAndAppend(requestSentToProviderEvent); diff --git a/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs b/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs index dbb4984..af5b6c0 100644 --- a/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs +++ b/MessagingService.SMSAggregate.Tests/SMSAggregateTests.cs @@ -34,19 +34,6 @@ public void SMSAggregate_SendRequestToProvider_RequestSent() smsAggregate.GetDeliveryStatus().ShouldBe(MessageStatus.InProgress); } - [Fact] - public void SMSAggregate_SendRequestToProvider_RequestAlreadySent_NoErrorThrown() - { - SMSAggregate smsAggregate = SMSAggregate.Create(TestData.MessageId); - - smsAggregate.SendRequestToProvider(TestData.Sender, TestData.Destination, TestData.Message); - - Should.NotThrow(() => - { - smsAggregate.SendRequestToProvider(TestData.Sender, TestData.Destination, TestData.Message); - }); - } - [Fact] public void SMSAggregate_ReceiveResponseFromProvider_ResponseReceived() { diff --git a/MessagingService.SMSMessageAggregate/SMSAggregate.cs b/MessagingService.SMSMessageAggregate/SMSAggregate.cs index 4c580ab..f23c715 100644 --- a/MessagingService.SMSMessageAggregate/SMSAggregate.cs +++ b/MessagingService.SMSMessageAggregate/SMSAggregate.cs @@ -113,9 +113,7 @@ public static void SendRequestToProvider(this SMSAggregate aggregate, String sender, String destination, String message){ - if (aggregate.DeliveryStatusList[aggregate.ResendCount] != MessageStatus.NotSet){ - return; - } + RequestSentToSMSProviderEvent requestSentToProviderEvent = new RequestSentToSMSProviderEvent(aggregate.AggregateId, sender, destination, message); @@ -146,6 +144,10 @@ private static void CheckMessageCanBeSetToUndeliverable(this SMSAggregate aggreg } } + public static MessageStatus GetMessageStatus(this SMSAggregate aggregate) { + return aggregate.DeliveryStatusList[aggregate.ResendCount]; + } + #endregion }