Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions TransactionProcessor.DatabaseTests/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using Xunit;

using TransactionProcessor.DatabaseTests;

[assembly: AssemblyFixture(typeof(DatabaseTestFixture))]
84 changes: 15 additions & 69 deletions TransactionProcessor.DatabaseTests/BaseTest.cs
Original file line number Diff line number Diff line change
@@ -1,44 +1,38 @@
using System.Diagnostics;
using DotNet.Testcontainers.Builders;
using DotNet.Testcontainers.Networks;
using Microsoft.Extensions.DependencyInjection;
using Moq;
using NLog;
using Shared.EntityFramework;
using Shared.IntegrationTesting;
using Shared.IntegrationTesting.TestContainers;
using Shared.Logger;
using Shouldly;
using TransactionProcessor.Database.Contexts;
using TransactionProcessor.Repository;
using Logger = Shared.Logger.Logger;

namespace TransactionProcessor.DatabaseTests
{
public abstract class BaseTest : IAsyncLifetime
{
protected ITransactionProcessorReadModelRepository Repository;
protected ITestOutputHelper TestOutputHelper;
public virtual async ValueTask InitializeAsync()
private readonly DatabaseTestFixture fixture;
protected ITransactionProcessorReadModelRepository Repository = null!;
protected Guid TestId;

protected BaseTest(DatabaseTestFixture fixture)
{
Logger.Initialise(new Shared.Logger.NullLogger());

this.fixture = fixture;
this.TestId = Guid.NewGuid();
}

await this.StartSqlContainer();
public virtual async ValueTask InitializeAsync()
{
await this.GetRepository();
EstateManagementContext context = this.GetContext();
await context.Database.EnsureCreatedAsync(TestContext.Current.CancellationToken);
}

public EstateManagementContext GetContext()
{
return new EstateManagementContext(GetLocalConnectionString($"TransactionProcessorReadModel-{this.TestId}"));
return new EstateManagementContext(this.GetLocalConnectionString($"TransactionProcessorReadModel-{this.TestId}"));
}

public async Task GetRepository()
{
String dbConnString = GetLocalConnectionString($"TransactionProcessorReadModel-{this.TestId}");
string dbConnString = this.GetLocalConnectionString($"TransactionProcessorReadModel-{this.TestId}");

Mock<IDbContextResolver<EstateManagementContext>> resolver = new Mock<IDbContextResolver<EstateManagementContext>>();
resolver.Setup(r => r.Resolve(It.IsAny<string>(), It.IsAny<string>()))
Expand All @@ -56,64 +50,16 @@ public async Task GetRepository()
this.Repository = new TransactionProcessorReadModelRepository(resolver.Object);
}

public virtual async ValueTask DisposeAsync() {
await this.DockerHelper.StopContainersForScenarioRun(DockerServices.None);
public virtual ValueTask DisposeAsync()
{
return ValueTask.CompletedTask;
}

//protected abstract Task ClearStandingData();
//protected abstract Task SetupStandingData();

protected Guid TestId;

public static INetwork DatabaseServerNetwork;
public static (String usename, String password) SqlCredentials = ("sa", "thisisalongpassword123!");

public String GetLocalConnectionString(String databaseName)
{
Int32? databaseHostPort = DockerHelper.GetHostPort(ContainerType.SqlServer);

return $"server=localhost,{databaseHostPort};database={databaseName};user id={SqlCredentials.usename};password={SqlCredentials.password};Encrypt=false";
}

private DockerHelper DockerHelper;

internal async Task StartSqlContainer()
{
DockerHelper = new TestDockerHelper();

NlogLogger logger = new NlogLogger();
logger.Initialise(LogManager.GetLogger("Specflow"), "Specflow");
LogManager.AddHiddenAssembly(typeof(NlogLogger).Assembly);
DockerHelper.Logger = logger;
DockerHelper.SqlCredentials = SqlCredentials;
DockerHelper.SqlServerContainerName = $"sqlserver_{this.TestId}";
DockerHelper.RequiredDockerServices = DockerServices.SqlServer;

//DatabaseServerNetwork = await DockerHelper.SetupTestNetwork($"nw{this.TestId}", true);
await DockerHelper.StartContainersForScenarioRun(this.TestId.ToString(), DockerServices.SqlServer);
}

//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();

//}
}



public class TestDockerHelper : DockerHelper
{
public override async Task CreateSubscriptions()
{
// Nothing here
return this.fixture.GetLocalConnectionString(databaseName);
}
}

}

8 changes: 8 additions & 0 deletions TransactionProcessor.DatabaseTests/ContractEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ namespace TransactionProcessor.DatabaseTests
{
public class ReconciliationEventTests : BaseTest
{
public ReconciliationEventTests(DatabaseTestFixture fixture) : base(fixture)
{
}

[Fact]
public async Task AddReconciliation_ReconciliationIsAdded()
{
Expand All @@ -35,6 +39,10 @@ public async Task AddReconciliation_EventReplayHandled() {

public class ContractEventTests : BaseTest
{
public ContractEventTests(DatabaseTestFixture fixture) : base(fixture)
{
}

[Fact]
public async Task AddContract_ContractIsAdded()
{
Expand Down
61 changes: 61 additions & 0 deletions TransactionProcessor.DatabaseTests/DatabaseTestFixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using DotNet.Testcontainers.Builders;
using NLog;
using Shared.IntegrationTesting;
using Shared.IntegrationTesting.TestContainers;
using Shared.Logger;
using Logger = Shared.Logger.Logger;

namespace TransactionProcessor.DatabaseTests
{
public sealed class DatabaseTestFixture : IAsyncLifetime
{
private readonly DockerHelper dockerHelper;

public DatabaseTestFixture()
{
Logger.Initialise(new Shared.Logger.NullLogger());

this.dockerHelper = new TestDockerHelper
{
Logger = this.CreateLogger(),
SqlCredentials = BaseTest.SqlCredentials,
RequiredDockerServices = DockerServices.SqlServer,
SqlServerContainerName = "sqlserver_database_tests"
};
}

public async ValueTask InitializeAsync()
{
await this.dockerHelper.StartContainersForScenarioRun("database-tests", DockerServices.SqlServer);
}

public async ValueTask DisposeAsync()
{
await this.dockerHelper.StopContainersForScenarioRun(DockerServices.SqlServer);
Comment thread
StuartFerguson marked this conversation as resolved.
Resolved
}

public string GetLocalConnectionString(string databaseName)
{
int? databaseHostPort = this.dockerHelper.GetHostPort(ContainerType.SqlServer);

return $"server=localhost,{databaseHostPort};database={databaseName};user id={BaseTest.SqlCredentials.usename};password={BaseTest.SqlCredentials.password};Encrypt=false";
}

private NlogLogger CreateLogger()
{
NlogLogger logger = new NlogLogger();
logger.Initialise(LogManager.GetLogger("Specflow"), "Specflow");
LogManager.AddHiddenAssembly(typeof(NlogLogger).Assembly);
return logger;
}
}

public class TestDockerHelper : DockerHelper
{
public override Task CreateSubscriptions()
{
return Task.CompletedTask;
}
}

}
12 changes: 6 additions & 6 deletions TransactionProcessor.DatabaseTests/EstateEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,10 @@
namespace TransactionProcessor.DatabaseTests;

public class MigrationTests : BaseTest {
public override async ValueTask InitializeAsync() {

Logger.Initialise(new Shared.Logger.NullLogger());

this.TestId = Guid.NewGuid();
public MigrationTests(DatabaseTestFixture fixture) : base(fixture) {
}

await this.StartSqlContainer();
public override async ValueTask InitializeAsync() {
await this.GetRepository();
}

Expand All @@ -27,6 +24,9 @@ public async Task CreateReadModel_EstateDatabaseIsMigrated()
}

public class EstateEventTests : BaseTest {
public EstateEventTests(DatabaseTestFixture fixture) : base(fixture) {
}

[Fact]
public async Task AddEstate_EstateIsAdded()
{
Expand Down
3 changes: 3 additions & 0 deletions TransactionProcessor.DatabaseTests/FileImportLogEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
namespace TransactionProcessor.DatabaseTests;

public class FileImportLogEventTests : BaseTest {
public FileImportLogEventTests(DatabaseTestFixture fixture) : base(fixture) {
}

private async Task CreateFileImportLogAsync()
{
Result result = await this.Repository.AddFileImportLog(TestData.DomainEvents.ImportLogCreatedEvent, TestContext.Current.CancellationToken);
Expand Down
3 changes: 3 additions & 0 deletions TransactionProcessor.DatabaseTests/FloatEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
namespace TransactionProcessor.DatabaseTests;

public class FloatEventTests : BaseTest {
public FloatEventTests(DatabaseTestFixture fixture) : base(fixture) {
}

[Fact]
public async Task CreateFloat_FloatIsAdded()
{
Expand Down
3 changes: 3 additions & 0 deletions TransactionProcessor.DatabaseTests/MerchantEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
namespace TransactionProcessor.DatabaseTests;

public class MerchantEventTests : BaseTest {
public MerchantEventTests(DatabaseTestFixture fixture) : base(fixture) {
}

private async Task CreateMerchantAsync()
{
Result result = await this.Repository.AddMerchant(TestData.DomainEvents.MerchantCreatedEvent, TestContext.Current.CancellationToken);
Expand Down
3 changes: 3 additions & 0 deletions TransactionProcessor.DatabaseTests/OperatorEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
namespace TransactionProcessor.DatabaseTests;

public class OperatorEventTests : BaseTest {
public OperatorEventTests(DatabaseTestFixture fixture) : base(fixture) {
}

[Fact]
public async Task AddOperator_OperatorIsAdded()
{
Expand Down
4 changes: 4 additions & 0 deletions TransactionProcessor.DatabaseTests/SettlementEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ namespace TransactionProcessor.DatabaseTests;

public class SettlementEventTests : BaseTest
{
public SettlementEventTests(DatabaseTestFixture fixture) : base(fixture)
{
}

[Fact]
public async Task CreateSettlement_SettlementIsAdded()
{
Expand Down
3 changes: 3 additions & 0 deletions TransactionProcessor.DatabaseTests/StatementEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
namespace TransactionProcessor.DatabaseTests;

public class StatementEventTests : BaseTest {
public StatementEventTests(DatabaseTestFixture fixture) : base(fixture) {
}

[Fact]
public async Task CreateStatement_StatementIsAdded()
{
Expand Down
3 changes: 3 additions & 0 deletions TransactionProcessor.DatabaseTests/TransactionEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
namespace TransactionProcessor.DatabaseTests;

public class TransactionEventTests : BaseTest {
public TransactionEventTests(DatabaseTestFixture fixture) : base(fixture) {
}

private async Task CreateOperatorAsync()
{
Result result = await this.Repository.AddOperator(TestData.DomainEvents.OperatorCreatedEvent, TestContext.Current.CancellationToken);
Expand Down
Loading