Skip to content

Commit 2b47b15

Browse files
authored
Migrate HealthChecks.Npgsql tests to Testcontainers (#2349)
1 parent 69fa668 commit 2b47b15

5 files changed

Lines changed: 49 additions & 49 deletions

File tree

.github/workflows/healthchecks_npgsql_ci.yml

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -29,47 +29,8 @@ on:
2929

3030
jobs:
3131
build:
32-
runs-on: ubuntu-latest
33-
services:
34-
npgsql:
35-
image: postgres
36-
ports:
37-
- 8010:5432
38-
env:
39-
POSTGRES_USER: postgres
40-
POSTGRES_PASSWORD: Password12!
41-
steps:
42-
- uses: actions/checkout@v3
43-
- name: Setup .NET
44-
uses: actions/setup-dotnet@v4
45-
with:
46-
dotnet-version: |
47-
8.0.x
48-
9.0.x
49-
- name: Restore
50-
run: |
51-
dotnet restore ./src/HealthChecks.NpgSql/HealthChecks.NpgSql.csproj &&
52-
dotnet restore ./test/HealthChecks.Npgsql.Tests/HealthChecks.Npgsql.Tests.csproj
53-
- name: Check formatting
54-
run: |
55-
dotnet format --no-restore --verify-no-changes --severity warn ./src/HealthChecks.NpgSql/HealthChecks.NpgSql.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) &&
56-
dotnet format --no-restore --verify-no-changes --severity warn ./test/HealthChecks.Npgsql.Tests/HealthChecks.Npgsql.Tests.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1)
57-
- name: Build
58-
run: |
59-
dotnet build --no-restore ./src/HealthChecks.NpgSql/HealthChecks.NpgSql.csproj &&
60-
dotnet build --no-restore ./test/HealthChecks.Npgsql.Tests/HealthChecks.Npgsql.Tests.csproj
61-
- name: Test
62-
run: >
63-
dotnet test
64-
./test/HealthChecks.Npgsql.Tests/HealthChecks.Npgsql.Tests.csproj
65-
--no-restore
66-
--no-build
67-
--collect "XPlat Code Coverage"
68-
--results-directory .coverage
69-
--
70-
DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover
71-
- name: Upload Coverage
72-
uses: codecov/codecov-action@v5
73-
with:
74-
flags: Npgsql
75-
directory: .coverage
32+
uses: ./.github/workflows/reusable_ci_workflow.yml
33+
with:
34+
PROJECT_PATH: ./src/HealthChecks.NpgSql/HealthChecks.NpgSql.csproj
35+
TEST_PROJECT_PATH: ./test/HealthChecks.Npgsql.Tests/HealthChecks.Npgsql.Tests.csproj
36+
CODECOV_FLAGS: Npgsql

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
<PackageVersion Include="System.Text.Json" Version="8.0.5" />
103103
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
104104
<PackageVersion Include="System.Threading.Channels" Version="8.0.0" />
105+
<PackageVersion Include="Testcontainers.PostgreSql" Version="$(TestcontainersVersion)" />
105106
<PackageVersion Include="Testcontainers.MsSql" Version="$(TestcontainersVersion)" />
106107
<PackageVersion Include="Testcontainers.Redis" Version="$(TestcontainersVersion)" />
107108
<PackageVersion Include="xunit" Version="2.9.2" />

test/HealthChecks.Npgsql.Tests/Functional/NpgsqlHealthCheckTests.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ public class DBConfigSetting
99
public string ConnectionString { get; set; } = null!;
1010
}
1111

12-
public class npgsql_healthcheck_should
12+
public class npgsql_healthcheck_should(PostgreSQLContainerFixture postgreSQLContainerFixture) : IClassFixture<PostgreSQLContainerFixture>
1313
{
1414
[Fact]
1515
public async Task be_healthy_if_npgsql_is_available()
1616
{
17-
var connectionString = "Server=127.0.0.1;Port=8010;User ID=postgres;Password=Password12!;database=postgres";
17+
var connectionString = postgreSQLContainerFixture.GetConnectionString();
1818

1919
var webHostBuilder = new WebHostBuilder()
2020
.ConfigureServices(services =>
@@ -40,7 +40,7 @@ public async Task be_healthy_if_npgsql_is_available()
4040
[Fact]
4141
public async Task be_unhealthy_if_sql_query_is_not_valid()
4242
{
43-
var connectionString = "Server=127.0.0.1;Port=8010;User ID=postgres;Password=Password12!;database=postgres";
43+
var connectionString = postgreSQLContainerFixture.GetConnectionString();
4444

4545
var webHostBuilder = new WebHostBuilder()
4646
.ConfigureServices(services =>
@@ -90,12 +90,14 @@ public async Task be_unhealthy_if_npgsql_is_not_available()
9090
[Fact]
9191
public async Task be_healthy_if_npgsql_is_available_by_iServiceProvider_registered()
9292
{
93+
var connectionString = postgreSQLContainerFixture.GetConnectionString();
94+
9395
var webHostBuilder = new WebHostBuilder()
9496
.ConfigureServices(services =>
9597
{
9698
services.AddSingleton(new DBConfigSetting
9799
{
98-
ConnectionString = "Server=127.0.0.1;Port=8010;User ID=postgres;Password=Password12!;database=postgres"
100+
ConnectionString = connectionString
99101
});
100102

101103
services.AddHealthChecks()
@@ -148,7 +150,7 @@ public async Task be_unhealthy_if_npgsql_is_not_available_registered()
148150
[Fact]
149151
public async Task unhealthy_check_log_detailed_messages()
150152
{
151-
var connectionString = "Server=127.0.0.1;Port=8010;User ID=postgres;Password=Password12!;database=postgres";
153+
var connectionString = postgreSQLContainerFixture.GetConnectionString();
152154

153155
var webHostBuilder = new WebHostBuilder()
154156
.ConfigureServices(services =>

test/HealthChecks.Npgsql.Tests/HealthChecks.Npgsql.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<ItemGroup>
44
<PackageReference Include="Npgsql.DependencyInjection" />
5+
<PackageReference Include="Testcontainers.PostgreSql" />
56
</ItemGroup>
67

78
<ItemGroup>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Testcontainers.PostgreSql;
2+
3+
namespace HealthChecks.Npgsql.Tests;
4+
5+
public sealed class PostgreSQLContainerFixture : IAsyncLifetime
6+
{
7+
public const string Registry = "docker.io";
8+
9+
public const string Image = "library/postgres";
10+
11+
public const string Tag = "17.0";
12+
13+
public PostgreSqlContainer? Container { get; private set; }
14+
15+
public string GetConnectionString() => Container?.GetConnectionString() ??
16+
throw new InvalidOperationException("The test container was not initialized.");
17+
18+
public async Task InitializeAsync() => Container = await CreateContainerAsync();
19+
20+
public async Task DisposeAsync()
21+
{
22+
if (Container is not null)
23+
await Container.DisposeAsync();
24+
}
25+
26+
public static async Task<PostgreSqlContainer> CreateContainerAsync()
27+
{
28+
var container = new PostgreSqlBuilder()
29+
.WithImage($"{Registry}/{Image}:{Tag}")
30+
.Build();
31+
await container.StartAsync();
32+
33+
return container;
34+
}
35+
}

0 commit comments

Comments
 (0)