diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs index d6d71df4..05a5fcd1 100644 --- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs @@ -38,7 +38,7 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupSuccessful_SaleM TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), CancellationToken.None); operatorResponse.ShouldNotBeNull(); @@ -67,7 +67,7 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupFailed_SaleMessa TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), CancellationToken.None); operatorResponse.ShouldNotBeNull(); @@ -97,7 +97,7 @@ await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessTo TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), CancellationToken.None); }); } diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs index b36fe759..71c15c7d 100644 --- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs @@ -29,7 +29,7 @@ public async Task VoucherManagementProxy_ProcessSaleMessage_VoucherIssueSuccessf TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference, - TestData.AdditionalTransactionMetaDataForVoucher, + TestData.AdditionalTransactionMetaDataForVoucher(), CancellationToken.None); operatorResponse.ShouldNotBeNull(); @@ -56,7 +56,7 @@ await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessT TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference, - TestData.AdditionalTransactionMetaDataForVoucher, + TestData.AdditionalTransactionMetaDataForVoucher(), CancellationToken.None); @@ -71,7 +71,7 @@ public async Task VoucherManagementProxy_ProcessSaleMessage_InvalidData_Transact { Mock voucherManagementClient = new Mock(); - Dictionary additionalMetatdata = TestData.AdditionalTransactionMetaDataForVoucher; + Dictionary additionalMetatdata = TestData.AdditionalTransactionMetaDataForVoucher(); additionalMetatdata["Amount"] = transactionAmount; IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object); diff --git a/TransactionProcessor.BusinessLogic.Tests/Requests/RequestTests.cs b/TransactionProcessor.BusinessLogic.Tests/Requests/RequestTests.cs index b846c2b9..1ff555d5 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Requests/RequestTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Requests/RequestTests.cs @@ -34,7 +34,7 @@ public void ProcessSaleTransactionRequest_CanBeCreated_IsCreated() TestData.TransactionNumber, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId); @@ -49,7 +49,7 @@ public void ProcessSaleTransactionRequest_CanBeCreated_IsCreated() processSaleTransactionRequest.OperatorIdentifier.ShouldBe(TestData.OperatorIdentifier1); processSaleTransactionRequest.CustomerEmailAddress.ShouldBe(TestData.CustomerEmailAddress); processSaleTransactionRequest.AdditionalTransactionMetadata.ShouldNotBeNull(); - processSaleTransactionRequest.AdditionalTransactionMetadata.Count.ShouldBe(TestData.AdditionalTransactionMetaData.Count); + processSaleTransactionRequest.AdditionalTransactionMetadata.Count.ShouldBe(TestData.AdditionalTransactionMetaData().Count); processSaleTransactionRequest.ContractId.ShouldBe(TestData.ContractId); processSaleTransactionRequest.ProductId.ShouldBe(TestData.ProductId); } diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionAggregateManagerTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionAggregateManagerTests.cs index 22d806b7..f4a239ca 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionAggregateManagerTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionAggregateManagerTests.cs @@ -103,7 +103,7 @@ public async Task TransactionAggregateManager_RecordAdditionalRequestData_Additi await transactionAggregateManager.RecordAdditionalRequestData(TestData.EstateId, TestData.TransactionId, TestData.OperatorIdentifier1, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), CancellationToken.None); } @@ -145,7 +145,7 @@ public async Task TransactionAggregateManager_RecordAdditionalResponseData_Addit await transactionAggregateManager.RecordAdditionalResponseData(TestData.EstateId, TestData.TransactionId, TestData.OperatorIdentifier1, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), CancellationToken.None); } diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs index e784d083..453026d6 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs @@ -523,7 +523,137 @@ public async Task TransactionDomainService_ProcessSaleTransaction_SuccesfulOpera TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), + TestData.ContractId, + TestData.ProductId, + CancellationToken.None); + + this.ValidateResponse(response, TransactionResponseCode.Success); + } + + [Theory] + [InlineData("amount")] + [InlineData("Amount")] + [InlineData("AMOUNT")] + public async Task TransactionDomainService_ProcessSaleTransaction_MetaDataCaseTests_Amount_TransactionIsProcessed(String amountFieldName) + { + IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build(); + ConfigurationReader.Initialise(configurationRoot); + + Logger.Initialise(NullLogger.Instance); + + Mock transactionAggregateManager = new Mock(); + Mock estateClient = new Mock(); + Mock securityServiceClient = new Mock(); + + securityServiceClient.Setup(s => s.GetToken(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(TestData.TokenResponse); + estateClient.Setup(e => e.GetEstate(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(TestData.GetEstateResponseWithOperator1); + estateClient.Setup(e => e.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(TestData.GetMerchantResponseWithOperator1); + transactionAggregateManager.Setup(t => t.GetAggregate(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(TestData.GetCompletedAuthorisedSaleTransactionAggregate); + + Mock operatorProxy = new Mock(); + operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())).ReturnsAsync(new OperatorResponse + { + ResponseMessage = TestData.OperatorResponseMessage, + IsSuccessful = true, + AuthorisationCode = TestData.OperatorAuthorisationCode, + TransactionId = TestData.OperatorTransactionId, + ResponseCode = TestData.ResponseCode + }); + Func operatorProxyResolver = (operatorName) => { return operatorProxy.Object; }; + + Mock> reconciliationAggregateRepository = + new Mock>(); + + TransactionDomainService transactionDomainService = + new TransactionDomainService(transactionAggregateManager.Object, estateClient.Object, securityServiceClient.Object, + operatorProxyResolver, reconciliationAggregateRepository.Object); + + + + ProcessSaleTransactionResponse response = await transactionDomainService.ProcessSaleTransaction(TestData.TransactionId, + TestData.EstateId, + TestData.MerchantId, + TestData.TransactionDateTime, + TestData.TransactionNumber, + TestData.DeviceIdentifier, + TestData.OperatorIdentifier1, + TestData.CustomerEmailAddress, + TestData.AdditionalTransactionMetaData(amountName:amountFieldName), + TestData.ContractId, + TestData.ProductId, + CancellationToken.None); + + this.ValidateResponse(response, TransactionResponseCode.Success); + } + + [Theory] + [InlineData("customerAccountNumber")] + [InlineData("CustomerAccountNumber")] + [InlineData("CUSTOMERACCOUNTNUMBER")] + public async Task TransactionDomainService_ProcessSaleTransaction_MetaDataCaseTests_CustomerAccountNumber_TransactionIsProcessed(String customerAccountNumberFieldName) + { + IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build(); + ConfigurationReader.Initialise(configurationRoot); + + Logger.Initialise(NullLogger.Instance); + + Mock transactionAggregateManager = new Mock(); + Mock estateClient = new Mock(); + Mock securityServiceClient = new Mock(); + + securityServiceClient.Setup(s => s.GetToken(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(TestData.TokenResponse); + estateClient.Setup(e => e.GetEstate(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(TestData.GetEstateResponseWithOperator1); + estateClient.Setup(e => e.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(TestData.GetMerchantResponseWithOperator1); + transactionAggregateManager.Setup(t => t.GetAggregate(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(TestData.GetCompletedAuthorisedSaleTransactionAggregate); + + Mock operatorProxy = new Mock(); + operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())).ReturnsAsync(new OperatorResponse + { + ResponseMessage = TestData.OperatorResponseMessage, + IsSuccessful = true, + AuthorisationCode = TestData.OperatorAuthorisationCode, + TransactionId = TestData.OperatorTransactionId, + ResponseCode = TestData.ResponseCode + }); + Func operatorProxyResolver = (operatorName) => { return operatorProxy.Object; }; + + Mock> reconciliationAggregateRepository = + new Mock>(); + + TransactionDomainService transactionDomainService = + new TransactionDomainService(transactionAggregateManager.Object, estateClient.Object, securityServiceClient.Object, + operatorProxyResolver, reconciliationAggregateRepository.Object); + + + + ProcessSaleTransactionResponse response = await transactionDomainService.ProcessSaleTransaction(TestData.TransactionId, + TestData.EstateId, + TestData.MerchantId, + TestData.TransactionDateTime, + TestData.TransactionNumber, + TestData.DeviceIdentifier, + TestData.OperatorIdentifier1, + TestData.CustomerEmailAddress, + TestData.AdditionalTransactionMetaData(customerAccountNumberName: customerAccountNumberFieldName), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -581,7 +711,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_FailedOperator TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -625,7 +755,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_MerchantWithNu TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -670,7 +800,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_MerchantWithNo TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -714,7 +844,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_IncorrectDevic TestData.DeviceIdentifier1, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -758,7 +888,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_InvalidEstate_ TestData.DeviceIdentifier1, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -803,7 +933,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_NotEnoughCredi TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -846,7 +976,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_InvalidMerchan TestData.DeviceIdentifier1, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -890,7 +1020,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_EstateWithEmpt TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -934,7 +1064,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_EstateWithNull TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -978,7 +1108,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_OperatorNotSup TestData.DeviceIdentifier, TestData.OperatorIdentifier2, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -1023,7 +1153,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_MerchantWithEm TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -1067,7 +1197,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_MerchantWithNu TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -1111,7 +1241,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_OperatorNotSup TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); @@ -1164,7 +1294,7 @@ public async Task TransactionDomainService_ProcessSaleTransaction_ErrorInOperato TestData.DeviceIdentifier, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId, CancellationToken.None); diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs index f01a3cc7..8734b3f8 100644 --- a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Eventing.Reader; + using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -189,10 +190,15 @@ public async Task ProcessSaleTransaction(Guid tr // Extract the transaction amount from the metadata Decimal transactionAmount = this.ExtractFieldFromMetadata("Amount", additionalTransactionMetadata); - + (String responseMessage, TransactionResponseCode responseCode) validationResult = await this.ValidateSaleTransaction(estateId, merchantId, deviceIdentifier, operatorIdentifier, transactionAmount, cancellationToken); + if (validationResult.responseCode == TransactionResponseCode.InvalidSaleTransactionAmount) + { + throw new InvalidDataException(validationResult.responseMessage); + } + await this.TransactionAggregateManager.StartTransaction(transactionId, transactionDateTime, transactionNumber, @@ -400,9 +406,16 @@ public async Task ProcessReconciliatio private T ExtractFieldFromMetadata(String fieldName, Dictionary additionalTransactionMetadata) { - if (additionalTransactionMetadata.ContainsKey(fieldName)) + // Create a case insensitive version of the dictionary + Dictionary caseInsensitiveDictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + foreach (KeyValuePair keyValuePair in additionalTransactionMetadata) { - String fieldData = additionalTransactionMetadata[fieldName]; + caseInsensitiveDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + + if (caseInsensitiveDictionary.ContainsKey(fieldName)) + { + String fieldData = caseInsensitiveDictionary[fieldName]; return (T)Convert.ChangeType(fieldData, typeof(T)); } else @@ -648,6 +661,12 @@ private async Task GetToken(CancellationToken cancellationToken) } } + // Check the amount + if (transactionAmount <= 0) + { + throw new TransactionValidationException("Transaction Amount must be greater than 0", TransactionResponseCode.InvalidSaleTransactionAmount); + } + // Check the merchant has enough balance to perform the sale if (merchant.AvailableBalance < transactionAmount) { diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionResponseCode.cs b/TransactionProcessor.BusinessLogic/Services/TransactionResponseCode.cs index 1a6789d5..8f7ab754 100644 --- a/TransactionProcessor.BusinessLogic/Services/TransactionResponseCode.cs +++ b/TransactionProcessor.BusinessLogic/Services/TransactionResponseCode.cs @@ -15,6 +15,7 @@ public enum TransactionResponseCode TransactionDeclinedByOperator = 1008, MerchantDoesNotHaveEnoughCredit = 1009, OperatorCommsError = 1010, + InvalidSaleTransactionAmount = 1011, // A Catch All generic Error where reason has not been identified UnknownFailure = 9999 diff --git a/TransactionProcessor.DataTransferObjects/TransactionProcessor.DataTransferObjects.xml b/TransactionProcessor.DataTransferObjects/TransactionProcessor.DataTransferObjects.xml index baf792b6..afeb58de 100644 --- a/TransactionProcessor.DataTransferObjects/TransactionProcessor.DataTransferObjects.xml +++ b/TransactionProcessor.DataTransferObjects/TransactionProcessor.DataTransferObjects.xml @@ -99,6 +99,14 @@ The response message. + + + Gets or sets the transaction identifier. + + + The transaction identifier. + + @@ -229,6 +237,14 @@ The response message. + + + Gets or sets the transaction identifier. + + + The transaction identifier. + + Gets or sets the additional transaction metadata. @@ -341,6 +357,14 @@ The additional transaction metadata. + + + Gets or sets the transaction identifier. + + + The transaction identifier. + + diff --git a/TransactionProcessor.Testing/TestData.cs b/TransactionProcessor.Testing/TestData.cs index 421dc86b..ef1fd4fd 100644 --- a/TransactionProcessor.Testing/TestData.cs +++ b/TransactionProcessor.Testing/TestData.cs @@ -108,7 +108,7 @@ public class TestData new OperatorResponse { ResponseMessage = TestData.OperatorResponseMessage, - AdditionalTransactionResponseMetadata = TestData.AdditionalTransactionMetaData, + AdditionalTransactionResponseMetadata = TestData.AdditionalTransactionMetaData(), TransactionId = TestData.OperatorTransactionId, IsSuccessful = true, AuthorisationCode = TestData.OperatorAuthorisationCode, @@ -141,18 +141,18 @@ public class TestData /// /// The additional transaction meta data. /// - public static Dictionary AdditionalTransactionMetaData => + public static Dictionary AdditionalTransactionMetaData(String amountName = "Amount", String customerAccountNumberName = "CustomerAccountNumber") => new Dictionary { - {"Amount", "100.00"}, - {"CustomerAccountNumber", "123456789" } + {amountName, "100.00"}, + {customerAccountNumberName, "123456789" } }; - public static Dictionary AdditionalTransactionMetaDataForVoucher => + public static Dictionary AdditionalTransactionMetaDataForVoucher(String amountName = "Amount", String recipientEmailName = "RecipientEmail") => new Dictionary { - {"Amount", "100.00"}, - {"RecipientEmail", "test@testvoucher.co.uk" } + {amountName, "100.00"}, + {recipientEmailName, "test@testvoucher.co.uk" } }; @@ -401,7 +401,7 @@ public class TestData TestData.TransactionNumber, TestData.OperatorIdentifier1, TestData.CustomerEmailAddress, - TestData.AdditionalTransactionMetaData, + TestData.AdditionalTransactionMetaData(), TestData.ContractId, TestData.ProductId); diff --git a/TransactionProcessor.TransactionAggregate.Tests/DomainEventTests.cs b/TransactionProcessor.TransactionAggregate.Tests/DomainEventTests.cs index 7d89b508..68662b7e 100644 --- a/TransactionProcessor.TransactionAggregate.Tests/DomainEventTests.cs +++ b/TransactionProcessor.TransactionAggregate.Tests/DomainEventTests.cs @@ -170,7 +170,7 @@ public void AdditionalResponseDataRecordedEvent_CanBeCreated_IsCreated() TestData.EstateId, TestData.MerchantId, TestData.OperatorIdentifier1, - TestData.AdditionalTransactionMetaData); + TestData.AdditionalTransactionMetaData()); additionalResponseDataRecordedEvent.ShouldNotBeNull(); additionalResponseDataRecordedEvent.AggregateId.ShouldBe(TestData.TransactionId); @@ -181,7 +181,7 @@ public void AdditionalResponseDataRecordedEvent_CanBeCreated_IsCreated() additionalResponseDataRecordedEvent.OperatorIdentifier.ShouldBe(TestData.OperatorIdentifier1); additionalResponseDataRecordedEvent.AdditionalTransactionResponseMetadata.ShouldNotBeNull(); - foreach (KeyValuePair keyValuePair in TestData.AdditionalTransactionMetaData) + foreach (KeyValuePair keyValuePair in TestData.AdditionalTransactionMetaData()) { additionalResponseDataRecordedEvent.AdditionalTransactionResponseMetadata.ShouldContainKeyAndValue(keyValuePair.Key, keyValuePair.Value); } @@ -194,7 +194,7 @@ public void AdditionalRequestDataRecordedEvent_CanBeCreated_IsCreated() TestData.EstateId, TestData.MerchantId, TestData.OperatorIdentifier1, - TestData.AdditionalTransactionMetaData); + TestData.AdditionalTransactionMetaData()); additionalRequestDataRecordedEvent.ShouldNotBeNull(); additionalRequestDataRecordedEvent.AggregateId.ShouldBe(TestData.TransactionId); @@ -205,7 +205,7 @@ public void AdditionalRequestDataRecordedEvent_CanBeCreated_IsCreated() additionalRequestDataRecordedEvent.OperatorIdentifier.ShouldBe(TestData.OperatorIdentifier1); additionalRequestDataRecordedEvent.AdditionalTransactionRequestMetadata.ShouldNotBeNull(); - foreach (KeyValuePair keyValuePair in TestData.AdditionalTransactionMetaData) + foreach (KeyValuePair keyValuePair in TestData.AdditionalTransactionMetaData()) { additionalRequestDataRecordedEvent.AdditionalTransactionRequestMetadata.ShouldContainKeyAndValue(keyValuePair.Key, keyValuePair.Value); } diff --git a/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs b/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs index 1ce85f52..4877dd69 100644 --- a/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs +++ b/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs @@ -724,7 +724,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_RequestDataRecorded Should.NotThrow(() => { - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -738,7 +738,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_TransactionNotStart Should.Throw(() => { - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -754,11 +754,11 @@ public void TransactionAggregate_RecordAdditionalRequestData_AdditionalRequestDa { transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); } - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); Should.Throw(() => { - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -775,7 +775,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyAuthorised_E transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); } - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); if (transactionType == TransactionType.Logon) { @@ -788,7 +788,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyAuthorised_E Should.Throw(() => { - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -804,7 +804,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyDeclined_Err { transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); } - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); if (transactionType == TransactionType.Logon) { @@ -817,7 +817,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyDeclined_Err Should.Throw(() => { - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -833,7 +833,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyCompleted_Er { transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); } - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); if (transactionType == TransactionType.Logon) { transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); @@ -846,7 +846,7 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyCompleted_Er Should.Throw(() => { - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -876,7 +876,7 @@ public void TransactionAggregate_RecordAdditionalResponseData_ResponseDataRecord Should.NotThrow(() => { - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -890,7 +890,7 @@ public void TransactionAggregate_RecordAdditionalResponseData_TransactionNotStar Should.Throw(() => { - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -906,7 +906,7 @@ public void TransactionAggregate_RecordAdditionalResponseData_AdditionalResponse { transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); } - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); if (transactionType == TransactionType.Logon) { transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); @@ -915,11 +915,11 @@ public void TransactionAggregate_RecordAdditionalResponseData_AdditionalResponse { transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); } - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); Should.Throw(() => { - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -935,7 +935,7 @@ public void TransactionAggregate_RecordAdditionalResponseData_AlreadyCompleted_E { transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); } - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); if (transactionType == TransactionType.Logon) { transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); @@ -944,12 +944,12 @@ public void TransactionAggregate_RecordAdditionalResponseData_AlreadyCompleted_E { transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); } - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); transactionAggregate.CompleteTransaction(); Should.Throw(() => { - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); }); } @@ -960,9 +960,9 @@ public void TransactionAggregate_RequestEmailReceipt_CustomerEmailReceiptHasBeen transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, TransactionType.Sale, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); transactionAggregate.CompleteTransaction(); transactionAggregate.RequestEmailReceipt(TestData.CustomerEmailAddress); @@ -977,9 +977,9 @@ public void TransactionAggregate_RequestEmailReceipt_TransactionNotCompleted_Err transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, TransactionType.Sale, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); Should.Throw(() => { transactionAggregate.RequestEmailReceipt(TestData.CustomerEmailAddress); }); } @@ -991,9 +991,9 @@ public void TransactionAggregate_RequestEmailReceipt_EmailReceiptAlreadyRequeste transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, TransactionType.Sale, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); - transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); - transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); + transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData()); transactionAggregate.CompleteTransaction(); transactionAggregate.RequestEmailReceipt(TestData.CustomerEmailAddress); diff --git a/TransactionProcessor/TransactionProcessor.xml b/TransactionProcessor/TransactionProcessor.xml index 1564aec1..177becdd 100644 --- a/TransactionProcessor/TransactionProcessor.xml +++ b/TransactionProcessor/TransactionProcessor.xml @@ -151,6 +151,11 @@ The transaction value + + + The transaction identifier + +