/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.translator.swagger; import static org.junit.Assert.*; import io.swagger.models.Swagger; import io.swagger.parser.SwaggerParser; import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; import org.junit.Test; import org.teiid.core.util.UnitTestUtil; import org.teiid.metadata.Column; import org.teiid.metadata.ColumnSet; import org.teiid.metadata.MetadataFactory; import org.teiid.metadata.Procedure; import org.teiid.metadata.ProcedureParameter; import org.teiid.metadata.RestMetadataExtension; import org.teiid.query.function.FunctionTree; import org.teiid.query.function.UDFSource; import org.teiid.query.metadata.DDLStringVisitor; import org.teiid.query.metadata.MetadataValidator; import org.teiid.query.metadata.SystemMetadata; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.parser.QueryParser; import org.teiid.query.unittest.RealMetadataFactory; import org.teiid.query.validator.ValidatorReport; import org.teiid.translator.TranslatorException; import org.teiid.translator.WSConnection; @SuppressWarnings("nls") public class TestSwaggerMetadataProcessor { public static TransformationMetadata getTransformationMetadata( MetadataFactory mf, SwaggerExecutionFactory ef) throws Exception { TransformationMetadata metadata = RealMetadataFactory.createTransformationMetadata(mf.asMetadataStore(), "swagger", new FunctionTree("foo", new UDFSource(ef.getPushDownFunctions()))); ValidatorReport report = new MetadataValidator().validate(metadata.getVdbMetaData(), metadata.getMetadataStore()); if (report.hasItems()) { throw new RuntimeException(report.getFailureMessage()); } return metadata; } static MetadataFactory swaggerMetadata(SwaggerExecutionFactory ef) throws TranslatorException { SwaggerMetadataProcessor processor = new SwaggerMetadataProcessor(ef) { protected Swagger getSchema(WSConnection conn) throws TranslatorException { File f = new File(UnitTestUtil.getTestDataPath()+"/swagger.json"); SwaggerParser parser = new SwaggerParser(); return parser.read(f.getAbsolutePath()); } }; processor.setPreferredProduces("application/json"); processor.setPreferredConsumes("application/json"); processor.setPreferredScheme("http"); Properties props = new Properties(); MetadataFactory mf = new MetadataFactory("vdb", 1, "swagger", SystemMetadata.getInstance().getRuntimeTypeMap(), props, null); processor.process(mf, null); //String ddl = DDLStringVisitor.getDDLString(mf.getSchema(), null, null); //System.out.println(ddl); return mf; } static MetadataFactory petstoreMetadata(SwaggerExecutionFactory ef) throws TranslatorException { SwaggerMetadataProcessor processor = new SwaggerMetadataProcessor(ef) { protected Swagger getSchema(WSConnection conn) throws TranslatorException { File f = new File(UnitTestUtil.getTestDataPath()+"/petstore.json"); SwaggerParser parser = new SwaggerParser(); return parser.read(f.getAbsolutePath()); } }; processor.setPreferredProduces("application/json"); processor.setPreferredConsumes("application/json"); processor.setPreferredScheme("http"); Properties props = new Properties(); MetadataFactory mf = new MetadataFactory("vdb", 1, "swagger", SystemMetadata.getInstance().getRuntimeTypeMap(), props, null); processor.process(mf, null); //String ddl = DDLStringVisitor.getDDLString(mf.getSchema(), null, null); //System.out.println(ddl); return mf; } @Test public void testSchema() throws Exception { SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); //TransformationMetadata metadata = getTransformationMetadata(mf, translator); String ddl = DDLStringVisitor.getDDLString(mf.getSchema(), null, null); //System.out.println(ddl); MetadataFactory mf2 = new MetadataFactory("vdb", 1, "x", SystemMetadata.getInstance().getRuntimeTypeMap(), new Properties(), null); QueryParser.getQueryParser().parseDDL(mf2, ddl); Set<String> procSet = new HashSet<String>(); for(Procedure p : mf.getSchema().getProcedures().values()) { procSet.add(p.getName()); } assertEquals(29, procSet.size()); assertTrue(procSet.contains("addCustomer")); assertTrue(procSet.contains("addOneCustomer")); assertTrue(procSet.contains("addCustomerList")); assertTrue(procSet.contains("getCustomers")); assertTrue(procSet.contains("getCustomerList")); assertTrue(procSet.contains("getCustomerByCity")); assertTrue(procSet.contains("getCustomerByCountry")); assertTrue(procSet.contains("getCustomerByName")); assertTrue(procSet.contains("getCustomerByNumber")); assertTrue(procSet.contains("getByNumCityCountry")); assertTrue(procSet.contains("size")); assertTrue(procSet.contains("removeCustomer")); assertTrue(procSet.contains("removeCustomerByCity")); assertTrue(procSet.contains("removeCustomerByCountry")); assertTrue(procSet.contains("removeCustomerByName")); assertTrue(procSet.contains("removeCustomerByNumber")); assertTrue(procSet.contains("removeCustomerByNumCityCountry")); assertTrue(procSet.contains("updateCustomer")); assertTrue(procSet.contains("updateCustomerByCity")); assertTrue(procSet.contains("updateCustomerByCountry")); assertTrue(procSet.contains("updateCustomerByName")); assertTrue(procSet.contains("updateCustomerByNumber")); assertTrue(procSet.contains("updateCustomerByNumCityCountry")); // test preferences Procedure p = mf.getSchema().getProcedures().get("updateCustomer"); assertEquals("application/json", p.getProperty(RestMetadataExtension.PRODUCES, false)); } @Test public void testSwaggerINParameterTypes() throws TranslatorException { SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); for(Procedure p : mf.getSchema().getProcedures().values()) { // multiple in parameter if(p.getName().equals("getByNumCityCountry")) { List<ProcedureParameter> params = p.getParameters(); for(ProcedureParameter param : params) { assertEquals(RestMetadataExtension.ParameterType.QUERY.name(), param.getProperty(RestMetadataExtension.PARAMETER_TYPE, false).toUpperCase()); } assertEquals(3, params.size()); assertTrue(params.get(0).getName().equalsIgnoreCase("customernumber")); assertTrue(params.get(1).getName().equalsIgnoreCase("city")); assertTrue(params.get(2).getName().equalsIgnoreCase("country")); } // QueryParameter and PathParameter else if (p.getName().equals("getCustomerByCity") || p.getName().equals("getCustomerByCountry") && p.getName().equals("getByNumCityCountry")) { for(ProcedureParameter param : p.getParameters()) { assertEquals(RestMetadataExtension.ParameterType.QUERY.name(), param.getProperty(RestMetadataExtension.PARAMETER_TYPE, false).toUpperCase()); } } else if(p.getName().equals("getCustomerByNumber") || p.getName().equals("getCustomerByName")) { for(ProcedureParameter param : p.getParameters()) { assertEquals(RestMetadataExtension.ParameterType.PATH.name(), param.getProperty(RestMetadataExtension.PARAMETER_TYPE, false).toUpperCase()); } } // Post parameter else if (p.getName().equals("addCustomer") || p.getName().equals("addOneCustomer") || p.getName().equals("addCustomerList")) { ProcedureParameter param = p.getParameters().get(0); assertEquals(RestMetadataExtension.ParameterType.BODY.name(), param.getProperty(RestMetadataExtension.PARAMETER_TYPE, false).toUpperCase()); } if (p.getName().equals("addCustomer")) { List<ProcedureParameter> params = p.getParameters(); assertEquals(13, params.size()); assertEquals("customernumber", params.get(0).getName()); assertEquals("creditlimit", params.get(12).getName()); } } } @Test public void testAnnotation() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); for(Procedure p : mf.getSchema().getProcedures().values()){ if(p.getName().equals("addCustomer")){ assertEquals("Add a Customer", p.getAnnotation()); } else if (p.getName().equals("getByNumCityCountry")){ assertEquals("get customer by Number, City, Country as return xml/json", p.getAnnotation()); } } } @Test public void testURI() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); Procedure p = mf.getSchema().getProcedure("addCustomer"); assertNotNull(p); assertEquals("POST", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/customer", p.getProperty(RestMetadataExtension.URI, false)); assertNull(p.getResultSet()); p = mf.getSchema().getProcedure("getCustomers"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/customer/customerList", p.getProperty(RestMetadataExtension.URI, false)); assertEquals("application/xml", p.getProperty(RestMetadataExtension.PRODUCES, false)); assertNull(p.getResultSet()); assertEquals("return", p.getParameters().get(0).getName()); assertEquals("string", p.getParameters().get(0).getRuntimeType()); p = mf.getSchema().getProcedure("removeCustomer"); assertNotNull(p); assertEquals("DELETE", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/customer/delete/{id}", p.getProperty(RestMetadataExtension.URI, false)); assertEquals("application/json", p.getProperty(RestMetadataExtension.PRODUCES, false)); assertNull(p.getResultSet()); assertEquals("id", p.getParameters().get(0).getName()); assertEquals(1, p.getParameters().size()); } @Test public void testResultSets() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); Procedure p = mf.getSchema().getProcedure("getCustomerList"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/customer/getAll", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); ColumnSet<Procedure> results = p.getResultSet(); assertEquals(13, results.getColumns().size()); Column c = results.getColumnByName("customernumber"); assertNotNull(c); assertEquals("string", c.getRuntimeType()); c = results.getColumnByName("postalcode"); assertNotNull(c); assertEquals("string", c.getRuntimeType()); } @Test public void testTypes() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); Procedure p = mf.getSchema().getProcedure("testReturnTypes"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/test/testReturnTypes", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); ColumnSet<Procedure> results = p.getResultSet(); assertEquals("byte", results.getColumnByName("a").getRuntimeType()); assertEquals("integer", results.getColumnByName("b").getRuntimeType()); assertEquals("integer", results.getColumnByName("c").getRuntimeType()); assertEquals("long", results.getColumnByName("d").getRuntimeType()); assertEquals("float", results.getColumnByName("e").getRuntimeType()); assertEquals("double", results.getColumnByName("f").getRuntimeType()); assertEquals("boolean", results.getColumnByName("g").getRuntimeType()); assertEquals("string", results.getColumnByName("h").getRuntimeType()); assertEquals("byte[]", results.getColumnByName("i").getRuntimeType()); assertEquals("timestamp", results.getColumnByName("l").getRuntimeType()); p = mf.getSchema().getProcedure("testTimeTypes"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/test/testTimeTypes", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); results = p.getResultSet(); assertEquals("timestamp", results.getColumnByName("date").getRuntimeType()); assertEquals("timestamp", results.getColumnByName("sqlDate").getRuntimeType()); // test types in parameters p = mf.getSchema().getProcedure("testTypes"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/test/testTypes", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); List<ProcedureParameter> pp = p.getParameters(); assertEquals("integer", pp.get(0).getRuntimeType()); assertEquals("long", pp.get(1).getRuntimeType()); assertEquals("float", pp.get(2).getRuntimeType()); assertEquals("double", pp.get(3).getRuntimeType()); assertEquals("string", pp.get(4).getRuntimeType()); assertEquals("byte", pp.get(5).getRuntimeType()); assertEquals("string[]", pp.get(6).getRuntimeType()); assertEquals("boolean", pp.get(7).getRuntimeType()); assertEquals("timestamp", pp.get(8).getRuntimeType()); } @Test public void testOnetoOneEmbeddedReturn() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); Procedure p = mf.getSchema().getProcedure("size"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/customer/status", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); ColumnSet<Procedure> results = p.getResultSet(); assertNotNull(results.getColumnByName("size")); assertNotNull(results.getColumnByName("heap_maxMemory")); assertNotNull(results.getColumnByName("heap_freeMemory")); } @Test public void testDateTime() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); Procedure p = mf.getSchema().getProcedure("testTimeTypes"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/test/testTimeTypes", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); List<Column> columns = p.getResultSet().getColumns(); for (int i = 0; i < columns.size(); i++){ Column column = columns.get(i); Class<?> type = column.getJavaType(); assertEquals(java.sql.Timestamp.class, type); } } @Test public void testRefToProcedureParam() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = petstoreMetadata(translator); Procedure p = mf.getSchema().getProcedure("addPet"); assertNotNull(p); assertEquals("POST", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://petstore.swagger.io/v2/pet", p.getProperty(RestMetadataExtension.URI, false)); ProcedureParameter pa = p.getParameterByName("id"); assertNull(pa.getNameInSource()); assertEquals("body", pa.getProperty("teiid_rest:PARAMETER_TYPE", false)); pa = p.getParameterByName("category_id"); assertEquals("category/id", pa.getNameInSource()); assertEquals("body", pa.getProperty("teiid_rest:PARAMETER_TYPE", false)); pa = p.getParameterByName("tags_Tag_id"); assertEquals("tags[]/Tag/id", pa.getNameInSource()); assertEquals("body", pa.getProperty("teiid_rest:PARAMETER_TYPE", false)); } @Test public void testReftoResponse() throws TranslatorException{ SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = petstoreMetadata(translator); Procedure p = mf.getSchema().getProcedure("findPetsByTags"); assertNotNull(p); assertEquals("GET", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://petstore.swagger.io/v2/pet/findByTags", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); List<Column> columns = p.getResultSet().getColumns(); assertEquals(8, columns.size()); Column pa = p.getResultSet().getColumnByName("id"); assertNull(pa.getNameInSource()); pa = p.getResultSet().getColumnByName("category_id"); assertEquals("category/id", pa.getNameInSource()); pa = p.getResultSet().getColumnByName("tags_Tag_id"); assertEquals("tags[]/Tag/id", pa.getNameInSource()); } @Test public void testBodyandPathProcedure() throws Exception { SwaggerExecutionFactory translator = new SwaggerExecutionFactory(); translator.start(); MetadataFactory mf = swaggerMetadata(translator); Procedure p = mf.getSchema().getProcedure("executeOperation"); assertNotNull(p); assertEquals("PUT", p.getProperty(RestMetadataExtension.METHOD, false).toUpperCase()); assertEquals("http://localhost:8080/operation/{operationId}", p.getProperty(RestMetadataExtension.URI, false)); assertNotNull(p.getResultSet()); assertNotNull(p.getParameterByName("operationId")); assertNotNull(p.getParameterByName("id")); assertNotNull(p.getParameterByName("name")); assertNotNull(p.getParameterByName("resourceId")); assertNotNull(p.getParameterByName("definitionId")); assertNotNull(p.getParameterByName("readyToSubmit")); assertNotNull(p.getParameterByName("params_arguments")); List<Column> columns = p.getResultSet().getColumns(); assertEquals(2, columns.size()); } }