Skip to content

Commit 05f5ba4

Browse files
authored
Migrate HealthChecks.SqlServer tests to Testcontainers (#2348)
1 parent f54852f commit 05f5ba4

File tree

5 files changed

+48
-47
lines changed

5 files changed

+48
-47
lines changed

.github/workflows/healthchecks_sqlserver_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-
sqlserver:
35-
image: mcr.microsoft.com/mssql/server
36-
ports:
37-
- 5433:1433
38-
env:
39-
ACCEPT_EULA: Y
40-
SA_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.SqlServer/HealthChecks.SqlServer.csproj &&
52-
dotnet restore ./test/HealthChecks.SqlServer.Tests/HealthChecks.SqlServer.Tests.csproj
53-
- name: Check formatting
54-
run: |
55-
dotnet format --no-restore --verify-no-changes --severity warn ./src/HealthChecks.SqlServer/HealthChecks.SqlServer.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) &&
56-
dotnet format --no-restore --verify-no-changes --severity warn ./test/HealthChecks.SqlServer.Tests/HealthChecks.SqlServer.Tests.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1)
57-
- name: Build
58-
run: |
59-
dotnet build --no-restore ./src/HealthChecks.SqlServer/HealthChecks.SqlServer.csproj &&
60-
dotnet build --no-restore ./test/HealthChecks.SqlServer.Tests/HealthChecks.SqlServer.Tests.csproj
61-
- name: Test
62-
run: >
63-
dotnet test
64-
./test/HealthChecks.SqlServer.Tests/HealthChecks.SqlServer.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: SqlServer
75-
directory: .coverage
32+
uses: ./.github/workflows/reusable_ci_workflow.yml
33+
with:
34+
PROJECT_PATH: ./src/HealthChecks.SqlServer/HealthChecks.SqlServer.csproj
35+
TEST_PROJECT_PATH: ./test/HealthChecks.SqlServer.Tests/HealthChecks.SqlServer.Tests.csproj
36+
CODECOV_FLAGS: SqlServer

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.MsSql" Version="$(TestcontainersVersion)" />
105106
<PackageVersion Include="Testcontainers.Redis" Version="$(TestcontainersVersion)" />
106107
<PackageVersion Include="xunit" Version="2.9.2" />
107108
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />

test/HealthChecks.SqlServer.Tests/Functional/SqlServerHealthCheckTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
namespace HealthChecks.SqlServer.Tests.Functional;
44

5-
public class sqlserver_healthcheck_should
5+
public class sqlserver_healthcheck_should(SqlServerContainerFixture sqlServerContainerFixture) : IClassFixture<SqlServerContainerFixture>
66
{
77
[Fact]
88
public async Task be_healthy_if_sqlServer_is_available()
99
{
10-
var connectionString = "Server=tcp:localhost,5433;Initial Catalog=master;User Id=sa;Password=Password12!;Encrypt=false";
10+
var connectionString = sqlServerContainerFixture.GetConnectionString();
1111

1212
var webHostBuilder = new WebHostBuilder()
1313
.ConfigureServices(services =>
@@ -57,7 +57,7 @@ public async Task be_unhealthy_if_sqlServer_is_not_available()
5757
[Fact]
5858
public async Task be_unhealthy_if_sqlquery_spec_is_not_valid()
5959
{
60-
var connectionString = "Server=tcp:localhost,5433;Initial Catalog=master;User Id=sa;Password=Password12!;Encrypt=false";
60+
var connectionString = sqlServerContainerFixture.GetConnectionString();
6161

6262
var webHostBuilder = new WebHostBuilder()
6363
.ConfigureServices(services =>

test/HealthChecks.SqlServer.Tests/HealthChecks.SqlServer.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

3+
<ItemGroup>
4+
<PackageReference Include="Testcontainers.MsSql" />
5+
</ItemGroup>
6+
37
<ItemGroup>
48
<ProjectReference Include="..\..\src\HealthChecks.SqlServer\HealthChecks.SqlServer.csproj" />
59
</ItemGroup>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Testcontainers.MsSql;
2+
3+
namespace HealthChecks.SqlServer.Tests;
4+
5+
public sealed class SqlServerContainerFixture : IAsyncLifetime
6+
{
7+
public const string Registry = "mcr.microsoft.com";
8+
9+
public const string Image = "mssql/server";
10+
11+
public const string Tag = "2022-latest";
12+
13+
public MsSqlContainer? 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<MsSqlContainer> CreateContainerAsync()
27+
{
28+
var container = new MsSqlBuilder()
29+
.WithImage($"{Registry}/{Image}:{Tag}")
30+
.Build();
31+
await container.StartAsync();
32+
33+
return container;
34+
}
35+
}

0 commit comments

Comments
 (0)