From 911d80c186bd2da4898a2980bb5c9c61a59d39c1 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Tue, 26 Aug 2025 15:22:46 +0100 Subject: [PATCH] handle duplicates on contract product transaction fee --- .../ContractEventTests.cs | 22 ++++++++++++++++++- ...TransactionProcessorReadModelRepository.cs | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/TransactionProcessor.DatabaseTests/ContractEventTests.cs b/TransactionProcessor.DatabaseTests/ContractEventTests.cs index 4182635..713bc97 100644 --- a/TransactionProcessor.DatabaseTests/ContractEventTests.cs +++ b/TransactionProcessor.DatabaseTests/ContractEventTests.cs @@ -73,7 +73,27 @@ public async Task AddContractProduct_ContractProductIsAdded_EventReplayHandled() result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - + } + + [Fact] + public async Task AddContractProductTransactionFee_ContractIsAdded() + { + Result result = await this.Repository.AddContractProductTransactionFee(TestData.DomainEvents.TransactionFeeForProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + EstateManagementContext context = this.GetContext(); + ContractProductTransactionFee? contractProductTransactionFee = await context.ContractProductTransactionFees.SingleOrDefaultAsync(c => c.ContractProductId == TestData.DomainEvents.TransactionFeeForProductAddedToContractEvent.ProductId && + c.ContractProductTransactionFeeId == TestData.DomainEvents.TransactionFeeForProductAddedToContractEvent.TransactionFeeId); + contractProductTransactionFee.ShouldNotBeNull(); + } + + [Fact] + public async Task AddContractProductTransactionFee_ContractIsAdded_EventReplayHandled() + { + Result result = await this.Repository.AddContractProductTransactionFee(TestData.DomainEvents.TransactionFeeForProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + + result = await this.Repository.AddContractProductTransactionFee(TestData.DomainEvents.TransactionFeeForProductAddedToContractEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); } } } diff --git a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs index 521442f..fed7c38 100644 --- a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs +++ b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs @@ -960,7 +960,7 @@ public async Task AddContractProductTransactionFee(ContractDomainEvents. await context.ContractProductTransactionFees.AddAsync(contractProductTransactionFee, cancellationToken); - return await context.SaveChangesAsync(cancellationToken); + return await context.SaveChangesWithDuplicateHandling(cancellationToken); } public async Task AddEstate(EstateDomainEvents.EstateCreatedEvent domainEvent,