Skip to content

Commit 38df263

Browse files
committed
Migrate HealthChecks.OpenIdConnectServer tests to Testcontainers
1 parent 846fbc9 commit 38df263

File tree

5 files changed

+59
-44
lines changed

5 files changed

+59
-44
lines changed

.github/workflows/healthchecks_openidconnectserver_ci.yml

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

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

Directory.Packages.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
<PackageVersion Include="Testcontainers" Version="$(TestcontainersVersion)" />
106106
<PackageVersion Include="Testcontainers.ClickHouse" Version="$(TestcontainersVersion)" />
107107
<PackageVersion Include="Testcontainers.Kafka" Version="$(TestcontainersVersion)" />
108+
<PackageVersion Include="Testcontainers.Keycloak" Version="$(TestcontainersVersion)" />
108109
<PackageVersion Include="Testcontainers.Milvus" Version="$(TestcontainersVersion)" />
109110
<PackageVersion Include="Testcontainers.PostgreSql" Version="$(TestcontainersVersion)" />
110111
<PackageVersion Include="TestContainers.MongoDb" Version="$(TestcontainersVersion)" />
@@ -119,4 +120,4 @@
119120
<ItemGroup Condition="'$(IsPackable)' == 'true'">
120121
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
121122
</ItemGroup>
122-
</Project>
123+
</Project>

test/HealthChecks.OpenIdConnectServer.Tests/Functional/OpenIdConnectServerHealthCheckTests.cs

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

33
namespace HealthChecks.OpenIdConnectServer.Tests.Functional;
44

5-
public class oidc_server_healthcheck_should
5+
public class oidc_server_healthcheck_should(KeycloakContainerFixture keycloakFixture) : IClassFixture<KeycloakContainerFixture>
66
{
77
[Fact]
88
public async Task be_unhealthy_if_oidc_server_is_unavailable()
@@ -32,12 +32,14 @@ public async Task be_unhealthy_if_oidc_server_is_unavailable()
3232
[Fact]
3333
public async Task be_healthy_if_oidc_server_is_available()
3434
{
35+
string baseAddress = keycloakFixture.GetBaseAddress();
36+
3537
var webHostBuilder = new WebHostBuilder()
3638
.ConfigureServices(services =>
3739
{
3840
services
3941
.AddHealthChecks()
40-
.AddOpenIdConnectServer(new Uri("http://localhost:8888"), tags: ["oidcserver"]);
42+
.AddOpenIdConnectServer(new Uri(baseAddress), tags: ["oidcserver"]);
4143
})
4244
.Configure(app =>
4345
{

test/HealthChecks.OpenIdConnectServer.Tests/HealthChecks.OpenIdConnectServer.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@
44
<ProjectReference Include="..\..\src\HealthChecks.OpenIdConnectServer\HealthChecks.OpenIdConnectServer.csproj" />
55
</ItemGroup>
66

7+
<ItemGroup>
8+
<PackageReference Include="Testcontainers.Keycloak" />
9+
</ItemGroup>
10+
711
</Project>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using Testcontainers.Keycloak;
2+
3+
namespace HealthChecks.OpenIdConnectServer.Tests;
4+
5+
public class KeycloakContainerFixture : IAsyncLifetime
6+
{
7+
private const string Registry = "quay.io";
8+
9+
private const string Image = "keycloak/keycloak";
10+
11+
private const string Tag = "26.3.2";
12+
13+
public KeycloakContainer? Container { get; private set; }
14+
15+
public string GetBaseAddress()
16+
{
17+
if (Container is null)
18+
{
19+
throw new InvalidOperationException("The test container was not initialized.");
20+
}
21+
22+
var uriBuilder = new UriBuilder(Container.GetBaseAddress())
23+
{
24+
Path = "/realms/master/"
25+
};
26+
27+
return uriBuilder.ToString();
28+
}
29+
30+
public async Task InitializeAsync() => Container = await CreateContainerAsync();
31+
32+
public Task DisposeAsync() => Container?.DisposeAsync().AsTask() ?? Task.CompletedTask;
33+
34+
private static async Task<KeycloakContainer> CreateContainerAsync()
35+
{
36+
var container = new KeycloakBuilder()
37+
.WithImage($"{Registry}/{Image}:{Tag}")
38+
.Build();
39+
40+
await container.StartAsync();
41+
42+
return container;
43+
}
44+
}

0 commit comments

Comments
 (0)