Skip to content

Commit 846fbc9

Browse files
authored
Migrate HealthChecks.RavenDB tests to Testcontainers (#2408)
* Migrate HealthChecks.RavenDB tests to Testcontainers * Create database in fixture instead
1 parent d82593a commit 846fbc9

File tree

6 files changed

+70
-88
lines changed

6 files changed

+70
-88
lines changed

.github/workflows/healthchecks_ravendb_ci.yml

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

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

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
<PackageVersion Include="TestContainers.MongoDb" Version="$(TestcontainersVersion)" />
111111
<PackageVersion Include="Testcontainers.MsSql" Version="$(TestcontainersVersion)" />
112112
<PackageVersion Include="Testcontainers.MySql" Version="$(TestcontainersVersion)" />
113+
<PackageVersion Include="Testcontainers.RavenDb" Version="$(TestcontainersVersion)" />
113114
<PackageVersion Include="Testcontainers.Redis" Version="$(TestcontainersVersion)" />
114115
<PackageVersion Include="Testcontainers.RabbitMq" Version="$(TestcontainersVersion)" />
115116
<PackageVersion Include="xunit" Version="2.9.2" />

test/HealthChecks.RavenDb.Tests/Functional/RavenDbHealthCheckTests.cs

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,11 @@
11
using System.Net;
22
using HealthChecks.UI.Client;
3-
using Raven.Client.Documents;
4-
using Raven.Client.ServerWide;
5-
using Raven.Client.ServerWide.Operations;
63

74
namespace HealthChecks.RavenDb.Tests.Functional;
85

9-
public class ravendb_healthcheck_should
6+
public class ravendb_healthcheck_should(RavenDbContainerFixture ravenDbFixture) : IClassFixture<RavenDbContainerFixture>
107
{
11-
private readonly string[] _urls = ["http://localhost:9030"];
12-
13-
public ravendb_healthcheck_should()
14-
{
15-
try
16-
{
17-
using var store = new DocumentStore
18-
{
19-
Urls = _urls,
20-
};
21-
22-
store.Initialize();
23-
24-
store.Maintenance.Server.Send(new CreateDatabaseOperation(new DatabaseRecord("Demo")));
25-
}
26-
catch { }
27-
}
8+
private readonly string[] _urls = [ravenDbFixture.GetConnectionString()];
289

2910
[Fact]
3011
public async Task be_healthy_if_ravendb_is_available()

test/HealthChecks.RavenDb.Tests/Functional/RavenDbHealthCheckTestsSingleConnectionString.cs

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,10 @@
11
using System.Net;
2-
using Raven.Client.Documents;
3-
using Raven.Client.ServerWide;
4-
using Raven.Client.ServerWide.Operations;
52

63
namespace HealthChecks.RavenDb.Tests.Functional;
74

8-
public class ravendb_healthcheck_should_single_connection_string
5+
public class ravendb_healthcheck_should_single_connection_string(RavenDbContainerFixture ravenDbFixture) : IClassFixture<RavenDbContainerFixture>
96
{
10-
private const string ConnectionString = "http://localhost:9030";
11-
12-
public ravendb_healthcheck_should_single_connection_string()
13-
{
14-
try
15-
{
16-
using var store = new DocumentStore
17-
{
18-
Urls = [ConnectionString],
19-
};
20-
21-
store.Initialize();
22-
23-
store.Maintenance.Server.Send(new CreateDatabaseOperation(new DatabaseRecord("Demo")));
24-
}
25-
catch { }
26-
}
7+
private readonly string _connectionString = ravenDbFixture.GetConnectionString();
278

289
[Fact]
2910
public async Task be_healthy_if_ravendb_is_available()
@@ -33,7 +14,7 @@ public async Task be_healthy_if_ravendb_is_available()
3314
{
3415
services
3516
.AddHealthChecks()
36-
.AddRavenDB(setup => setup.Urls = [ConnectionString], tags: ["ravendb"]);
17+
.AddRavenDB(setup => setup.Urls = [_connectionString], tags: ["ravendb"]);
3718
})
3819
.Configure(app =>
3920
{
@@ -58,7 +39,7 @@ public async Task be_healthy_if_ravendb_is_available_and_contains_specific_datab
5839
{
5940
services
6041
.AddHealthChecks()
61-
.AddRavenDB(setup => setup.Urls = [ConnectionString], "Demo", tags: ["ravendb"]);
42+
.AddRavenDB(setup => setup.Urls = [_connectionString], "Demo", tags: ["ravendb"]);
6243
})
6344
.Configure(app =>
6445
{
@@ -112,7 +93,7 @@ public async Task be_unhealthy_if_ravendb_is_available_but_database_doesnot_exis
11293
.AddHealthChecks()
11394
.AddRavenDB(setup =>
11495
{
115-
setup.Urls = [ConnectionString];
96+
setup.Urls = [_connectionString];
11697
setup.Database = "ThisDatabaseReallyDoesnExist";
11798
}, "ThisDatabaseReallyDoesnExist", tags: ["ravendb"]);
11899
})

test/HealthChecks.RavenDb.Tests/HealthChecks.RavenDb.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.RavenDB\HealthChecks.RavenDB.csproj" />
55
</ItemGroup>
66

7+
<ItemGroup>
8+
<PackageReference Include="Testcontainers.RavenDb" />
9+
</ItemGroup>
10+
711
</Project>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using Raven.Client.Documents;
2+
using Raven.Client.ServerWide;
3+
using Raven.Client.ServerWide.Operations;
4+
using Testcontainers.RavenDb;
5+
6+
namespace HealthChecks.RavenDb.Tests;
7+
8+
public class RavenDbContainerFixture : IAsyncLifetime
9+
{
10+
private const string Registry = "docker.io";
11+
12+
private const string Image = "ravendb/ravendb";
13+
14+
private const string Tag = "7.1-latest";
15+
16+
public RavenDbContainer? Container { get; private set; }
17+
18+
public string GetConnectionString()
19+
{
20+
if (Container is null)
21+
{
22+
throw new InvalidOperationException("The test container was not initialized.");
23+
}
24+
25+
return Container.GetConnectionString();
26+
}
27+
28+
public async Task InitializeAsync()
29+
{
30+
Container = await CreateContainerAsync();
31+
32+
using var store = new DocumentStore();
33+
34+
store.Urls = [GetConnectionString()];
35+
36+
store.Initialize();
37+
38+
await store.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord("Demo")));
39+
}
40+
41+
public Task DisposeAsync() => Container?.DisposeAsync().AsTask() ?? Task.CompletedTask;
42+
43+
private async Task<RavenDbContainer?> CreateContainerAsync()
44+
{
45+
var container = new RavenDbBuilder()
46+
.WithImage($"{Registry}/{Image}:{Tag}")
47+
.Build();
48+
49+
await container.StartAsync();
50+
51+
return container;
52+
}
53+
}

0 commit comments

Comments
 (0)