From 119cbe1ed71152ece47531de4e97ce8cb545e8df Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 13 Jun 2023 16:54:56 +0200 Subject: [PATCH 1/2] Fixed some SonarCloud issues --- .../Mappers/OpenApiPathsMapper.cs | 4 +- .../WireMockOpenApiParser.cs | 4 +- test/WireMock.Net.Tests/Pact/PactTests.cs | 18 +- .../WireMockServer.AdminFiles.cs | 367 +++++++++--------- 4 files changed, 201 insertions(+), 192 deletions(-) diff --git a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs index 09a5ae4ca..26049125e 100644 --- a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs +++ b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs @@ -320,14 +320,14 @@ private string MapBasePath(IList? servers) var mappedHeaders = headers?.ToDictionary( item => item.Key, _ => GetExampleMatcherModel(null, _settings.HeaderPatternToUse).Pattern! - ); + ) ?? new Dictionary(); if (!string.IsNullOrEmpty(responseContentType)) { mappedHeaders.TryAdd(HeaderContentType, responseContentType!); } - return mappedHeaders?.Keys.Any() == true ? mappedHeaders : null; + return mappedHeaders.Keys.Any() ? mappedHeaders : null; } private IList? MapQueryParameters(IEnumerable queryParameters) diff --git a/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs b/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs index d690f8cb7..3dacce7e2 100644 --- a/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs +++ b/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs @@ -47,9 +47,9 @@ public IReadOnlyList FromFile(string path, WireMockOpenApiParserSe /// [PublicAPI] - public IReadOnlyList FromDocument(OpenApiDocument openApiDocument, WireMockOpenApiParserSettings? settings = null) + public IReadOnlyList FromDocument(OpenApiDocument document, WireMockOpenApiParserSettings? settings = null) { - return new OpenApiPathsMapper(settings ?? new WireMockOpenApiParserSettings()).ToMappingModels(openApiDocument.Paths, openApiDocument.Servers); + return new OpenApiPathsMapper(settings ?? new WireMockOpenApiParserSettings()).ToMappingModels(document.Paths, document.Servers); } /// diff --git a/test/WireMock.Net.Tests/Pact/PactTests.cs b/test/WireMock.Net.Tests/Pact/PactTests.cs index e02e2572e..8cf02a250 100644 --- a/test/WireMock.Net.Tests/Pact/PactTests.cs +++ b/test/WireMock.Net.Tests/Pact/PactTests.cs @@ -42,7 +42,14 @@ public void SavePact_Get_Request_And_Response_WithBodyAsJson() }) ); - server.SavePact(Path.Combine("../../../", "Pact", "files"), "pact-get.json"); + var folder = Path.Combine("../../../", "Pact", "files"); + var file = "pact-get.json"; + + // Act + server.SavePact(folder, file); + + // Assert + File.ReadAllBytes(Path.Combine(folder, file)).Length.Should().BeGreaterThan(1); } [Fact] @@ -201,6 +208,13 @@ public void SavePact_Multiple_Requests() }) ); - server.SavePact(Path.Combine("../../../", "Pact", "files"), "pact-multiple.json"); + var folder = Path.Combine("../../../", "Pact", "files"); + var file = "pact-multiple.json"; + + // Act + server.SavePact(folder, file); + + // Assert + File.ReadAllBytes(Path.Combine(folder, file)).Length.Should().BeGreaterThan(1); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/WireMockServer.AdminFiles.cs b/test/WireMock.Net.Tests/WireMockServer.AdminFiles.cs index 182e3d192..3fb66e2c4 100644 --- a/test/WireMock.Net.Tests/WireMockServer.AdminFiles.cs +++ b/test/WireMock.Net.Tests/WireMockServer.AdminFiles.cs @@ -1,215 +1,210 @@ -using Moq; -using NFluent; using System.IO; -using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; +using FluentAssertions; +using Moq; using WireMock.Handlers; using WireMock.Server; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests +namespace WireMock.Net.Tests; + +public class WireMockServerAdminFilesTests { - public class WireMockServerAdminFilesTests + private readonly HttpClient _client = new HttpClient(); + + [Fact] + public async Task WireMockServer_Admin_Files_Post_Ascii() { - private readonly HttpClient _client = new HttpClient(); + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.GetMappingFolder()).Returns("__admin/mappings"); + filesystemHandlerMock.Setup(fs => fs.FolderExists(It.IsAny())).Returns(true); + filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); - [Fact] - public async Task WireMockServer_Admin_Files_Post_Ascii() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.GetMappingFolder()).Returns("__admin/mappings"); - filesystemHandlerMock.Setup(fs => fs.FolderExists(It.IsAny())).Returns(true); - filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); - - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); - - var multipartFormDataContent = new MultipartFormDataContent(); - multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); - multipartFormDataContent.Add(new StreamContent(new MemoryStream(Encoding.ASCII.GetBytes("Here's a string.")))); - - // Act - var httpResponseMessage = await _client.PostAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt", multipartFormDataContent).ConfigureAwait(false); - - // Assert - Check.That(httpResponseMessage.StatusCode).Equals(HttpStatusCode.OK); - Check.That(server.LogEntries.Count().Equals(1)); - - // Verify - filesystemHandlerMock.Verify(fs => fs.GetMappingFolder(), Times.Once); - filesystemHandlerMock.Verify(fs => fs.FolderExists(It.IsAny()), Times.Once); - filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); - } - - [Fact] - public async Task WireMockServer_Admin_Files_Post_MappingFolderDoesNotExistsButWillBeCreated() - { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.GetMappingFolder()).Returns("x"); - filesystemHandlerMock.Setup(fs => fs.CreateFolder(It.IsAny())); - filesystemHandlerMock.Setup(fs => fs.FolderExists(It.IsAny())).Returns(false); - filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); - - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); - - var multipartFormDataContent = new MultipartFormDataContent(); - multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); - multipartFormDataContent.Add(new StreamContent(new MemoryStream(Encoding.ASCII.GetBytes("Here's a string.")))); - - // Act - var httpResponseMessage = await _client.PostAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt", multipartFormDataContent).ConfigureAwait(false); - - // Assert - Check.That(httpResponseMessage.StatusCode).Equals(HttpStatusCode.OK); - - // Verify - filesystemHandlerMock.Verify(fs => fs.GetMappingFolder(), Times.Once); - filesystemHandlerMock.Verify(fs => fs.FolderExists(It.IsAny()), Times.Once); - filesystemHandlerMock.Verify(fs => fs.CreateFolder(It.Is(p => p == "x")), Times.Once); - filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); - } - - [Fact] - public async Task WireMockServer_Admin_Files_GetAscii() + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); + + var multipartFormDataContent = new MultipartFormDataContent(); + multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); + multipartFormDataContent.Add(new StreamContent(new MemoryStream(Encoding.ASCII.GetBytes("Here's a string.")))); + + // Act + var httpResponseMessage = await _client.PostAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt", multipartFormDataContent).ConfigureAwait(false); + + // Assert + httpResponseMessage.StatusCode.Should().Be(HttpStatusCode.OK); + + // Verify + filesystemHandlerMock.Verify(fs => fs.GetMappingFolder(), Times.Once); + filesystemHandlerMock.Verify(fs => fs.FolderExists(It.IsAny()), Times.Once); + filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); + } + + [Fact] + public async Task WireMockServer_Admin_Files_Post_MappingFolderDoesNotExistsButWillBeCreated() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.GetMappingFolder()).Returns("x"); + filesystemHandlerMock.Setup(fs => fs.CreateFolder(It.IsAny())); + filesystemHandlerMock.Setup(fs => fs.FolderExists(It.IsAny())).Returns(false); + filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); + + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); - filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(Encoding.ASCII.GetBytes("Here's a string.")); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); + + var multipartFormDataContent = new MultipartFormDataContent(); + multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); + multipartFormDataContent.Add(new StreamContent(new MemoryStream(Encoding.ASCII.GetBytes("Here's a string.")))); + + // Act + var httpResponseMessage = await _client.PostAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt", multipartFormDataContent).ConfigureAwait(false); + + // Assert + httpResponseMessage.StatusCode.Should().Be(HttpStatusCode.OK); + + // Verify + filesystemHandlerMock.Verify(fs => fs.GetMappingFolder(), Times.Once); + filesystemHandlerMock.Verify(fs => fs.FolderExists(It.IsAny()), Times.Once); + filesystemHandlerMock.Verify(fs => fs.CreateFolder(It.Is(p => p == "x")), Times.Once); + filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); + } - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + [Fact] + public async Task WireMockServer_Admin_Files_GetAscii() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); + filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(Encoding.ASCII.GetBytes("Here's a string.")); - var multipartFormDataContent = new MultipartFormDataContent(); - multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); - multipartFormDataContent.Add(new StreamContent(new MemoryStream())); + var server = WireMockServer.Start(new WireMockServerSettings + { + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - // Act - var httpResponseMessageGet = await _client.GetAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt").ConfigureAwait(false); + var multipartFormDataContent = new MultipartFormDataContent(); + multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); + multipartFormDataContent.Add(new StreamContent(new MemoryStream())); - // Assert - Check.That(httpResponseMessageGet.StatusCode).Equals(HttpStatusCode.OK); + // Act + var httpResponseMessageGet = await _client.GetAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt").ConfigureAwait(false); - Check.That(httpResponseMessageGet.Content.ReadAsStringAsync().Result).Equals("Here's a string."); + // Assert + httpResponseMessageGet.StatusCode.Should().Be(HttpStatusCode.OK); - Check.That(server.LogEntries.Count().Equals(2)); + var result = await httpResponseMessageGet.Content.ReadAsStringAsync().ConfigureAwait(false); + result.Should().Be("Here's a string."); - // Verify - filesystemHandlerMock.Verify(fs => fs.ReadFile(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); - } + // Verify + filesystemHandlerMock.Verify(fs => fs.ReadFile(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); + } + + [Fact] + public async Task WireMockServer_Admin_Files_GetUTF16() + { + // Arrange + byte[] symbol = Encoding.UTF32.GetBytes(char.ConvertFromUtf32(0x1D161)); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); + filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(symbol); - [Fact] - public async Task WireMockServer_Admin_Files_GetUTF16() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - byte[] symbol = Encoding.UTF32.GetBytes(char.ConvertFromUtf32(0x1D161)); - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); - filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(symbol); - - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); - - var multipartFormDataContent = new MultipartFormDataContent(); - multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); - multipartFormDataContent.Add(new StreamContent(new MemoryStream())); - - // Act - var httpResponseMessageGet = await _client.GetAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.bin").ConfigureAwait(false); - - // Assert - Check.That(httpResponseMessageGet.StatusCode).Equals(HttpStatusCode.OK); - Check.That(httpResponseMessageGet.Content.ReadAsByteArrayAsync().Result).Equals(symbol); - Check.That(server.LogEntries.Count().Equals(2)); - - // Verify - filesystemHandlerMock.Verify(fs => fs.ReadFile(It.Is(p => p == "filename.bin")), Times.Once); - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.bin")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); - } - - [Fact] - public async Task WireMockServer_Admin_Files_Head() + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); + + var multipartFormDataContent = new MultipartFormDataContent(); + multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); + multipartFormDataContent.Add(new StreamContent(new MemoryStream())); + + // Act + var httpResponseMessageGet = await _client.GetAsync("http://localhost:" + server.Ports[0] + "/__admin/files/filename.bin").ConfigureAwait(false); + + // Assert + httpResponseMessageGet.StatusCode.Should().Be(HttpStatusCode.OK); + + var result = await httpResponseMessageGet.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + result.Should().BeEquivalentTo(symbol); + + // Verify + filesystemHandlerMock.Verify(fs => fs.ReadFile(It.Is(p => p == "filename.bin")), Times.Once); + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.bin")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); + } + + [Fact] + public async Task WireMockServer_Admin_Files_Head() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); + + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); - - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); - - // Act - var requestUri = "http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt"; - var httpRequestMessage = new HttpRequestMessage(HttpMethod.Head, requestUri); - var httpResponseMessage = await _client.SendAsync(httpRequestMessage).ConfigureAwait(false); - - // Assert - Check.That(httpResponseMessage.StatusCode).Equals(HttpStatusCode.NoContent); - Check.That(server.LogEntries.Count().Equals(1)); - - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.IsAny()), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); - } - - [Fact] - public async Task WireMockServer_Admin_Files_Head_FileDoesNotExistsReturns404() + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); + + // Act + var requestUri = "http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt"; + var httpRequestMessage = new HttpRequestMessage(HttpMethod.Head, requestUri); + var httpResponseMessage = await _client.SendAsync(httpRequestMessage).ConfigureAwait(false); + + // Assert + httpResponseMessage.StatusCode.Should().Be(HttpStatusCode.NoContent); + + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.IsAny()), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); + } + + [Fact] + public async Task WireMockServer_Admin_Files_Head_FileDoesNotExistsReturns404() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); + + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); - - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); - - // Act - var requestUri = "http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt"; - var httpRequestMessage = new HttpRequestMessage(HttpMethod.Head, requestUri); - var httpResponseMessage = await _client.SendAsync(httpRequestMessage).ConfigureAwait(false); - - // Assert - Check.That(httpResponseMessage.StatusCode).Equals(HttpStatusCode.NotFound); - Check.That(server.LogEntries.Count().Equals(1)); - - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.IsAny()), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); - } + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); + + // Act + var requestUri = "http://localhost:" + server.Ports[0] + "/__admin/files/filename.txt"; + var httpRequestMessage = new HttpRequestMessage(HttpMethod.Head, requestUri); + var httpResponseMessage = await _client.SendAsync(httpRequestMessage).ConfigureAwait(false); + + // Assert + httpResponseMessage.StatusCode.Should().Be(HttpStatusCode.NotFound); + + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.IsAny()), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); } } \ No newline at end of file From c7267d3cac92edb3bef21fee0ab31df12467af59 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 13 Jun 2023 17:01:17 +0200 Subject: [PATCH 2/2] if (value.Contains('\n')) --- src/WireMock.Net/Util/CSharpFormatter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WireMock.Net/Util/CSharpFormatter.cs b/src/WireMock.Net/Util/CSharpFormatter.cs index 8a79ddc43..a7ac59034 100644 --- a/src/WireMock.Net/Util/CSharpFormatter.cs +++ b/src/WireMock.Net/Util/CSharpFormatter.cs @@ -138,7 +138,7 @@ public static string ToCSharpStringLiteral(string? value) return "\"\""; } - if (value.Contains("\n")) + if (value.Contains('\n')) { var escapedValue = value?.Replace("\"", "\"\"") ?? string.Empty; return $"@\"{escapedValue}\"";