Skip to content

Commit dfeabf2

Browse files
authored
WireMock.Net.OpenApiParser : support Examples (#1366)
1 parent 1feb0ad commit dfeabf2

File tree

2 files changed

+2042
-8369
lines changed

2 files changed

+2042
-8369
lines changed

src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs

Lines changed: 90 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,12 @@
1919

2020
namespace WireMock.Net.OpenApiParser.Mappers;
2121

22-
internal class OpenApiPathsMapper
22+
internal class OpenApiPathsMapper(WireMockOpenApiParserSettings settings)
2323
{
2424
private const string HeaderContentType = "Content-Type";
2525

26-
private readonly WireMockOpenApiParserSettings _settings;
27-
private readonly ExampleValueGenerator _exampleValueGenerator;
28-
29-
public OpenApiPathsMapper(WireMockOpenApiParserSettings settings)
30-
{
31-
_settings = Guard.NotNull(settings);
32-
_exampleValueGenerator = new ExampleValueGenerator(settings);
33-
}
26+
private readonly WireMockOpenApiParserSettings _settings = Guard.NotNull(settings);
27+
private readonly ExampleValueGenerator _exampleValueGenerator = new(settings);
3428

3529
public IReadOnlyList<MappingModel> ToMappingModels(OpenApiPaths? paths, IList<OpenApiServer> servers)
3630
{
@@ -41,7 +35,7 @@ public IReadOnlyList<MappingModel> ToMappingModels(OpenApiPaths? paths, IList<Op
4135
.ToArray() ?? [];
4236
}
4337

44-
private IReadOnlyList<MappingModel> MapPath(string path, IOpenApiPathItem pathItem, IList<OpenApiServer> servers)
38+
private MappingModel[] MapPath(string path, IOpenApiPathItem pathItem, IList<OpenApiServer> servers)
4539
{
4640
return pathItem.Operations?.Select(o => MapOperationToMappingModel(path, o.Key.ToString().ToUpperInvariant(), o.Value, servers)).ToArray() ?? [];
4741
}
@@ -50,53 +44,104 @@ private MappingModel MapOperationToMappingModel(string path, string httpMethod,
5044
{
5145
var queryParameters = operation.Parameters?.Where(p => p.In == ParameterLocation.Query) ?? [];
5246
var pathParameters = operation.Parameters?.Where(p => p.In == ParameterLocation.Path) ?? [];
53-
var headers = operation.Parameters?.Where(p => p.In == ParameterLocation.Header) ?? [];
47+
var requestHeaders = operation.Parameters?.Where(p => p.In == ParameterLocation.Header) ?? [];
5448

55-
var response = operation.Responses?.FirstOrDefault() ?? new KeyValuePair<string, IOpenApiResponse>();
49+
return new MappingModel
50+
{
51+
Guid = Guid.NewGuid(),
52+
Request = new RequestModel
53+
{
54+
Methods = [httpMethod],
55+
Path = PathUtils.Combine(MapBasePath(servers), MapPathWithParameters(path, pathParameters)),
56+
Params = MapQueryParameters(queryParameters),
57+
Headers = MapRequestHeaders(requestHeaders),
58+
Body = GetRequestBodyModel(operation.RequestBody)
59+
},
60+
Response = GetResponseModel(operation.Responses?.FirstOrDefault())
61+
};
62+
}
5663

57-
TryGetContent(response.Value?.Content, out OpenApiMediaType? responseContent, out var responseContentType);
58-
var responseSchema = response.Value?.Content?.FirstOrDefault().Value?.Schema;
59-
var responseExample = responseContent?.Example;
60-
var responseSchemaExample = responseContent?.Schema?.Example;
64+
private BodyModel GetRequestBodyModel(IOpenApiRequestBody? openApiRequestBody)
65+
{
66+
if (openApiRequestBody is not { Content: not null, Required: true })
67+
{
68+
return new BodyModel();
69+
}
6170

62-
var responseBody = responseExample ?? responseSchemaExample ?? MapSchemaToObject(responseSchema);
71+
var content = openApiRequestBody.Content;
6372

64-
var requestBodyModel = new BodyModel();
65-
if (operation.RequestBody != null && operation.RequestBody.Content != null && operation.RequestBody.Required)
66-
{
67-
var request = operation.RequestBody.Content;
68-
TryGetContent(request, out var requestContent, out _);
73+
TryGetContent(content, out var requestContent, out _);
6974

70-
var requestBodySchema = operation.RequestBody.Content.First().Value?.Schema;
71-
var requestBodyExample = requestContent!.Example;
72-
var requestBodySchemaExample = requestContent.Schema?.Example;
75+
var requestExample = requestContent?.Example;
76+
var requestExamples = requestContent?.Examples;
77+
var requestSchemaExample = requestContent?.Schema?.Example;
78+
var requestSchemaExamples = requestContent?.Schema?.Examples;
7379

74-
var requestBodyMapped = requestBodyExample ?? requestBodySchemaExample ?? MapSchemaToObject(requestBodySchema);
75-
requestBodyModel = MapRequestBody(requestBodyMapped);
80+
JsonNode? request;
81+
if (requestExample != null)
82+
{
83+
request = requestExample;
84+
}
85+
else if (requestSchemaExample != null)
86+
{
87+
request = requestSchemaExample;
88+
}
89+
else if (requestExamples != null)
90+
{
91+
request = requestExamples.FirstOrDefault().Value.Value;
7692
}
93+
else if (requestSchemaExamples != null)
94+
{
95+
request = requestSchemaExamples.FirstOrDefault();
96+
}
97+
else
98+
{
99+
var requestSchema = content?.FirstOrDefault().Value.Schema;
100+
request = MapSchemaToObject(requestSchema);
101+
}
102+
103+
return MapRequestBody(request) ?? new BodyModel();
104+
}
105+
106+
private ResponseModel GetResponseModel(KeyValuePair<string, IOpenApiResponse>? openApiResponse)
107+
{
108+
var content = openApiResponse?.Value.Content;
109+
110+
TryGetContent(content, out var responseContent, out var contentType);
111+
112+
var responseExample = responseContent?.Example;
113+
var responseExamples = responseContent?.Examples;
114+
var responseSchemaExample = responseContent?.Schema?.Example;
115+
var responseSchemaExamples = responseContent?.Schema?.Examples;
77116

78-
if (!int.TryParse(response.Key, out var httpStatusCode))
117+
JsonNode? response;
118+
if (responseExample != null)
119+
{
120+
response = responseExample;
121+
}
122+
else if (responseSchemaExample != null)
123+
{
124+
response = responseSchemaExample;
125+
}
126+
else if (responseExamples != null)
127+
{
128+
response = responseExamples.FirstOrDefault().Value.Value;
129+
}
130+
else if (responseSchemaExamples != null)
131+
{
132+
response = responseSchemaExamples.FirstOrDefault();
133+
}
134+
else
79135
{
80-
httpStatusCode = 200;
136+
var responseSchema = content?.FirstOrDefault().Value?.Schema;
137+
response = MapSchemaToObject(responseSchema);
81138
}
82139

83-
return new MappingModel
140+
return new ResponseModel
84141
{
85-
Guid = Guid.NewGuid(),
86-
Request = new RequestModel
87-
{
88-
Methods = [httpMethod],
89-
Path = PathUtils.Combine(MapBasePath(servers), MapPathWithParameters(path, pathParameters)),
90-
Params = MapQueryParameters(queryParameters),
91-
Headers = MapRequestHeaders(headers),
92-
Body = requestBodyModel
93-
},
94-
Response = new ResponseModel
95-
{
96-
StatusCode = httpStatusCode,
97-
Headers = MapHeaders(responseContentType, response.Value?.Headers),
98-
BodyAsJson = responseBody != null ? JsonConvert.DeserializeObject(SystemTextJsonSerializer.Serialize(responseBody)) : null
99-
}
142+
StatusCode = int.TryParse(openApiResponse?.Key, out var httpStatusCode) ? httpStatusCode : 200,
143+
Headers = MapHeaders(contentType, openApiResponse?.Value.Headers),
144+
BodyAsJson = response != null ? JsonConvert.DeserializeObject(SystemTextJsonSerializer.Serialize(response)) : null
100145
};
101146
}
102147

0 commit comments

Comments
 (0)