diff --git a/src/WireMock.Net.RestClient/IWireMockAdminApi.cs b/src/WireMock.Net.RestClient/IWireMockAdminApi.cs index 2a798cfa..4de6622b 100644 --- a/src/WireMock.Net.RestClient/IWireMockAdminApi.cs +++ b/src/WireMock.Net.RestClient/IWireMockAdminApi.cs @@ -24,12 +24,24 @@ public interface IWireMockAdminApi [Header("Authorization")] AuthenticationHeaderValue Authorization { get; set; } + /// + /// Get health status. + /// + /// The optional cancellationToken. + /// + /// Returns HttpStatusCode 200 with a value Healthy to indicate that WireMock.Net is healthy. + /// Else it returns HttpStatusCode 404. + /// + [Get("health")] + [AllowAnyStatusCode] + Task GetHealthAsync(CancellationToken cancellationToken = default); + /// /// Get the settings. /// /// SettingsModel [Get("settings")] - Task GetSettingsAsync(); + Task GetSettingsAsync(CancellationToken cancellationToken = default); /// /// Update the settings. diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index afb72518..0656efa4 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -31,6 +31,7 @@ public partial class WireMockServer { private const int EnhancedFileSystemWatcherTimeoutMs = 1000; private const string AdminFiles = "/__admin/files"; + private const string AdminHealth = "/__admin/health"; private const string AdminMappings = "/__admin/mappings"; private const string AdminMappingsCode = "/__admin/mappings/code"; private const string AdminMappingsWireMockOrg = "/__admin/mappings/wiremock.org"; @@ -54,6 +55,9 @@ public partial class WireMockServer #region InitAdmin private void InitAdmin() { + // __admin/health + Given(Request.Create().WithPath(AdminHealth).UsingGet()).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(HealthGet)); + // __admin/settings Given(Request.Create().WithPath(AdminSettings).UsingGet()).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(SettingsGet)); Given(Request.Create().WithPath(AdminSettings).UsingMethod("PUT", "POST").WithHeader(HttpKnownHeaderNames.ContentType, AdminRequestContentTypeJson)).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(SettingsUpdate)); @@ -218,6 +222,22 @@ public partial class WireMockServer } #endregion + #region Health + private static IResponseMessage HealthGet(IRequestMessage requestMessage) + { + return new ResponseMessage + { + BodyData = new BodyData + { + DetectedBodyType = BodyType.String, + BodyAsString = "Healthy" + }, + StatusCode = (int)HttpStatusCode.OK, + Headers = new Dictionary> { { HttpKnownHeaderNames.ContentType, new WireMockList(WireMockConstants.ContentTypeTextPlain) } } + }; + } + #endregion + #region Settings private IResponseMessage SettingsGet(IRequestMessage requestMessage) { @@ -830,4 +850,4 @@ public partial class WireMockServer var singleResult = ((JObject)value).ToObject(); return new[] { singleResult! }; } -} +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs b/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs index dde12f4e..6dc03f37 100644 --- a/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs +++ b/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs @@ -41,6 +41,18 @@ public partial class WireMockAdminApiTests VerifyNewtonsoftJson.Enable(VerifySettings); } + [Fact] + public async Task IWireMockAdminApi_GetHealthAsync() + { + // Arrange + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var status = await api.GetHealthAsync().ConfigureAwait(false); + status.Should().Be("Healthy"); + } + [Fact] public async Task IWireMockAdminApi_GetSettingsAsync() { diff --git a/test/WireMock.Net.Tests/WireMockServer.Proxy.cs b/test/WireMock.Net.Tests/WireMockServer.Proxy.cs index 1504b636..6bb753c4 100644 --- a/test/WireMock.Net.Tests/WireMockServer.Proxy.cs +++ b/test/WireMock.Net.Tests/WireMockServer.Proxy.cs @@ -117,7 +117,7 @@ public class WireMockServerProxyTests } // Assert - server.Mappings.Should().HaveCount(35); + server.Mappings.Should().HaveCount(36); } [Fact] diff --git a/test/WireMock.Net.Tests/WireMockServer.Settings.cs b/test/WireMock.Net.Tests/WireMockServer.Settings.cs index d1e8e9c9..a698527b 100644 --- a/test/WireMock.Net.Tests/WireMockServer.Settings.cs +++ b/test/WireMock.Net.Tests/WireMockServer.Settings.cs @@ -81,7 +81,7 @@ public class WireMockServerSettingsTests // Assert server.Mappings.Should().NotBeNull(); - server.Mappings.Should().HaveCount(33); + server.Mappings.Should().HaveCount(34); server.Mappings.All(m => m.Priority == WireMockConstants.AdminPriority).Should().BeTrue(); } @@ -100,9 +100,9 @@ public class WireMockServerSettingsTests // Assert server.Mappings.Should().NotBeNull(); - server.Mappings.Should().HaveCount(34); + server.Mappings.Should().HaveCount(35); - server.Mappings.Count(m => m.Priority == WireMockConstants.AdminPriority).Should().Be(33); + server.Mappings.Count(m => m.Priority == WireMockConstants.AdminPriority).Should().Be(34); server.Mappings.Count(m => m.Priority == WireMockConstants.ProxyPriority).Should().Be(1); }