1919
2020namespace 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