Skip to content

Commit 5fb38ee

Browse files
authored
Merge pull request #5612 from Particular/cxp832-testing
Set up test projects for SQL transports
2 parents 8c9f284 + 38697c6 commit 5fb38ee

23 files changed

Lines changed: 289 additions & 4 deletions

src/Directory.Packages.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@
7575
<PackageVersion Include="PropertyChanging.Fody" Version="1.31.0" />
7676
<PackageVersion Include="PublicApiGenerator" Version="11.5.4" />
7777
<PackageVersion Include="RavenDB.Embedded" Version="6.2.17" />
78+
<PackageVersion Include="Testcontainers.MsSql" Version="4.13.0" />
79+
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.13.0" />
7880
<PackageVersion Include="ReactiveUI.WPF" Version="22.3.1" />
7981
<PackageVersion Include="Seq.Extensions.Logging" Version="9.0.0" />
8082
<PackageVersion Include="ServiceControl.Contracts" Version="5.1.0" />

src/ServiceControl.Persistence.EFCore.PostgreSql/ServiceControl.Persistence.EFCore.PostgreSql.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,8 @@
3333
<ItemGroup>
3434
<Artifact Include="$(OutputPath)" DestinationFolder="$(ArtifactsPath)Particular.ServiceControl/Persisters/PostgreSQL" />
3535
</ItemGroup>
36+
<ItemGroup>
37+
<InternalsVisibleTo Include="ServiceControl.Persistence.Tests.PostgreSql" />
38+
</ItemGroup>
3639

3740
</Project>

src/ServiceControl.Persistence.EFCore.SqlServer/ServiceControl.Persistence.EFCore.SqlServer.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,9 @@
3333
<ItemGroup>
3434
<Artifact Include="$(OutputPath)" DestinationFolder="$(ArtifactsPath)Particular.ServiceControl/Persisters/SQLServer" />
3535
</ItemGroup>
36+
37+
<ItemGroup>
38+
<InternalsVisibleTo Include="ServiceControl.Persistence.Tests.SqlServer" />
39+
</ItemGroup>
3640

3741
</Project>

src/ServiceControl.Persistence.Tests.InMemory/PersistenceTestsContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
public class PersistenceTestsContext : IPersistenceTestsContext
99
{
1010
public PersistenceSettings PersistenceSettings { get; private set; }
11+
public string GenerateFailedMessageRecordId(string messageId) => throw new System.NotImplementedException();
1112

1213
public Task Setup(IHostApplicationBuilder hostBuilder)
1314
{
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[*.cs]
2+
3+
# Justification: ServiceControl app has no synchronization context
4+
dotnet_diagnostic.CA2007.severity = none
5+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// ReSharper disable once CheckNamespace
2+
namespace ServiceControl.Persistence.Tests;
3+
4+
using System.Threading.Tasks;
5+
using EFCore.PostgreSql;
6+
using Microsoft.Extensions.DependencyInjection;
7+
using Microsoft.Extensions.Hosting;
8+
9+
public class PersistenceTestsContext : IPersistenceTestsContext
10+
{
11+
public async Task Setup(IHostApplicationBuilder hostBuilder)
12+
{
13+
PersistenceSettings = new PostgreSqlPersisterSettings
14+
{
15+
ConnectionString = await PostgreSqlSharedContainer.GetConnectionStringAsync()
16+
};
17+
18+
var persistence = new PostgreSqlPersistenceConfiguration().Create(PersistenceSettings);
19+
20+
persistence.AddPersistence(hostBuilder.Services);
21+
persistence.AddInstaller(hostBuilder.Services);
22+
}
23+
24+
public async Task PostSetup(IHost host)
25+
{
26+
using var scope = host.Services.CreateScope();
27+
var db = scope.ServiceProvider.GetRequiredService<PostgreSqlServiceControlDbContext>();
28+
await db.Database.EnsureCreatedAsync();
29+
}
30+
31+
public Task TearDown() => Task.CompletedTask;
32+
33+
public void CompleteDatabaseOperation() { }
34+
35+
public PersistenceSettings PersistenceSettings { get; set; }
36+
37+
public string GenerateFailedMessageRecordId(string messageId) => messageId;
38+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
namespace ServiceControl.Persistence.Tests;
2+
3+
using System;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using Testcontainers.PostgreSql;
7+
8+
static class PostgreSqlSharedContainer
9+
{
10+
public static async Task<string> GetConnectionStringAsync(CancellationToken ct = default)
11+
{
12+
var envConnStr = Environment.GetEnvironmentVariable("ServiceControl_Persistence_PostgreSql_ConnectionString");
13+
if (!string.IsNullOrEmpty(envConnStr))
14+
{
15+
return envConnStr;
16+
}
17+
18+
if (container != null)
19+
{
20+
return container.GetConnectionString();
21+
}
22+
23+
await semaphore.WaitAsync(ct);
24+
try
25+
{
26+
container ??= await StartContainerAsync(ct);
27+
return container.GetConnectionString();
28+
}
29+
finally
30+
{
31+
semaphore.Release();
32+
}
33+
}
34+
35+
public static async Task Stop() => await (container?.DisposeAsync() ?? ValueTask.CompletedTask);
36+
37+
static async Task<PostgreSqlContainer> StartContainerAsync(CancellationToken ct)
38+
{
39+
var c = new PostgreSqlBuilder("postgres:16-alpine")
40+
.Build();
41+
await c.StartAsync(ct);
42+
return c;
43+
}
44+
45+
static PostgreSqlContainer container;
46+
static readonly SemaphoreSlim semaphore = new(1, 1);
47+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<ProjectReference Include="..\ServiceControl.Infrastructure\ServiceControl.Infrastructure.csproj" />
9+
<ProjectReference Include="..\ServiceControl\ServiceControl.csproj" />
10+
<ProjectReference Include="..\ServiceControl.Persistence.EFCore.PostgreSql\ServiceControl.Persistence.EFCore.PostgreSql.csproj" />
11+
<ProjectReference Include="..\ServiceControl.Transports.Learning\ServiceControl.Transports.Learning.csproj" />
12+
<ProjectReference Include="..\TestHelper\TestHelper.csproj" />
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<PackageReference Include="GitHubActionsTestLogger" />
17+
<PackageReference Include="Microsoft.NET.Test.Sdk" />
18+
<PackageReference Include="NServiceBus.Testing" />
19+
<PackageReference Include="NUnit" />
20+
<PackageReference Include="NUnit.Analyzers" />
21+
<PackageReference Include="NUnit3TestAdapter" />
22+
<PackageReference Include="Particular.Approvals" />
23+
<PackageReference Include="PublicApiGenerator" />
24+
<PackageReference Include="Testcontainers.PostgreSql" />
25+
</ItemGroup>
26+
27+
<ItemGroup>
28+
<Compile Include="..\ServiceControl.Persistence.Tests\**\*.cs" LinkBase="Shared" />
29+
</ItemGroup>
30+
31+
</Project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace ServiceControl;
2+
3+
using System.Threading.Tasks;
4+
using NUnit.Framework;
5+
using Persistence.Tests;
6+
7+
[SetUpFixture]
8+
public class StopSharedPostgreSql
9+
{
10+
[OneTimeTearDown]
11+
public async Task Teardown() => await PostgreSqlSharedContainer.Stop();
12+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[assembly: IncludeInTestCategory("PostgreSqlPersistence")]

0 commit comments

Comments
 (0)