/** * 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.systest.jaxrs.description; import java.io.InputStream; import java.util.Arrays; import javax.json.Json; import javax.json.JsonObject; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider; import org.apache.cxf.jaxrs.model.AbstractResourceInfo; import org.apache.cxf.jaxrs.swagger.SwaggerFeature; import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; import org.apache.cxf.testutil.common.AbstractBusTestServerBase; import org.junit.Ignore; import org.junit.Test; import org.skyscreamer.jsonassert.JSONAssert; public abstract class AbstractSwaggerServiceDescriptionTest extends AbstractBusClientServerTestBase { private static final JsonObject DELETE_METHOD_SPEC = Json.createObjectBuilder() .add("method", "DELETE") .add("summary", "Delete book") .add("notes", "Delete book") .add("type", "void") .add("nickname", "delete") .add("parameters", Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("name", "id") .add("description", "id") .add("required", true) .add("type", "string") .add("paramType", "path") .add("allowMultiple", false) ) ).build(); private static final JsonObject GET_BY_ID_METHOD_SPEC = Json.createObjectBuilder() .add("method", "GET") .add("summary", "Get book by Id") .add("notes", "Get book by Id") .add("type", "Book") .add("nickname", "getBook") .add("produces", Json.createArrayBuilder().add("application/json")) .add("parameters", Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("name", "id") .add("description", "id") .add("required", true) .add("type", "integer") .add("format", "int64") .add("paramType", "path") .add("allowMultiple", false) ) ).build(); private static final JsonObject GET_METHOD_SPEC = Json.createObjectBuilder() .add("method", "GET") .add("summary", "Get books") .add("notes", "Get books") .add("type", "array") .add("items", Json.createObjectBuilder().add("$ref", "Book")) .add("nickname", "getBooks") .add("produces", Json.createArrayBuilder().add("application/json")) .add("parameters", Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("name", "page") .add("description", "Page to fetch") .add("defaultValue", "1") .add("required", true) .add("type", "integer") .add("format", "int32") .add("paramType", "query") .add("allowMultiple", false) ) ).build(); private static final JsonObject BOOK_MODEL_SPEC = Json.createObjectBuilder() .add("Book", Json.createObjectBuilder() .add("id", "Book") .add("discriminator", "class") .add("properties", Json.createObjectBuilder() .add("name", Json.createObjectBuilder().add("type", "string")) .add("id", Json.createObjectBuilder() .add("type", "integer") .add("format", "int64") ) ) ).build(); @Ignore public abstract static class Server extends AbstractBusTestServerBase { private final String port; private final boolean runAsFilter; Server(final String port, final boolean runAsFilter) { this.port = port; this.runAsFilter = runAsFilter; } protected void run() { final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); sf.setResourceClasses(BookStoreSwagger.class); sf.setResourceProvider(BookStoreSwagger.class, new SingletonResourceProvider(new BookStoreSwagger())); sf.setProvider(new JacksonJsonProvider()); final SwaggerFeature feature = new SwaggerFeature(); feature.setRunAsFilter(runAsFilter); sf.setFeatures(Arrays.asList(feature)); sf.setAddress("http://localhost:" + port + "/"); sf.create(); } protected static void start(final Server s) { try { s.start(); } catch (Exception ex) { ex.printStackTrace(); System.exit(-1); } finally { System.out.println("done!"); } } } protected static void startServers(final Class< ? extends Server> serverClass) throws Exception { AbstractResourceInfo.clearAllMaps(); //keep out of process due to stack traces testing failures assertTrue("server did not launch correctly", launchServer(serverClass, false)); createStaticBus(); } protected abstract String getPort(); @Test public void testApiListingIsProperlyReturned() throws Exception { final WebClient client = createWebClient("/api-docs"); try { final Response r = client.get(); assertEquals(Status.OK.getStatusCode(), r.getStatus()); JSONAssert.assertEquals( Json.createObjectBuilder() .add("apiVersion", "1.0.0") .add("swaggerVersion", "1.2") .add("apis", Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("path", "/bookstore") .add("description", "Sample JAX-RS service with Swagger documentation") ) ) .add("info", Json.createObjectBuilder() .add("title", "Sample REST Application") .add("description", "The Application") .add("contact", "users@cxf.apache.org") .add("license", "Apache 2.0 License") .add("licenseUrl", "http://www.apache.org/licenses/LICENSE-2.0.html") ).build().toString(), IOUtils.readStringFromStream((InputStream)r.getEntity()), false); } finally { client.close(); } } @Test public void testApiResourcesAreProperlyReturned() throws Exception { final WebClient client = createWebClient("/api-docs/bookstore"); try { final Response r = client.get(); assertEquals(Status.OK.getStatusCode(), r.getStatus()); JSONAssert.assertEquals( Json.createObjectBuilder() .add("apiVersion", "1.0.0") .add("swaggerVersion", "1.2") .add("basePath", "http://localhost:" + getPort() + "/") .add("resourcePath", "/bookstore") .add("apis", Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("path", "/bookstore/{id}") .add("operations", Json.createArrayBuilder() .add(DELETE_METHOD_SPEC) .add(GET_BY_ID_METHOD_SPEC))) .add(Json.createObjectBuilder() .add("path", "/bookstore") .add("operations", Json.createArrayBuilder().add(GET_METHOD_SPEC)))) .add("models", BOOK_MODEL_SPEC).build().toString(), IOUtils.readStringFromStream((InputStream)r.getEntity()), false); } finally { client.close(); } } @Test public void testNonRegisteredApiResourcesAreNotReturned() throws Exception { final Response r = createWebClient("/api-docs/books").get(); assertEquals(Status.NOT_FOUND.getStatusCode(), r.getStatus()); } private WebClient createWebClient(final String url) { return WebClient .create("http://localhost:" + getPort() + url, Arrays.< Object >asList(new JacksonJsonProvider())) .accept(MediaType.APPLICATION_JSON); } }