Skip to content

Commit

Permalink
Add AdminPath to WireMockServerSettings (#1130)
Browse files Browse the repository at this point in the history
* Make admin endpoint configurable

* Add AdminPath to WireMockServerSettings

* sealed

* foo

* WireMockServer_CreateClient_And_CallAdminSettingsEndpoint
  • Loading branch information
StefH authored Jul 9, 2024
1 parent d96ae9b commit 8788d9b
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 83 deletions.
121 changes: 69 additions & 52 deletions src/WireMock.Net/Server/WireMockServer.Admin.cs

Large diffs are not rendered by default.

6 changes: 2 additions & 4 deletions src/WireMock.Net/Server/WireMockServer.AdminFiles.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@
using System.Linq;
using System.Net;
using System.Text;
using WireMock.Matchers;
using WireMock.Types;
using WireMock.Util;

namespace WireMock.Server;

public partial class WireMockServer
{
private static readonly RegexMatcher AdminFilesFilenamePathMatcher = new(@"^\/__admin\/files\/.*$");
private static readonly Encoding[] FileBodyIsString = { Encoding.UTF8, Encoding.ASCII };

#region Files/{filename}
Expand Down Expand Up @@ -117,9 +115,9 @@ private IResponseMessage FileDelete(IRequestMessage requestMessage)
return ResponseMessageBuilder.Create(HttpStatusCode.OK, "File deleted.");
}

private static string GetFileNameFromRequestMessage(IRequestMessage requestMessage)
private string GetFileNameFromRequestMessage(IRequestMessage requestMessage)
{
return Path.GetFileName(requestMessage.Path.Substring(AdminFiles.Length + 1));
return Path.GetFileName(requestMessage.Path.Substring(_adminPaths!.Files.Length + 1));
}
#endregion
}
27 changes: 17 additions & 10 deletions src/WireMock.Net/Settings/WireMockServerSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -245,16 +245,16 @@ public class WireMockServerSettings
public bool CustomCertificateDefined => CertificateSettings?.IsDefined == true;

#if USE_ASPNETCORE
/// <summary>
/// Client certificate mode for the server
/// </summary>
[PublicAPI]
public ClientCertificateMode ClientCertificateMode { get; set; }

/// <summary>
/// Whether to accept any client certificate
/// </summary>
public bool AcceptAnyClientCertificate { get; set; }
/// <summary>
/// Client certificate mode for the server
/// </summary>
[PublicAPI]
public ClientCertificateMode ClientCertificateMode { get; set; }

/// <summary>
/// Whether to accept any client certificate
/// </summary>
public bool AcceptAnyClientCertificate { get; set; }
#endif

/// <summary>
Expand Down Expand Up @@ -320,4 +320,11 @@ public class WireMockServerSettings
/// </summary>
[PublicAPI]
public Dictionary<string, GraphQLSchemaDetails>? GraphQLSchemas { get; set; }

/// <summary>
/// The admin path to use for accessing the Admin REST interface.
/// If not set <c>__/admin</c> is used.
/// </summary>
[PublicAPI]
public string? AdminPath { get; set; }
}
1 change: 1 addition & 0 deletions src/WireMock.Net/Settings/WireMockServerSettingsParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public static bool TryParseArguments(string[] args, IDictionary? environment, [N
AdminAzureADTenant = parser.GetStringValue(nameof(WireMockServerSettings.AdminAzureADTenant)),
AdminPassword = parser.GetStringValue(nameof(WireMockServerSettings.AdminPassword)),
AdminUsername = parser.GetStringValue(nameof(WireMockServerSettings.AdminUsername)),
AdminPath = parser.GetStringValue(nameof(WireMockServerSettings.AdminPath), "/__admin"),
AllowBodyForAllHttpMethods = parser.GetBoolValue(nameof(WireMockServerSettings.AllowBodyForAllHttpMethods)),
AllowCSharpCodeMatcher = parser.GetBoolValue(nameof(WireMockServerSettings.AllowCSharpCodeMatcher)),
AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue(nameof(WireMockServerSettings.AllowOnlyDefinedHttpStatusCodeInResponse)),
Expand Down
22 changes: 22 additions & 0 deletions test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,28 @@ public async Task IWireMockAdminApi_GetSettingsAsync()
Check.That(settings).IsNotNull();
}

[Fact]
public async Task IWireMockAdminApi_GetSettingsAsync_ForDifferentAdminPath()
{
// Arrange
var server = WireMockServer.Start(w =>
{
w.StartAdminInterface = true;
w.AdminPath = "/foo/__admin";
});
var api = RestClient.For<IWireMockAdminApi>(server.Urls[0] + "/foo");

// Act
var settings = await api.GetSettingsAsync().ConfigureAwait(false);

// Assert
Check.That(settings).IsNotNull();

// Cleanup
server.Stop();
server.Dispose();
}

[Fact]
public async Task IWireMockAdminApi_PostSettingsAsync()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using FluentAssertions;
using WireMock.Settings;
using Xunit;

namespace WireMock.Net.Tests.Settings;

public class WireMockServerSettingsParserTests
{
[Fact]
public void TryParseArguments_With_Args()
{
// Act
var result = WireMockServerSettingsParser.TryParseArguments(new[]
{
"--adminPath", "ap"
}, null, out var settings);

// Assert
result.Should().BeTrue();
settings.Should().NotBeNull();
settings!.AdminPath.Should().Be("ap");
}

[Fact]
public void TryParseArguments_Without_Args()
{
// Act
var result = WireMockServerSettingsParser.TryParseArguments(new string[] { }, null, out var settings);

// Assert
result.Should().BeTrue();
settings.Should().NotBeNull();
settings!.AdminPath.Should().Be("/__admin");
}
}
54 changes: 37 additions & 17 deletions test/WireMock.Net.Tests/WireMockServer.Admin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Moq;
using Newtonsoft.Json;
using NFluent;
using WireMock.Admin.Settings;
using WireMock.Handlers;
using WireMock.Logging;
using WireMock.RequestBuilders;
Expand All @@ -22,13 +23,9 @@ namespace WireMock.Net.Tests;
public class WireMockServerAdminTests
{
// For for AppVeyor + OpenCover
private string GetCurrentFolder()
private static string GetCurrentFolder()
{
string current = Directory.GetCurrentDirectory();
//if (!current.EndsWith("WireMock.Net.Tests"))
// return Path.Combine(current, "test", "WireMock.Net.Tests");

return current;
return Directory.GetCurrentDirectory();
}

[Fact]
Expand Down Expand Up @@ -468,9 +465,9 @@ public async Task WireMockServer_Admin_DeleteMappings()

Check.That(server.MappingModels.Count()).Equals(3);

Guid? guid1 = server.MappingModels.ElementAt(0).Guid;
Guid? guid2 = server.MappingModels.ElementAt(1).Guid;
Guid? guid3 = server.MappingModels.ElementAt(2).Guid;
var guid1 = server.MappingModels.ElementAt(0).Guid;
var guid2 = server.MappingModels.ElementAt(1).Guid;
var guid3 = server.MappingModels.ElementAt(2).Guid;

Check.That(guid1).IsNotNull();
Check.That(guid2).IsNotNull();
Expand All @@ -482,7 +479,7 @@ public async Task WireMockServer_Admin_DeleteMappings()
$"]";

// Act
var request = new HttpRequestMessage()
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri($"http://localhost:{server.Ports[0]}/__admin/mappings"),
Expand All @@ -501,22 +498,45 @@ public async Task WireMockServer_Admin_DeleteMappings()
}

[Fact]
public async Task WireMockServer_Admin_()
public async Task WireMockServer_CreateClient_And_CallEndpoint()
{
// given
// Arrange
var server = WireMockServer.Start();
var client = server.CreateClient();

server.CreateClient();

// when
await new HttpClient().GetAsync("http://localhost:" + server.Ports[0] + "/foo").ConfigureAwait(false);
// Act
await client.GetAsync($"{server.Url}/foo").ConfigureAwait(false);

// then
// Assert
Check.That(server.LogEntries).HasSize(1);
var requestLogged = server.LogEntries.First();
Check.That(requestLogged.RequestMessage.Method).IsEqualTo("GET");
Check.That(requestLogged.RequestMessage.BodyData).IsNull();

// Cleanup
server.Stop();
server.Dispose();
}

[Fact]
public async Task WireMockServer_CreateClient_And_CallAdminSettingsEndpoint()
{
// Arrange
var server = WireMockServer.Start(w =>
{
w.StartAdminInterface = true;
w.AdminPath = "/adm";
});
var client = server.CreateClient();

// Act
var settings = await client.GetStringAsync($"{server.Url}/adm/settings").ConfigureAwait(false);

// Assert
settings.Should().NotBeNull();

// Cleanup
server.Stop();
server.Dispose();
}
}

0 comments on commit 8788d9b

Please sign in to comment.