From 49e10ed20f7e9288d042a77e96b6c2719a765e38 Mon Sep 17 00:00:00 2001 From: "Daniel L. Romero" Date: Tue, 2 Nov 2021 09:28:02 -0500 Subject: [PATCH] Support basepath from servers (#675) * Support basepath from servers * Refactor BasePath * Comments applied --- .../Mappers/OpenApiPathsMapper.cs | 32 ++++++++++++++----- .../WireMockOpenApiParser.cs | 2 +- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs index 30a9f23a..d4e8707f 100644 --- a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs +++ b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs @@ -26,22 +26,22 @@ namespace WireMock.Net.OpenApiParser.Mappers _exampleValueGenerator = new ExampleValueGenerator(settings); } - public IEnumerable ToMappingModels(OpenApiPaths paths) + public IEnumerable ToMappingModels(OpenApiPaths paths, IList servers) { - return paths.Select(p => MapPath(p.Key, p.Value)).SelectMany(x => x); + return paths.Select(p => MapPath(p.Key, p.Value, servers)).SelectMany(x => x); } - private IEnumerable MapPaths(OpenApiPaths paths) + private IEnumerable MapPaths(OpenApiPaths paths, IList servers) { - return paths.Select(p => MapPath(p.Key, p.Value)).SelectMany(x => x); + return paths.Select(p => MapPath(p.Key, p.Value, servers)).SelectMany(x => x); } - private IEnumerable MapPath(string path, OpenApiPathItem pathItem) + private IEnumerable MapPath(string path, OpenApiPathItem pathItem, IList servers) { - return pathItem.Operations.Select(o => MapOperationToMappingModel(path, o.Key.ToString().ToUpperInvariant(), o.Value)); + return pathItem.Operations.Select(o => MapOperationToMappingModel(path, o.Key.ToString().ToUpperInvariant(), o.Value, servers)); } - private MappingModel MapOperationToMappingModel(string path, string httpMethod, OpenApiOperation operation) + private MappingModel MapOperationToMappingModel(string path, string httpMethod, OpenApiOperation operation, IList servers) { var queryParameters = operation.Parameters.Where(p => p.In == ParameterLocation.Query); var pathParameters = operation.Parameters.Where(p => p.In == ParameterLocation.Path); @@ -69,7 +69,7 @@ namespace WireMock.Net.OpenApiParser.Mappers Request = new RequestModel { Methods = new[] { httpMethod }, - Path = MapPathWithParameters(path, pathParameters), + Path = MapBasePath(servers) + MapPathWithParameters(path, pathParameters), Params = MapQueryParameters(queryParameters), Headers = MapRequestHeaders(headers) }, @@ -230,6 +230,22 @@ namespace WireMock.Net.OpenApiParser.Mappers return newPath; } + private string MapBasePath(IList servers) + { + if (servers == null || servers.Count == 0) + { + return string.Empty; + } + + OpenApiServer server = servers.First(); + Uri uriResult; + if (Uri.TryCreate(server.Url, UriKind.RelativeOrAbsolute, out uriResult)) + { + return uriResult.IsAbsoluteUri ? uriResult.AbsolutePath : uriResult.ToString(); + } + return string.Empty; + } + private JToken MapOpenApiAnyToJToken(IOpenApiAny any) { if (any == null) diff --git a/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs b/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs index d84672a8..297c6033 100644 --- a/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs +++ b/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs @@ -62,7 +62,7 @@ namespace WireMock.Net.OpenApiParser [PublicAPI] public IEnumerable FromDocument(OpenApiDocument openApiDocument, WireMockOpenApiParserSettings settings = null) { - return new OpenApiPathsMapper(settings).ToMappingModels(openApiDocument.Paths); + return new OpenApiPathsMapper(settings).ToMappingModels(openApiDocument.Paths, openApiDocument.Servers); } } } \ No newline at end of file