diff --git a/TransactionProcessor.DatabaseTests/BaseTest.cs b/TransactionProcessor.DatabaseTests/BaseTest.cs index 7c6135e9..c0d56bb4 100644 --- a/TransactionProcessor.DatabaseTests/BaseTest.cs +++ b/TransactionProcessor.DatabaseTests/BaseTest.cs @@ -57,8 +57,8 @@ public async Task GetRepository() this.Repository = new TransactionProcessorReadModelRepository(resolver.Object); } - public virtual async Task DisposeAsync() - { + public virtual async Task DisposeAsync() { + await this.DockerHelper.StopContainersForScenarioRun(DockerServices.None); } //protected abstract Task ClearStandingData(); @@ -94,16 +94,16 @@ internal async Task StartSqlContainer() await DockerHelper.StartContainersForScenarioRun(this.TestId.ToString(), DockerServices.SqlServer); } - public void Dispose() - { - EstateManagementContext context = new EstateManagementContext(this.GetLocalConnectionString($"EstateReportingReadModel{this.TestId.ToString()}")); + //public void Dispose() + //{ + // EstateManagementContext context = new EstateManagementContext(this.GetLocalConnectionString($"EstateReportingReadModel{this.TestId.ToString()}")); - Console.WriteLine($"About to delete database EstateReportingReadModel{this.TestId.ToString()}"); - Boolean result = context.Database.EnsureDeleted(); - Console.WriteLine($"Delete result is {result}"); - result.ShouldBeTrue(); + // Console.WriteLine($"About to delete database EstateReportingReadModel{this.TestId.ToString()}"); + // Boolean result = context.Database.EnsureDeleted(); + // Console.WriteLine($"Delete result is {result}"); + // result.ShouldBeTrue(); - } + //} } diff --git a/TransactionProcessor.DatabaseTests/ContractEventTests.cs b/TransactionProcessor.DatabaseTests/ContractEventTests.cs index 7cf896fa..e8607cc0 100644 --- a/TransactionProcessor.DatabaseTests/ContractEventTests.cs +++ b/TransactionProcessor.DatabaseTests/ContractEventTests.cs @@ -15,7 +15,8 @@ namespace TransactionProcessor.DatabaseTests { public class MerchantEventTests : BaseTest { [Fact] - public async Task AddMerchant_MerchantIsAdded() { + public async Task AddMerchant_MerchantIsAdded() + { Result result = await this.Repository.AddMerchant(TestData.DomainEvents.MerchantCreatedEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); EstateManagementContext context = this.GetContext(); @@ -32,7 +33,8 @@ public async Task AddMerchant_EventReplayHandled() { } [Fact] - public async Task AddMerchantDevice_MerchantContractIsAdded() { + public async Task AddMerchantDevice_MerchantContractIsAdded() + { Result result = await this.Repository.AddMerchantDevice(TestData.DomainEvents.DeviceAddedToMerchantEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); EstateManagementContext context = this.GetContext(); @@ -101,6 +103,26 @@ public async Task SwapMerchantDevice_EventReplayHandled() } + public class StatementEventTests : BaseTest { + [Fact] + public async Task CreateStatement_StatementIsAdded() + { + Result result = await this.Repository.CreateStatement(TestData.DomainEvents.StatementCreatedEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + EstateManagementContext context = this.GetContext(); + StatementHeader? statement = await context.StatementHeaders.SingleOrDefaultAsync(c => c.StatementId == TestData.DomainEvents.StatementCreatedEvent.MerchantStatementId); + statement.ShouldNotBeNull(); + } + [Fact] + public async Task CreateStatement_EventReplayHandled() + { + Result result = await this.Repository.CreateStatement(TestData.DomainEvents.StatementCreatedEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + result = await this.Repository.CreateStatement(TestData.DomainEvents.StatementCreatedEvent, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + } + } + public class ContractEventTests : BaseTest { [Fact] @@ -124,7 +146,8 @@ public async Task AddOperator_EventReplayHandled() } [Fact] - public async Task AddContract_ContractIsAdded() { + public async Task AddContract_ContractIsAdded() + { Result result = await this.Repository.AddContract(TestData.DomainEvents.ContractCreatedEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); EstateManagementContext context = this.GetContext(); @@ -142,7 +165,8 @@ public async Task AddContract_EventReplayHandled() { } [Fact] - public async Task AddContractProduct_ContractProductIsAdded() { + public async Task AddContractProduct_ContractProductIsAdded() + { Result result = await this.Repository.AddContractProduct(TestData.DomainEvents.FixedValueProductAddedToContractEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); EstateManagementContext context = this.GetContext(); @@ -176,7 +200,7 @@ public async Task AddContractProduct_EventReplayHandled() { result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); } - + [Fact] public async Task AddContractProductTransactionFee_ContractIsAdded() { @@ -197,7 +221,7 @@ public async Task AddContractProductTransactionFee_EventReplayHandled() result = await this.Repository.AddContractProductTransactionFee(TestData.DomainEvents.TransactionFeeForProductAddedToContractEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); } - + [Fact] public async Task AddFileImportLog_FileImportLogIsAdded() { diff --git a/TransactionProcessor.DatabaseTests/TransactionProcessor.DatabaseTests.csproj b/TransactionProcessor.DatabaseTests/TransactionProcessor.DatabaseTests.csproj index 5d50a9d6..ce5e1f12 100644 --- a/TransactionProcessor.DatabaseTests/TransactionProcessor.DatabaseTests.csproj +++ b/TransactionProcessor.DatabaseTests/TransactionProcessor.DatabaseTests.csproj @@ -35,4 +35,10 @@ + + + Always + + + diff --git a/TransactionProcessor.DatabaseTests/xunit.runner.json b/TransactionProcessor.DatabaseTests/xunit.runner.json new file mode 100644 index 00000000..bac550d0 --- /dev/null +++ b/TransactionProcessor.DatabaseTests/xunit.runner.json @@ -0,0 +1,5 @@ +{ + "parallelizeAssembly": true, + "parallelizeTestCollections": true, + "maxParallelThreads": 3 +} \ No newline at end of file diff --git a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs index 495caf05..9479bc46 100644 --- a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs +++ b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs @@ -1762,7 +1762,7 @@ public async Task CreateStatement(StatementCreatedEvent domainEvent, await context.StatementHeaders.AddAsync(header, cancellationToken); - return await context.SaveChangesAsync(cancellationToken); + return await context.SaveChangesWithDuplicateHandling(cancellationToken); } // TODO@ Add this back in