package io.swagger; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import io.swagger.jaxrs.Reader; import io.swagger.jaxrs.ext.AbstractSwaggerExtension; import io.swagger.jaxrs.ext.SwaggerExtension; import io.swagger.jaxrs.ext.SwaggerExtensions; import io.swagger.models.Operation; import io.swagger.models.Response; import io.swagger.models.Swagger; import io.swagger.resources.SimpleResourceWithVendorAnnotation; import io.swagger.resources.SimpleResourceWithVendorAnnotation.VendorFunnyAnnotation; import java.lang.reflect.Method; import java.util.Iterator; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * Scanner example for custom operation decorator extension. */ public class SimpleScannerWithDecoratorExtensionTest { private static final String RESPONSE_DESCRIPTION = "Some vendor error description"; private static final String RESPONSE_STATUS_401 = "401"; private static final SwaggerExtension customExtension = new AbstractSwaggerExtension() { @Override public void decorateOperation(final Operation operation, final Method method, final Iterator<SwaggerExtension> chain) { method.getDeclaredAnnotations(); final VendorFunnyAnnotation myFunyError = method.getAnnotation(SimpleResourceWithVendorAnnotation.VendorFunnyAnnotation.class); if (myFunyError != null) { /* * Extend swagger model by new error response description, with additional data received from vendor * based annotation. This example overwrite existing response from swagger annotation, but it is only * for demo. */ final Response value = new Response(); value.setDescription(RESPONSE_DESCRIPTION); operation.getResponses().put(RESPONSE_STATUS_401, value); } } }; private Swagger getSwagger(final Class<?> cls) { return new Reader(new Swagger()).read(cls); } private Operation getGet(final Swagger swagger, final String path) { return swagger.getPaths().get(path).getGet(); } @BeforeMethod() public void addCustomExtension() { SwaggerExtensions.getExtensions().add(customExtension); } @AfterMethod() public void removeCustomExtension() { SwaggerExtensions.getExtensions().remove(customExtension); } /** * Test for method annotated with vendor annotation which could be used for swagger documentation. */ @Test(description = "scan a simple resource with custom decorator") public void scanSimpleResourceWithDecorator() { final Swagger swagger = getSwagger(SimpleResourceWithVendorAnnotation.class); assertEquals(swagger.getPaths().size(), 2); final Operation get = getGet(swagger, "/{id}"); assertNotNull(get); assertEquals(get.getParameters().size(), 2); final Response response = get.getResponses().get(RESPONSE_STATUS_401); assertNotNull(response); assertEquals(response.getDescription(), RESPONSE_DESCRIPTION); } /** * Test for method annotated without vendor annotation. */ @Test(description = "scan a simple resource without custom decorator") public void scanSimpleResourceWithoutDecorator() { final Swagger swagger = getSwagger(SimpleResourceWithVendorAnnotation.class); assertEquals(swagger.getPaths().size(), 2); final Operation get = getGet(swagger, "/{id}/value"); assertNotNull(get); assertEquals(get.getParameters().size(), 0); final Response response = get.getResponses().get(RESPONSE_STATUS_401); assertNull(response); } }