diff --git a/.github/workflows/healthchecks_consul_ci.yml b/.github/workflows/healthchecks_consul_ci.yml index d4a11ffabe..73a6a6f3a9 100644 --- a/.github/workflows/healthchecks_consul_ci.yml +++ b/.github/workflows/healthchecks_consul_ci.yml @@ -29,45 +29,8 @@ on: jobs: build: - runs-on: ubuntu-latest - services: - consul: - image: hashicorp/consul:latest - ports: - - 8500:8500 - - 8600:8600 - 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.Consul/HealthChecks.Consul.csproj && - dotnet restore ./test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj - - name: Check formatting - run: | - dotnet format --no-restore --verify-no-changes --severity warn ./src/HealthChecks.Consul/HealthChecks.Consul.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) && - dotnet format --no-restore --verify-no-changes --severity warn ./test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) - - name: Build - run: | - dotnet build --no-restore ./src/HealthChecks.Consul/HealthChecks.Consul.csproj && - dotnet build --no-restore ./test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj - - name: Test - run: > - dotnet test - ./test/HealthChecks.Consul.Tests/HealthChecks.Consul.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: Consul - directory: .coverage + uses: ./.github/workflows/reusable_ci_workflow.yml + with: + PROJECT_PATH: ./src/HealthChecks.Consul/HealthChecks.Consul.csproj + TEST_PROJECT_PATH: ./test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj + CODECOV_FLAGS: Consul diff --git a/Directory.Packages.props b/Directory.Packages.props index 2c2207765a..24912c6446 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -104,6 +104,7 @@ + diff --git a/test/HealthChecks.Consul.Tests/ConsulContainerFixture.cs b/test/HealthChecks.Consul.Tests/ConsulContainerFixture.cs new file mode 100644 index 0000000000..095276ebda --- /dev/null +++ b/test/HealthChecks.Consul.Tests/ConsulContainerFixture.cs @@ -0,0 +1,44 @@ +using Testcontainers.Consul; + +namespace HealthChecks.Consul.Tests; + +public class ConsulContainerFixture : IAsyncLifetime +{ + private const string Registry = "docker.io"; + + private const string Image = "library/consul"; + + private const string Tag = "1.15.4"; + + public ConsulContainer? Container { get; private set; } + + public ConsulOptions GetConnectionOptions() + { + if (Container is null) + { + throw new InvalidOperationException("The test container was not initialized."); + } + + return new ConsulOptions + { + HostName = Container.Hostname, + Port = Container.GetMappedPublicPort(ConsulBuilder.ConsulHttpPort), + RequireHttps = false + }; + } + + public async Task InitializeAsync() => Container = await CreateContainerAsync(); + + public Task DisposeAsync() => Container?.DisposeAsync().AsTask() ?? Task.CompletedTask; + + private async Task CreateContainerAsync() + { + var container = new ConsulBuilder() + .WithImage($"{Registry}/{Image}:{Tag}") + .Build(); + + await container.StartAsync(); + + return container; + } +} diff --git a/test/HealthChecks.Consul.Tests/Functional/ConsulHealthCheckTests.cs b/test/HealthChecks.Consul.Tests/Functional/ConsulHealthCheckTests.cs index cf0f557c94..3ce437ca45 100644 --- a/test/HealthChecks.Consul.Tests/Functional/ConsulHealthCheckTests.cs +++ b/test/HealthChecks.Consul.Tests/Functional/ConsulHealthCheckTests.cs @@ -2,20 +2,22 @@ namespace HealthChecks.Consul.Tests.Functional; -public class consul_healthcheck_should +public class consul_healthcheck_should(ConsulContainerFixture consulFixture) : IClassFixture { [Fact] public async Task be_healthy_if_consul_is_available() { + var options = consulFixture.GetConnectionOptions(); + var webHostBuilder = new WebHostBuilder() .ConfigureServices(services => { services.AddHealthChecks() .AddConsul(setup => { - setup.HostName = "localhost"; - setup.Port = 8500; - setup.RequireHttps = false; + setup.HostName = options.HostName; + setup.Port = options.Port; + setup.RequireHttps = options.RequireHttps; }, tags: ["consul"]); }) .Configure(app => @@ -36,6 +38,8 @@ public async Task be_healthy_if_consul_is_available() [Fact] public async Task be_unhealthy_if_consul_is_not_available() { + var options = consulFixture.GetConnectionOptions(); + var webHostBuilder = new WebHostBuilder() .ConfigureServices(services => { @@ -43,8 +47,8 @@ public async Task be_unhealthy_if_consul_is_not_available() .AddConsul(setup => { setup.HostName = "non-existing-host"; - setup.Port = 8500; - setup.RequireHttps = false; + setup.Port = options.Port; + setup.RequireHttps = options.RequireHttps; }, tags: ["consul"]); }) .Configure(app => diff --git a/test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj b/test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj index fa346d7185..7a117df260 100644 --- a/test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj +++ b/test/HealthChecks.Consul.Tests/HealthChecks.Consul.Tests.csproj @@ -4,4 +4,8 @@ + + + +