package io.dropwizard.jetty.setup; import io.dropwizard.jetty.MutableServletContextHandler; import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.security.SecurityHandler; import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlets.WelcomeFilter; import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.ResourceCollection; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.ArgumentCaptor; import javax.servlet.Filter; import javax.servlet.FilterRegistration; import javax.servlet.GenericServlet; import javax.servlet.Servlet; import javax.servlet.ServletContextListener; import javax.servlet.ServletRegistration; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class ServletEnvironmentTest { private final ServletHandler servletHandler = mock(ServletHandler.class); private final MutableServletContextHandler handler = mock(MutableServletContextHandler.class); private final ServletEnvironment environment = new ServletEnvironment(handler); @Rule public TemporaryFolder tempDir = new TemporaryFolder(); @Before public void setUp() throws Exception { when(handler.getServletHandler()).thenReturn(servletHandler); } @Test public void addsServletInstances() throws Exception { final Servlet servlet = mock(Servlet.class); final ServletRegistration.Dynamic builder = environment.addServlet("servlet", servlet); assertThat(builder) .isNotNull(); final ArgumentCaptor<ServletHolder> holder = ArgumentCaptor.forClass(ServletHolder.class); verify(servletHandler).addServlet(holder.capture()); assertThat(holder.getValue().getName()) .isEqualTo("servlet"); assertThat(holder.getValue().getServlet()) .isEqualTo(servlet); } @Test public void addsServletClasses() throws Exception { final ServletRegistration.Dynamic builder = environment.addServlet("servlet", GenericServlet.class); assertThat(builder) .isNotNull(); final ArgumentCaptor<ServletHolder> holder = ArgumentCaptor.forClass(ServletHolder.class); verify(servletHandler).addServlet(holder.capture()); assertThat(holder.getValue().getName()) .isEqualTo("servlet"); // this is ugly, but comparing classes sucks with these type bounds assertThat(holder.getValue().getHeldClass().equals(GenericServlet.class)) .isTrue(); } @Test public void addsFilterInstances() throws Exception { final Filter filter = mock(Filter.class); final FilterRegistration.Dynamic builder = environment.addFilter("filter", filter); assertThat(builder) .isNotNull(); final ArgumentCaptor<FilterHolder> holder = ArgumentCaptor.forClass(FilterHolder.class); verify(servletHandler).addFilter(holder.capture()); assertThat(holder.getValue().getName()) .isEqualTo("filter"); assertThat(holder.getValue().getFilter()) .isEqualTo(filter); } @Test public void addsFilterClasses() throws Exception { final FilterRegistration.Dynamic builder = environment.addFilter("filter", WelcomeFilter.class); assertThat(builder) .isNotNull(); final ArgumentCaptor<FilterHolder> holder = ArgumentCaptor.forClass(FilterHolder.class); verify(servletHandler).addFilter(holder.capture()); assertThat(holder.getValue().getName()) .isEqualTo("filter"); // this is ugly, but comparing classes sucks with these type bounds assertThat(holder.getValue().getHeldClass().equals(WelcomeFilter.class)) .isTrue(); } @Test public void addsServletListeners() throws Exception { final ServletContextListener listener = mock(ServletContextListener.class); environment.addServletListeners(listener); verify(handler).addEventListener(listener); } @Test public void addsProtectedTargets() throws Exception { environment.setProtectedTargets("/woo"); verify(handler).setProtectedTargets(new String[]{"/woo"}); } @Test public void setsBaseResource() throws Exception { final Resource testResource = Resource.newResource(tempDir.newFolder()); environment.setBaseResource(testResource); verify(handler).setBaseResource(testResource); } @Test public void setsBaseResourceList() throws Exception { Resource wooResource = Resource.newResource(tempDir.newFolder()); Resource fooResource = Resource.newResource(tempDir.newFolder()); final Resource[] testResources = new Resource[]{wooResource, fooResource}; environment.setBaseResource(testResources); ArgumentCaptor<Resource> captor = ArgumentCaptor.forClass(Resource.class); verify(handler).setBaseResource(captor.capture()); Resource actualResource = captor.getValue(); assertThat(actualResource).isInstanceOf(ResourceCollection.class); ResourceCollection actualResourceCollection = (ResourceCollection) actualResource; assertThat(actualResourceCollection.getResources()).contains(wooResource, fooResource); } @Test public void setsResourceBase() throws Exception { environment.setResourceBase("/woo"); verify(handler).setResourceBase("/woo"); } @Test public void setsBaseResourceStringList() throws Exception { String wooResource = tempDir.newFolder().getAbsolutePath(); String fooResource = tempDir.newFolder().getAbsolutePath(); final String[] testResources = new String[]{wooResource, fooResource}; environment.setBaseResource(testResources); ArgumentCaptor<Resource> captor = ArgumentCaptor.forClass(Resource.class); verify(handler).setBaseResource(captor.capture()); Resource actualResource = captor.getValue(); assertThat(actualResource).isInstanceOf(ResourceCollection.class); ResourceCollection actualResourceCollection = (ResourceCollection) actualResource; assertThat(actualResourceCollection.getResources()).contains(Resource.newResource(wooResource), Resource.newResource(fooResource)); } @Test public void setsInitParams() throws Exception { environment.setInitParameter("a", "b"); verify(handler).setInitParameter("a", "b"); } @Test public void setsSessionHandlers() throws Exception { final SessionHandler sessionHandler = mock(SessionHandler.class); environment.setSessionHandler(sessionHandler); verify(handler).setSessionHandler(sessionHandler); verify(handler).setSessionsEnabled(true); } @Test public void setsSecurityHandlers() throws Exception { final SecurityHandler securityHandler = mock(SecurityHandler.class); environment.setSecurityHandler(securityHandler); verify(handler).setSecurityHandler(securityHandler); verify(handler).setSecurityEnabled(true); } @Test public void addsMimeMapping() { final MimeTypes mimeTypes = mock(MimeTypes.class); when(handler.getMimeTypes()).thenReturn(mimeTypes); environment.addMimeMapping("example/foo", "foo"); verify(mimeTypes).addMimeMapping("example/foo", "foo"); } }