package org.everrest.core.impl;
import org.everrest.core.Filter;
import org.everrest.core.GenericContainerRequest;
import org.everrest.core.GenericContainerResponse;
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.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 org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class RestComponentResolverTest {
private ResourceBinder resources;
private ProviderBinder providers;
private RestComponentResolver componentResolver;
@Before
public void setUp() throws Exception {
resources = mock(ResourceBinder.class);
providers = mock(ProviderBinder.class);
componentResolver = new RestComponentResolver(resources, providers);
}
@Test
public void resolvesPerRequestResource() {
componentResolver.addPerRequest(Resource.class);
verify(resources).addResource(Resource.class, null);
}
@Test
public void resolvesSingletonResource() {
Resource resource = new Resource();
componentResolver.addSingleton(resource);
verify(resources).addResource(resource, null);
}
@Path("a")
public static class Resource {
}
@Test
public void resolvesPerRequestExceptionMapper() {
componentResolver.addPerRequest(RuntimeExceptionMapper.class);
verify(providers).addExceptionMapper(RuntimeExceptionMapper.class);
}
@Test
public void resolvesSingletonExceptionMapper() {
ExceptionMapper exceptionMapper = new RuntimeExceptionMapper();
componentResolver.addSingleton(exceptionMapper);
verify(providers).addExceptionMapper(exceptionMapper);
}
@Provider
public static class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {
@Override
public Response toResponse(RuntimeException exception) {
return null;
}
}
@Test
public void resolvesPerRequestContextResolver() {
componentResolver.addPerRequest(ContextResolverText.class);
verify(providers).addContextResolver(ContextResolverText.class);
}
@Test
public void resolvesSingletonContextResolver() {
ContextResolver contextResolver = new ContextResolverText();
componentResolver.addSingleton(contextResolver);
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 resolvesPerRequestMessageBodyReader() {
componentResolver.addPerRequest(StringEntityProvider.class);
verify(providers).addMessageBodyReader(StringEntityProvider.class);
}
@Test
public void resolvesSingletonMessageBodyReader() {
MessageBodyReader<String> messageBodyReader = new StringEntityProvider();
componentResolver.addSingleton(messageBodyReader);
verify(providers).addMessageBodyReader(messageBodyReader);
}
@Test
public void resolvesPerRequestMessageBodyWriter() {
componentResolver.addPerRequest(StringEntityProvider.class);
verify(providers).addMessageBodyWriter(StringEntityProvider.class);
}
@Test
public void resolvesSingletonMessageBodyWriter() {
MessageBodyWriter<String> messageBodyWriter = new StringEntityProvider();
componentResolver.addSingleton(messageBodyWriter);
verify(providers).addMessageBodyWriter(messageBodyWriter);
}
@Test
public void resolvesPerRequestMethodInvokerFilter() {
componentResolver.addPerRequest(AllMatchesMethodInvokerFilter.class);
verify(providers).addMethodInvokerFilter(AllMatchesMethodInvokerFilter.class);
}
@Test
public void resolvesSingletonMethodInvokerFilter() {
MethodInvokerFilter methodInvokerFilter = new AllMatchesMethodInvokerFilter();
componentResolver.addSingleton(methodInvokerFilter);
verify(providers).addMethodInvokerFilter(methodInvokerFilter);
}
@Filter
public static class AllMatchesMethodInvokerFilter implements MethodInvokerFilter {
@Override
public void accept(GenericResourceMethod genericResourceMethod, Object[] params) {
}
}
@Test
public void resolvesPerRequestRequestFilter() {
componentResolver.addPerRequest(AllMatchesRequestFilter.class);
verify(providers).addRequestFilter(AllMatchesRequestFilter.class);
}
@Test
public void resolvesSingletonRequestFilter() {
RequestFilter requestFilter = new AllMatchesRequestFilter();
componentResolver.addSingleton(requestFilter);
verify(providers).addRequestFilter(requestFilter);
}
@Filter
public static class AllMatchesRequestFilter implements RequestFilter {
@Override
public void doFilter(GenericContainerRequest request) {
}
}
@Test
public void resolvesPerResponseResponseFilter() {
componentResolver.addPerRequest(AllMatchesResponseFilter.class);
verify(providers).addResponseFilter(AllMatchesResponseFilter.class);
}
@Test
public void resolvesSingletonResponseFilter() {
ResponseFilter responseFilter = new AllMatchesResponseFilter();
componentResolver.addSingleton(responseFilter);
verify(providers).addResponseFilter(responseFilter);
}
@Filter
public static class AllMatchesResponseFilter implements ResponseFilter {
@Override
public void doFilter(GenericContainerResponse response) {
}
}
}