From 34d5ad074db75353477381d2c84e10f0683578f7 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Thu, 30 Jul 2020 10:17:52 +0100 Subject: [PATCH] Always record product details on a sale --- .../Services/TransactionDomainService.cs | 10 +- .../TransactionAggregateTests.cs | 139 +++++++++++++++++- .../TransactionAggregate.cs | 2 + 3 files changed, 139 insertions(+), 12 deletions(-) diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs index 89343b10..f0139649 100644 --- a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs @@ -173,7 +173,7 @@ public async Task ProcessSaleTransaction(Guid tr (String responseMessage, TransactionResponseCode responseCode) validationResult = await this.ValidateSaleTransaction(estateId, merchantId, deviceIdentifier, operatorIdentifier, transactionAmount, cancellationToken); - + await this.TransactionAggregateManager.StartTransaction(transactionId, transactionDateTime, transactionNumber, @@ -184,12 +184,12 @@ await this.TransactionAggregateManager.StartTransaction(transactionId, deviceIdentifier, transactionAmount, cancellationToken); - + + // Add the product details + await this.TransactionAggregateManager.AddProductDetails(estateId, transactionId, contractId, productId, cancellationToken); + if (validationResult.responseCode == TransactionResponseCode.Success) { - // Add the product details - await this.TransactionAggregateManager.AddProductDetails(estateId, transactionId, contractId, productId, cancellationToken); - // Record any additional request metadata await this.TransactionAggregateManager.RecordAdditionalRequestData(estateId, transactionId, diff --git a/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs b/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs index aee7b755..f18c33b2 100644 --- a/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs +++ b/TransactionProcessor.TransactionAggregate.Tests/TransactionAggregateTests.cs @@ -86,7 +86,7 @@ public void TransactionAggregate_StartTransaction_TransactionAlreadyCompleted_Er TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); - + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); if (transactionType == TransactionType.Logon) { transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); @@ -221,6 +221,52 @@ public void TransactionAggregate_AddProductDetails_ProductDetailsAlreadyAdded_Er }); } + [Theory] + [InlineData(TransactionType.Sale)] + public void TransactionAggregate_AddProductDetails_TransactionNotStarted_ErrorThrown(TransactionType transactionType) + { + TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); + + Should.Throw(() => + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + }); + } + + [Theory] + [InlineData(TransactionType.Sale)] + public void TransactionAggregate_AddProductDetails_TransactionAlreadyCompleted_ErrorThrown(TransactionType transactionType) + { + TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); + transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, + TestData.TransactionAmount); + + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + + if (transactionType == TransactionType.Logon) + { + transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); + } + else + { + transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, + TestData.OperatorAuthorisationCode, + TestData.OperatorResponseCode, + TestData.OperatorResponseMessage, + TestData.OperatorTransactionId, + TestData.ResponseCode, + TestData.ResponseMessage); + } + + transactionAggregate.CompleteTransaction(); + + + Should.Throw(() => + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + }); + } + [Theory] [InlineData(TransactionType.Logon)] public void TransactionAggregate_AuthoriseTransactionLocally_TransactionIsAuthorised(TransactionType transactionType) @@ -228,7 +274,7 @@ public void TransactionAggregate_AuthoriseTransactionLocally_TransactionIsAuthor TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); - + transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); transactionAggregate.IsLocallyAuthorised.ShouldBeTrue(); @@ -287,11 +333,12 @@ public void TransactionAggregate_AuthoriseTransactionLocally_TransactionAlreadyA [Theory] [InlineData(TransactionType.Sale)] - public void TransactionAggregate_AuthoriseTransactionLocally_TransactionCannotBeLocallyyAuthorised_ErrorThrown(TransactionType transactionType) + public void TransactionAggregate_AuthoriseTransactionLocally_TransactionCannotBeLocallyAuthorised_ErrorThrown(TransactionType transactionType) { TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); Should.Throw(() => { @@ -310,6 +357,10 @@ public void TransactionAggregate_AuthoriseTransaction_TransactionIsAuthorised(Tr TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); @@ -340,6 +391,10 @@ public void TransactionAggregate_AuthoriseTransaction_TransactionAlreadyAuthoris TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); Should.Throw(() => @@ -356,7 +411,10 @@ public void TransactionAggregate_DeclineTransactionLocally_TransactionIsDeclined TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); - + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.DeclineTransactionLocally(TestData.DeclinedResponseCode, TestData.DeclinedResponseMessage); transactionAggregate.IsAuthorised.ShouldBeFalse(); @@ -402,6 +460,10 @@ public void TransactionAggregate_DeclineTransactionLocally_TransactionAlreadyAut TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); Should.Throw(() => @@ -418,6 +480,10 @@ public void TransactionAggregate_DeclineTransactionLocally_TransactionAlreadyDec TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.DeclineTransactionLocally(TestData.ResponseCode, TestData.ResponseMessage); Should.Throw(() => @@ -434,6 +500,10 @@ public void TransactionAggregate_DeclineTransactionLocally_TransactionAlreadyDec TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.DeclineTransaction(TestData.OperatorIdentifier1, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.DeclinedResponseCode, TestData.DeclinedResponseMessage); Should.Throw(() => @@ -450,7 +520,10 @@ public void TransactionAggregate_DeclineTransaction_TransactionIsDeclined(Transa TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); - + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.DeclineTransaction(TestData.OperatorIdentifier1, TestData.DeclinedOperatorResponseCode, TestData.DeclinedOperatorResponseMessage, TestData.DeclinedResponseCode, TestData.DeclinedResponseMessage); transactionAggregate.IsAuthorised.ShouldBeFalse(); @@ -496,6 +569,10 @@ public void TransactionAggregate_DeclineTransaction_TransactionAlreadyAuthorised TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); Should.Throw(() => @@ -512,6 +589,10 @@ public void TransactionAggregate_DeclineTransaction_TransactionAlreadyDeclinedLo TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.DeclineTransactionLocally(TestData.ResponseCode, TestData.ResponseMessage); Should.Throw(() => @@ -528,6 +609,10 @@ public void TransactionAggregate_DeclineTransaction_TransactionAlreadyDeclined_E TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.DeclineTransaction(TestData.OperatorIdentifier1, TestData.DeclinedOperatorResponseCode, TestData.DeclinedOperatorResponseMessage, TestData.DeclinedResponseCode, TestData.DeclinedResponseMessage); Should.Throw(() => @@ -579,7 +664,10 @@ public void TransactionAggregate_CompleteTransaction_TransactionNotAuthorised_Er TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); - + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } Should.Throw(() => { transactionAggregate.CompleteTransaction(); @@ -594,13 +682,14 @@ public void TransactionAggregate_CompleteTransaction_TransactionAlreadyCompleted TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); - + if (transactionType == TransactionType.Logon) { transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); } else { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); transactionAggregate.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); } @@ -620,6 +709,10 @@ public void TransactionAggregate_RecordAdditionalRequestData_RequestDataRecorded TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } Should.NotThrow(() => { @@ -649,6 +742,10 @@ public void TransactionAggregate_RecordAdditionalRequestData_AdditionalRequestDa TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); Should.Throw(() => @@ -665,6 +762,11 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyAuthorised_E TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } + transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); if (transactionType == TransactionType.Logon) @@ -690,6 +792,10 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyDeclined_Err TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); if (transactionType == TransactionType.Logon) @@ -715,6 +821,10 @@ public void TransactionAggregate_RecordAdditionalRequestData_AlreadyCompleted_Er TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); if (transactionType == TransactionType.Logon) { @@ -743,6 +853,10 @@ public void TransactionAggregate_RecordAdditionalResponseData_ResponseDataRecord TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } if (transactionType == TransactionType.Logon) { transactionAggregate.AuthoriseTransactionLocally(TestData.AuthorisationCode, TestData.ResponseCode, TestData.ResponseMessage); @@ -780,6 +894,10 @@ public void TransactionAggregate_RecordAdditionalResponseData_AdditionalResponse TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); if (transactionType == TransactionType.Logon) { @@ -805,6 +923,10 @@ public void TransactionAggregate_RecordAdditionalResponseData_AlreadyCompleted_E TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); transactionAggregate.StartTransaction(TestData.TransactionDateTime, TestData.TransactionNumber, transactionType, TestData.TransactionReference, TestData.EstateId, TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionAmount); + if (transactionType != TransactionType.Logon) + { + transactionAggregate.AddProductDetails(TestData.ContractId, TestData.ProductId); + } transactionAggregate.RecordAdditionalRequestData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); if (transactionType == TransactionType.Logon) { @@ -829,6 +951,7 @@ public void TransactionAggregate_RequestEmailReceipt_CustomerEmailReceiptHasBeen TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); 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.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); @@ -845,6 +968,7 @@ public void TransactionAggregate_RequestEmailReceipt_TransactionNotCompleted_Err TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); 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.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); @@ -858,6 +982,7 @@ public void TransactionAggregate_RequestEmailReceipt_EmailReceiptAlreadyRequeste TransactionAggregate transactionAggregate = TransactionAggregate.Create(TestData.TransactionId); 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.AuthoriseTransaction(TestData.OperatorIdentifier1, TestData.OperatorAuthorisationCode, TestData.OperatorResponseCode, TestData.OperatorResponseMessage, TestData.OperatorTransactionId, TestData.ResponseCode, TestData.ResponseMessage); transactionAggregate.RecordAdditionalResponseData(TestData.OperatorIdentifier1, TestData.AdditionalTransactionMetaData); diff --git a/TransactionProcessor.TransactionAgrgegate/TransactionAggregate.cs b/TransactionProcessor.TransactionAgrgegate/TransactionAggregate.cs index 19de8f09..e81f9c42 100644 --- a/TransactionProcessor.TransactionAgrgegate/TransactionAggregate.cs +++ b/TransactionProcessor.TransactionAgrgegate/TransactionAggregate.cs @@ -497,6 +497,8 @@ public void AddProductDetails(Guid contractId, Guard.ThrowIfInvalidGuid(contractId, typeof(ArgumentException), $"Contract Id must not be [{Guid.Empty}]"); Guard.ThrowIfInvalidGuid(productId, typeof(ArgumentException), $"Product Id must not be [{Guid.Empty}]"); + this.CheckTransactionHasBeenStarted(); + this.CheckTransactionNotAlreadyCompleted(); this.CheckProductDetailsNotAlreadyAdded(); ProductDetailsAddedToTransactionEvent productDetailsAddedToTransactionEvent = ProductDetailsAddedToTransactionEvent.Create(this.AggregateId,