Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using BusinessLogic.Services;
using EstateManagement.Client;
using EventHandling;
using MessagingService.Client;
using Microsoft.Extensions.Configuration;
using Moq;
using SecurityService.Client;
Expand Down Expand Up @@ -39,6 +40,8 @@ public async Task TransactionDomainEventHandler_Handle_TransactionHasBeenComplet
Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();
securityServiceClient.Setup(s => s.GetToken(It.IsAny<String>(), It.IsAny<String>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.TokenResponse);

Mock<ITransactionReceiptBuilder> transactionReceiptBulder = new Mock<ITransactionReceiptBuilder>();
Mock<IMessagingServiceClient> messagingServiceClient = new Mock<IMessagingServiceClient>();

IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
Expand All @@ -47,7 +50,9 @@ public async Task TransactionDomainEventHandler_Handle_TransactionHasBeenComplet
TransactionDomainEventHandler transactionDomainEventHandler = new TransactionDomainEventHandler(transactionAggregateManager.Object,
feeCalculationManager.Object,
estateClient.Object,
securityServiceClient.Object);
securityServiceClient.Object,
transactionReceiptBulder.Object,
messagingServiceClient.Object);

await transactionDomainEventHandler.Handle(TestData.TransactionHasBeenCompletedEvent, CancellationToken.None);
}
Expand All @@ -63,14 +68,19 @@ public async Task TransactionDomainEventHandler_Handle_TransactionHasBeenComplet

Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();

Mock<ITransactionReceiptBuilder> transactionReceiptBulder = new Mock<ITransactionReceiptBuilder>();
Mock<IMessagingServiceClient> messagingServiceClient = new Mock<IMessagingServiceClient>();

IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
Logger.Initialise(NullLogger.Instance);

TransactionDomainEventHandler transactionDomainEventHandler = new TransactionDomainEventHandler(transactionAggregateManager.Object,
feeCalculationManager.Object,
estateClient.Object,
securityServiceClient.Object);
securityServiceClient.Object,
transactionReceiptBulder.Object,
messagingServiceClient.Object);

await transactionDomainEventHandler.Handle(TestData.TransactionHasBeenCompletedEvent, CancellationToken.None);
}
Expand All @@ -86,14 +96,19 @@ public async Task TransactionDomainEventHandler_Handle_TransactionHasBeenComplet

Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();

Mock<ITransactionReceiptBuilder> transactionReceiptBulder = new Mock<ITransactionReceiptBuilder>();
Mock<IMessagingServiceClient> messagingServiceClient = new Mock<IMessagingServiceClient>();

IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
Logger.Initialise(NullLogger.Instance);

TransactionDomainEventHandler transactionDomainEventHandler = new TransactionDomainEventHandler(transactionAggregateManager.Object,
feeCalculationManager.Object,
estateClient.Object,
securityServiceClient.Object);
securityServiceClient.Object,
transactionReceiptBulder.Object,
messagingServiceClient.Object);

await transactionDomainEventHandler.Handle(TestData.TransactionHasBeenCompletedEvent, CancellationToken.None);
}
Expand All @@ -109,14 +124,19 @@ public async Task TransactionDomainEventHandler_Handle_TransactionHasBeenComplet

Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();

Mock<ITransactionReceiptBuilder> transactionReceiptBulder = new Mock<ITransactionReceiptBuilder>();
Mock<IMessagingServiceClient> messagingServiceClient = new Mock<IMessagingServiceClient>();

IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
Logger.Initialise(NullLogger.Instance);

TransactionDomainEventHandler transactionDomainEventHandler = new TransactionDomainEventHandler(transactionAggregateManager.Object,
feeCalculationManager.Object,
estateClient.Object,
securityServiceClient.Object);
securityServiceClient.Object,
transactionReceiptBulder.Object,
messagingServiceClient.Object);

await transactionDomainEventHandler.Handle(TestData.TransactionHasBeenCompletedEvent, CancellationToken.None);
}
Expand All @@ -132,16 +152,50 @@ public async Task TransactionDomainEventHandler_Handle_TransactionHasBeenComplet

Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();

Mock<ITransactionReceiptBuilder> transactionReceiptBulder = new Mock<ITransactionReceiptBuilder>();
Mock<IMessagingServiceClient> messagingServiceClient = new Mock<IMessagingServiceClient>();

IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
Logger.Initialise(NullLogger.Instance);

TransactionDomainEventHandler transactionDomainEventHandler = new TransactionDomainEventHandler(transactionAggregateManager.Object,
feeCalculationManager.Object,
estateClient.Object,
securityServiceClient.Object);
securityServiceClient.Object,
transactionReceiptBulder.Object,
messagingServiceClient.Object);

await transactionDomainEventHandler.Handle(TestData.TransactionHasBeenCompletedEvent, CancellationToken.None);
}

[Fact]
public async Task TransactionDomainEventHandler_Handle_CustomerEmailReceiptRequestedEvent_EventIsHandled()
{
Mock<ITransactionAggregateManager> transactionAggregateManager = new Mock<ITransactionAggregateManager>();
transactionAggregateManager.Setup(t => t.GetAggregate(It.IsAny<Guid>(), It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(TestData.GetCompletedAuthorisedSaleTransactionAggregate);
Mock<IFeeCalculationManager> feeCalculationManager = new Mock<IFeeCalculationManager>();
Mock<IEstateClient> estateClient = new Mock<IEstateClient>();

Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();
securityServiceClient.Setup(s => s.GetToken(It.IsAny<String>(), It.IsAny<String>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.TokenResponse);

Mock<ITransactionReceiptBuilder> transactionReceiptBulder = new Mock<ITransactionReceiptBuilder>();
Mock<IMessagingServiceClient> messagingServiceClient = new Mock<IMessagingServiceClient>();

IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
Logger.Initialise(NullLogger.Instance);

TransactionDomainEventHandler transactionDomainEventHandler = new TransactionDomainEventHandler(transactionAggregateManager.Object,
feeCalculationManager.Object,
estateClient.Object,
securityServiceClient.Object,
transactionReceiptBulder.Object,
messagingServiceClient.Object);

await transactionDomainEventHandler.Handle(TestData.CustomerEmailReceiptRequestedEvent, CancellationToken.None);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace TransactionProcessor.BusinessLogic.Tests.Services
{
using System.IO;
using System.IO.Abstractions;
using System.IO.Abstractions.TestingHelpers;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using BusinessLogic.Services;
using EstateManagement.DataTransferObjects.Responses;
using Models;
using Shouldly;
using Xunit;

public class TransactionReceiptBuilderTests
{
[Fact]
public async Task TransactionReceiptBuilder_GetEmailReceiptMessage_MessageBuilt()
{
Transaction transaction = new Transaction
{
OperatorIdentifier = "Safaricom",
TransactionNumber = "12345"
};

var path = Directory.GetParent(Assembly.GetExecutingAssembly().Location);

var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
{
{ $"{path}\\Receipts\\Email\\{transaction.OperatorIdentifier}\\TransactionAuthorised.html", new MockFileData("Transaction Number: [TransactionNumber]") }
});

TransactionReceiptBuilder receiptBuilder = new TransactionReceiptBuilder(fileSystem);

String receiptMessage = await receiptBuilder.GetEmailReceiptMessage(transaction, new MerchantResponse(), CancellationToken.None);

receiptMessage.ShouldBe("Transaction Number: 12345");


}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="Moq" Version="4.14.4" />
<PackageReference Include="Shouldly" Version="3.0.2" />
<PackageReference Include="System.IO.Abstractions.TestingHelpers" Version="12.2.2" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2">
<PrivateAssets>all</PrivateAssets>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
using EstateManagement.DataTransferObjects.Responses;
using Manager;
using MessagingService.BusinessLogic.EventHandling;
using MessagingService.Client;
using MessagingService.DataTransferObjects;
using Models;
using SecurityService.Client;
using SecurityService.DataTransferObjects.Responses;
Expand Down Expand Up @@ -42,6 +44,10 @@ public class TransactionDomainEventHandler : IDomainEventHandler
/// </summary>
private readonly ISecurityServiceClient SecurityServiceClient;

private readonly ITransactionReceiptBuilder TransactionReceiptBuilder;

private readonly IMessagingServiceClient MessagingServiceClient;

/// <summary>
/// The token response
/// </summary>
Expand All @@ -57,21 +63,27 @@ public class TransactionDomainEventHandler : IDomainEventHandler
#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="TransactionDomainEventHandler"/> class.
/// Initializes a new instance of the <see cref="TransactionDomainEventHandler" /> class.
/// </summary>
/// <param name="transactionAggregateManager">The transaction aggregate manager.</param>
/// <param name="feeCalculationManager">The fee calculation manager.</param>
/// <param name="estateClient">The estate client.</param>
/// <param name="securityServiceClient">The security service client.</param>
/// <param name="transactionReceiptBuilder">The transaction receipt builder.</param>
/// <param name="messagingServiceClient">The messaging service client.</param>
public TransactionDomainEventHandler(ITransactionAggregateManager transactionAggregateManager,
IFeeCalculationManager feeCalculationManager,
IEstateClient estateClient,
ISecurityServiceClient securityServiceClient)
ISecurityServiceClient securityServiceClient,
ITransactionReceiptBuilder transactionReceiptBuilder,
IMessagingServiceClient messagingServiceClient)
{
this.TransactionAggregateManager = transactionAggregateManager;
this.FeeCalculationManager = feeCalculationManager;
this.EstateClient = estateClient;
this.SecurityServiceClient = securityServiceClient;
this.TransactionReceiptBuilder = transactionReceiptBuilder;
this.MessagingServiceClient = messagingServiceClient;
}

#endregion
Expand Down Expand Up @@ -179,6 +191,62 @@ private async Task HandleSpecificDomainEvent(TransactionHasBeenCompletedEvent do
}
}

/// <summary>
/// Handles the specific domain event.
/// </summary>
/// <param name="domainEvent">The domain event.</param>
/// <param name="cancellationToken">The cancellation token.</param>
private async Task HandleSpecificDomainEvent(CustomerEmailReceiptRequestedEvent domainEvent,
CancellationToken cancellationToken)
{
this.TokenResponse = await this.GetToken(cancellationToken);

TransactionAggregate transactionAggregate = await this.TransactionAggregateManager.GetAggregate(domainEvent.EstateId, domainEvent.TransactionId, cancellationToken);

var merchant = await this.EstateClient.GetMerchant(this.TokenResponse.AccessToken, domainEvent.EstateId, domainEvent.MerchantId, cancellationToken);

// Determine the body of the email
String receiptMessage = await this.TransactionReceiptBuilder.GetEmailReceiptMessage(transactionAggregate.GetTransaction(), merchant, cancellationToken);

// Send the message
await this.SendEmailMessage(this.TokenResponse.AccessToken, domainEvent.EstateId, "Transaction Successful", receiptMessage, domainEvent.CustomerEmailAddress, cancellationToken);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


}

/// <summary>
/// Sends the email message.
/// </summary>
/// <param name="accessToken">The access token.</param>
/// <param name="estateId">The estate identifier.</param>
/// <param name="subject">The subject.</param>
/// <param name="body">The body.</param>
/// <param name="emailAddress">The email address.</param>
/// <param name="cancellationToken">The cancellation token.</param>
private async Task SendEmailMessage(String accessToken,
Guid estateId,
String subject,
String body,
String emailAddress,
CancellationToken cancellationToken)
{
SendEmailRequest sendEmailRequest = new SendEmailRequest
{
Body = body,
ConnectionIdentifier = estateId,
FromAddress = "golfhandicapping@btinternet.com", // TODO: lookup from config
IsHtml = true,
Subject = subject,
ToAddresses = new List<String>
{
emailAddress
}
};

// TODO: may decide to record the message Id againsts the Transaction Aggregate in future, but for now
// we wont do this...
await this.MessagingServiceClient.SendEmail(accessToken, sendEmailRequest, cancellationToken);
}

#endregion
}
}
Loading