package org.jboss.resteasy.test.resource;
import org.jboss.resteasy.core.ResourceInvoker;
import org.jboss.resteasy.core.ResourceLocatorInvoker;
import org.jboss.resteasy.core.ResourceMethodInvoker;
import org.jboss.resteasy.core.ResourceMethodRegistry;
import org.jboss.resteasy.mock.MockHttpRequest;
import org.jboss.resteasy.spi.DefaultOptionsMethodException;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.test.resource.resource.SegmentLocatorComplex;
import org.jboss.resteasy.test.resource.resource.SegmentNullResource;
import org.jboss.resteasy.test.resource.resource.SegmentResource;
import org.jboss.resteasy.test.resource.resource.SegmentResourceSwitch;
import org.junit.Assert;
import org.junit.Test;
import javax.ws.rs.NotAllowedException;
import java.net.URISyntaxException;
/**
* @tpSubChapter Resource tests
* @tpChapter Unit tests
* @tpTestCaseDetails Tests to make sure that standard segment mapping work correctly, especially
* regexes that contain "\"
* @tpSince RESTEasy 3.0.16
*/
public class SegmentTest {
/**
* @tpTestDetails Basic segment check
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testBasic() throws URISyntaxException {
ResourceMethodRegistry registry = new ResourceMethodRegistry(ResteasyProviderFactory
.getInstance());
registry.addSingletonResource(new SegmentNullResource());
assertMatchRoot(registry, "/", "doNothing", SegmentNullResource.class);
assertMatchRoot(registry, "/child", "childDoNothing", SegmentNullResource.class);
assertMatchRoot(registry, "/child/foo", "childWithName", SegmentNullResource.class);
assertMatchRoot(registry, "/child/1", "childWithId", SegmentNullResource.class);
assertMatchRoot(registry, "/child1/1", "child1WithId", SegmentNullResource.class);
}
/**
* @tpTestDetails Check default option for segment
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testDefaultOptions() throws URISyntaxException {
ResourceMethodRegistry registry = new ResourceMethodRegistry(ResteasyProviderFactory
.getInstance());
registry.addPerRequestResource(SegmentResource.class);
try {
ResourceInvoker invoker = registry.getResourceInvoker(MockHttpRequest.options("/resource/sub"));
} catch (DefaultOptionsMethodException e) {
}
try {
ResourceInvoker invoker = registry.getResourceInvoker(MockHttpRequest.put("/resource/sub"));
} catch (NotAllowedException e) {
}
}
/**
* @tpTestDetails Check locator option
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testLocatorOptions() throws URISyntaxException {
ResourceMethodRegistry registry = new ResourceMethodRegistry(ResteasyProviderFactory
.getInstance());
registry.addPerRequestResource(SegmentResourceSwitch.class);
ResourceLocatorInvoker invoker = (ResourceLocatorInvoker) registry.getResourceInvoker(MockHttpRequest.options("/resource/sub"));
Assert.assertNotNull("Wrong ResourceLocatorInvoker response", invoker);
Assert.assertEquals("Wrong ResourceLocatorInvoker response", invoker.getMethod().getName(), "locator");
}
/**
* @tpTestDetails Check complex locator
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testLocator3() throws URISyntaxException {
ResourceMethodRegistry registry = new ResourceMethodRegistry(ResteasyProviderFactory
.getInstance());
registry.addPerRequestResource(SegmentLocatorComplex.class);
ResourceLocatorInvoker invoker = (ResourceLocatorInvoker) registry.getResourceInvoker(MockHttpRequest.get("/locator/responseok/responseok"));
Assert.assertNotNull("Wrong ResourceLocatorInvoker response", invoker);
Assert.assertEquals("Wrong ResourceLocatorInvoker response", invoker.getMethod().getName(), "responseOk");
}
private void assertMatchRoot(ResourceMethodRegistry registry, final String url, final String methodName,
final Class<?> clazz) throws URISyntaxException {
ResourceMethodInvoker matchRoot = getResourceMethod(url, registry);
Assert.assertEquals("Wrong ResourceLocatorInvoker response", clazz, matchRoot.getResourceClass());
Assert.assertEquals("Wrong ResourceLocatorInvoker response", methodName, matchRoot.getMethod().getName());
}
private ResourceMethodInvoker getResourceMethod(String url, ResourceMethodRegistry registry)
throws URISyntaxException {
return (ResourceMethodInvoker) registry.getResourceInvoker(MockHttpRequest.get(url));
}
}