From b580065aaf7800b0a5eff9914a480118d04b8d1d Mon Sep 17 00:00:00 2001 From: Rhys Bevilaqua Date: Thu, 16 Jul 2026 12:20:32 +0800 Subject: [PATCH 1/7] Set up sql test project with shared persistence tests --- ...ontrol.Persistence.EFCore.SqlServer.csproj | 4 ++ .../ExternalIntegrationRequestsDataStore.cs | 23 ++++++++--- .../FailedMessageViewIndexNotifications.cs | 22 ++++++++--- .../PersistenceTestsContext.cs | 1 + .../PersistenceTestsContext.cs | 1 + .../.editorconfig | 5 +++ .../PersistenceTestsContext.cs | 39 +++++++++++++++++++ .../ScrachTestDbContainer.cs | 22 +++++++++++ ...Control.Persistence.Tests.SqlServer.csproj | 30 ++++++++++++++ .../TestsFilter.cs | 1 + .../IPersistenceTestsContext.cs | 2 + .../Recoverability/EditHandlerAuditTests.cs | 2 +- .../Recoverability/EditMessageTests.cs | 2 +- .../RetryStateTests.cs | 4 +- src/ServiceControl.slnx | 1 + src/ServiceControl/ServiceControl.csproj | 1 + 16 files changed, 144 insertions(+), 16 deletions(-) create mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/.editorconfig create mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs create mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs create mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj create mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs diff --git a/src/ServiceControl.Persistence.EFCore.SqlServer/ServiceControl.Persistence.EFCore.SqlServer.csproj b/src/ServiceControl.Persistence.EFCore.SqlServer/ServiceControl.Persistence.EFCore.SqlServer.csproj index 862beed816..9346aa13f2 100644 --- a/src/ServiceControl.Persistence.EFCore.SqlServer/ServiceControl.Persistence.EFCore.SqlServer.csproj +++ b/src/ServiceControl.Persistence.EFCore.SqlServer/ServiceControl.Persistence.EFCore.SqlServer.csproj @@ -33,5 +33,9 @@ + + + + diff --git a/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs b/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs index dfa5094631..2703f99912 100644 --- a/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs +++ b/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs @@ -5,15 +5,26 @@ namespace ServiceControl.Persistence.EFCore.Implementation; public class ExternalIntegrationRequestsDataStore : IExternalIntegrationRequestsDataStore, IHostedService { - public void Subscribe(Func callback) => - throw new NotImplementedException(); + public void Subscribe(Func callback) + { + //todo: + } + public Task StoreDispatchRequest(IEnumerable dispatchRequests) => throw new NotImplementedException(); - public Task StartAsync(CancellationToken cancellationToken) => - throw new NotImplementedException(); + public Task StartAsync(CancellationToken cancellationToken) + { + //todo: + return Task.CompletedTask; + } + + + public Task StopAsync(CancellationToken cancellationToken) + { + //todo: + return Task.CompletedTask; + } - public Task StopAsync(CancellationToken cancellationToken) => - throw new NotImplementedException(); } diff --git a/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs b/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs index 583e6de887..0da7f48f63 100644 --- a/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs +++ b/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs @@ -4,12 +4,22 @@ namespace ServiceControl.Persistence.EFCore.Implementation; public class FailedMessageViewIndexNotifications : IFailedMessageViewIndexNotifications, IHostedService { - public IDisposable Subscribe(Func callback) => - throw new NotImplementedException(); + public IDisposable Subscribe(Func callback) + { + //todo: + return Task.CompletedTask; + } - public Task StartAsync(CancellationToken cancellationToken) => - throw new NotImplementedException(); - public Task StopAsync(CancellationToken cancellationToken) => - throw new NotImplementedException(); + public Task StartAsync(CancellationToken cancellationToken) + { + //todo: + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + //todo: + return Task.CompletedTask; + } } diff --git a/src/ServiceControl.Persistence.Tests.InMemory/PersistenceTestsContext.cs b/src/ServiceControl.Persistence.Tests.InMemory/PersistenceTestsContext.cs index 4e2f2e3d23..8e66c39775 100644 --- a/src/ServiceControl.Persistence.Tests.InMemory/PersistenceTestsContext.cs +++ b/src/ServiceControl.Persistence.Tests.InMemory/PersistenceTestsContext.cs @@ -8,6 +8,7 @@ public class PersistenceTestsContext : IPersistenceTestsContext { public PersistenceSettings PersistenceSettings { get; private set; } + public string GenerateFailedMessageRecordId(string messageId) => throw new System.NotImplementedException(); public Task Setup(IHostApplicationBuilder hostBuilder) { diff --git a/src/ServiceControl.Persistence.Tests.RavenDB/PersistenceTestsContext.cs b/src/ServiceControl.Persistence.Tests.RavenDB/PersistenceTestsContext.cs index 1bf7b44424..e8ba73939c 100644 --- a/src/ServiceControl.Persistence.Tests.RavenDB/PersistenceTestsContext.cs +++ b/src/ServiceControl.Persistence.Tests.RavenDB/PersistenceTestsContext.cs @@ -53,6 +53,7 @@ public async Task PostSetup(IHost host) public async Task TearDown() => await embeddedServer.DeleteDatabase(databaseName); public PersistenceSettings PersistenceSettings { get; private set; } + public string GenerateFailedMessageRecordId(string messageId) => FailedMessageIdGenerator.MakeDocumentId(messageId); public IDocumentStore DocumentStore { get; private set; } diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/.editorconfig b/src/ServiceControl.Persistence.Tests.SqlServer/.editorconfig new file mode 100644 index 0000000000..20102eaa39 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.SqlServer/.editorconfig @@ -0,0 +1,5 @@ +[*.cs] + +# Justification: ServiceControl app has no synchronization context +dotnet_diagnostic.CA2007.severity = none + diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs b/src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs new file mode 100644 index 0000000000..f92a2ced7d --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs @@ -0,0 +1,39 @@ +// ReSharper disable once CheckNamespace +namespace ServiceControl.Persistence.Tests; + +using System.Threading.Tasks; +using EFCore.SqlServer; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +public class PersistenceTestsContext : IPersistenceTestsContext +{ + public Task Setup(IHostApplicationBuilder hostBuilder) + { + PersistenceSettings = new SqlServerPersisterSettings() + { + ConnectionString = "Server=localhost;Database=ServiceControl;User=sa;Password=Password1!;TrustServerCertificate=True" + }; + + var persistence = new SqlServerPersistenceConfiguration().Create(PersistenceSettings); + + persistence.AddPersistence(hostBuilder.Services); + persistence.AddInstaller(hostBuilder.Services); + return Task.CompletedTask; + } + + public async Task PostSetup(IHost host) + { + using var scope = host.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + await db.Database.EnsureCreatedAsync(); + } + + public Task TearDown() => Task.CompletedTask; + + public void CompleteDatabaseOperation() { } + + public PersistenceSettings PersistenceSettings { get; set; } + + public string GenerateFailedMessageRecordId(string messageId) => messageId; +} \ No newline at end of file diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs b/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs new file mode 100644 index 0000000000..ce2772fcfe --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs @@ -0,0 +1,22 @@ +namespace ServiceControl.Persistence.Tests; + +using System.Threading.Tasks; +using EFCore.SqlServer; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; + +#pragma warning disable CA2007 + +public class ScratchTestDbLoading : PersistenceTestBase +{ + [Test] + public async Task TestDbOperation() + { + using var scope = ServiceProvider.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var result = await db.Database.ExecuteSqlAsync($"SELECT 1 as Hello"); + Assert.That(result, Is.EqualTo(1)); + } +} \ No newline at end of file diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj b/src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj new file mode 100644 index 0000000000..856ad60e80 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj @@ -0,0 +1,30 @@ + + + + net10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs new file mode 100644 index 0000000000..bdfa9656f4 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs @@ -0,0 +1 @@ +[assembly: IncludeInTestCategory("PrimarySqlServerPersistence")] \ No newline at end of file diff --git a/src/ServiceControl.Persistence.Tests/IPersistenceTestsContext.cs b/src/ServiceControl.Persistence.Tests/IPersistenceTestsContext.cs index bebd0aec54..5009a117a8 100644 --- a/src/ServiceControl.Persistence.Tests/IPersistenceTestsContext.cs +++ b/src/ServiceControl.Persistence.Tests/IPersistenceTestsContext.cs @@ -14,4 +14,6 @@ public interface IPersistenceTestsContext void CompleteDatabaseOperation(); PersistenceSettings PersistenceSettings { get; } + + string GenerateFailedMessageRecordId(string messageId); } \ No newline at end of file diff --git a/src/ServiceControl.Persistence.Tests/Recoverability/EditHandlerAuditTests.cs b/src/ServiceControl.Persistence.Tests/Recoverability/EditHandlerAuditTests.cs index a22a45e2fd..df02f36532 100644 --- a/src/ServiceControl.Persistence.Tests/Recoverability/EditHandlerAuditTests.cs +++ b/src/ServiceControl.Persistence.Tests/Recoverability/EditHandlerAuditTests.cs @@ -91,7 +91,7 @@ async Task CreateAndStoreFailedMessage(string failedMessageId = n var failedMessage = new FailedMessage { UniqueMessageId = failedMessageId, - Id = FailedMessageIdGenerator.MakeDocumentId(failedMessageId), + Id = PersistenceTestsContext.GenerateFailedMessageRecordId(failedMessageId), Status = FailedMessageStatus.Unresolved, ProcessingAttempts = [ diff --git a/src/ServiceControl.Persistence.Tests/Recoverability/EditMessageTests.cs b/src/ServiceControl.Persistence.Tests/Recoverability/EditMessageTests.cs index 74f62ef85f..7836a00e0f 100644 --- a/src/ServiceControl.Persistence.Tests/Recoverability/EditMessageTests.cs +++ b/src/ServiceControl.Persistence.Tests/Recoverability/EditMessageTests.cs @@ -248,7 +248,7 @@ async Task CreateAndStoreFailedMessage(string failedMessageId = n var failedMessage = new FailedMessage { UniqueMessageId = failedMessageId, - Id = FailedMessageIdGenerator.MakeDocumentId(failedMessageId), + Id = PersistenceTestsContext.GenerateFailedMessageRecordId(failedMessageId), Status = status, ProcessingAttempts = [ diff --git a/src/ServiceControl.Persistence.Tests/RetryStateTests.cs b/src/ServiceControl.Persistence.Tests/RetryStateTests.cs index 8f22784e67..bc87e50e34 100644 --- a/src/ServiceControl.Persistence.Tests/RetryStateTests.cs +++ b/src/ServiceControl.Persistence.Tests/RetryStateTests.cs @@ -239,7 +239,7 @@ public async Task When_a_selection_is_staged_each_message_is_audited_as_a_batch( var messages = ids.Select(id => new FailedMessage { - Id = FailedMessageIdGenerator.MakeDocumentId(id), + Id = PersistenceTestsContext.GenerateFailedMessageRecordId(id), UniqueMessageId = id, Status = FailedMessageStatus.Unresolved, ProcessingAttempts = @@ -318,7 +318,7 @@ async Task CreateAFailedMessageAndMarkAsPartOfRetryBatch(RetryingManager retryMa { var messages = messageIds.Select(id => new FailedMessage { - Id = FailedMessageIdGenerator.MakeDocumentId(id), + Id = PersistenceTestsContext.GenerateFailedMessageRecordId(id), UniqueMessageId = id, FailureGroups = [ diff --git a/src/ServiceControl.slnx b/src/ServiceControl.slnx index 76d72c12f1..0db136483b 100644 --- a/src/ServiceControl.slnx +++ b/src/ServiceControl.slnx @@ -51,6 +51,7 @@ + diff --git a/src/ServiceControl/ServiceControl.csproj b/src/ServiceControl/ServiceControl.csproj index 6c857f62d8..83bcc18a3c 100644 --- a/src/ServiceControl/ServiceControl.csproj +++ b/src/ServiceControl/ServiceControl.csproj @@ -61,6 +61,7 @@ + From 33e91d2076809077b5d576619687c75168096bb6 Mon Sep 17 00:00:00 2001 From: Rhys Bevilaqua Date: Thu, 16 Jul 2026 13:07:13 +0800 Subject: [PATCH 2/7] Add postgres persister test project --- ...ntrol.Persistence.EFCore.PostgreSql.csproj | 3 ++ .../ExternalIntegrationRequestsDataStore.cs | 4 +- .../FailedMessageViewIndexNotifications.cs | 4 +- .../.editorconfig | 5 +++ .../PersistenceTestsContext.cs | 39 +++++++++++++++++++ .../ScratchTestDbLoading.cs | 20 ++++++++++ ...ontrol.Persistence.Tests.PostgreSql.csproj | 30 ++++++++++++++ .../TestsFilter.cs | 1 + .../ScrachTestDbContainer.cs | 2 - src/ServiceControl.slnx | 1 + src/ServiceControl/ServiceControl.csproj | 1 + 11 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/.editorconfig create mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs create mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs create mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj create mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs diff --git a/src/ServiceControl.Persistence.EFCore.PostgreSql/ServiceControl.Persistence.EFCore.PostgreSql.csproj b/src/ServiceControl.Persistence.EFCore.PostgreSql/ServiceControl.Persistence.EFCore.PostgreSql.csproj index f638c069d0..a20e270c74 100644 --- a/src/ServiceControl.Persistence.EFCore.PostgreSql/ServiceControl.Persistence.EFCore.PostgreSql.csproj +++ b/src/ServiceControl.Persistence.EFCore.PostgreSql/ServiceControl.Persistence.EFCore.PostgreSql.csproj @@ -33,5 +33,8 @@ + + + diff --git a/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs b/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs index 2703f99912..b42625f62e 100644 --- a/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs +++ b/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs @@ -5,7 +5,7 @@ namespace ServiceControl.Persistence.EFCore.Implementation; public class ExternalIntegrationRequestsDataStore : IExternalIntegrationRequestsDataStore, IHostedService { - public void Subscribe(Func callback) + public void Subscribe(Func callback) { //todo: } @@ -14,7 +14,7 @@ public void Subscribe(Func callback) public Task StoreDispatchRequest(IEnumerable dispatchRequests) => throw new NotImplementedException(); - public Task StartAsync(CancellationToken cancellationToken) + public Task StartAsync(CancellationToken cancellationToken) { //todo: return Task.CompletedTask; diff --git a/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs b/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs index 0da7f48f63..51e255b291 100644 --- a/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs +++ b/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs @@ -13,8 +13,8 @@ public IDisposable Subscribe(Func callback) public Task StartAsync(CancellationToken cancellationToken) { - //todo: - return Task.CompletedTask; + //todo: + return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/.editorconfig b/src/ServiceControl.Persistence.Tests.PostgreSql/.editorconfig new file mode 100644 index 0000000000..20102eaa39 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/.editorconfig @@ -0,0 +1,5 @@ +[*.cs] + +# Justification: ServiceControl app has no synchronization context +dotnet_diagnostic.CA2007.severity = none + diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs new file mode 100644 index 0000000000..1e622eaeac --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs @@ -0,0 +1,39 @@ +// ReSharper disable once CheckNamespace +namespace ServiceControl.Persistence.Tests; + +using System.Threading.Tasks; +using EFCore.PostgreSql; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +public class PersistenceTestsContext : IPersistenceTestsContext +{ + public Task Setup(IHostApplicationBuilder hostBuilder) + { + PersistenceSettings = new PostgreSqlPersisterSettings() + { + ConnectionString = "Host=localhost;Database=ServiceControl;Username=postgres;Password=postgres" + }; + + var persistence = new PostgreSqlPersistenceConfiguration().Create(PersistenceSettings); + + persistence.AddPersistence(hostBuilder.Services); + persistence.AddInstaller(hostBuilder.Services); + return Task.CompletedTask; + } + + public async Task PostSetup(IHost host) + { + using var scope = host.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + await db.Database.EnsureCreatedAsync(); + } + + public Task TearDown() => Task.CompletedTask; + + public void CompleteDatabaseOperation() { } + + public PersistenceSettings PersistenceSettings { get; set; } + + public string GenerateFailedMessageRecordId(string messageId) => messageId; +} diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs new file mode 100644 index 0000000000..b72d5f49f9 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs @@ -0,0 +1,20 @@ +namespace ServiceControl.Persistence.Tests; + +using System.Threading.Tasks; +using EFCore.PostgreSql; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; + +public class ScratchTestDbLoading : PersistenceTestBase +{ + [Test] + public async Task TestDbOperation() + { + using var scope = ServiceProvider.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var result = await db.Database.ExecuteSqlAsync($"SELECT 1 as Hello"); + Assert.That(result, Is.EqualTo(1)); + } +} diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj b/src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj new file mode 100644 index 0000000000..07b529689a --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj @@ -0,0 +1,30 @@ + + + + net10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs new file mode 100644 index 0000000000..cbc04bd870 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs @@ -0,0 +1 @@ +[assembly: IncludeInTestCategory("PrimaryPostgreSqlPersistence")] diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs b/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs index ce2772fcfe..e2adac7ee2 100644 --- a/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs +++ b/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs @@ -6,8 +6,6 @@ namespace ServiceControl.Persistence.Tests; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; -#pragma warning disable CA2007 - public class ScratchTestDbLoading : PersistenceTestBase { [Test] diff --git a/src/ServiceControl.slnx b/src/ServiceControl.slnx index 0db136483b..b59518a697 100644 --- a/src/ServiceControl.slnx +++ b/src/ServiceControl.slnx @@ -51,6 +51,7 @@ + diff --git a/src/ServiceControl/ServiceControl.csproj b/src/ServiceControl/ServiceControl.csproj index 83bcc18a3c..f9acf194da 100644 --- a/src/ServiceControl/ServiceControl.csproj +++ b/src/ServiceControl/ServiceControl.csproj @@ -61,6 +61,7 @@ + From 0893cec57c5b237d316ba7c8f06a787dcf8c6ed2 Mon Sep 17 00:00:00 2001 From: Rhys Bevilaqua Date: Thu, 16 Jul 2026 13:36:37 +0800 Subject: [PATCH 3/7] Add test containers for local test runs --- .github/workflows/ci.yml | 10 +++- src/Directory.Packages.props | 2 + .../PersistenceTestsContext.cs | 7 ++- .../PostgreSqlSharedContainer.cs | 47 +++++++++++++++++++ ...ontrol.Persistence.Tests.PostgreSql.csproj | 1 + .../StopSharedPostgreSql.cs | 12 +++++ .../PersistenceTestsContext.cs | 7 ++- .../ScrachTestDbContainer.cs | 2 +- ...Control.Persistence.Tests.SqlServer.csproj | 1 + .../SqlServerSharedContainer.cs | 47 +++++++++++++++++++ .../StopSharedSqlServer.cs | 12 +++++ 11 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/PostgreSqlSharedContainer.cs create mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/StopSharedPostgreSql.cs create mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/SqlServerSharedContainer.cs create mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/StopSharedSqlServer.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 630af17e0f..8ea5cf74bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: os: [windows-latest, ubuntu-latest] - test-category: [ Default, SqlServer, AzureServiceBus, RabbitMQ, AzureStorageQueues, MSMQ, SQS, PrimaryRavenAcceptance, PrimaryRavenPersistence, PostgreSQL, IBMMQ ] + test-category: [ Default, SqlServer, AzureServiceBus, RabbitMQ, AzureStorageQueues, MSMQ, SQS, PrimaryRavenAcceptance, PrimaryRavenPersistence, PostgreSQL, IBMMQ, PrimarySqlServerPersistence, PrimaryPostgreSqlPersistence ] include: - os: windows-latest os-name: Windows @@ -29,6 +29,8 @@ jobs: test-category: MSMQ - os: windows-latest test-category: IBMMQ + - os: windows-latest + test-category: PrimaryPostgreSqlPersistence fail-fast: false steps: - name: Check for secrets @@ -75,6 +77,12 @@ jobs: with: connection-string-env-var: ServiceControl_TransportTests_SQL_ConnectionString catalog: nservicebus + - name: Setup SQL Server (persistence) + uses: Particular/install-sql-server-action@v1.4.0 + if: matrix.test-category == 'PrimarySqlServerPersistence' + with: + connection-string-env-var: ServiceControl_Persistence_SqlServer_ConnectionString + catalog: ServiceControl - name: Setup PostgreSQL uses: Particular/setup-postgres-action@v1.1.0 if: matrix.test-category == 'PostgreSQL' diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index e0e28c4942..d28a7f9ceb 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -75,6 +75,8 @@ + + diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs index 1e622eaeac..091e910ece 100644 --- a/src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/PersistenceTestsContext.cs @@ -8,18 +8,17 @@ namespace ServiceControl.Persistence.Tests; public class PersistenceTestsContext : IPersistenceTestsContext { - public Task Setup(IHostApplicationBuilder hostBuilder) + public async Task Setup(IHostApplicationBuilder hostBuilder) { - PersistenceSettings = new PostgreSqlPersisterSettings() + PersistenceSettings = new PostgreSqlPersisterSettings { - ConnectionString = "Host=localhost;Database=ServiceControl;Username=postgres;Password=postgres" + ConnectionString = await PostgreSqlSharedContainer.GetConnectionStringAsync() }; var persistence = new PostgreSqlPersistenceConfiguration().Create(PersistenceSettings); persistence.AddPersistence(hostBuilder.Services); persistence.AddInstaller(hostBuilder.Services); - return Task.CompletedTask; } public async Task PostSetup(IHost host) diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/PostgreSqlSharedContainer.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/PostgreSqlSharedContainer.cs new file mode 100644 index 0000000000..b3c5a9b223 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/PostgreSqlSharedContainer.cs @@ -0,0 +1,47 @@ +namespace ServiceControl.Persistence.Tests; + +using System; +using System.Threading; +using System.Threading.Tasks; +using Testcontainers.PostgreSql; + +static class PostgreSqlSharedContainer +{ + public static async Task GetConnectionStringAsync(CancellationToken ct = default) + { + var envConnStr = Environment.GetEnvironmentVariable("ServiceControl_Persistence_PostgreSql_ConnectionString"); + if (!string.IsNullOrEmpty(envConnStr)) + { + return envConnStr; + } + + if (container != null) + { + return container.GetConnectionString(); + } + + await semaphore.WaitAsync(ct); + try + { + container ??= await StartContainerAsync(ct); + return container.GetConnectionString(); + } + finally + { + semaphore.Release(); + } + } + + public static async Task Stop() => await (container?.DisposeAsync() ?? ValueTask.CompletedTask); + + static async Task StartContainerAsync(CancellationToken ct) + { + var c = new PostgreSqlBuilder("postgres:16-alpine") + .Build(); + await c.StartAsync(ct); + return c; + } + + static PostgreSqlContainer container; + static readonly SemaphoreSlim semaphore = new(1, 1); +} diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj b/src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj index 07b529689a..4394b112a4 100644 --- a/src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/ServiceControl.Persistence.Tests.PostgreSql.csproj @@ -21,6 +21,7 @@ + diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/StopSharedPostgreSql.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/StopSharedPostgreSql.cs new file mode 100644 index 0000000000..d5b0e8515e --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/StopSharedPostgreSql.cs @@ -0,0 +1,12 @@ +namespace ServiceControl; + +using System.Threading.Tasks; +using NUnit.Framework; +using Persistence.Tests; + +[SetUpFixture] +public class StopSharedPostgreSql +{ + [OneTimeTearDown] + public async Task Teardown() => await PostgreSqlSharedContainer.Stop(); +} diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs b/src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs index f92a2ced7d..2d3a6b49d3 100644 --- a/src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs +++ b/src/ServiceControl.Persistence.Tests.SqlServer/PersistenceTestsContext.cs @@ -8,18 +8,17 @@ namespace ServiceControl.Persistence.Tests; public class PersistenceTestsContext : IPersistenceTestsContext { - public Task Setup(IHostApplicationBuilder hostBuilder) + public async Task Setup(IHostApplicationBuilder hostBuilder) { - PersistenceSettings = new SqlServerPersisterSettings() + PersistenceSettings = new SqlServerPersisterSettings { - ConnectionString = "Server=localhost;Database=ServiceControl;User=sa;Password=Password1!;TrustServerCertificate=True" + ConnectionString = await SqlServerSharedContainer.GetConnectionStringAsync() }; var persistence = new SqlServerPersistenceConfiguration().Create(PersistenceSettings); persistence.AddPersistence(hostBuilder.Services); persistence.AddInstaller(hostBuilder.Services); - return Task.CompletedTask; } public async Task PostSetup(IHost host) diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs b/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs index e2adac7ee2..7e8327c862 100644 --- a/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs +++ b/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs @@ -15,6 +15,6 @@ public async Task TestDbOperation() var db = scope.ServiceProvider.GetRequiredService(); var result = await db.Database.ExecuteSqlAsync($"SELECT 1 as Hello"); - Assert.That(result, Is.EqualTo(1)); + Assert.That(result, Is.EqualTo(-1)); } } \ No newline at end of file diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj b/src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj index 856ad60e80..acbe985b53 100644 --- a/src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj +++ b/src/ServiceControl.Persistence.Tests.SqlServer/ServiceControl.Persistence.Tests.SqlServer.csproj @@ -21,6 +21,7 @@ + diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/SqlServerSharedContainer.cs b/src/ServiceControl.Persistence.Tests.SqlServer/SqlServerSharedContainer.cs new file mode 100644 index 0000000000..066e823329 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.SqlServer/SqlServerSharedContainer.cs @@ -0,0 +1,47 @@ +namespace ServiceControl.Persistence.Tests; + +using System; +using System.Threading; +using System.Threading.Tasks; +using Testcontainers.MsSql; + +static class SqlServerSharedContainer +{ + public static async Task GetConnectionStringAsync(CancellationToken ct = default) + { + var envConnStr = Environment.GetEnvironmentVariable("ServiceControl_Persistence_SqlServer_ConnectionString"); + if (!string.IsNullOrEmpty(envConnStr)) + { + return envConnStr; + } + + if (container != null) + { + return container.GetConnectionString(); + } + + await semaphore.WaitAsync(ct); + try + { + container ??= await StartContainerAsync(ct); + return container.GetConnectionString(); + } + finally + { + semaphore.Release(); + } + } + + public static async Task Stop() => await (container?.DisposeAsync() ?? ValueTask.CompletedTask); + + static async Task StartContainerAsync(CancellationToken ct) + { + var c = new MsSqlBuilder("mcr.microsoft.com/mssql/server:2025-latest") + .Build(); + await c.StartAsync(ct); + return c; + } + + static MsSqlContainer container; + static readonly SemaphoreSlim semaphore = new(1, 1); +} diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/StopSharedSqlServer.cs b/src/ServiceControl.Persistence.Tests.SqlServer/StopSharedSqlServer.cs new file mode 100644 index 0000000000..61b506cceb --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.SqlServer/StopSharedSqlServer.cs @@ -0,0 +1,12 @@ +namespace ServiceControl; + +using System.Threading.Tasks; +using NUnit.Framework; +using Persistence.Tests; + +[SetUpFixture] +public class StopSharedSqlServer +{ + [OneTimeTearDown] + public async Task Teardown() => await SqlServerSharedContainer.Stop(); +} From e02e25796e8a28347f19a3dc4efa01b7c4e22c5b Mon Sep 17 00:00:00 2001 From: Rhys Bevilaqua Date: Thu, 16 Jul 2026 14:01:52 +0800 Subject: [PATCH 4/7] Combine persister tests with existing sql/postgre steps --- .github/workflows/ci.yml | 18 +++++++++--------- .../TestsFilter.cs | 2 +- .../TestsFilter.cs | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ea5cf74bd..40d0f42248 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: os: [windows-latest, ubuntu-latest] - test-category: [ Default, SqlServer, AzureServiceBus, RabbitMQ, AzureStorageQueues, MSMQ, SQS, PrimaryRavenAcceptance, PrimaryRavenPersistence, PostgreSQL, IBMMQ, PrimarySqlServerPersistence, PrimaryPostgreSqlPersistence ] + test-category: [ Default, SqlServer, AzureServiceBus, RabbitMQ, AzureStorageQueues, MSMQ, SQS, PrimaryRavenAcceptance, PrimaryRavenPersistence, PostgreSQL, IBMMQ ] include: - os: windows-latest os-name: Windows @@ -29,8 +29,6 @@ jobs: test-category: MSMQ - os: windows-latest test-category: IBMMQ - - os: windows-latest - test-category: PrimaryPostgreSqlPersistence fail-fast: false steps: - name: Check for secrets @@ -77,12 +75,11 @@ jobs: with: connection-string-env-var: ServiceControl_TransportTests_SQL_ConnectionString catalog: nservicebus - - name: Setup SQL Server (persistence) - uses: Particular/install-sql-server-action@v1.4.0 - if: matrix.test-category == 'PrimarySqlServerPersistence' - with: - connection-string-env-var: ServiceControl_Persistence_SqlServer_ConnectionString - catalog: ServiceControl + - name: Alias SQL Server connection string for persistence tests + if: matrix.test-category == 'SqlServer' + run: | + $connStr = $env:ServiceControl_TransportTests_SQL_ConnectionString -replace '(?i)(Initial Catalog|Database)=[^;]+', 'Initial Catalog=ServiceControl' + echo "ServiceControl_Persistence_SqlServer_ConnectionString=$connStr" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - name: Setup PostgreSQL uses: Particular/setup-postgres-action@v1.1.0 if: matrix.test-category == 'PostgreSQL' @@ -91,6 +88,9 @@ jobs: tag: ServiceControl registry-username: ${{ secrets.DOCKERHUB_USERNAME }} registry-password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Alias PostgreSQL connection string for persistence tests + if: matrix.test-category == 'PostgreSQL' + run: echo "ServiceControl_Persistence_PostgreSql_ConnectionString=$env:ServiceControl_TransportTests_PostgreSQL_ConnectionString" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - name: Setup RabbitMQ uses: Particular/setup-rabbitmq-action@v1.7.1 if: matrix.test-category == 'RabbitMQ' diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs index cbc04bd870..029d54f41e 100644 --- a/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs @@ -1 +1 @@ -[assembly: IncludeInTestCategory("PrimaryPostgreSqlPersistence")] +[assembly: IncludeInTestCategory("PostgreSQL")] diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs index bdfa9656f4..e3a4207d02 100644 --- a/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs +++ b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs @@ -1 +1 @@ -[assembly: IncludeInTestCategory("PrimarySqlServerPersistence")] \ No newline at end of file +[assembly: IncludeInTestCategory("SqlServer")] \ No newline at end of file From db49e5939558897c660f161d32d39c7364765aa0 Mon Sep 17 00:00:00 2001 From: Rhys Bevilaqua Date: Thu, 16 Jul 2026 15:02:41 +0800 Subject: [PATCH 5/7] Disable tests on CI builds for now --- src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs | 3 ++- src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs index 029d54f41e..88cfba6b09 100644 --- a/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs @@ -1 +1,2 @@ -[assembly: IncludeInTestCategory("PostgreSQL")] +//Don't apply the test category yet - we are currently failing the tests while building +//[assembly: IncludeInTestCategory("PostgreSQL")] diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs index e3a4207d02..88cfba6b09 100644 --- a/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs +++ b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs @@ -1 +1,2 @@ -[assembly: IncludeInTestCategory("SqlServer")] \ No newline at end of file +//Don't apply the test category yet - we are currently failing the tests while building +//[assembly: IncludeInTestCategory("PostgreSQL")] From 4719774e92d6d4afaebab250ea00c280447e1caf Mon Sep 17 00:00:00 2001 From: Rhys Bevilaqua Date: Fri, 17 Jul 2026 10:57:48 +0800 Subject: [PATCH 6/7] Tidy up & disable new tests in CI --- .github/workflows/ci.yml | 8 ------- .../ExternalIntegrationRequestsDataStore.cs | 23 +++++-------------- .../FailedMessageViewIndexNotifications.cs | 22 +++++------------- .../ScratchTestDbLoading.cs | 20 ---------------- .../TestsFilter.cs | 3 +-- .../ScrachTestDbContainer.cs | 20 ---------------- .../TestsFilter.cs | 3 +-- 7 files changed, 14 insertions(+), 85 deletions(-) delete mode 100644 src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs delete mode 100644 src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40d0f42248..630af17e0f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,11 +75,6 @@ jobs: with: connection-string-env-var: ServiceControl_TransportTests_SQL_ConnectionString catalog: nservicebus - - name: Alias SQL Server connection string for persistence tests - if: matrix.test-category == 'SqlServer' - run: | - $connStr = $env:ServiceControl_TransportTests_SQL_ConnectionString -replace '(?i)(Initial Catalog|Database)=[^;]+', 'Initial Catalog=ServiceControl' - echo "ServiceControl_Persistence_SqlServer_ConnectionString=$connStr" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - name: Setup PostgreSQL uses: Particular/setup-postgres-action@v1.1.0 if: matrix.test-category == 'PostgreSQL' @@ -88,9 +83,6 @@ jobs: tag: ServiceControl registry-username: ${{ secrets.DOCKERHUB_USERNAME }} registry-password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Alias PostgreSQL connection string for persistence tests - if: matrix.test-category == 'PostgreSQL' - run: echo "ServiceControl_Persistence_PostgreSql_ConnectionString=$env:ServiceControl_TransportTests_PostgreSQL_ConnectionString" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - name: Setup RabbitMQ uses: Particular/setup-rabbitmq-action@v1.7.1 if: matrix.test-category == 'RabbitMQ' diff --git a/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs b/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs index b42625f62e..dfa5094631 100644 --- a/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs +++ b/src/ServiceControl.Persistence.EFCore/Implementation/ExternalIntegrationRequestsDataStore.cs @@ -5,26 +5,15 @@ namespace ServiceControl.Persistence.EFCore.Implementation; public class ExternalIntegrationRequestsDataStore : IExternalIntegrationRequestsDataStore, IHostedService { - public void Subscribe(Func callback) - { - //todo: - } - + public void Subscribe(Func callback) => + throw new NotImplementedException(); public Task StoreDispatchRequest(IEnumerable dispatchRequests) => throw new NotImplementedException(); - public Task StartAsync(CancellationToken cancellationToken) - { - //todo: - return Task.CompletedTask; - } - - - public Task StopAsync(CancellationToken cancellationToken) - { - //todo: - return Task.CompletedTask; - } + public Task StartAsync(CancellationToken cancellationToken) => + throw new NotImplementedException(); + public Task StopAsync(CancellationToken cancellationToken) => + throw new NotImplementedException(); } diff --git a/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs b/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs index 51e255b291..583e6de887 100644 --- a/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs +++ b/src/ServiceControl.Persistence.EFCore/Implementation/FailedMessageViewIndexNotifications.cs @@ -4,22 +4,12 @@ namespace ServiceControl.Persistence.EFCore.Implementation; public class FailedMessageViewIndexNotifications : IFailedMessageViewIndexNotifications, IHostedService { - public IDisposable Subscribe(Func callback) - { - //todo: - return Task.CompletedTask; - } + public IDisposable Subscribe(Func callback) => + throw new NotImplementedException(); + public Task StartAsync(CancellationToken cancellationToken) => + throw new NotImplementedException(); - public Task StartAsync(CancellationToken cancellationToken) - { - //todo: - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - //todo: - return Task.CompletedTask; - } + public Task StopAsync(CancellationToken cancellationToken) => + throw new NotImplementedException(); } diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs deleted file mode 100644 index b72d5f49f9..0000000000 --- a/src/ServiceControl.Persistence.Tests.PostgreSql/ScratchTestDbLoading.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace ServiceControl.Persistence.Tests; - -using System.Threading.Tasks; -using EFCore.PostgreSql; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using NUnit.Framework; - -public class ScratchTestDbLoading : PersistenceTestBase -{ - [Test] - public async Task TestDbOperation() - { - using var scope = ServiceProvider.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - - var result = await db.Database.ExecuteSqlAsync($"SELECT 1 as Hello"); - Assert.That(result, Is.EqualTo(1)); - } -} diff --git a/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs index 88cfba6b09..c2971486f6 100644 --- a/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs +++ b/src/ServiceControl.Persistence.Tests.PostgreSql/TestsFilter.cs @@ -1,2 +1 @@ -//Don't apply the test category yet - we are currently failing the tests while building -//[assembly: IncludeInTestCategory("PostgreSQL")] +[assembly: IncludeInTestCategory("PostgreSqlPersistence")] diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs b/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs deleted file mode 100644 index 7e8327c862..0000000000 --- a/src/ServiceControl.Persistence.Tests.SqlServer/ScrachTestDbContainer.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace ServiceControl.Persistence.Tests; - -using System.Threading.Tasks; -using EFCore.SqlServer; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using NUnit.Framework; - -public class ScratchTestDbLoading : PersistenceTestBase -{ - [Test] - public async Task TestDbOperation() - { - using var scope = ServiceProvider.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - - var result = await db.Database.ExecuteSqlAsync($"SELECT 1 as Hello"); - Assert.That(result, Is.EqualTo(-1)); - } -} \ No newline at end of file diff --git a/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs index 88cfba6b09..d37d903ffb 100644 --- a/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs +++ b/src/ServiceControl.Persistence.Tests.SqlServer/TestsFilter.cs @@ -1,2 +1 @@ -//Don't apply the test category yet - we are currently failing the tests while building -//[assembly: IncludeInTestCategory("PostgreSQL")] +[assembly: IncludeInTestCategory("SqlServerPersistence")] From 38697c638ad5091ae8aa028199de7bdd988ac653 Mon Sep 17 00:00:00 2001 From: Rhys Bevilaqua Date: Fri, 17 Jul 2026 10:59:48 +0800 Subject: [PATCH 7/7] Alphabetise internalsvisible --- src/ServiceControl/ServiceControl.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceControl/ServiceControl.csproj b/src/ServiceControl/ServiceControl.csproj index f9acf194da..2223cb11af 100644 --- a/src/ServiceControl/ServiceControl.csproj +++ b/src/ServiceControl/ServiceControl.csproj @@ -60,8 +60,8 @@ - +