package io.swagger;
import io.swagger.config.Scanner;
import io.swagger.config.ScannerFactory;
import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.jaxrs.config.DefaultJaxrsScanner;
import io.swagger.jaxrs.config.SwaggerConfigLocator;
import io.swagger.jaxrs.config.SwaggerContextService;
import io.swagger.jaxrs.config.SwaggerScannerLocator;
import io.swagger.jaxrs.config.WebXMLReader;
import io.swagger.models.Info;
import io.swagger.models.Swagger;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import static io.swagger.jaxrs.config.SwaggerContextService.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
public class SwaggerContextServiceTest {
private ServletContext servletContext1;
private ServletConfig servletConfig1;
private ServletContext servletContext2;
private ServletConfig servletConfig2;
private Scanner beanConfigScanner1;
private Scanner beanConfigScanner2;
private Scanner jaxrsScanner;
@BeforeMethod
void initMock() {
servletContext1 = mock(ServletContext.class);
servletConfig1 = mock(ServletConfig.class);
servletContext2 = mock(ServletContext.class);
servletConfig2 = mock(ServletConfig.class);
jaxrsScanner = new DefaultJaxrsScanner();
BeanConfig bc = new BeanConfig();
bc.setDescription("Bean Config test 1");
beanConfigScanner1 = bc;
bc = new BeanConfig();
bc.setDescription("Bean Config test 2");
beanConfigScanner2 = bc;
}
void stubWithPathBasedConfigInitParam() {
when(servletContext1.getAttribute(SCANNER_ID_PREFIX + "/url1")).thenReturn(beanConfigScanner1);
when(servletContext2.getAttribute(SCANNER_ID_PREFIX + "/url2")).thenReturn(beanConfigScanner2);
when(servletConfig1.getServletContext()).thenReturn(servletContext1);
when(servletConfig2.getServletContext()).thenReturn(servletContext2);
when(servletConfig1.getInitParameter(USE_PATH_BASED_CONFIG)).thenReturn("true");
when(servletConfig2.getInitParameter(USE_PATH_BASED_CONFIG)).thenReturn("true");
}
private void stubWithInitParam() {
when(servletContext1.getAttribute(SCANNER_ID_PREFIX + "test.1")).thenReturn(beanConfigScanner1);
when(servletContext2.getAttribute(SCANNER_ID_PREFIX + "test.2")).thenReturn(beanConfigScanner2);
when(servletConfig1.getServletContext()).thenReturn(servletContext1);
when(servletConfig2.getServletContext()).thenReturn(servletContext2);
when(servletConfig1.getInitParameter(SCANNER_ID_KEY)).thenReturn("test.1");
when(servletConfig2.getInitParameter(SCANNER_ID_KEY)).thenReturn("test.2");
when(servletConfig1.getInitParameter(CONFIG_ID_KEY)).thenReturn("test.1");
when(servletConfig2.getInitParameter(CONFIG_ID_KEY)).thenReturn("test.2");
}
private void stubWithContextInitParam() {
when(servletContext1.getAttribute(SCANNER_ID_PREFIX + "test.1")).thenReturn(beanConfigScanner1);
when(servletContext2.getAttribute(SCANNER_ID_PREFIX + "test.2")).thenReturn(beanConfigScanner2);
when(servletConfig1.getServletContext()).thenReturn(servletContext1);
when(servletConfig2.getServletContext()).thenReturn(servletContext2);
when(servletConfig1.getInitParameter(CONTEXT_ID_KEY)).thenReturn("test.1");
when(servletConfig2.getInitParameter(CONTEXT_ID_KEY)).thenReturn("test.2");
}
private void stubWithoutInitParam() {
when(servletContext1.getAttribute(SCANNER_ID_DEFAULT)).thenReturn(jaxrsScanner);
when(servletContext2.getAttribute(SCANNER_ID_DEFAULT)).thenReturn(jaxrsScanner);
when(servletConfig1.getServletContext()).thenReturn(servletContext1);
when(servletConfig2.getServletContext()).thenReturn(servletContext2);
}
@Test(description = "should add servletContext attributes SCANNER_ID_PREFIX + \"test.1/2")
public void initializeScannerWithInitParam() {
stubWithInitParam();
new SwaggerContextService().withServletConfig(servletConfig1).initScanner();
new SwaggerContextService().withServletConfig(servletConfig2).initScanner();
verify(servletConfig1, times(2)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext1, times(1)).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
verify(servletContext2, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
verify(servletConfig2, times(2)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext2, times(1)).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
verify(servletContext1, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
}
@Test(description = "should call servletContext getAttribute with param SCANNER_ID_PREFIX + \"test.1/2\"")
public void getScannerWithInitParam() {
stubWithInitParam();
Scanner scanner1 = new SwaggerContextService().withServletConfig(servletConfig1).getScanner();
Scanner scanner2 = new SwaggerContextService().withServletConfig(servletConfig2).getScanner();
assertEquals(beanConfigScanner1, scanner1);
assertEquals(beanConfigScanner2, scanner2);
verify(servletConfig1, times(2)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext1, times(1)).getAttribute(eq(SCANNER_ID_PREFIX + "test.1"));
verify(servletContext2, never()).getAttribute(eq(SCANNER_ID_PREFIX + "test.1"));
verify(servletConfig2, times(2)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext2, times(1)).getAttribute(eq(SCANNER_ID_PREFIX + "test.2"));
verify(servletContext1, never()).getAttribute(eq(SCANNER_ID_PREFIX + "test.2"));
}
@Test(description = "should add servletContext attributes SCANNER_ID_PREFIX + \"test.1/2")
public void initializeScannerWithContextInitParam() {
stubWithContextInitParam();
new SwaggerContextService().withServletConfig(servletConfig1).initScanner();
new SwaggerContextService().withServletConfig(servletConfig2).initScanner();
verify(servletConfig1, times(1)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletConfig1, times(2)).getInitParameter(eq(CONTEXT_ID_KEY));
verify(servletContext1, times(1)).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
verify(servletContext2, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
verify(servletConfig2, times(1)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletConfig2, times(2)).getInitParameter(eq(CONTEXT_ID_KEY));
verify(servletContext2, times(1)).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
verify(servletContext1, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
}
@Test(description = "should call servletContext getAttribute with param SCANNER_ID_PREFIX + \"test.1/2\"")
public void getScannerWithContextInitParam() {
stubWithContextInitParam();
Scanner scanner1 = new SwaggerContextService().withServletConfig(servletConfig1).getScanner();
Scanner scanner2 = new SwaggerContextService().withServletConfig(servletConfig2).getScanner();
assertEquals(beanConfigScanner1, scanner1);
assertEquals(beanConfigScanner2, scanner2);
verify(servletConfig1, times(1)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletConfig1, times(2)).getInitParameter(eq(CONTEXT_ID_KEY));
verify(servletContext1, times(1)).getAttribute(eq(SCANNER_ID_PREFIX + "test.1"));
verify(servletContext2, never()).getAttribute(eq(SCANNER_ID_PREFIX + "test.1"));
verify(servletConfig2, times(1)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletConfig2, times(2)).getInitParameter(eq(CONTEXT_ID_KEY));
verify(servletContext2, times(1)).getAttribute(eq(SCANNER_ID_PREFIX + "test.2"));
verify(servletContext1, never()).getAttribute(eq(SCANNER_ID_PREFIX + "test.2"));
}
@Test(description = "should add servletContext attributes SCANNER_ID_DEFAULT")
public void initializeAndGetScannerWithoutInitParam() {
stubWithoutInitParam();
new SwaggerContextService().withServletConfig(servletConfig1).initScanner();
new SwaggerContextService().withServletConfig(servletConfig2).initScanner();
verify(servletConfig1, times(1)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext1, times(1)).setAttribute(eq(SCANNER_ID_DEFAULT), any(Scanner.class));
verify(servletContext1, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
verify(servletContext2, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
verify(servletConfig2, times(1)).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext2, times(1)).setAttribute(eq(SCANNER_ID_DEFAULT), any(Scanner.class));
verify(servletContext2, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
verify(servletContext1, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
}
@Test(description = "should add scanner to ScannerFactory")
public void initializeAndGetScannerWithoutServletConfig() {
new SwaggerContextService().initScanner();
new SwaggerContextService().initScanner();
verify(servletConfig1, never()).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext1, never()).setAttribute(eq(SCANNER_ID_DEFAULT), any(Scanner.class));
verify(servletContext1, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
verify(servletContext2, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
verify(servletConfig2, never()).getInitParameter(eq(SCANNER_ID_KEY));
verify(servletContext2, never()).setAttribute(eq(SCANNER_ID_DEFAULT), any(Scanner.class));
verify(servletContext2, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.2"), any(Scanner.class));
verify(servletContext1, never()).setAttribute(eq(SCANNER_ID_PREFIX + "test.1"), any(Scanner.class));
assertNotNull(ScannerFactory.getScanner());
assertEquals(new SwaggerContextService().getScanner(), SwaggerScannerLocator.getInstance().getScanner(SCANNER_ID_DEFAULT));
}
@Test(description = "should add SwaggerConfig to SwaggerConfigLocator map with key CONFIG_ID_PREFIX + \"test.1/2\"")
public void initializeAndGetConfigWithInitParam() {
stubWithInitParam();
new SwaggerContextService().withServletConfig(servletConfig1).initConfig();
new SwaggerContextService().withServletConfig(servletConfig2).initConfig();
assertTrue(SwaggerConfigLocator.getInstance().getConfig(CONFIG_ID_PREFIX + "test.1") instanceof WebXMLReader);
assertTrue(SwaggerConfigLocator.getInstance().getConfig(CONFIG_ID_PREFIX + "test.2") instanceof WebXMLReader);
verify(servletConfig1, times(2)).getInitParameter(eq(CONFIG_ID_KEY));
verify(servletConfig2, times(2)).getInitParameter(eq(CONFIG_ID_KEY));
}
@Test(description = "should add SwaggerConfig to SwaggerConfigLocator map with key CONFIG_ID_PREFIX + \"test.1/2\"")
public void initializeAndGetConfigWithContextInitParam() {
stubWithContextInitParam();
new SwaggerContextService().withServletConfig(servletConfig1).initConfig();
new SwaggerContextService().withServletConfig(servletConfig2).initConfig();
assertTrue(SwaggerConfigLocator.getInstance().getConfig(CONFIG_ID_PREFIX + "test.1") instanceof WebXMLReader);
assertTrue(SwaggerConfigLocator.getInstance().getConfig(CONFIG_ID_PREFIX + "test.2") instanceof WebXMLReader);
verify(servletConfig1, times(2)).getInitParameter(eq(CONTEXT_ID_KEY));
verify(servletConfig1, times(1)).getInitParameter(eq(CONFIG_ID_KEY));
verify(servletConfig2, times(2)).getInitParameter(eq(CONTEXT_ID_KEY));
verify(servletConfig2, times(1)).getInitParameter(eq(CONFIG_ID_KEY));
}
@Test(description = "should add SwaggerConfig to SwaggerConfigLocator map with key CONFIG_ID_DEFAULT")
public void initializeAndGetConfigWithoutInitParam() {
stubWithoutInitParam();
new SwaggerContextService().withServletConfig(servletConfig1).initConfig();
new SwaggerContextService().withServletConfig(servletConfig2).initConfig();
verify(servletConfig1, times(1)).getInitParameter(eq(CONFIG_ID_KEY));
verify(servletConfig2, times(1)).getInitParameter(eq(CONFIG_ID_KEY));
}
@Test(description = "should add SwaggerConfig to SwaggerConfigLocator map with key CONFIG_ID_DEFAULT")
public void initializeAndGetConfigWithoutServletConfig() {
new SwaggerContextService().initConfig();
new SwaggerContextService().initConfig();
verify(servletConfig1, never()).getInitParameter(eq(CONFIG_ID_KEY));
verify(servletConfig2, never()).getInitParameter(eq(CONFIG_ID_KEY));
}
private void stubWithContextSwaggerAttribute() {
Swagger swagger = new Swagger();
Info info = new Info().title("Test Title");
swagger.setInfo(info);
when(servletContext1.getAttribute("swagger")).thenReturn(swagger);
when(servletConfig1.getServletContext()).thenReturn(servletContext1);
when(servletConfig2.getServletContext()).thenReturn(servletContext2);
when(servletConfig1.getInitParameter(CONTEXT_ID_KEY)).thenReturn("test.1");
when(servletConfig2.getInitParameter(CONTEXT_ID_KEY)).thenReturn("test.2");
}
@Test(description = "should get correct swagger context set via context param \"swagger\"")
public void initConfigViaContextParamSwagger() {
stubWithContextSwaggerAttribute();
Swagger swagger = new SwaggerContextService().withServletConfig(servletConfig1).getSwagger();
assertEquals("Test Title",swagger.getInfo().getTitle());
//verify(servletConfig1, times(2)).getInitParameter(eq(CONTEXT_ID_KEY));
}
@Test(description = "should add SwaggerConfig to SwaggerConfigLocator map with keys path-based keys")
public void initializeAndGetConfigBasedOnPath() {
stubWithPathBasedConfigInitParam();
new SwaggerContextService()
.withServletConfig(servletConfig1)
.withBasePath("/url1")
.initConfig();
new SwaggerContextService()
.withServletConfig(servletConfig2)
.withBasePath("url2")
.initConfig();
assertTrue(SwaggerConfigLocator.getInstance().getConfig(CONFIG_ID_PREFIX + "/url1/") instanceof WebXMLReader);
assertTrue(SwaggerConfigLocator.getInstance().getConfig(CONFIG_ID_PREFIX + "/url2/") instanceof WebXMLReader);
verify(servletConfig1, times(1)).getInitParameter(eq(USE_PATH_BASED_CONFIG));
verify(servletConfig2, times(1)).getInitParameter(eq(USE_PATH_BASED_CONFIG));
}
}