From 32ddd48321671c3bca36f3d156c0dc5d79e422e8 Mon Sep 17 00:00:00 2001 From: "Daniel L. Romero" Date: Wed, 17 Nov 2021 02:16:31 -0500 Subject: [PATCH] Support RequestBody (#678) * Support RequestBody * SerializeObject in the request matcher and apply JsonMatcher * Refactor names * Call to method TryGetContent * Applied comments * Changes applied! * Comments applied V2! --- .../Mappers/OpenApiPathsMapper.cs | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs index d4e8707f..c3b8e8f1 100644 --- a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs +++ b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs @@ -6,6 +6,7 @@ using Microsoft.OpenApi; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Writers; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using WireMock.Admin.Mappings; using WireMock.Net.OpenApiParser.Extensions; @@ -58,6 +59,23 @@ namespace WireMock.Net.OpenApiParser.Mappers responseSchemaExample != null ? MapOpenApiAnyToJToken(responseSchemaExample) : MapSchemaToObject(responseSchema); + var requestBodyModel = new BodyModel(); + if (operation.RequestBody != null && operation.RequestBody.Content != null) + { + var request = operation.RequestBody.Content; + TryGetContent(request, out OpenApiMediaType requestContent, out string requestContentType); + + var requestBodySchema = operation.RequestBody.Content.First().Value?.Schema; + var requestBodyExample = requestContent.Example; + var requestBodySchemaExample = requestContent.Schema?.Example; + + var requestBodyMapped = requestBodyExample != null ? MapOpenApiAnyToJToken(requestBodyExample) : + requestBodySchemaExample != null ? MapOpenApiAnyToJToken(requestBodySchemaExample) : + MapSchemaToObject(requestBodySchema); + + requestBodyModel = MapRequestBody(requestBodyMapped); + } + if (!int.TryParse(response.Key, out var httpStatusCode)) { httpStatusCode = 200; @@ -71,7 +89,8 @@ namespace WireMock.Net.OpenApiParser.Mappers Methods = new[] { httpMethod }, Path = MapBasePath(servers) + MapPathWithParameters(path, pathParameters), Params = MapQueryParameters(queryParameters), - Headers = MapRequestHeaders(headers) + Headers = MapRequestHeaders(headers), + Body = requestBodyModel }, Response = new ResponseModel { @@ -82,6 +101,20 @@ namespace WireMock.Net.OpenApiParser.Mappers }; } + private BodyModel MapRequestBody(object requestBody) + { + if (requestBody == null) + { + return null; + } + + var requestBodyModel = new BodyModel(); + requestBodyModel.Matcher = new MatcherModel(); + requestBodyModel.Matcher.Name = "JsonMatcher"; + requestBodyModel.Matcher.Pattern = JsonConvert.SerializeObject(requestBody, Formatting.Indented); + return requestBodyModel; + } + private bool TryGetContent(IDictionary contents, out OpenApiMediaType openApiMediaType, out string contentType) { openApiMediaType = null;