diff --git a/TransactionProcessor.Aggregates.Tests/ContractAggregateTests.cs b/TransactionProcessor.Aggregates.Tests/ContractAggregateTests.cs index 39f771e3..f2a48d67 100644 --- a/TransactionProcessor.Aggregates.Tests/ContractAggregateTests.cs +++ b/TransactionProcessor.Aggregates.Tests/ContractAggregateTests.cs @@ -68,7 +68,7 @@ public void ContractAggregate_AddFixedValueProduct_ProductAdded() ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddFixedValueProduct(TestData.ContractProductId, + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, @@ -91,11 +91,11 @@ public void ContractAggregate_AddFixedValueProduct_DuplicateProduct_ErrorThrown( ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddFixedValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); Should.Throw(() => { - aggregate.AddFixedValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); }); } @@ -109,7 +109,7 @@ public void ContractAggregate_AddFixedValueProduct_InvalidProductName_ErrorThrow Should.Throw(() => { - aggregate.AddFixedValueProduct(TestData.ContractProductId, productName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, productName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); }); } @@ -123,7 +123,7 @@ public void ContractAggregate_AddFixedValueProduct_InvalidProductDisplayText_Err Should.Throw(() => { - aggregate.AddFixedValueProduct(TestData.ContractProductId, TestData.ProductName, displayText, TestData.ProductFixedValue,TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, displayText, TestData.ProductFixedValue,TestData.ProductTypeMobileTopup); }); } @@ -137,7 +137,7 @@ public void ContractAggregate_AddFixedValueProduct_InvalidProductValue_ErrorThro Should.Throw(() => { - aggregate.AddFixedValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, value, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, value, TestData.ProductTypeMobileTopup); }); } @@ -147,7 +147,7 @@ public void ContractAggregate_AddVariableValueProduct_ProductAdded() ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); products.Count.ShouldBe(1); @@ -166,11 +166,11 @@ public void ContractAggregate_AddVariableValueProduct_DuplicateProduct_ErrorThro ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); Should.Throw(() => { - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); }); } @@ -184,7 +184,7 @@ public void ContractAggregate_AddVariableValueProduct_InvalidProductName_ErrorTh Should.Throw(() => { - aggregate.AddVariableValueProduct(TestData.ContractProductId, productName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, productName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); }); } @@ -198,7 +198,7 @@ public void ContractAggregate_AddVariableValueProduct_InvalidProductDisplayText_ Should.Throw(() => { - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, displayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, displayText, TestData.ProductTypeMobileTopup); }); } @@ -225,7 +225,7 @@ public void ContractAggregate_AddTransactionFee_FixedValueProduct_TransactionFee { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddFixedValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -253,7 +253,7 @@ public void ContractAggregate_AddTransactionFee_FixedValueProduct_InvalidFeeId_E { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddFixedValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -277,7 +277,7 @@ public void ContractAggregate_AddTransactionFee_FixedValueProduct_InvalidFeeDesc { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddFixedValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -297,7 +297,7 @@ public void ContractAggregate_AddTransactionFee_VariableValueProduct_Transaction { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -325,7 +325,7 @@ public void ContractAggregate_AddTransactionFee_VariableValueProduct_InvalidFeeI { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -349,7 +349,7 @@ public void ContractAggregate_AddTransactionFee_VariableValueProduct_InvalidFeeD { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -385,7 +385,7 @@ public void ContractAggregate_AddTransactionFee_ProductNotFound_ErrorThrown(Calc { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddFixedValueProduct(TestData.ContractProductId,TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); + aggregate.AddFixedValueProduct(TestData.FixedContractProductId,TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); Should.Throw(() => { @@ -400,7 +400,7 @@ public void ContractAggregate_AddTransactionFee_FixedValueProduct_InvalidCalcula { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -418,7 +418,7 @@ public void ContractAggregate_AddTransactionFee_FixedValueProduct_InvalidFeeType { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -442,7 +442,7 @@ public void ContractAggregate_AddTransactionFee_VariableValueProduct_InvalidFeeV { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -466,7 +466,7 @@ public void ContractAggregate_AddTransactionFee_FixedValueProduct_InvalidFeeValu { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -484,7 +484,7 @@ public void ContractAggregate_AddTransactionFee_VariableValueProduct_InvalidCalc { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -502,7 +502,7 @@ public void ContractAggregate_AddTransactionFee_VariableValueProduct_InvalidFeeT { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -522,7 +522,7 @@ public void ContractAggregate_DisableTransactionFee_TransactionFeeIsDisabled(Cal { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); List products = aggregate.GetProducts(); Product product = products.Single(); @@ -535,7 +535,7 @@ public void ContractAggregate_DisableTransactionFee_TransactionFeeIsDisabled(Cal ContractProductTransactionFee? fee = productWithFees.TransactionFees.Single(); fee.IsEnabled.ShouldBeTrue(); - aggregate.DisableTransactionFee(TestData.ContractProductId, TestData.TransactionFeeId); + aggregate.DisableTransactionFee(TestData.VariableContractProductId, TestData.TransactionFeeId); productsAfterFeeAdded = aggregate.GetProducts(); productWithFees = productsAfterFeeAdded.Single(); @@ -552,7 +552,7 @@ public void ContractAggregate_DisableTransactionFee_ProductNotFound_ErrorThrown( Should.Throw(() => { - aggregate.DisableTransactionFee(TestData.ContractProductId, TestData.TransactionFeeId); + aggregate.DisableTransactionFee(TestData.VariableContractProductId, TestData.TransactionFeeId); }); } @@ -561,11 +561,11 @@ public void ContractAggregate_DisableTransactionFee_TransactionFeeNotFound_Error { ContractAggregate aggregate = ContractAggregate.Create(TestData.ContractId); aggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - aggregate.AddVariableValueProduct(TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); + aggregate.AddVariableValueProduct(TestData.VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductTypeMobileTopup); Should.Throw(() => { - aggregate.DisableTransactionFee(TestData.ContractProductId, TestData.TransactionFeeId); + aggregate.DisableTransactionFee(TestData.VariableContractProductId, TestData.TransactionFeeId); }); } } diff --git a/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs b/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs index 04a896fa..56fa359c 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs @@ -117,7 +117,7 @@ public async Task TransactionProcessorManager_GetContract_ContractIsReturned() contractModel.Description.ShouldBe(TestData.ContractDescription); contractModel.OperatorId.ShouldBe(TestData.OperatorId); contractModel.Products.ShouldNotBeNull(); - contractModel.Products.First().ContractProductId.ShouldBe(TestData.ContractProductId); + contractModel.Products.First().ContractProductId.ShouldBe(TestData.VariableContractProductId); contractModel.Products.First().TransactionFees.ShouldNotBeNull(); contractModel.Products.First().TransactionFees.First().TransactionFeeId.ShouldBe(TestData.TransactionFeeId); } @@ -166,7 +166,7 @@ public async Task TransactionProcessorManager_GetTransactionFeesForProduct_Trans { this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedContractAggregateWithAProductAndTransactionFee(CalculationType.Fixed, FeeType.Merchant))); - Result> getTransactionFeesForProductResult = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.ContractProductId, CancellationToken.None); + Result> getTransactionFeesForProductResult = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.VariableContractProductId, CancellationToken.None); getTransactionFeesForProductResult.IsSuccess.ShouldBeTrue(); List transactionFees = getTransactionFeesForProductResult.Data; transactionFees.ShouldNotBeNull(); @@ -179,7 +179,7 @@ public async Task TransactionProcessorManager_GetTransactionFeesForProduct_Contr { this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate())); - Result> result = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.ContractProductId, CancellationToken.None); + Result> result = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.FixedContractProductId, CancellationToken.None); result.IsFailed.ShouldBeTrue(); } @@ -188,7 +188,7 @@ public async Task TransactionProcessorManager_GetTransactionFeesForProduct_Produ { this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedContractAggregate())); - Result> result = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.ContractProductId, CancellationToken.None); + Result> result = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.FixedContractProductId, CancellationToken.None); result.IsFailed.ShouldBeTrue(); } @@ -197,7 +197,7 @@ public async Task TransactionProcessorManager_GetTransactionFeesForProduct_GetLa { this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Failure()); - Result> result = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.ContractProductId, CancellationToken.None); + Result> result = await this.TransactionProcessorManager.GetTransactionFeesForProduct(TestData.EstateId, TestData.MerchantId, TestData.ContractId, TestData.FixedContractProductId, CancellationToken.None); result.IsFailed.ShouldBeTrue(); } /* diff --git a/TransactionProcessor.DatabaseTests/ContractEventTests.cs b/TransactionProcessor.DatabaseTests/ContractEventTests.cs index c8e58f9d..41826357 100644 --- a/TransactionProcessor.DatabaseTests/ContractEventTests.cs +++ b/TransactionProcessor.DatabaseTests/ContractEventTests.cs @@ -32,5 +32,48 @@ public async Task AddContract_ContractIsAdded_EventReplayHandled() { result = await this.Repository.AddContract(TestData.DomainEvents.ContractCreatedEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); } + + [Fact] + public async Task AddContractProduct_ContractProductIsAdded() + { + Result result = await this.Repository.AddContractProduct(TestData.DomainEvents.FixedValueProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + EstateManagementContext context = this.GetContext(); + ContractProduct? fixedContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ContractId && + c.ContractProductId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ProductId); + fixedContractProduct.ShouldNotBeNull(); + + result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + context = this.GetContext(); + ContractProduct? variableContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ContractId && + c.ContractProductId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ProductId); + variableContractProduct.ShouldNotBeNull(); + } + + [Fact] + public async Task AddContractProduct_ContractProductIsAdded_EventReplayHandled() + { + Result result = await this.Repository.AddContractProduct(TestData.DomainEvents.FixedValueProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + EstateManagementContext context = this.GetContext(); + ContractProduct? fixedContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ContractId && + c.ContractProductId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ProductId); + fixedContractProduct.ShouldNotBeNull(); + + result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + context = this.GetContext(); + ContractProduct? variableContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ContractId && + c.ContractProductId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ProductId); + variableContractProduct.ShouldNotBeNull(); + + result = await this.Repository.AddContractProduct(TestData.DomainEvents.FixedValueProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + + result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + + } } } diff --git a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs index c1f329be..521442f6 100644 --- a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs +++ b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs @@ -1678,7 +1678,7 @@ public async Task AddContractProduct(ContractDomainEvents.VariableValueP await context.ContractProducts.AddAsync(contractProduct, cancellationToken); - return await context.SaveChangesAsync(cancellationToken); + return await context.SaveChangesWithDuplicateHandling(cancellationToken); } public async Task AddContractProduct(ContractDomainEvents.FixedValueProductAddedToContractEvent domainEvent, @@ -1697,7 +1697,7 @@ public async Task AddContractProduct(ContractDomainEvents.FixedValueProd await context.ContractProducts.AddAsync(contractProduct, cancellationToken); - return await context.SaveChangesAsync(cancellationToken); + return await context.SaveChangesWithDuplicateHandling(cancellationToken); } public async Task MarkStatementAsGenerated(StatementGeneratedEvent domainEvent, diff --git a/TransactionProcessor.Testing/TestData.cs b/TransactionProcessor.Testing/TestData.cs index f9e03913..c3ed4864 100644 --- a/TransactionProcessor.Testing/TestData.cs +++ b/TransactionProcessor.Testing/TestData.cs @@ -99,7 +99,7 @@ public class TestData OperatorName = TestData.OperatorName, Products = new List{ new Product{ - ContractProductId = TestData.ContractProductId, + ContractProductId = VariableContractProductId, Value = TestData.ProductFixedValue, DisplayText = TestData.ProductDisplayText, Name = TestData.ProductName @@ -205,7 +205,7 @@ public class TestData Products = new List{ new Product{ Value = TestData.ProductFixedValue, - ContractProductId = TestData.ContractProductId, + ContractProductId = FixedContractProductId, DisplayText = TestData.ProductDisplayText, Name = TestData.ProductName, TransactionFees = null @@ -483,7 +483,7 @@ public class TestData Products = new List{ new Product{ Value = TestData.ProductFixedValue, - ContractProductId = TestData.ContractProductId, + ContractProductId = FixedContractProductId, DisplayText = TestData.ProductDisplayText, Name = TestData.ProductName, TransactionFees = new List{ @@ -500,7 +500,8 @@ public class TestData public static String EmailAddress = "testuser1@testestate1.co.uk"; public static String ContractDescription = "Test Contract"; - public static Guid ContractProductId = Guid.Parse("C6309D4C-3182-4D96-AEEA-E9DBBB9DED8F"); + public static Guid VariableContractProductId = Guid.Parse("C6309D4C-3182-4D96-AEEA-E9DBBB9DED8F"); + public static Guid FixedContractProductId = Guid.Parse("11F5A576-B2A7-4488-B34B-0392199447F0"); public static String ProductName = "Product 1"; public static String ProductDisplayText = "100 KES"; public static Decimal ProductFixedValue = 100.00m; @@ -2200,19 +2201,19 @@ public static ContractCommands.AddTransactionFeeForProductToContractCommand x.FeeType = feeType; ContractCommands.AddTransactionFeeForProductToContractCommand cmd = new(EstateId, ContractId, - ContractProductId, TransactionFeeId, x); + FixedContractProductId, TransactionFeeId, x); return cmd; } public static ContractCommands.DisableTransactionFeeForProductCommand DisableTransactionFeeForProductCommand = new ContractCommands.DisableTransactionFeeForProductCommand(TestData.EstateId, TestData.ContractId, - TestData.ContractProductId, TestData.TransactionFeeId); + TestData.VariableContractProductId, TestData.TransactionFeeId); public static ContractCommands.AddProductToContractCommand AddProductToContractCommand_FixedValue => - new(EstateId, ContractId, ContractProductId, TestData.AddProductToContractRequest_FixedValue); + new(EstateId, ContractId, FixedContractProductId, TestData.AddProductToContractRequest_FixedValue); public static ContractCommands.AddProductToContractCommand AddProductToContractCommand_VariableValue => - new(EstateId, ContractId, ContractProductId, TestData.AddProductToContractRequest_VariableValue); + new(EstateId, ContractId, VariableContractProductId, TestData.AddProductToContractRequest_VariableValue); public static ContractCommands.CreateContractCommand CreateContractCommand => new ContractCommands.CreateContractCommand(EstateId, ContractId, CreateContractRequest); @@ -2259,7 +2260,7 @@ public static class Queries { new MerchantQueries.GetTransactionFeesForProductQuery(TestData.EstateId, TestData.MerchantId, TestData.ContractId, - TestData.ContractProductId); + TestData.FixedContractProductId); public static MerchantQueries.GetMerchantContractsQuery GetMerchantContractsQuery => new MerchantQueries.GetMerchantContractsQuery(TestData.EstateId, TestData.MerchantId); public static MerchantQueries.GetMerchantQuery GetMerchantQuery => new MerchantQueries.GetMerchantQuery(TestData.EstateId, TestData.MerchantId); @@ -2445,7 +2446,7 @@ public static ContractAggregate CreatedContractAggregateWithAProduct() ContractAggregate contractAggregate = ContractAggregate.Create(TestData.ContractId); contractAggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - contractAggregate.AddFixedValueProduct(TestData.ContractProductId, + contractAggregate.AddFixedValueProduct(TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, @@ -2459,13 +2460,13 @@ public static ContractAggregate CreatedContractAggregateWithAProductAndTransacti ContractAggregate contractAggregate = ContractAggregate.Create(TestData.ContractId); contractAggregate.Create(TestData.EstateId, TestData.OperatorId, TestData.ContractDescription); - contractAggregate.AddFixedValueProduct(TestData.ContractProductId, + contractAggregate.AddFixedValueProduct(VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue, TestData.ProductTypeMobileTopup); - Product product = contractAggregate.GetProducts().Single(p => p.ContractProductId == TestData.ContractProductId); + Product product = contractAggregate.GetProducts().Single(p => p.ContractProductId == VariableContractProductId); contractAggregate.AddTransactionFee(product, TestData.TransactionFeeId, TestData.TransactionFeeDescription, @@ -2730,19 +2731,19 @@ public static class DomainEvents { public static ContractDomainEvents.TransactionFeeForProductAddedToContractEvent TransactionFeeForProductAddedToContractEvent => new ContractDomainEvents.TransactionFeeForProductAddedToContractEvent(TestData.ContractId, TestData.EstateId, - TestData.ContractProductId, + TestData.FixedContractProductId, TestData.TransactionFeeId, TestData.TransactionFeeDescription, TestData.FeeCalculationType, TestData.FeeType, TestData.FeeValue); - public static ContractDomainEvents.TransactionFeeForProductDisabledEvent TransactionFeeForProductDisabledEvent => new ContractDomainEvents.TransactionFeeForProductDisabledEvent(TestData.ContractId, TestData.EstateId, TestData.ContractProductId, TestData.TransactionFeeId); - public static ContractDomainEvents.VariableValueProductAddedToContractEvent VariableValueProductAddedToContractEvent => new ContractDomainEvents.VariableValueProductAddedToContractEvent(TestData.ContractId, TestData.EstateId, TestData.ContractProductId, TestData.ProductName, TestData.ProductDisplayText, (Int32)TestData.ProductTypeMobileTopup); + public static ContractDomainEvents.TransactionFeeForProductDisabledEvent TransactionFeeForProductDisabledEvent => new ContractDomainEvents.TransactionFeeForProductDisabledEvent(TestData.ContractId, TestData.EstateId, TestData.FixedContractProductId, TestData.TransactionFeeId); + public static ContractDomainEvents.VariableValueProductAddedToContractEvent VariableValueProductAddedToContractEvent => new ContractDomainEvents.VariableValueProductAddedToContractEvent(TestData.ContractId, TestData.EstateId, VariableContractProductId, TestData.ProductName, TestData.ProductDisplayText, (Int32)TestData.ProductTypeMobileTopup); public static ContractDomainEvents.FixedValueProductAddedToContractEvent FixedValueProductAddedToContractEvent => new ContractDomainEvents.FixedValueProductAddedToContractEvent(TestData.ContractId, TestData.EstateId, - TestData.ContractProductId, + TestData.FixedContractProductId, TestData.ProductName, TestData.ProductDisplayText, TestData.ProductFixedValue,