From ac3d17e5f595397ff8b6c6d87ea5f1be997e5d05 Mon Sep 17 00:00:00 2001 From: Thomas Levesque Date: Fri, 22 Dec 2023 11:21:38 -0500 Subject: [PATCH] Change FindRequestByMappingGuidAsync to return a collection of entries --- .../IWireMockAdminApi.cs | 6 +-- .../Server/WireMockServer.Admin.cs | 18 ++++----- .../WireMockAdminApiTests.cs | 38 +++++++++++++------ 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/WireMock.Net.RestClient/IWireMockAdminApi.cs b/src/WireMock.Net.RestClient/IWireMockAdminApi.cs index e8f07c2e0..2a798cfae 100644 --- a/src/WireMock.Net.RestClient/IWireMockAdminApi.cs +++ b/src/WireMock.Net.RestClient/IWireMockAdminApi.cs @@ -201,12 +201,12 @@ public interface IWireMockAdminApi Task> FindRequestsAsync([Body] RequestModel model, CancellationToken cancellationToken = default); /// - /// Find a request based on the Mapping Guid. + /// Find requests based on the Mapping Guid. /// /// The Mapping Guid /// The optional cancellationToken. [Get("requests/find")] - Task FindRequestByMappingGuidAsync([Query] Guid mappingGuid, CancellationToken cancellationToken = default); + Task> FindRequestsByMappingGuidAsync([Query] Guid mappingGuid, CancellationToken cancellationToken = default); /// /// Get all scenarios @@ -304,4 +304,4 @@ public interface IWireMockAdminApi /// The optional cancellationToken. [Post("openapi/save")] Task OpenApiSaveAsync([Body] string text, CancellationToken cancellationToken = default); -} \ No newline at end of file +} diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index 15c225d7f..6e5e41a18 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -99,7 +99,7 @@ private void InitAdmin() // __admin/requests/find Given(Request.Create().WithPath(AdminRequests + "/find").UsingPost()).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(RequestsFind)); - Given(Request.Create().WithPath(AdminRequests + "/find").UsingGet().WithParam("mappingGuid", new NotNullOrEmptyMatcher())).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(RequestFindByMappingGuid)); + Given(Request.Create().WithPath(AdminRequests + "/find").UsingGet().WithParam("mappingGuid", new NotNullOrEmptyMatcher())).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(RequestsFindByMappingGuid)); // __admin/scenarios Given(Request.Create().WithPath(AdminScenarios).UsingGet()).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(ScenariosGet)); @@ -602,21 +602,17 @@ private IResponseMessage RequestsFind(IRequestMessage requestMessage) return ToJson(result); } - private IResponseMessage RequestFindByMappingGuid(IRequestMessage requestMessage) + private IResponseMessage RequestsFindByMappingGuid(IRequestMessage requestMessage) { if (requestMessage.Query != null && requestMessage.Query.TryGetValue("mappingGuid", out var value) && Guid.TryParse(value.ToString(), out var mappingGuid) ) { - var logEntry = LogEntries.SingleOrDefault(le => !le.RequestMessage.Path.StartsWith("/__admin/") && le.MappingGuid == mappingGuid); - if (logEntry != null) - { - var logEntryMapper = new LogEntryMapper(_options); - return ToJson(logEntryMapper.Map(logEntry)); - } - - return ResponseMessageBuilder.Create(HttpStatusCode.OK); + var logEntries = LogEntries.Where(le => !le.RequestMessage.Path.StartsWith("/__admin/") && le.MappingGuid == mappingGuid); + var logEntryMapper = new LogEntryMapper(_options); + var result = logEntries.Select(logEntryMapper.Map); + return ToJson(result); } return ResponseMessageBuilder.Create(HttpStatusCode.BadRequest); @@ -833,4 +829,4 @@ private static T[] DeserializeObjectToArray(object value) var singleResult = ((JObject)value).ToObject(); return new[] { singleResult! }; } -} \ No newline at end of file +} diff --git a/test/WireMock.Net.Tests/WireMockAdminApiTests.cs b/test/WireMock.Net.Tests/WireMockAdminApiTests.cs index b25018321..587cbbb24 100644 --- a/test/WireMock.Net.Tests/WireMockAdminApiTests.cs +++ b/test/WireMock.Net.Tests/WireMockAdminApiTests.cs @@ -1,5 +1,6 @@ #if !(NET452 || NET461 || NETCOREAPP3_1) using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; @@ -25,6 +26,7 @@ using WireMock.ResponseBuilders; using WireMock.Server; using WireMock.Settings; +using WireMock.Types; using Xunit; namespace WireMock.Net.Tests; @@ -254,7 +256,7 @@ public async Task IWireMockAdminApi_FindRequestsAsync() } [Fact] - public async Task IWireMockAdminApi_FindRequestByMappingGuidAsync_Found() + public async Task IWireMockAdminApi_FindRequestsByMappingGuidAsync_Found() { // Arrange var mappingGuid = Guid.NewGuid(); @@ -269,21 +271,33 @@ public async Task IWireMockAdminApi_FindRequestByMappingGuidAsync_Found() .RespondWith(Response.Create()); var serverUrl = "http://localhost:" + server.Ports[0]; - await new HttpClient().GetAsync(serverUrl + "/foo").ConfigureAwait(false); + using var client = new HttpClient(); + await client.GetAsync(serverUrl + "/foo").ConfigureAwait(false); + await client.GetAsync(serverUrl + "/foo?bar=baz").ConfigureAwait(false); var api = RestClient.For(serverUrl); // Act - var logEntryModel = await api.FindRequestByMappingGuidAsync(mappingGuid).ConfigureAwait(false); + var logEntryModels = await api.FindRequestsByMappingGuidAsync(mappingGuid).ConfigureAwait(false); // Assert - logEntryModel.Should().NotBeNull(); - logEntryModel!.Request.Method.Should().Be("GET"); - logEntryModel!.Request.Body.Should().BeNull(); - logEntryModel!.Request.Path.Should().Be("/foo"); + logEntryModels.Should().HaveCount(2); + logEntryModels[0].Should().NotBeNull(); + logEntryModels[0]!.Request.Method.Should().Be("GET"); + logEntryModels[0]!.Request.Body.Should().BeNull(); + logEntryModels[0]!.Request.Path.Should().Be("/foo"); + logEntryModels[0]!.Request.Query.Should().BeNullOrEmpty(); + logEntryModels[1].Should().NotBeNull(); + logEntryModels[1]!.Request.Method.Should().Be("GET"); + logEntryModels[1]!.Request.Body.Should().BeNull(); + logEntryModels[1]!.Request.Path.Should().Be("/foo"); + logEntryModels[1]!.Request.Query.Should().BeEquivalentTo(new Dictionary> + { + {"bar", new WireMockList("baz")} + }); } [Fact] - public async Task IWireMockAdminApi_FindRequestByMappingGuidAsync_NotFound() + public async Task IWireMockAdminApi_FindRequestsByMappingGuidAsync_NotFound() { // Arrange var server = WireMockServer.Start(new WireMockServerSettings @@ -301,14 +315,14 @@ public async Task IWireMockAdminApi_FindRequestByMappingGuidAsync_NotFound() var api = RestClient.For(serverUrl); // Act - var logEntryModel = await api.FindRequestByMappingGuidAsync(Guid.NewGuid()).ConfigureAwait(false); + var logEntryModels = await api.FindRequestsByMappingGuidAsync(Guid.NewGuid()).ConfigureAwait(false); // Assert - logEntryModel.Should().BeNull(); + logEntryModels.Should().BeEmpty(); } [Fact] - public async Task IWireMockAdminApi_FindRequestByMappingGuidAsync_Invalid_ShouldReturnBadRequest() + public async Task IWireMockAdminApi_FindRequestsByMappingGuidAsync_Invalid_ShouldReturnBadRequest() { // Arrange var server = WireMockServer.Start(new WireMockServerSettings @@ -1001,4 +1015,4 @@ public async Task IWireMockAdminApi_OpenApiSave_Yml() server.Stop(); } } -#endif \ No newline at end of file +#endif