diff --git a/.github/workflows/healthchecks_nats_ci.yml b/.github/workflows/healthchecks_nats_ci.yml index 69853fd915..d372a414e3 100644 --- a/.github/workflows/healthchecks_nats_ci.yml +++ b/.github/workflows/healthchecks_nats_ci.yml @@ -29,46 +29,8 @@ on: jobs: build: - runs-on: ubuntu-latest - services: - nats: - image: nats:latest - ports: - - "4222:4222" - - "8222:8222" - - "6222:6222" - steps: - - uses: actions/checkout@v3 - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 8.0.x - 9.0.x - - name: Restore - run: | - dotnet restore ./src/HealthChecks.Nats/HealthChecks.Nats.csproj && - dotnet restore ./test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj - - name: Check formatting - run: | - dotnet format --no-restore --verify-no-changes --severity warn ./src/HealthChecks.Nats/HealthChecks.Nats.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) && - dotnet format --no-restore --verify-no-changes --severity warn ./test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) - - name: Build - run: | - dotnet build --no-restore ./src/HealthChecks.Nats/HealthChecks.Nats.csproj && - dotnet build --no-restore ./test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj - - name: Test - run: > - dotnet test - ./test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj - --no-restore - --no-build - --collect "XPlat Code Coverage" - --results-directory .coverage - -- - DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover - - name: Upload Coverage - uses: codecov/codecov-action@v5 - with: - flags: Nats - directory: .coverage + uses: ./.github/workflows/reusable_ci_workflow.yml + with: + PROJECT_PATH: ./src/HealthChecks.Nats/HealthChecks.Nats.csproj + TEST_PROJECT_PATH: ./test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj + CODECOV_FLAGS: Nats diff --git a/Directory.Packages.props b/Directory.Packages.props index 2c2207765a..91308f0a85 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -106,6 +106,7 @@ + diff --git a/test/HealthChecks.Nats.Tests/Defines.cs b/test/HealthChecks.Nats.Tests/Defines.cs deleted file mode 100644 index 793700bf79..0000000000 --- a/test/HealthChecks.Nats.Tests/Defines.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace HealthChecks.Nats.Tests; - -internal class Defines -{ - public const string DefaultLocalConnectionString = "nats://localhost:4222"; - public const string DemoConnectionString = "nats://demo.nats.io:4222"; - public const string MixedLocalUrl = "nats://localhost:4222, nats://localhost:8222"; - public const string ConnectionStringDoesNotExistOrStopped = "nats://DoesNotExist:4222"; - - public const string CredentialsPathDoesnExist = nameof(CredentialsPathDoesnExist); - - public const string NatsName = "nats"; - public const string CustomRegistrationName = nameof(CustomRegistrationName); - public static readonly string[] Tags = [NatsName]; - - public const string HealthRequestRelativePath = "/health"; -} diff --git a/test/HealthChecks.Nats.Tests/DependencyInjection/RegistrationTests.cs b/test/HealthChecks.Nats.Tests/DependencyInjection/RegistrationTests.cs index da2be2a245..0886f534eb 100644 --- a/test/HealthChecks.Nats.Tests/DependencyInjection/RegistrationTests.cs +++ b/test/HealthChecks.Nats.Tests/DependencyInjection/RegistrationTests.cs @@ -1,10 +1,11 @@ using NATS.Client.Core; -using static HealthChecks.Nats.Tests.Defines; namespace HealthChecks.Nats.Tests.DependencyInjection; public class nats_registration_should { + private const string ConnectionString = "nats://localhost:4222"; + [Fact] public void add_health_check_when_properly_configured() { @@ -47,7 +48,7 @@ public void add_health_check_when_properly_configured_by_using_singlton_regestra var services = new ServiceCollection(); var natsOpts = NatsOpts.Default with { - Url = DefaultLocalConnectionString, + Url = ConnectionString, }; var connection = new NatsConnection(natsOpts); @@ -86,7 +87,7 @@ private NatsConnection ClientFactory(IServiceProvider _) { var options = NatsOpts.Default with { - Url = DefaultLocalConnectionString, + Url = ConnectionString, }; return new NatsConnection(options); } diff --git a/test/HealthChecks.Nats.Tests/Functional/NatsHealthCheckTests.cs b/test/HealthChecks.Nats.Tests/Functional/NatsHealthCheckTests.cs index 5aeb63d843..2944748f78 100644 --- a/test/HealthChecks.Nats.Tests/Functional/NatsHealthCheckTests.cs +++ b/test/HealthChecks.Nats.Tests/Functional/NatsHealthCheckTests.cs @@ -1,21 +1,21 @@ using System.Net; using NATS.Client.Core; -using NATS.Client.Hosting; -using static HealthChecks.Nats.Tests.Defines; namespace HealthChecks.Nats.Tests.Functional; -public class nats_healthcheck_should +public class nats_healthcheck_should(NatsContainerFixture natsFixture) : IClassFixture { [Fact] public async Task be_healthy_when_nats_is_available_using_client_factory() { + string connectionString = natsFixture.GetConnectionString(); + var webHostBuilder = new WebHostBuilder() .ConfigureServices(services => { var options = NatsOpts.Default with { - Url = DefaultLocalConnectionString, + Url = connectionString, }; var natsConnection = new NatsConnection(options); @@ -42,12 +42,14 @@ public async Task be_healthy_when_nats_is_available_using_client_factory() [Fact] public async Task be_healthy_when_nats_is_available_using_singleton() { + string connectionString = natsFixture.GetConnectionString(); + var webHostBuilder = new WebHostBuilder() .ConfigureServices(services => { var options = NatsOpts.Default with { - Url = DefaultLocalConnectionString, + Url = connectionString }; services @@ -83,7 +85,7 @@ public async Task be_unhealthy_when_nats_is_unavailable() { var options = NatsOpts.Default with { - Url = ConnectionStringDoesNotExistOrStopped, + Url = "nats://DoesNotExist:4222", }; return new NatsConnection(options); }, tags: new string[] { "nats" }); diff --git a/test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj b/test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj index 02fb71da06..15cedbc29c 100644 --- a/test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj +++ b/test/HealthChecks.Nats.Tests/HealthChecks.Nats.Tests.csproj @@ -4,4 +4,8 @@ + + + + diff --git a/test/HealthChecks.Nats.Tests/NatsContainerFixture.cs b/test/HealthChecks.Nats.Tests/NatsContainerFixture.cs new file mode 100644 index 0000000000..38b9dafa4a --- /dev/null +++ b/test/HealthChecks.Nats.Tests/NatsContainerFixture.cs @@ -0,0 +1,39 @@ +using Testcontainers.Nats; + +namespace HealthChecks.Nats.Tests; + +public class NatsContainerFixture : IAsyncLifetime +{ + private const string Registry = "docker.io"; + + private const string Image = "library/nats"; + + private const string Tag = "2.11.8"; + + public NatsContainer? Container { get; private set; } + + public string GetConnectionString() + { + if (Container is null) + { + throw new InvalidOperationException("The test container was not initialized."); + } + + return Container.GetConnectionString(); + } + + public async Task InitializeAsync() => Container = await CreateContainerAsync(); + + public Task DisposeAsync() => Container?.DisposeAsync().AsTask() ?? Task.CompletedTask; + + private static async Task CreateContainerAsync() + { + var container = new NatsBuilder() + .WithImage($"{Registry}/{Image}:{Tag}") + .Build(); + + await container.StartAsync(); + + return container; + } +}