This is an automated email from the ASF dual-hosted git repository. sergeyb pushed a commit to branch 3.1.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
commit e3291104573c631481fbc933e0783c5cc4027962 Author: Sergey Beryozkin <[email protected]> AuthorDate: Tue Dec 12 16:47:28 2017 +0000 [CXF-7525] Adding the resources for 3.1.x --- .../swagger/openapi/OpenApiConfiguration.java | 31 + .../openapi/SwaggerToOpenApiConversionFilter.java | 79 +++ .../openapi/SwaggerToOpenApiConversionUtils.java | 393 +++++++++++ .../SwaggerToOpenApiConversionUtilsTest.java | 775 +++++++++++++++++++++ 4 files changed, 1278 insertions(+) diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/OpenApiConfiguration.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/OpenApiConfiguration.java new file mode 100644 index 0000000..c0f2256 --- /dev/null +++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/OpenApiConfiguration.java @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.swagger.openapi; + +public class OpenApiConfiguration { + private boolean createRequestBodies; + + public boolean isCreateRequestBodies() { + return createRequestBodies; + } + + public void setCreateRequestBodies(boolean createRequestBodies) { + this.createRequestBodies = createRequestBodies; + } +} diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java new file mode 100644 index 0000000..ccda81a --- /dev/null +++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.swagger.openapi; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.URI; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.ext.Provider; +import javax.ws.rs.ext.WriterInterceptor; +import javax.ws.rs.ext.WriterInterceptorContext; + +import org.apache.cxf.common.util.StringUtils; +import org.apache.cxf.helpers.IOUtils; +import org.apache.cxf.io.CachedOutputStream; +import org.apache.cxf.jaxrs.utils.JAXRSUtils; + +@Provider +@PreMatching +public final class SwaggerToOpenApiConversionFilter implements ContainerRequestFilter, WriterInterceptor { + + private static final String SWAGGER_PATH = "swagger.json"; + private static final String OPEN_API_PATH = "openapi.json"; + private static final String OPEN_API_PROPERTY = "openapi"; + + private OpenApiConfiguration openApiConfig; + @Override + public void filter(ContainerRequestContext reqCtx) throws IOException { + String path = reqCtx.getUriInfo().getPath(); + if (path.endsWith(OPEN_API_PATH)) { + reqCtx.setRequestUri(URI.create(SWAGGER_PATH)); + JAXRSUtils.getCurrentMessage().getExchange().put(OPEN_API_PROPERTY, Boolean.TRUE); + } + + } + + public OpenApiConfiguration getOpenApiConfig() { + return openApiConfig; + } + + public void setOpenApiConfig(OpenApiConfiguration openApiConfig) { + this.openApiConfig = openApiConfig; + } + + @Override + public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { + if (Boolean.TRUE == JAXRSUtils.getCurrentMessage().getExchange().get(OPEN_API_PROPERTY)) { + OutputStream os = context.getOutputStream(); + CachedOutputStream cos = new CachedOutputStream(); + context.setOutputStream(cos); + context.proceed(); + String swaggerJson = IOUtils.readStringFromStream(cos.getInputStream()); + String openApiJson = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson(swaggerJson, openApiConfig); + os.write(StringUtils.toBytesUTF8(openApiJson)); + os.flush(); + + } + } +} diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java new file mode 100644 index 0000000..fbfdb43 --- /dev/null +++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java @@ -0,0 +1,393 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.swagger.openapi; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import org.apache.cxf.Bus; +import org.apache.cxf.BusFactory; +import org.apache.cxf.common.logging.LogUtils; +import org.apache.cxf.common.util.StringUtils; +import org.apache.cxf.helpers.CastUtils; +import org.apache.cxf.helpers.IOUtils; +import org.apache.cxf.jaxrs.json.basic.JsonMapObject; +import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter; +import org.apache.cxf.jaxrs.utils.ExceptionUtils; +import org.apache.cxf.jaxrs.utils.ResourceUtils; + +public final class SwaggerToOpenApiConversionUtils { + private static final Logger LOG = LogUtils.getL7dLogger(SwaggerToOpenApiConversionUtils.class); + + private static final List<String> SIMPLE_TYPE_RELATED_PROPS = + Arrays.asList("format", "minimum", "maximum", "default"); + + private SwaggerToOpenApiConversionUtils() { + + } + + public static String getOpenApiFromSwaggerLoc(String loc) { + return getOpenApiFromSwaggerLoc(loc, null); + } + + public static String getOpenApiFromSwaggerLoc(String loc, OpenApiConfiguration cfg) { + return getOpenApiFromSwaggerLoc(loc, cfg, BusFactory.getThreadDefaultBus()); + } + + public static String getOpenApiFromSwaggerLoc(String loc, OpenApiConfiguration cfg, Bus bus) { + try { + InputStream is = ResourceUtils.getResourceStream(loc, bus); + if (is == null) { + return null; + } + return getOpenApiFromSwaggerStream(is, cfg); + } catch (Exception ex) { + LOG.warning("Problem with processing a user model at " + loc + ", exception: " + + ExceptionUtils.getStackTrace(ex)); + } + return null; + } + + public static String getOpenApiFromSwaggerStream(InputStream is) throws IOException { + return getOpenApiFromSwaggerStream(is, null); + } + + public static String getOpenApiFromSwaggerStream(InputStream is, OpenApiConfiguration cfg) throws IOException { + return getOpenApiFromSwaggerJson(IOUtils.readStringFromStream(is), cfg); + } + + public static String getOpenApiFromSwaggerJson(String json) throws IOException { + return getOpenApiFromSwaggerJson(json, null); + } + + public static String getOpenApiFromSwaggerJson(String json, OpenApiConfiguration cfg) throws IOException { + JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter(); + JsonMapObject sw2 = readerWriter.fromJsonToJsonObject(json); + JsonMapObject sw3 = new JsonMapObject(); + + // "openapi" + sw3.setProperty("openapi", "3.0.0"); + + // "servers" + setServersProperty(sw2, sw3); + + // "info" + JsonMapObject infoObject = sw2.getJsonMapProperty("info"); + if (infoObject != null) { + sw3.setProperty("info", infoObject); + } + + // "tags" + List<Map<String, Object>> tagsObject = sw2.getListMapProperty("tags"); + if (tagsObject != null) { + sw3.setProperty("tags", tagsObject); + } + + // paths + Map<String, JsonMapObject> requestBodies = cfg != null && cfg.isCreateRequestBodies() + ? new LinkedHashMap<String, JsonMapObject>() : null; + setPathsProperty(sw2, sw3, requestBodies); + + // components + setComponentsProperty(sw2, sw3, requestBodies); + + // externalDocs + Object externalDocsObject = sw2.getProperty("externalDocs"); + if (externalDocsObject != null) { + sw3.setProperty("externalDocs", externalDocsObject); + } + + return readerWriter.toJson(sw3); + } + + private static void setComponentsProperty(JsonMapObject sw2, JsonMapObject sw3, + Map<String, JsonMapObject> requestBodies) { + JsonMapObject comps = new JsonMapObject(); + JsonMapObject requestBodiesObj = new JsonMapObject(); + if (requestBodies != null) { + for (Map.Entry<String, JsonMapObject> entry : requestBodies.entrySet()) { + requestBodiesObj.setProperty(entry.getKey(), entry.getValue()); + } + } + comps.setProperty("requestBodies", requestBodiesObj); + + Object s2Defs = sw2.getProperty("definitions"); + if (s2Defs != null) { + comps.setProperty("schemas", s2Defs); + } + Object s2SecurityDefs = sw2.getProperty("securityDefinitions"); + if (s2SecurityDefs != null) { + comps.setProperty("securitySchemes", s2SecurityDefs); + } + + sw3.setProperty("components", comps); + + } + + private static void setPathsProperty(JsonMapObject sw2, JsonMapObject sw3, + Map<String, JsonMapObject> requestBodies) { + JsonMapObject sw2Paths = sw2.getJsonMapProperty("paths"); + for (Map.Entry<String, Object> sw2PathEntries : sw2Paths.asMap().entrySet()) { + Map<String, Object> map1 = CastUtils.cast((Map<?, ?>)sw2PathEntries.getValue()); + JsonMapObject sw2PathVerbs = new JsonMapObject(map1); + for (Map.Entry<String, Object> sw2PathVerbEntries : sw2PathVerbs.asMap().entrySet()) { + Map<String, Object> map2 = CastUtils.cast((Map<?, ?>)sw2PathVerbEntries.getValue()); + JsonMapObject sw2PathVerbProps = new JsonMapObject(map2); + + prepareRequestBody(sw2PathVerbProps, requestBodies); + prepareResponses(sw2PathVerbProps); + + } + } + + sw3.setProperty("paths", sw2Paths); + + + } + + private static void prepareResponses(JsonMapObject sw2PathVerbProps) { + List<String> sw2PathVerbProduces = + CastUtils.cast((List<?>)sw2PathVerbProps.removeProperty("produces")); + + JsonMapObject sw3PathVerbResps = null; + JsonMapObject sw2PathVerbResps = sw2PathVerbProps.getJsonMapProperty("responses"); + if (sw2PathVerbResps != null) { + sw3PathVerbResps = new JsonMapObject(); + + JsonMapObject okResp = null; + if (sw2PathVerbResps.containsProperty("200")) { + Map<String, Object> map = CastUtils.cast((Map<?, ?>)sw2PathVerbResps.removeProperty("200")); + okResp = new JsonMapObject(map); + JsonMapObject newOkResp = new JsonMapObject(); + String description = okResp.getStringProperty("description"); + if (description != null) { + newOkResp.setProperty("description", description); + } + JsonMapObject schema = okResp.getJsonMapProperty("schema"); + if (schema != null) { + JsonMapObject content = prepareContentFromSchema(schema, sw2PathVerbProduces, false); + if (content != null) { + newOkResp.setProperty("content", content); + } + + } + JsonMapObject headers = okResp.getJsonMapProperty("headers"); + if (headers != null) { + newOkResp.setProperty("headers", headers); + } + sw3PathVerbResps.setProperty("200", newOkResp); + } + for (Map.Entry<String, Object> entry : sw2PathVerbResps.asMap().entrySet()) { + sw3PathVerbResps.setProperty(entry.getKey(), entry.getValue()); + } + sw2PathVerbProps.setProperty("responses", sw3PathVerbResps); + } + + } + + private static void prepareRequestBody(JsonMapObject sw2PathVerbProps, + Map<String, JsonMapObject> requestBodies) { + List<String> sw2PathVerbConsumes = + CastUtils.cast((List<?>)sw2PathVerbProps.removeProperty("consumes")); + + JsonMapObject sw3RequestBody = null; + List<JsonMapObject> sw3formBody = null; + List<Map<String, Object>> sw2PathVerbParamsList = sw2PathVerbProps.getListMapProperty("parameters"); + if (sw2PathVerbParamsList != null) { + for (Iterator<Map<String, Object>> it = sw2PathVerbParamsList.iterator(); it.hasNext();) { + JsonMapObject sw2PathVerbParamMap = new JsonMapObject(it.next()); + if ("body".equals(sw2PathVerbParamMap.getStringProperty("in"))) { + it.remove(); + + sw3RequestBody = new JsonMapObject(); + String description = sw2PathVerbParamMap.getStringProperty("description"); + if (description != null) { + sw3RequestBody.setProperty("description", description); + } + Boolean required = sw2PathVerbParamMap.getBooleanProperty("required"); + if (required != null) { + sw3RequestBody.setProperty("required", required); + } + JsonMapObject schema = sw2PathVerbParamMap.getJsonMapProperty("schema"); + if (schema != null) { + JsonMapObject content = prepareContentFromSchema(schema, sw2PathVerbConsumes, + requestBodies != null); + if (content != null) { + sw3RequestBody.setProperty("content", content); + } + + } + } else if ("formData".equals(sw2PathVerbParamMap.getStringProperty("in"))) { + it.remove(); + if (sw3formBody == null) { + sw3formBody = new LinkedList<JsonMapObject>(); + sw3RequestBody = new JsonMapObject(); + } + sw2PathVerbParamMap.removeProperty("in"); + sw2PathVerbParamMap.removeProperty("required"); + sw3formBody.add(sw2PathVerbParamMap); + } else if ("array".equals(sw2PathVerbParamMap.getStringProperty("type"))) { + sw2PathVerbParamMap.removeProperty("type"); + sw2PathVerbParamMap.removeProperty("collectionFormat"); + sw2PathVerbParamMap.setProperty("explode", true); + JsonMapObject items = sw2PathVerbParamMap.getJsonMapProperty("items"); + sw2PathVerbParamMap.removeProperty("items"); + JsonMapObject schema = new JsonMapObject(); + schema.setProperty("type", "array"); + schema.setProperty("items", items); + sw2PathVerbParamMap.setProperty("schema", schema); + } else { + String type = (String)sw2PathVerbParamMap.removeProperty("type"); + if (type != null) { + JsonMapObject schema = new JsonMapObject(); + schema.setProperty("type", type); + for (String prop : SIMPLE_TYPE_RELATED_PROPS) { + Object value = sw2PathVerbParamMap.removeProperty(prop); + if (value != null) { + schema.setProperty(prop, value); + } + } + if ("password".equals(sw2PathVerbParamMap.getProperty("name"))) { + schema.setProperty("format", "password"); + } + sw2PathVerbParamMap.setProperty("schema", schema); + } + } + } + } + if (sw2PathVerbParamsList.isEmpty()) { + sw2PathVerbProps.removeProperty("parameters"); + } + if (sw3formBody != null) { + sw3RequestBody.setProperty("content", prepareFormContent(sw3formBody, sw2PathVerbConsumes)); + } + if (sw3RequestBody != null) { + if (requestBodies == null || sw3formBody != null) { + sw2PathVerbProps.setProperty("requestBody", sw3RequestBody); + } else { + JsonMapObject content = sw3RequestBody.getJsonMapProperty("content"); + if (content != null) { + String requestBodyName = (String)content.removeProperty("requestBodyName"); + if (requestBodyName != null) { + requestBodies.put(requestBodyName, sw3RequestBody); + String ref = "#components/requestBodies/" + requestBodyName; + sw2PathVerbProps.setProperty("requestBody", + Collections.singletonMap("$ref", ref)); + } + } + } + } + + } + + private static JsonMapObject prepareFormContent(List<JsonMapObject> formList, List<String> mediaTypes) { + String mediaType = StringUtils.isEmpty(mediaTypes) + ? "application/x-www-form-urlencoded" : mediaTypes.get(0); + JsonMapObject content = new JsonMapObject(); + JsonMapObject formType = new JsonMapObject(); + JsonMapObject schema = new JsonMapObject(); + schema.setProperty("type", "object"); + JsonMapObject props = new JsonMapObject(); + for (JsonMapObject prop : formList) { + String name = (String)prop.removeProperty("name"); + props.setProperty(name, prop); + if ("file".equals(prop.getProperty("type"))) { + prop.setProperty("type", "string"); + if (!prop.containsProperty("format")) { + prop.setProperty("format", "binary"); + } + } + } + schema.setProperty("properties", props); + formType.setProperty("schema", schema); + content.setProperty(mediaType, formType); + return content; + } + private static JsonMapObject prepareContentFromSchema(JsonMapObject schema, + List<String> mediaTypes, + boolean storeModelName) { + String type = schema.getStringProperty("type"); + String modelName = null; + boolean isArray = false; + if (!"object".equals(type) || !"string".equals(type)) { + String ref = null; + JsonMapObject items = null; + if ("array".equals(type)) { + isArray = true; + items = schema.getJsonMapProperty("items"); + ref = (String)items.getProperty("$ref"); + } else { + ref = schema.getStringProperty("$ref"); + } + if (ref != null) { + int index = ref.lastIndexOf("/"); + modelName = ref.substring(index + 1); + if (items == null) { + schema.setProperty("$ref", "#components/schemas/" + modelName); + } else { + items.setProperty("$ref", "#components/schemas/" + modelName); + } + + + } + } + JsonMapObject content = new JsonMapObject(); + + List<String> mediaTypesList = mediaTypes == null + ? Collections.singletonList("application/json") : mediaTypes; + + for (String mediaType : mediaTypesList) { + content.setProperty(mediaType, + Collections.singletonMap("schema", schema)); + + } + if (modelName != null && storeModelName) { + content.setProperty("requestBodyName", isArray ? modelName + "Array" : modelName); + } + // pass the model name via the content object + return content; + } + + private static void setServersProperty(JsonMapObject sw2, JsonMapObject sw3) { + String sw2Host = sw2.getStringProperty("host"); + String sw2BasePath = sw2.getStringProperty("basePath"); + String sw2Scheme = null; + List<String> sw2Schemes = sw2.getListStringProperty("schemes"); + if (StringUtils.isEmpty(sw2Schemes)) { + sw2Scheme = "https"; + } else { + sw2Scheme = sw2Schemes.get(0); + } + String sw3ServerUrl = sw2Scheme + "://" + sw2Host + sw2BasePath; + sw3.setProperty("servers", + Collections.singletonList( + Collections.singletonMap("url", sw3ServerUrl))); + + } + + +} diff --git a/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtilsTest.java b/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtilsTest.java new file mode 100644 index 0000000..73b352e --- /dev/null +++ b/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtilsTest.java @@ -0,0 +1,775 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.swagger.openapi; + +import java.util.List; +import java.util.Map; + +import org.apache.cxf.jaxrs.json.basic.JsonMapObject; +import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter; + +import org.junit.Assert; +import org.junit.Test; + +public class SwaggerToOpenApiConversionUtilsTest extends Assert { + + @Test + public void testConvertFromSwaggerToOpenApi() { + OpenApiConfiguration cfg = new OpenApiConfiguration(); + String s = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerLoc("/swagger2petShop.json"); + JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter(); + JsonMapObject sw3 = readerWriter.fromJsonToJsonObject(s); + assertEquals("3.0.0", sw3.getStringProperty("openapi")); + verifyServersProperty(sw3); + verifyInfoProperty(sw3); + verifyTagsProperty(sw3); + verifyPathsProperty(sw3, cfg); + verifyComponentsProperty(sw3, cfg); + } + + @Test + public void testConvertFromSwaggerToOpenApiWithRequestBodies() { + OpenApiConfiguration cfg = new OpenApiConfiguration(); + cfg.setCreateRequestBodies(true); + String s = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerLoc("/swagger2petShop.json", cfg); + JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter(); + JsonMapObject sw3 = readerWriter.fromJsonToJsonObject(s); + assertEquals("3.0.0", sw3.getStringProperty("openapi")); + verifyServersProperty(sw3); + verifyInfoProperty(sw3); + verifyTagsProperty(sw3); + verifyPathsProperty(sw3, cfg); + verifyComponentsProperty(sw3, cfg); + } + + private void verifyPathsProperty(JsonMapObject sw3, OpenApiConfiguration cfg) { + JsonMapObject paths = sw3.getJsonMapProperty("paths"); + assertEquals(14, paths.size()); + // /pet + verifyPetPath(paths, cfg); + // /pet/findByStatus + verifyPetFindByStatusPath(paths); + // /pet/findByTags + verifyPetFindByTagsPath(paths); + // /pet/{petId} + verifyPetIdPath(paths); + // "/pet/{petId}/uploadImage" + verifyPetIdUploadImagePath(paths); + // "/store/inventory" + verifyStoreInventoryPath(paths); + // "/store/order" + verifyStoreOrderPath(paths, cfg); + // "/store/order/{orderId}" + verifyStoreOrderIdPath(paths); + // "/user" + verifyUserPath(paths, cfg); + // "/user/createWithArray" + verifyUserCreateWithArrayPath(paths, cfg); + // "/user/createWithList" + verifyUserCreateWithListPath(paths, cfg); + // "/user/login" + verifyUserLoginPath(paths); + // "/user/logout" + verifyUserLogoutPath(paths); + // "/user/{username}" + verifyUserUsernamePath(paths, cfg); + } + + private void verifyPetPath(JsonMapObject paths, OpenApiConfiguration cfg) { + // /pet + JsonMapObject pet = paths.getJsonMapProperty("/pet"); + assertEquals(2, pet.size()); + verifyPetPathPost(pet, cfg); + verifyPetPathPut(pet, cfg); + } + + private void verifyPetFindByStatusPath(JsonMapObject paths) { + // /pet/findByStatus + JsonMapObject pet = paths.getJsonMapProperty("/pet/findByStatus"); + assertEquals(1, pet.size()); + verifyPetFindByStatusOrTags(pet, "findPetsByStatus"); + + } + private void verifyPetFindByTagsPath(JsonMapObject paths) { + // /pet/findByTags + JsonMapObject pet = paths.getJsonMapProperty("/pet/findByTags"); + assertEquals(1, pet.size()); + verifyPetFindByStatusOrTags(pet, "findPetsByTags"); + } + + private void verifyPetIdPath(JsonMapObject paths) { + // /pet/{petId} + JsonMapObject pet = paths.getJsonMapProperty("/pet/{petId}"); + assertEquals(3, pet.size()); + verifyPetIdPathPost(pet); + verifyPetIdPathGet(pet); + verifyPetIdPathDelete(pet); + } + + private void verifyPetIdUploadImagePath(JsonMapObject paths) { + // /pet/{petId}/uploadImage + JsonMapObject pet = paths.getJsonMapProperty("/pet/{petId}/uploadImage"); + assertEquals(1, pet.size()); + verifyPetIdUploadImagePathPost(pet); + } + + private void verifyStoreInventoryPath(JsonMapObject paths) { + // /store/inventory + JsonMapObject store = paths.getJsonMapProperty("/store/inventory"); + assertEquals(1, store.size()); + verifyStoreInventoryPathGet(store); + } + + private void verifyStoreOrderPath(JsonMapObject paths, OpenApiConfiguration cfg) { + // /store/order + JsonMapObject store = paths.getJsonMapProperty("/store/order"); + assertEquals(1, store.size()); + verifyStoreOrderPathPost(store, cfg); + } + + private void verifyStoreOrderIdPath(JsonMapObject paths) { + // /store/order/{orderId} + JsonMapObject store = paths.getJsonMapProperty("/store/order/{orderId}"); + assertEquals(2, store.size()); + verifyStoreOrderIdPathGet(store); + verifyStoreOrderIdPathDelete(store); + } + + private void verifyUserPath(JsonMapObject paths, OpenApiConfiguration cfg) { + // /user + JsonMapObject user = paths.getJsonMapProperty("/user"); + assertEquals(1, user.size()); + verifyUserPathPost(user, cfg); + } + + private void verifyUserCreateWithArrayPath(JsonMapObject paths, OpenApiConfiguration cfg) { + // /user/createWithArray + JsonMapObject user = paths.getJsonMapProperty("/user/createWithArray"); + assertEquals(1, user.size()); + verifyUserCreateWithArrayPathPost(user, cfg); + } + + private void verifyUserCreateWithListPath(JsonMapObject paths, OpenApiConfiguration cfg) { + // /user/createWithList + JsonMapObject user = paths.getJsonMapProperty("/user/createWithList"); + assertEquals(1, user.size()); + verifyUserCreateWithListPathPost(user, cfg); + } + + private void verifyUserLoginPath(JsonMapObject paths) { + // /user/login + JsonMapObject user = paths.getJsonMapProperty("/user/login"); + assertEquals(1, user.size()); + verifyUserLoginPathPost(user); + } + + private void verifyUserLogoutPath(JsonMapObject paths) { + // /user/logout + JsonMapObject user = paths.getJsonMapProperty("/user/logout"); + assertEquals(1, user.size()); + verifyUserLogoutPathGet(user); + } + + private void verifyUserUsernamePath(JsonMapObject paths, OpenApiConfiguration cfg) { + // /user/{username} + JsonMapObject user = paths.getJsonMapProperty("/user/{username}"); + assertEquals(3, user.size()); + verifyUserUsernamePathGet(user); + verifyUserUsernamePathPut(user, cfg); + verifyUserUsernamePathDelete(user); + } + + private void verifyUserLoginPathPost(JsonMapObject user) { + JsonMapObject userPost = user.getJsonMapProperty("get"); + assertEquals(6, userPost.size()); + testCommonVerbPropsExceptSec(userPost, "loginUser"); + assertNull(userPost.getProperty("requestBody")); + List<Map<String, Object>> parameters = userPost.getListMapProperty("parameters"); + assertEquals(2, parameters.size()); + verifyUserNameParameter(new JsonMapObject(parameters.get(0)), "username", "query"); + verifyPasswordParameter(new JsonMapObject(parameters.get(1)), "password"); + JsonMapObject responses = userPost.getJsonMapProperty("responses"); + assertEquals(2, responses.size()); + assertNotNull(responses.getJsonMapProperty("400")); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(3, okResp.size()); + assertNotNull(okResp.getProperty("description")); + assertNotNull(okResp.getProperty("headers")); + JsonMapObject content = okResp.getJsonMapProperty("content"); + assertEquals(2, content.size()); + verifySimpleStringContent(content, "application/json"); + verifySimpleStringContent(content, "application/xml"); + } + + private void verifyUserLogoutPathGet(JsonMapObject user) { + JsonMapObject userGet = user.getJsonMapProperty("get"); + assertEquals(5, userGet.size()); + testCommonVerbPropsExceptSec(userGet, "logoutUser"); + assertNull(userGet.getListMapProperty("parameters")); + assertNull(userGet.getProperty("requestBody")); + JsonMapObject responses = userGet.getJsonMapProperty("responses"); + assertEquals(1, responses.size()); + testDefaultResponse(userGet); + } + + private void verifyUserUsernamePathGet(JsonMapObject user) { + JsonMapObject userGet = user.getJsonMapProperty("get"); + assertEquals(6, userGet.size()); + testCommonVerbPropsExceptSec(userGet, "getUserByName"); + List<Map<String, Object>> parameters = userGet.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject userParam = new JsonMapObject(parameters.get(0)); + verifyUserNameParameter(userParam, "username", "path"); + assertNull(userGet.getProperty("requestBody")); + JsonMapObject responses = userGet.getJsonMapProperty("responses"); + assertEquals(3, responses.size()); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(2, okResp.size()); + assertNotNull(okResp.getProperty("description")); + JsonMapObject content = okResp.getJsonMapProperty("content"); + assertEquals(2, content.size()); + verifySimpleContent(content, "application/json", "User"); + verifySimpleContent(content, "application/xml", "User"); + } + + private void verifyUserUsernamePathPut(JsonMapObject user, OpenApiConfiguration cfg) { + JsonMapObject userPut = user.getJsonMapProperty("put"); + assertEquals(7, userPut.size()); + testCommonVerbPropsExceptSec(userPut, "updateUser"); + List<Map<String, Object>> parameters = userPut.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject userParam = new JsonMapObject(parameters.get(0)); + verifyUserNameParameter(userParam, "username", "path"); + if (cfg.isCreateRequestBodies()) { + verifyRequestBodyRef(userPut, "User"); + } else { + JsonMapObject requestBody = userPut.getJsonMapProperty("requestBody"); + assertEquals(3, requestBody.size()); + assertNotNull(requestBody.getProperty("description")); + assertTrue(requestBody.getBooleanProperty("required")); + JsonMapObject content = requestBody.getJsonMapProperty("content"); + assertEquals(1, content.size()); + verifySimpleContent(content, "application/json", "User"); + } + + JsonMapObject responses = userPut.getJsonMapProperty("responses"); + assertEquals(2, responses.size()); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + } + + private void verifyUserUsernamePathDelete(JsonMapObject user) { + JsonMapObject usetDelete = user.getJsonMapProperty("delete"); + assertEquals(6, usetDelete.size()); + testCommonVerbPropsExceptSec(usetDelete, "deleteUser"); + List<Map<String, Object>> parameters = usetDelete.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject userParam = new JsonMapObject(parameters.get(0)); + verifyUserNameParameter(userParam, "username", "path"); + assertNull(usetDelete.getJsonMapProperty("requestBody")); + JsonMapObject responses = usetDelete.getJsonMapProperty("responses"); + assertEquals(2, responses.size()); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + + + } + + private void verifyStoreOrderIdPathGet(JsonMapObject store) { + JsonMapObject storeGet = store.getJsonMapProperty("get"); + assertEquals(6, storeGet.size()); + testCommonVerbPropsExceptSec(storeGet, "getOrderById"); + List<Map<String, Object>> parameters = storeGet.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject orderIdParam = new JsonMapObject(parameters.get(0)); + verifyOrderIdParameter(orderIdParam, false); + assertNull(storeGet.getJsonMapProperty("requestBody")); + JsonMapObject responses = storeGet.getJsonMapProperty("responses"); + assertEquals(3, responses.size()); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(2, okResp.size()); + assertNotNull(okResp.getProperty("description")); + JsonMapObject content = okResp.getJsonMapProperty("content"); + assertEquals(2, content.size()); + verifySimpleContent(content, "application/json", "Order"); + verifySimpleContent(content, "application/xml", "Order"); + } + + private void verifyStoreOrderIdPathDelete(JsonMapObject store) { + JsonMapObject storeGet = store.getJsonMapProperty("delete"); + assertEquals(6, storeGet.size()); + testCommonVerbPropsExceptSec(storeGet, "deleteOrder"); + List<Map<String, Object>> parameters = storeGet.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject orderIdParam = new JsonMapObject(parameters.get(0)); + verifyOrderIdParameter(orderIdParam, true); + assertNull(storeGet.getJsonMapProperty("requestBody")); + JsonMapObject responses = storeGet.getJsonMapProperty("responses"); + assertEquals(2, responses.size()); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + } + + private void verifyStoreOrderPathPost(JsonMapObject store, OpenApiConfiguration cfg) { + JsonMapObject storePost = store.getJsonMapProperty("post"); + assertEquals(6, storePost.size()); + testCommonVerbPropsExceptSec(storePost, "placeOrder"); + assertNull(storePost.getProperty("parameters")); + + if (cfg.isCreateRequestBodies()) { + verifyRequestBodyRef(storePost, "Order"); + } else { + JsonMapObject contentIn = verifyRequestBodyContent(storePost); + assertEquals(1, contentIn.size()); + verifySimpleContent(contentIn, "application/json", "Order"); + } + JsonMapObject responses = storePost.getJsonMapProperty("responses"); + assertEquals(2, responses.size()); + assertNotNull(responses.getJsonMapProperty("400")); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(2, okResp.size()); + assertNotNull(okResp.getProperty("description")); + JsonMapObject contentOut = okResp.getJsonMapProperty("content"); + assertEquals(2, contentOut.size()); + verifySimpleContent(contentOut, "application/json", "Order"); + verifySimpleContent(contentOut, "application/xml", "Order"); + } + + private void verifyUserPathPost(JsonMapObject store, OpenApiConfiguration cfg) { + JsonMapObject userPost = store.getJsonMapProperty("post"); + assertEquals(6, userPost.size()); + testCommonVerbPropsExceptSec(userPost, "createUser"); + assertNull(userPost.getProperty("parameters")); + if (cfg.isCreateRequestBodies()) { + verifyRequestBodyRef(userPost, "User"); + } else { + JsonMapObject contentIn = verifyRequestBodyContent(userPost); + assertEquals(1, contentIn.size()); + verifySimpleContent(contentIn, "application/json", "User"); + } + testDefaultResponse(userPost); + } + + private void testDefaultResponse(JsonMapObject json) { + JsonMapObject responses = json.getJsonMapProperty("responses"); + assertEquals(1, responses.size()); + assertNotNull(responses.getProperty("default")); + + } + + private void verifyUserCreateWithArrayPathPost(JsonMapObject store, OpenApiConfiguration cfg) { + verifyUserCreateWithListOrArrayPathPost(store, "createUsersWithArrayInput", cfg); + } + + private void verifyUserCreateWithListPathPost(JsonMapObject store, OpenApiConfiguration cfg) { + verifyUserCreateWithListOrArrayPathPost(store, "createUsersWithListInput", cfg); + } + + private void verifyUserCreateWithListOrArrayPathPost(JsonMapObject store, String opId, + OpenApiConfiguration cfg) { + JsonMapObject userPost = store.getJsonMapProperty("post"); + assertEquals(6, userPost.size()); + testCommonVerbPropsExceptSec(userPost, opId); + assertNull(userPost.getProperty("parameters")); + if (cfg.isCreateRequestBodies()) { + verifyRequestBodyRef(userPost, "UserArray"); + } else { + JsonMapObject contentIn = verifyRequestBodyContent(userPost); + assertEquals(1, contentIn.size()); + verifyArrayContent(contentIn, "application/json", "User"); + } + testDefaultResponse(userPost); + } + + private void verifyStoreInventoryPathGet(JsonMapObject store) { + JsonMapObject storeGet = store.getJsonMapProperty("get"); + assertEquals(6, storeGet.size()); + testCommonVerbProps(storeGet, "getInventory"); + assertNull(storeGet.getProperty("parameters")); + assertNull(storeGet.getJsonMapProperty("requestBody")); + JsonMapObject responses = storeGet.getJsonMapProperty("responses"); + assertEquals(1, responses.size()); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(2, okResp.size()); + assertNotNull(okResp.getProperty("description")); + JsonMapObject content = okResp.getJsonMapProperty("content"); + assertEquals(1, content.size()); + verifyMapContent(content, "application/json", "integer", "int32"); + } + + private void verifyPetFindByStatusOrTags(JsonMapObject pet, String opId) { + JsonMapObject petGet = pet.getJsonMapProperty("get"); + boolean findByStatus = "findPetsByStatus".equals(opId); + + assertEquals(findByStatus ? 7 : 8, petGet.size()); + testCommonVerbProps(petGet, opId); + assertNull(petGet.getJsonMapProperty("requestBody")); + List<Map<String, Object>> parameters = petGet.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject param = new JsonMapObject(parameters.get(0)); + assertEquals(findByStatus ? "status" : "tags", param.getProperty("name")); + assertEquals("query", param.getProperty("in")); + assertNull(param.getProperty("type")); + assertNull(param.getProperty("items")); + assertNull(param.getProperty("collectionFormat")); + assertTrue(param.getBooleanProperty("explode")); + assertTrue(param.getBooleanProperty("required")); + JsonMapObject schema = param.getJsonMapProperty("schema"); + assertEquals(2, schema.size()); + assertEquals("array", schema.getStringProperty("type")); + assertNotNull(schema.getProperty("items")); + assertNull(schema.getProperty("requestBody")); + JsonMapObject responses = petGet.getJsonMapProperty("responses"); + assertEquals(2, responses.size()); + assertNotNull(responses.getProperty("400")); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(2, okResp.size()); + assertNotNull(okResp.getProperty("description")); + JsonMapObject content = okResp.getJsonMapProperty("content"); + assertEquals(2, content.size()); + verifyArrayContent(content, "application/json", "Pet"); + verifyArrayContent(content, "application/xml", "Pet"); + if (findByStatus) { + assertNull(petGet.getProperty("deprecated")); + } else { + assertTrue(petGet.getBooleanProperty("deprecated")); + } + } + private void verifyPetIdUploadImagePathPost(JsonMapObject pet) { + JsonMapObject petPost = pet.getJsonMapProperty("post"); + assertEquals(8, petPost.size()); + testCommonVerbProps(petPost, "uploadFile"); + List<Map<String, Object>> parameters = petPost.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject pathIdParam = new JsonMapObject(parameters.get(0)); + verifyPetIdParameter(pathIdParam); + + verifyPetFormContent(petPost, "multipart/form-data", + "additionalMetadata", "file"); + JsonMapObject responses = petPost.getJsonMapProperty("responses"); + assertEquals(1, responses.size()); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(2, okResp.size()); + assertNotNull(okResp.getProperty("description")); + JsonMapObject content = okResp.getJsonMapProperty("content"); + assertEquals(1, content.size()); + verifySimpleContent(content, "application/json", "ApiResponse"); + + } + private void verifyPetIdPathPost(JsonMapObject pet) { + JsonMapObject petPost = pet.getJsonMapProperty("post"); + assertEquals(8, petPost.size()); + testCommonVerbProps(petPost, "updatePetWithForm"); + List<Map<String, Object>> parameters = petPost.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject pathIdParam = new JsonMapObject(parameters.get(0)); + verifyPetIdParameter(pathIdParam); + + verifyPetFormContent(petPost, "application/x-www-form-urlencoded", + "name", "status"); + JsonMapObject responses = petPost.getJsonMapProperty("responses"); + assertEquals(1, responses.size()); + assertNotNull(responses.getProperty("405")); + + } + private void verifyPetIdPathGet(JsonMapObject pet) { + JsonMapObject petGet = pet.getJsonMapProperty("get"); + assertEquals(7, petGet.size()); + testCommonVerbProps(petGet, "getPetById"); + List<Map<String, Object>> parameters = petGet.getListMapProperty("parameters"); + assertEquals(1, parameters.size()); + JsonMapObject pathIdParam = new JsonMapObject(parameters.get(0)); + verifyPetIdParameter(pathIdParam); + + assertNull(petGet.getJsonMapProperty("requestBody")); + JsonMapObject responses = petGet.getJsonMapProperty("responses"); + assertEquals(3, responses.size()); + JsonMapObject okResp = responses.getJsonMapProperty("200"); + assertEquals(2, okResp.size()); + JsonMapObject content = okResp.getJsonMapProperty("content"); + assertEquals(2, content.size()); + verifySimpleContent(content, "application/json", "Pet"); + verifySimpleContent(content, "application/xml", "Pet"); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + + } + + private void verifyPetIdPathDelete(JsonMapObject pet) { + JsonMapObject petDel = pet.getJsonMapProperty("delete"); + assertEquals(7, petDel.size()); + testCommonVerbProps(petDel, "deletePet"); + List<Map<String, Object>> parameters = petDel.getListMapProperty("parameters"); + assertEquals(2, parameters.size()); + JsonMapObject apiKeyParam = new JsonMapObject(parameters.get(0)); + assertEquals("api_key", apiKeyParam.getProperty("name")); + assertEquals("header", apiKeyParam.getProperty("in")); + assertNull(apiKeyParam.getProperty("type")); + assertNull(apiKeyParam.getProperty("format")); + assertFalse(apiKeyParam.getBooleanProperty("required")); + JsonMapObject schema = apiKeyParam.getJsonMapProperty("schema"); + assertEquals(1, schema.size()); + assertEquals("string", schema.getProperty("type")); + JsonMapObject pathIdParam = new JsonMapObject(parameters.get(1)); + verifyPetIdParameter(pathIdParam); + assertNull(petDel.getJsonMapProperty("requestBody")); + JsonMapObject responses = petDel.getJsonMapProperty("responses"); + assertEquals(2, responses.size()); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + + } + + private void verifyPetIdParameter(JsonMapObject param) { + assertEquals("petId", param.getProperty("name")); + assertEquals("path", param.getProperty("in")); + assertNull(param.getProperty("type")); + assertNull(param.getProperty("format")); + assertNotNull(param.getProperty("description")); + assertTrue(param.getBooleanProperty("required")); + JsonMapObject schema = param.getJsonMapProperty("schema"); + assertEquals(2, schema.size()); + assertEquals("integer", schema.getProperty("type")); + assertEquals("int64", schema.getProperty("format")); + } + + private void verifyUserNameParameter(JsonMapObject param, String name, String inType) { + verifyStringParameter(param, "username", inType); + + } + + private void verifyPasswordParameter(JsonMapObject param, String name) { + verifyStringParameter(param, "password", "query"); + assertEquals("password", + param.getJsonMapProperty("schema").getProperty("format")); + } + + private void verifyStringParameter(JsonMapObject param, String name, String inType) { + assertEquals(name, param.getProperty("name")); + assertEquals(inType, param.getProperty("in")); + assertNull(param.getProperty("type")); + assertNull(param.getProperty("format")); + assertNotNull(param.getProperty("description")); + assertTrue(param.getBooleanProperty("required")); + JsonMapObject schema = param.getJsonMapProperty("schema"); + assertEquals("password".equals(name) ? 2 : 1, schema.size()); + assertEquals("string", schema.getProperty("type")); + } + + private void verifyOrderIdParameter(JsonMapObject param, boolean minOnly) { + assertEquals("orderId", param.getProperty("name")); + assertEquals("path", param.getProperty("in")); + assertNull(param.getProperty("type")); + assertNull(param.getProperty("format")); + assertNotNull(param.getProperty("description")); + assertTrue(param.getBooleanProperty("required")); + JsonMapObject schema = param.getJsonMapProperty("schema"); + + assertEquals(minOnly ? 3 : 4, schema.size()); + assertEquals("integer", schema.getProperty("type")); + assertNotNull(schema.getProperty("minimum")); + if (!minOnly) { + assertNotNull(schema.getProperty("maximum")); + } + } + + private void verifyPetPathPost(JsonMapObject pet, OpenApiConfiguration cfg) { + JsonMapObject petPost = pet.getJsonMapProperty("post"); + assertEquals(7, petPost.size()); + testCommonVerbProps(petPost, "addPet"); + assertNull(petPost.getProperty("parameters")); + if (cfg.isCreateRequestBodies()) { + verifyRequestBodyRef(petPost, "Pet"); + } else { + JsonMapObject content = verifyRequestBodyContent(petPost); + assertEquals(2, content.size()); + verifySimpleContent(content, "application/json", "Pet"); + verifySimpleContent(content, "application/xml", "Pet"); + } + JsonMapObject responses = petPost.getJsonMapProperty("responses"); + assertEquals(1, responses.size()); + assertNotNull(responses.getProperty("405")); + } + private JsonMapObject verifyRequestBodyContent(JsonMapObject json) { + return verifyRequestBodyContent(json, "requestBody"); + } + private JsonMapObject verifyRequestBodyContent(JsonMapObject json, String propName) { + JsonMapObject requestBody = json.getJsonMapProperty(propName); + assertEquals(3, requestBody.size()); + assertNotNull(requestBody.getProperty("description")); + assertTrue(requestBody.getBooleanProperty("required")); + return requestBody.getJsonMapProperty("content"); + } + private void verifyRequestBodyRef(JsonMapObject json, String refName) { + JsonMapObject requestBody = json.getJsonMapProperty("requestBody"); + assertEquals(1, requestBody.size()); + assertEquals("#components/requestBodies/" + refName, + requestBody.getProperty("$ref")); + } + + private void verifyPetPathPut(JsonMapObject pet, OpenApiConfiguration cfg) { + JsonMapObject petPut = pet.getJsonMapProperty("put"); + assertEquals(7, petPut.size()); + testCommonVerbProps(petPut, "updatePet"); + assertNull(petPut.getProperty("parameters")); + if (cfg.isCreateRequestBodies()) { + verifyRequestBodyRef(petPut, "Pet"); + } else { + JsonMapObject content = verifyRequestBodyContent(petPut); + assertEquals(2, content.size()); + verifySimpleContent(content, "application/json", "Pet"); + verifySimpleContent(content, "application/xml", "Pet"); + } + JsonMapObject responses = petPut.getJsonMapProperty("responses"); + assertEquals(3, responses.size()); + assertNotNull(responses.getProperty("400")); + assertNotNull(responses.getProperty("404")); + assertNotNull(responses.getProperty("405")); + } + + + private void verifySimpleContent(JsonMapObject contentMap, String mediaType, String modelName) { + JsonMapObject content = contentMap.getJsonMapProperty(mediaType); + assertEquals(1, content.size()); + JsonMapObject schema = content.getJsonMapProperty("schema"); + assertEquals(1, schema.size()); + assertEquals("#components/schemas/" + modelName, schema.getStringProperty("$ref")); + } + private void verifySimpleStringContent(JsonMapObject contentMap, String mediaType) { + JsonMapObject content = contentMap.getJsonMapProperty(mediaType); + assertEquals(1, content.size()); + JsonMapObject schema = content.getJsonMapProperty("schema"); + assertEquals(1, schema.size()); + assertEquals("string", schema.getStringProperty("type")); + } + private void verifyMapContent(JsonMapObject contentMap, String mediaType, String type, String format) { + JsonMapObject content = contentMap.getJsonMapProperty(mediaType); + assertEquals(1, content.size()); + JsonMapObject schema = content.getJsonMapProperty("schema"); + assertEquals(2, schema.size()); + assertEquals("object", schema.getStringProperty("type")); + JsonMapObject additionalProps = schema.getJsonMapProperty("additionalProperties"); + assertEquals(type, additionalProps.getStringProperty("type")); + assertEquals(format, additionalProps.getStringProperty("format")); + } + private void verifyPetFormContent(JsonMapObject petPost, + String mediaType, + String firstPropName, + String secondPropName) { + JsonMapObject requestBody = petPost.getJsonMapProperty("requestBody"); + assertEquals(1, requestBody.size()); + JsonMapObject contentMap = requestBody.getJsonMapProperty("content"); + assertEquals(1, contentMap.size()); + + + JsonMapObject content = contentMap.getJsonMapProperty(mediaType); + assertEquals(1, content.size()); + JsonMapObject schema = content.getJsonMapProperty("schema"); + assertEquals(2, schema.size()); + assertEquals("object", schema.getStringProperty("type")); + JsonMapObject props = schema.getJsonMapProperty("properties"); + assertEquals(2, props.size()); + JsonMapObject firstProp = props.getJsonMapProperty(firstPropName); + assertNotNull(firstProp.getProperty("description")); + assertEquals("string", firstProp.getProperty("type")); + JsonMapObject secondProp = props.getJsonMapProperty(secondPropName); + assertNotNull(secondProp.getProperty("description")); + assertEquals("string", secondProp.getProperty("type")); + if ("file".equals(secondPropName)) { + assertEquals("binary", secondProp.getProperty("format")); + } + } + private void verifyArrayContent(JsonMapObject contentMap, String mediaType, String modelName) { + JsonMapObject content = contentMap.getJsonMapProperty(mediaType); + assertEquals(1, content.size()); + JsonMapObject schema = content.getJsonMapProperty("schema"); + assertEquals(2, schema.size()); + assertEquals("array", schema.getStringProperty("type")); + JsonMapObject items = schema.getJsonMapProperty("items"); + assertEquals(1, items.size()); + assertEquals("#components/schemas/" + modelName, items.getStringProperty("$ref")); + } + + private void verifyServersProperty(JsonMapObject sw3) { + List<Map<String, Object>> servers = sw3.getListMapProperty("servers"); + assertEquals(1, servers.size()); + JsonMapObject server = new JsonMapObject(servers.get(0)); + assertEquals(1, server.size()); + assertEquals("http://petstore.swagger.io/v2", server.getStringProperty("url")); + } + + private void verifyInfoProperty(JsonMapObject sw3) { + //TODO: check info properties as well, though it's only copied from the original doc + assertNotNull(sw3.getJsonMapProperty("info")); + } + + private void verifyTagsProperty(JsonMapObject sw3) { + //TODO: check info properties as well, though it's only copied from the original doc + assertNotNull(sw3.getListMapProperty("tags")); + } + + private void verifyComponentsProperty(JsonMapObject sw3, OpenApiConfiguration cfg) { + JsonMapObject comps = sw3.getJsonMapProperty("components"); + assertEquals(3, comps.size()); + JsonMapObject requestBodies = comps.getJsonMapProperty("requestBodies"); + if (cfg.isCreateRequestBodies()) { + assertEquals(4, requestBodies.size()); + // UserArray + JsonMapObject userArrayContent = verifyRequestBodyContent(requestBodies, "UserArray"); + assertEquals(1, userArrayContent.size()); + verifyArrayContent(userArrayContent, "application/json", "User"); + // Pet + JsonMapObject petContent = verifyRequestBodyContent(requestBodies, "Pet"); + assertEquals(2, petContent.size()); + verifySimpleContent(petContent, "application/json", "Pet"); + verifySimpleContent(petContent, "application/xml", "Pet"); + // User + JsonMapObject userContent = verifyRequestBodyContent(requestBodies, "User"); + assertEquals(1, userContent.size()); + verifySimpleContent(userContent, "application/json", "User"); + // Order + JsonMapObject orderContent = verifyRequestBodyContent(requestBodies, "Order"); + assertEquals(1, orderContent.size()); + verifySimpleContent(orderContent, "application/json", "Order"); + } else { + assertEquals(0, requestBodies.size()); + } + assertNotNull(comps.getJsonMapProperty("schemas")); + assertNotNull(comps.getJsonMapProperty("securitySchemes")); + + } + + private void testCommonVerbProps(JsonMapObject method, String opId) { + testCommonVerbPropsExceptSec(method, opId); + assertNotNull(method.getProperty("security")); + } + private void testCommonVerbPropsExceptSec(JsonMapObject method, String opId) { + assertNotNull(method.getProperty("tags")); + assertNotNull(method.getProperty("summary")); + assertNotNull(method.getProperty("description")); + assertEquals(opId, method.getStringProperty("operationId")); + assertNull(method.getProperty("produces")); + assertNull(method.getProperty("consumes")); + + } +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
