/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.everrest.core.impl;
import com.google.common.collect.ImmutableMap;
import org.everrest.core.Filter;
import org.everrest.core.GenericContainerRequest;
import org.everrest.core.GenericContainerResponse;
import org.everrest.core.ObjectFactory;
import org.everrest.core.RequestFilter;
import org.everrest.core.ResourceBinder;
import org.everrest.core.ResponseFilter;
import org.everrest.core.impl.provider.StringEntityProvider;
import org.everrest.core.method.MethodInvokerFilter;
import org.everrest.core.resource.GenericResourceMethod;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import static com.google.common.collect.Sets.newHashSet;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ApplicationPublisherTest {
private ResourceBinder resources;
private ProviderBinder providers;
private ApplicationPublisher publisher;
@Before
public void setUp() throws Exception {
resources = mock(ResourceBinder.class);
providers = mock(ProviderBinder.class);
publisher = new ApplicationPublisher(resources, providers);
}
@Test
public void publishesPerRequestResource() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(Resource.class));
publisher.publish(application);
verify(resources).addResource(Resource.class, null);
}
@Test
public void publishesSingletonResource() {
Resource resource = new Resource();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(resource));
publisher.publish(application);
verify(resources).addResource(resource, null);
}
@Path("a")
public static class Resource {
}
@Test
public void publishesPerRequestExceptionMapper() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(RuntimeExceptionMapper.class));
publisher.publish(application);
verify(providers).addExceptionMapper(RuntimeExceptionMapper.class);
}
@Test
public void publishesSingletonExceptionMapper() {
ExceptionMapper exceptionMapper = new RuntimeExceptionMapper();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(exceptionMapper));
publisher.publish(application);
verify(providers).addExceptionMapper(exceptionMapper);
}
@Provider
public static class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {
@Override
public Response toResponse(RuntimeException exception) {
return null;
}
}
@Test
public void publishesPerRequestContextResolver() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(ContextResolverText.class));
publisher.publish(application);
verify(providers).addContextResolver(ContextResolverText.class);
}
@Test
public void publishesSingletonContextResolver() {
ContextResolver contextResolver = new ContextResolverText();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(contextResolver));
publisher.publish(application);
verify(providers).addContextResolver(contextResolver);
}
@Provider
@Produces("text/plain")
public static class ContextResolverText implements ContextResolver<String> {
public String getContext(Class<?> type) {
return null;
}
}
@Test
public void publishesPerRequestMessageBodyReader() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(StringEntityProvider.class));
publisher.publish(application);
verify(providers).addMessageBodyReader(StringEntityProvider.class);
}
@Test
public void publishesSingletonMessageBodyReader() {
MessageBodyReader<String> messageBodyReader = new StringEntityProvider();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(messageBodyReader));
publisher.publish(application);
verify(providers).addMessageBodyReader(messageBodyReader);
}
@Test
public void publishesPerRequestMessageBodyWriter() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(StringEntityProvider.class));
publisher.publish(application);
verify(providers).addMessageBodyWriter(StringEntityProvider.class);
}
@Test
public void publishesSingletonMessageBodyWriter() {
MessageBodyWriter<String> messageBodyWriter = new StringEntityProvider();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(messageBodyWriter));
publisher.publish(application);
verify(providers).addMessageBodyWriter(messageBodyWriter);
}
@Test
public void publishesPerRequestMethodInvokerFilter() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(AllMatchesMethodInvokerFilter.class));
publisher.publish(application);
verify(providers).addMethodInvokerFilter(AllMatchesMethodInvokerFilter.class);
}
@Test
public void publishesSingletonMethodInvokerFilter() {
MethodInvokerFilter methodInvokerFilter = new AllMatchesMethodInvokerFilter();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(methodInvokerFilter));
publisher.publish(application);
verify(providers).addMethodInvokerFilter(methodInvokerFilter);
}
@Filter
public static class AllMatchesMethodInvokerFilter implements MethodInvokerFilter {
@Override
public void accept(GenericResourceMethod genericResourceMethod, Object[] params) {
}
}
@Test
public void publishesPerRequestRequestFilter() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(AllMatchesRequestFilter.class));
publisher.publish(application);
verify(providers).addRequestFilter(AllMatchesRequestFilter.class);
}
@Test
public void publishesSingletonRequestFilter() {
RequestFilter requestFilter = new AllMatchesRequestFilter();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(requestFilter));
publisher.publish(application);
verify(providers).addRequestFilter(requestFilter);
}
@Filter
public static class AllMatchesRequestFilter implements RequestFilter {
@Override
public void doFilter(GenericContainerRequest request) {
}
}
@Test
public void publishesPerResponseResponseFilter() {
Application application = mock(Application.class);
when(application.getClasses()).thenReturn(newHashSet(AllMatchesResponseFilter.class));
publisher.publish(application);
verify(providers).addResponseFilter(AllMatchesResponseFilter.class);
}
@Test
public void publishesSingletonResponseFilter() {
ResponseFilter responseFilter = new AllMatchesResponseFilter();
Application application = mock(Application.class);
when(application.getSingletons()).thenReturn(newHashSet(responseFilter));
publisher.publish(application);
verify(providers).addResponseFilter(responseFilter);
}
@Filter
public static class AllMatchesResponseFilter implements ResponseFilter {
@Override
public void doFilter(GenericContainerResponse response) {
}
}
@Test
public void publishesPerRequestResourceWithNewPathThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
when(application.getClasses()).thenReturn(newHashSet(Resource.class));
when(application.getResourceClasses()).thenReturn(ImmutableMap.of("/x", Resource.class));
publisher.publish(application);
verify(resources, never()).addResource(Resource.class, null);
verify(resources).addResource("/x", Resource.class, null);
}
@Test
public void publishesSingletonResourceWithSpecifiedPathThroughEverrestApplication() {
Resource resource = new Resource();
EverrestApplication application = mock(EverrestApplication.class);
when(application.getSingletons()).thenReturn(newHashSet(resource));
when(application.getResourceSingletons()).thenReturn(ImmutableMap.of("/x", resource));
publisher.publish(application);
verify(resources).addResource(resource, null);
verify(resources).addResource("/x", resource, null);
}
@Test
public void publishesResourceWithFactoryAndOverridesPerRequestResourceThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory resourceFactory = mockObjectFactory(Resource.class);
when(application.getClasses()).thenReturn(newHashSet(Resource.class));
when(application.getFactories()).thenReturn(newHashSet(resourceFactory));
publisher.publish(application);
verify(resources, never()).addResource(Resource.class, null);
verify(resources).addResource(resourceFactory);
}
@Test
public void publishesExceptionMapperWithFactoryAndOverridesPerRequestExceptionMapperThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory exceptionMapperFactory = mockObjectFactory(RuntimeExceptionMapper.class);
when(application.getClasses()).thenReturn(newHashSet(RuntimeExceptionMapper.class));
when(application.getFactories()).thenReturn(newHashSet(exceptionMapperFactory));
publisher.publish(application);
verify(providers, never()).addExceptionMapper(RuntimeExceptionMapper.class);
verify(providers).addExceptionMapper(exceptionMapperFactory);
}
@Test
public void publishesContextResolverWithFactoryAndOverridesPerRequestContextResolverThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory contextResolverFactory = mockObjectFactory(ContextResolverText.class);
when(application.getClasses()).thenReturn(newHashSet(ContextResolverText.class));
when(application.getFactories()).thenReturn(newHashSet(contextResolverFactory));
publisher.publish(application);
verify(providers, never()).addContextResolver(ContextResolverText.class);
verify(providers).addContextResolver(contextResolverFactory);
}
@Test
public void publishesMessageBodyReaderWithFactoryAndOverridesPerRequestMessageBodyReaderThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory messageBodyReaderFactory = mockObjectFactory(StringEntityProvider.class);
when(application.getClasses()).thenReturn(newHashSet(StringEntityProvider.class));
when(application.getFactories()).thenReturn(newHashSet(messageBodyReaderFactory));
publisher.publish(application);
verify(providers, never()).addMessageBodyReader(StringEntityProvider.class);
verify(providers).addMessageBodyReader(messageBodyReaderFactory);
}
@Test
public void publishesMessageBodyWriterWithFactoryAndOverridesPerRequestMessageBodyWriterThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory messageBodyWriterFactory = mockObjectFactory(StringEntityProvider.class);
when(application.getClasses()).thenReturn(newHashSet(StringEntityProvider.class));
when(application.getFactories()).thenReturn(newHashSet(messageBodyWriterFactory));
publisher.publish(application);
verify(providers, never()).addMessageBodyWriter(StringEntityProvider.class);
verify(providers).addMessageBodyWriter(messageBodyWriterFactory);
}
@Test
public void publishesMethodInvokerFilterWithFactoryAndOverridesPerRequestMethodInvokerFilterThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory methodInvokerFilterFactory = mockObjectFactory(AllMatchesMethodInvokerFilter.class);
when(application.getClasses()).thenReturn(newHashSet(AllMatchesMethodInvokerFilter.class));
when(application.getFactories()).thenReturn(newHashSet(methodInvokerFilterFactory));
publisher.publish(application);
verify(providers, never()).addMethodInvokerFilter(AllMatchesMethodInvokerFilter.class);
verify(providers).addMethodInvokerFilter(methodInvokerFilterFactory);
}
@Test
public void publishesRequestFilterWithFactoryAndOverridesPerRequestRequestFilterThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory requestFilterFactory = mockObjectFactory(AllMatchesRequestFilter.class);
when(application.getClasses()).thenReturn(newHashSet(AllMatchesRequestFilter.class));
when(application.getFactories()).thenReturn(newHashSet(requestFilterFactory));
publisher.publish(application);
verify(providers, never()).addRequestFilter(AllMatchesRequestFilter.class);
verify(providers).addRequestFilter(requestFilterFactory);
}
@Test
public void publishesResponseFilterWithFactoryAndOverridesPerRequestResponseFilterThroughEverrestApplication() {
EverrestApplication application = mock(EverrestApplication.class);
ObjectFactory responseFilterFactory = mockObjectFactory(AllMatchesResponseFilter.class);
when(application.getClasses()).thenReturn(newHashSet(AllMatchesResponseFilter.class));
when(application.getFactories()).thenReturn(newHashSet(responseFilterFactory));
publisher.publish(application);
verify(providers, never()).addResponseFilter(AllMatchesResponseFilter.class);
verify(providers).addResponseFilter(responseFilterFactory);
}
private ObjectFactory mockObjectFactory(Class objectClass) {
ObjectFactory objectFactory = mock(ObjectFactory.class, RETURNS_DEEP_STUBS);
when(objectFactory.getObjectModel().getObjectClass()).thenReturn(objectClass);
return objectFactory;
}
}