From 5b5ff86fc7374ed1a74ab2790d3c8be83ddc30d0 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Wed, 28 Oct 2026 18:47:20 +0000 Subject: [PATCH] clean up the ValidateSaleTransaction function parameters --- .../Services/TransactionDomainServiceTests.cs | 52 +- .../TransactionValidationServiceTests.cs | 685 +++++++++--------- .../Services/TransactionDomainService.cs | 10 +- .../Services/TransactionValidationService.cs | 64 +- 4 files changed, 392 insertions(+), 419 deletions(-) diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs index 62744aef..05b787b3 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs @@ -86,9 +86,7 @@ public async Task TransactionDomainService_ProcessLogonTransaction_DeviceNeedsAd this.AggregateService.GetLatest(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.CreatedMerchantAggregate())); - this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), - Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(TransactionResponseCode.SuccessNeedToAddDevice, "SUCCESS"))); TransactionCommands.ProcessLogonTransactionCommand command = new(TestData.TransactionId, @@ -117,9 +115,7 @@ public async Task TransactionDomainService_ProcessLogonTransaction_TransactionIs this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), - Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(TransactionResponseCode.Success, "SUCCESS"))); TransactionCommands.ProcessLogonTransactionCommand command = new(TestData.TransactionId, @@ -148,9 +144,7 @@ public async Task TransactionDomainService_ProcessLogonTransaction_ValidationFai .ReturnsAsync(Result.Success(TestData.GetEmptyTransactionAggregate())); this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), - Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(responseCode, responseCode.ToString()))); TransactionCommands.ProcessLogonTransactionCommand command = new(TestData.TransactionId, @@ -176,9 +170,7 @@ public async Task TransactionDomainService_ProcessReconciliationTransaction_Reco .ReturnsAsync(new ReconciliationAggregate()); this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - this.TransactionValidationService.ValidateReconciliationTransaction(Arg.Any(), - Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateReconciliationTransaction(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(TransactionResponseCode.Success, "SUCCESS"))); TransactionCommands.ProcessReconciliationCommand command = @@ -206,9 +198,7 @@ public async Task TransactionDomainService_ProcessReconciliationTransaction_Vali .ReturnsAsync(new ReconciliationAggregate()); this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - this.TransactionValidationService.ValidateReconciliationTransaction(Arg.Any(), - Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateReconciliationTransaction(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(responseCode, responseCode.ToString()))); TransactionCommands.ProcessReconciliationCommand command = @@ -239,12 +229,10 @@ public async Task TransactionDomainService_ProcessSaleTransaction_DeclinedByOper this.AggregateService.GetLatest(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetEmptyFloatAggregate())); - this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), + this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any(), - Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(TransactionResponseCode.Success, "SUCCESS"))); @@ -297,11 +285,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_OperatorProxyT this.AggregateService.GetLatest(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetEmptyFloatAggregate())); - this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), @@ -344,11 +330,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_TransactionIsP this.AggregateService.GetLatest(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(floatAggregate)); - this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), @@ -408,12 +392,10 @@ public async Task TransactionDomainService_ProcessSaleTransaction_NoFloatFound_T this.AggregateService.GetLatest(Arg.Any(), Arg.Any()).ReturnsAsync(Result.NotFound()); - this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), + this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any(), - Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(TransactionResponseCode.Success, "SUCCESS"))); @@ -467,11 +449,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_ValidationFail this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), @@ -776,9 +756,7 @@ public async Task TransactionDomainService_ProcessLogonTransaction_SaveFailed_Re .ReturnsAsync(Result.Success(TestData.GetEmptyTransactionAggregate())); this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), - Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateLogonTransaction(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(TransactionResponseCode.Success, "SUCCESS"))); TransactionCommands.ProcessLogonTransactionCommand command = new(TestData.TransactionId, @@ -815,9 +793,7 @@ public async Task TransactionDomainService_ProcessReconciliationTransaction_Save .ReturnsAsync(new ReconciliationAggregate()); this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - this.TransactionValidationService.ValidateReconciliationTransaction(Arg.Any(), - Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateReconciliationTransaction(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new TransactionValidationResult(TransactionResponseCode.Success, "SUCCESS"))); TransactionCommands.ProcessReconciliationCommand command = @@ -881,11 +857,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_SaveFailed_Res this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); this.AggregateService.GetLatest(Arg.Any(), Arg.Any()).ReturnsAsync(Result.NotFound()); - this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), - Arg.Any(), + this.TransactionValidationService.ValidateSaleTransaction(Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs index 46efed4f..78d61f1a 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs @@ -28,6 +28,7 @@ public class TransactionValidationServiceTests { private readonly ISecurityServiceClientImposter SecurityServiceClient; private readonly IEventStoreContextImposter EventStoreContext; private readonly IAggregateServiceImposter AggregateService; + public TransactionValidationServiceTests() { StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions())); IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build(); @@ -51,8 +52,10 @@ public async Task ValidateLogonTransactionX_ValidationSuccessful_CorrectResponse this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); - Result result = await this.TransactionValidationService.ValidateLogonTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + + Result result = await this.TransactionValidationService.ValidateLogonTransaction(identifiers, TestContext.Current.CancellationToken); result.IsSuccess.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.Success); @@ -62,192 +65,199 @@ public async Task ValidateLogonTransactionX_ValidationSuccessful_CorrectResponse public async Task ValidateLogonTransactionX_InvalidEstate_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound("Estate not found")); - - Result result = await this.TransactionValidationService.ValidateLogonTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateLogonTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidEstateId); } [Fact] - public async Task ValidateLogonTransactionX_FailureWhileGettingEstate_CorrectResponseReturned() - { + public async Task ValidateLogonTransactionX_FailureWhileGettingEstate_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("Failed")); - Result result = await this.TransactionValidationService.ValidateLogonTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateLogonTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.UnknownFailure); } [Fact] - public async Task ValidateLogonTransactionX_InvalidMerchant_CorrectResponseReturned() - { + public async Task ValidateLogonTransactionX_InvalidMerchant_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound("Merchant Not Found")); - Result result = await this.TransactionValidationService.ValidateLogonTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateLogonTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidMerchantId); } [Fact] - public async Task ValidateLogonTransactionX_FailureWhileGettingMerchant_CorrectResponseReturned() - { + public async Task ValidateLogonTransactionX_FailureWhileGettingMerchant_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("Merchant Not Found")); - Result result = await this.TransactionValidationService.ValidateLogonTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateLogonTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.UnknownFailure); } [Fact] - public async Task ValidateLogonTransactionX_InvalidDeviceId_CorrectResponseReturned() - { + public async Task ValidateLogonTransactionX_InvalidDeviceId_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); - Result result = await this.TransactionValidationService.ValidateLogonTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier1, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier1); + Result result = await this.TransactionValidationService.ValidateLogonTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidDeviceIdentifier); } [Fact] - public async Task ValidateLogonTransactionX_MerchantHasNoDevices_CorrectResponseReturned() - { + public async Task ValidateLogonTransactionX_MerchantHasNoDevices_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.CreatedMerchantAggregate()); - Result result = await this.TransactionValidationService.ValidateLogonTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier1, TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier1); + Result result = await this.TransactionValidationService.ValidateLogonTransaction(identifiers, TestContext.Current.CancellationToken); result.IsSuccess.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.SuccessNeedToAddDevice); } - + [Fact] - public async Task ValidateReconciliationTransactionX_ValidationSuccessful_CorrectResponseReturned() - { + public async Task ValidateReconciliationTransactionX_ValidationSuccessful_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); - Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(identifiers, TestContext.Current.CancellationToken); result.IsSuccess.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.Success); } [Fact] - public async Task ValidateReconciliationTransactionX_InvalidEstate_CorrectResponseReturned() - { + public async Task ValidateReconciliationTransactionX_InvalidEstate_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound("Estate Not Found")); - Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidEstateId); } [Fact] - public async Task ValidateReconciliationTransactionX_FailureWhileGettingEstate_CorrectResponseReturned() - { + public async Task ValidateReconciliationTransactionX_FailureWhileGettingEstate_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("Failed")); - Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.UnknownFailure); } [Fact] - public async Task ValidateReconciliationTransactionX_InvalidMerchant_CorrectResponseReturned() - { + public async Task ValidateReconciliationTransactionX_InvalidMerchant_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound("Merchant Not Found")); - Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidMerchantId); } [Fact] - public async Task ValidateReconciliationTransactionX_FailureWhileGettingMerchant_CorrectResponseReturned() - { + public async Task ValidateReconciliationTransactionX_FailureWhileGettingMerchant_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("Merchant Not Found")); - Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.UnknownFailure); } [Fact] - public async Task ValidateReconciliationTransactionX_InvalidDeviceId_CorrectResponseReturned() - { + public async Task ValidateReconciliationTransactionX_InvalidDeviceId_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); - Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier1, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier1); + Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidDeviceIdentifier); } [Fact] - public async Task ValidateReconciliationTransactionX_MerchantHasNoDevices_CorrectResponseReturned() - { + public async Task ValidateReconciliationTransactionX_MerchantHasNoDevices_CorrectResponseReturned() { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.CreatedMerchantAggregate()); - Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(TestData.EstateId, TestData.MerchantId, - TestData.DeviceIdentifier1, TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier1); + Result result = await this.TransactionValidationService.ValidateReconciliationTransaction(identifiers, TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.NoValidDevices); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_DeviceNotRegisteredToMerchant_ResponseIsInvalidDeviceIdentifier() - { + public async Task TransactionValidationService_ValidateSaleTransaction_DeviceNotRegisteredToMerchant_ResponseIsInvalidDeviceIdentifier() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -255,143 +265,142 @@ public async Task TransactionValidationService_ValidateSaleTransaction_DeviceNot this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier1, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier1); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidDeviceIdentifier); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundButHasNoOperators_ResponseIsInvalidEstateId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundButHasNoOperators_ResponseIsInvalidEstateId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.CreatedEstateAggregate())); - - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.NoEstateOperators); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundButOperatorIsDeleted_ResponseIsOperatorNotEnabledForEstate() - { + public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundButOperatorIsDeleted_ResponseIsOperatorNotEnabledForEstate() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperatorDeleted())); - - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.OperatorNotEnabledForEstate); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundButHasNullOperators_ResponseIsInvalidEstateId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundButHasNullOperators_ResponseIsInvalidEstateId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.CreatedEstateAggregate())); - - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.NoEstateOperators); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundOperatorsNotConfiguredForEstate_ResponseIsOperatorNotValidForEstate() - { + public async Task TransactionValidationService_ValidateSaleTransaction_EstateFoundOperatorsNotConfiguredForEstate_ResponseIsOperatorNotValidForEstate() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); - - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId2, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId2, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.OperatorNotValidForEstate); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_EstateNotFound_ResponseIsInvalidEstateId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_EstateNotFound_ResponseIsInvalidEstateId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound("Estate Not Found")); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidEstateId); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_GetEstateFailed_ResponseIsInvalidEstateId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_GetEstateFailed_ResponseIsInvalidEstateId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("Failed")); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, TestData.ContractId, TestData.ProductId, - TestData.DeviceIdentifier, TestData.OperatorId, TestData.TransactionAmount, TransactionSource.OnlineSale, @@ -402,8 +411,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_GetEstate } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_InvalidContractId_ResponseIsInvalidContractIdValue() - { + public async Task TransactionValidationService_ValidateSaleTransaction_InvalidContractId_ResponseIsInvalidContractIdValue() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -412,25 +420,25 @@ public async Task TransactionValidationService_ValidateSaleTransaction_InvalidCo .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) - .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - Guid.Empty, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + Guid.Empty, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidContractIdValue); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_InvalidProductId_ResponseIsInvalidProductIdValue() - { + public async Task TransactionValidationService_ValidateSaleTransaction_InvalidProductId_ResponseIsInvalidProductIdValue() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -440,15 +448,16 @@ public async Task TransactionValidationService_ValidateSaleTransaction_InvalidPr this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - Guid.Empty, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + Guid.Empty, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidProductIdValue); @@ -457,31 +466,30 @@ public async Task TransactionValidationService_ValidateSaleTransaction_InvalidPr [Theory] [InlineData(0)] [InlineData(-1)] - public async Task TransactionValidationService_ValidateSaleTransaction_InvalidTransactionAmount_ResponseIsInvalidSaleTransactionAmount(Decimal transactionAmount) - { + public async Task TransactionValidationService_ValidateSaleTransaction_InvalidTransactionAmount_ResponseIsInvalidSaleTransactionAmount(Decimal transactionAmount) { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - transactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + transactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidSaleTransactionAmount); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantDeviceListEmpty_ResponseIsNoValidDevices() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantDeviceListEmpty_ResponseIsNoValidDevices() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -489,23 +497,23 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantD this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.CreatedMerchantAggregate()); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier1, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier1); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.NoValidDevices); } - + [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantDoesNotHaveSuppliedContract_ResponseIsContractNotValidForMerchant() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantDoesNotHaveSuppliedContract_ResponseIsContractNotValidForMerchant() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -513,25 +521,25 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantD this.AggregateService.Get(Arg.Any(), Arg.Any()).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) - .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId1, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId1, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.ContractNotValidForMerchant); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantHasNoContracts_ResponseIsMerchantDoesNotHaveEnoughCredit() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantHasNoContracts_ResponseIsMerchantDoesNotHaveEnoughCredit() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -541,25 +549,25 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantH this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) - .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.MerchantHasNoContractsConfigured); } - + [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantNotEnoughCredit_ResponseIsMerchantDoesNotHaveEnoughCredit() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantNotEnoughCredit_ResponseIsMerchantDoesNotHaveEnoughCredit() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -568,23 +576,23 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantN this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionStateNoCredit)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.MerchantDoesNotHaveEnoughCredit); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantNotFound_ResponseIsInvalidMerchantId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantNotFound_ResponseIsInvalidMerchantId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -592,24 +600,22 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantN this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound("Merchant not found")); - - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidMerchantId); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_FailedGettingMerchant_ResponseIsInvalidMerchantId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_FailedGettingMerchant_ResponseIsInvalidMerchantId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -617,23 +623,23 @@ public async Task TransactionValidationService_ValidateSaleTransaction_FailedGet this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("Merchant not found")); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.UnknownFailure); } [Fact(Skip = "Need to review if test is needed now")] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantNotFoundOnGetContract_ResponseIsInvalidMerchantId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantNotFoundOnGetContract_ResponseIsInvalidMerchantId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -644,25 +650,25 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantN .Then().ReturnsAsync(Result.NotFound()); this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) - .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.InvalidMerchantId); } [Fact(Skip = "not sure if this needed now")] - public async Task TransactionValidationService_ValidateSaleTransaction_FailedGettingMerchantOnGetContract_ResponseIsInvalidMerchantId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_FailedGettingMerchantOnGetContract_ResponseIsInvalidMerchantId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -672,25 +678,25 @@ public async Task TransactionValidationService_ValidateSaleTransaction_FailedGet .Then().ReturnsAsync(Result.NotFound()); this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) - .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.UnknownFailure); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantOperatorListEmpty_ResponseIsNoMerchantOperators() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantOperatorListEmpty_ResponseIsNoMerchantOperators() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -699,23 +705,23 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantO this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithDevice()); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.NoMerchantOperators); } - + [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_MerchantOperatorIsDeleted_ResponseIsOperatorNotEnabledForMerchant() - { + public async Task TransactionValidationService_ValidateSaleTransaction_MerchantOperatorIsDeleted_ResponseIsOperatorNotEnabledForMerchant() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -723,47 +729,45 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantO this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithDeletedOperator(SettlementSchedule.Immediate)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.OperatorNotEnabledForMerchant); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_OperatorNotConfiguredFroMerchant_ResponseIsOperatorNotValidForMerchant() - { + public async Task TransactionValidationService_ValidateSaleTransaction_OperatorNotConfiguredFroMerchant_ResponseIsOperatorNotValidForMerchant() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator2())); this.AggregateService.Get(Arg.Any(), Arg.Any()).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); - - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId2, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId2, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.OperatorNotValidForMerchant); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_ProductIdNotConfigured_ResponseIsProductNotValidForMerchant() - { + public async Task TransactionValidationService_ValidateSaleTransaction_ProductIdNotConfigured_ResponseIsProductNotValidForMerchant() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -771,25 +775,25 @@ public async Task TransactionValidationService_ValidateSaleTransaction_ProductId this.AggregateService.Get(Arg.Any(), Arg.Any()).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) - .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); + - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId1, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId1, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.ProductNotValidForMerchant); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_SuccessfulSale() - { + public async Task TransactionValidationService_ValidateSaleTransaction_SuccessfulSale() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -799,15 +803,16 @@ public async Task TransactionValidationService_ValidateSaleTransaction_Successfu this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsSuccess.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.Success); } @@ -815,8 +820,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_Successfu [Theory] [InlineData(TransactionSource.NotSet)] [InlineData(TransactionSource.FileImport)] - public async Task TransactionValidationService_ValidateSaleTransaction_NonOnlineSaleWithMissingDevice_ResponseIsSuccess(TransactionSource transactionSource) - { + public async Task TransactionValidationService_ValidateSaleTransaction_NonOnlineSaleWithMissingDevice_ResponseIsSuccess(TransactionSource transactionSource) { this.AggregateService.Get(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -825,23 +829,23 @@ public async Task TransactionValidationService_ValidateSaleTransaction_NonOnline this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)); - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - null, - TestData.OperatorId, - TestData.TransactionAmount, - transactionSource, - TestContext.Current.CancellationToken); + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + null); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + transactionSource, + TestContext.Current.CancellationToken); result.IsSuccess.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.Success); } [Fact] - public async Task TransactionValidationService_ValidateSaleTransaction_FailedGettingMerchantBalance_ResponseIsInvalidMerchantId() - { + public async Task TransactionValidationService_ValidateSaleTransaction_FailedGettingMerchantBalance_ResponseIsInvalidMerchantId() { this.SecurityServiceClient.GetToken(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.AggregateService.Get(Arg.Any(), Arg.Any()) @@ -850,17 +854,18 @@ public async Task TransactionValidationService_ValidateSaleTransaction_FailedGet .ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate)); this.EventStoreContext.GetPartitionStateFromProjection(Arg.Any(), Arg.Any(), Arg.Any()) - .ReturnsAsync(Result.Failure()); - - var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId, - TestData.MerchantId, - TestData.ContractId, - TestData.ProductId, - TestData.DeviceIdentifier, - TestData.OperatorId, - TestData.TransactionAmount, - TransactionSource.OnlineSale, - TestContext.Current.CancellationToken); + .ReturnsAsync(Result.Failure()); + + + TransactionValidationIdentifiers identifiers = new(TestData.EstateId, TestData.MerchantId, + TestData.DeviceIdentifier); + Result result = await this.TransactionValidationService.ValidateSaleTransaction(identifiers, + TestData.ContractId, + TestData.ProductId, + TestData.OperatorId, + TestData.TransactionAmount, + TransactionSource.OnlineSale, + TestContext.Current.CancellationToken); result.IsFailed.ShouldBeTrue(); result.Data.ResponseCode.ShouldBe(TransactionResponseCode.UnknownFailure); diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs index 5ddade9e..5cc13c54 100644 --- a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs @@ -105,7 +105,8 @@ public async Task> ProcessLogonTransacti if (stateResult.IsFailed) return ResultHelpers.CreateFailure(stateResult); - Result validationResult = await this.TransactionValidationService.ValidateLogonTransaction(command.EstateId, command.MerchantId, command.DeviceIdentifier, cancellationToken); + TransactionValidationIdentifiers validationIdentifiers = new(command.EstateId, command.MerchantId, command.DeviceIdentifier); + Result validationResult = await this.TransactionValidationService.ValidateLogonTransaction(validationIdentifiers, cancellationToken); stateResult = await this.RecordLogonTransactionValidation(command, transactionAggregate, validationResult, cancellationToken); if (stateResult.IsFailed) return ResultHelpers.CreateFailure(stateResult); @@ -136,7 +137,8 @@ public async Task> ProcessRecon return ResultHelpers.CreateFailure(reconciliationResult); ReconciliationAggregate reconciliationAggregate = reconciliationResult.Data; - Result validationResult = await this.TransactionValidationService.ValidateReconciliationTransaction(command.EstateId, command.MerchantId, command.DeviceIdentifier, cancellationToken); + TransactionValidationIdentifiers validationIdentifiers = new(command.EstateId, command.MerchantId, command.DeviceIdentifier); + Result validationResult = await this.TransactionValidationService.ValidateReconciliationTransaction(validationIdentifiers, cancellationToken); Result stateResult = this.ProcessReconciliation(reconciliationAggregate, command, validationResult); if (stateResult.IsFailed) return ResultHelpers.CreateFailure(stateResult); @@ -614,8 +616,8 @@ private async Task> ValidateTransaction(Tran Decimal? amount = command.AdditionalTransactionMetadata.ExtractFieldFromMetadata("Amount"); Logger.LogInformation("Validating Sale Transaction Id {TransactionId} for Merchant {MerchantId}, Product {ProductId}", command.TransactionId, command.MerchantId, command.ProductId); TransactionSource transactionSourceValue = (TransactionSource)command.TransactionSource; - - Result result = await TransactionValidationService.ValidateSaleTransaction(command.EstateId, command.MerchantId, command.ContractId, command.ProductId, command.DeviceIdentifier, command.OperatorId, amount, transactionSourceValue, cancellationToken); + TransactionValidationIdentifiers validationIdentifiers = new(command.EstateId, command.MerchantId, command.DeviceIdentifier); + Result result = await TransactionValidationService.ValidateSaleTransaction(validationIdentifiers, command.ContractId, command.ProductId, command.OperatorId, amount, transactionSourceValue, cancellationToken); Logger.LogInformation("Validation completed for Transaction Id {TransactionId} with ResponseCode {ResponseCode}, Message {ResponseMessage}", command.TransactionId, result.Data?.ResponseCode, result.Data?.ResponseMessage); diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs index 3221bd68..66158569 100644 --- a/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs +++ b/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs @@ -17,24 +17,22 @@ namespace TransactionProcessor.BusinessLogic.Services; using System.Threading.Tasks; using TransactionProcessor.Models; +public record TransactionValidationIdentifiers(Guid EstateId, + Guid MerchantId, + String DeviceIdentifier); + public interface ITransactionValidationService { #region Methods - Task> ValidateLogonTransaction(Guid estateId, - Guid merchantId, - String deviceIdentifier, + Task> ValidateLogonTransaction(TransactionValidationIdentifiers transactionValidationIdentifiers, CancellationToken cancellationToken); - Task> ValidateReconciliationTransaction(Guid estateId, - Guid merchantId, - String deviceIdentifier, + Task> ValidateReconciliationTransaction(TransactionValidationIdentifiers transactionValidationIdentifiers, CancellationToken cancellationToken); - Task> ValidateSaleTransaction(Guid estateId, - Guid merchantId, + Task> ValidateSaleTransaction(TransactionValidationIdentifiers transactionValidationIdentifiers, Guid contractId, Guid productId, - String deviceIdentifier, Guid operatorId, Decimal? transactionAmount, TransactionSource transactionSource, @@ -67,47 +65,43 @@ internal static Result CreateFailedResult(T resultData) { } - public async Task> ValidateLogonTransaction(Guid estateId, - Guid merchantId, - String deviceIdentifier, - CancellationToken cancellationToken) { + public async Task> ValidateLogonTransaction(TransactionValidationIdentifiers transactionValidationIdentifiers, + CancellationToken cancellationToken) { // Validate Estate - Result> estateValidationResult = await ValidateEstate(estateId, cancellationToken); + Result> estateValidationResult = await ValidateEstate(transactionValidationIdentifiers.EstateId, cancellationToken); if (estateValidationResult.IsFailed) return CreateFailedResult(estateValidationResult.Data.validationResult); // Validate Merchant - var merchantValidationResult = await ValidateMerchant(estateValidationResult.Data.additionalData.EstateName, merchantId, cancellationToken); + var merchantValidationResult = await ValidateMerchant(estateValidationResult.Data.additionalData.EstateName, transactionValidationIdentifiers.MerchantId, cancellationToken); if (merchantValidationResult.IsFailed) return CreateFailedResult(merchantValidationResult.Data.validationResult); Models.Merchant.Merchant merchant = merchantValidationResult.Data.additionalData.GetMerchant(); // Validate Device - Result deviceValidationResult = ValidateDeviceForLogon(merchant, deviceIdentifier); + Result deviceValidationResult = ValidateDeviceForLogon(merchant, transactionValidationIdentifiers.DeviceIdentifier); if (deviceValidationResult.IsFailed) return deviceValidationResult; // Validate the merchant device return deviceValidationResult; } - public async Task> ValidateReconciliationTransaction(Guid estateId, - Guid merchantId, - String deviceIdentifier, - CancellationToken cancellationToken) + public async Task> ValidateReconciliationTransaction(TransactionValidationIdentifiers transactionValidationIdentifiers, + CancellationToken cancellationToken) { // Validate Estate - Result> estateValidationResult = await ValidateEstate(estateId, cancellationToken); + Result> estateValidationResult = await ValidateEstate(transactionValidationIdentifiers.EstateId, cancellationToken); if (estateValidationResult.IsFailed) return CreateFailedResult(estateValidationResult.Data.validationResult); EstateAggregate estate = estateValidationResult.Data.additionalData; // Validate Merchant - Result> merchantValidationResult = await ValidateMerchant(estate.EstateName, merchantId, cancellationToken); + Result> merchantValidationResult = await ValidateMerchant(estate.EstateName, transactionValidationIdentifiers.MerchantId, cancellationToken); if (merchantValidationResult.IsFailed) return CreateFailedResult(merchantValidationResult.Data.validationResult); var merchant = merchantValidationResult.Data.additionalData.GetMerchant(); // Validate Device - Result deviceValidationResult = ValidateDevice(merchant, deviceIdentifier); + Result deviceValidationResult = ValidateDevice(merchant, transactionValidationIdentifiers.DeviceIdentifier); if (deviceValidationResult.IsFailed) return deviceValidationResult; // Validate the merchant device @@ -118,18 +112,16 @@ public async Task> ValidateReconciliationTra #endregion - public async Task> ValidateSaleTransaction(Guid estateId, - Guid merchantId, - Guid contractId, - Guid productId, - String deviceIdentifier, - Guid operatorId, - Decimal? transactionAmount, - TransactionSource transactionSource, - CancellationToken cancellationToken) + public async Task> ValidateSaleTransaction(TransactionValidationIdentifiers transactionValidationIdentifiers, + Guid contractId, + Guid productId, + Guid operatorId, + Decimal? transactionAmount, + TransactionSource transactionSource, + CancellationToken cancellationToken) { // Validate Estate - Result> estateValidationResult = await ValidateEstate(estateId, cancellationToken); + Result> estateValidationResult = await ValidateEstate(transactionValidationIdentifiers.EstateId, cancellationToken); if (estateValidationResult.IsFailed) return CreateFailedResult(estateValidationResult.Data.validationResult); EstateAggregate estate = estateValidationResult.Data.additionalData; @@ -139,7 +131,7 @@ public async Task> ValidateSaleTransaction(G if (estateOperatorValidationResult.IsFailed) return estateOperatorValidationResult; // Validate Merchant - Result> merchantValidationResult = await ValidateMerchant(estate.EstateName, merchantId, cancellationToken); + Result> merchantValidationResult = await ValidateMerchant(estate.EstateName, transactionValidationIdentifiers.MerchantId, cancellationToken); if (merchantValidationResult.IsFailed) return CreateFailedResult(merchantValidationResult.Data.validationResult); Models.Merchant.Merchant merchant = merchantValidationResult.Data.additionalData.GetMerchant(); @@ -147,7 +139,7 @@ public async Task> ValidateSaleTransaction(G if (transactionSource == TransactionSource.OnlineSale) { // Validate Device - Result deviceValidationResult = ValidateDevice(merchant, deviceIdentifier); + Result deviceValidationResult = ValidateDevice(merchant, transactionValidationIdentifiers.DeviceIdentifier); if (deviceValidationResult.IsFailed) return deviceValidationResult; } @@ -160,7 +152,7 @@ public async Task> ValidateSaleTransaction(G if (contractProductValidationResult.IsFailed) return contractProductValidationResult; // Validate Transaction Amount - Result transactionAmountValidationResult = await ValidateTransactionAmount(merchantId, merchant.MerchantName, transactionAmount, cancellationToken); + Result transactionAmountValidationResult = await ValidateTransactionAmount(transactionValidationIdentifiers.MerchantId, merchant.MerchantName, transactionAmount, cancellationToken); if (transactionAmountValidationResult.IsFailed) return transactionAmountValidationResult; // If we get here everything is good