package org.jboss.resteasy.test.request; import org.jboss.resteasy.core.ResourceMethodInvoker; import org.jboss.resteasy.core.ResourceMethodRegistry; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.spi.HttpRequest; import org.jboss.resteasy.spi.Registry; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.test.request.resource.AcceptComplexResource; import org.jboss.resteasy.test.request.resource.AcceptConsumeResource; import org.jboss.resteasy.test.request.resource.AcceptMultipleResource; import org.jboss.resteasy.test.request.resource.AcceptResource; import org.jboss.resteasy.test.request.resource.AcceptXmlResource; import org.jboss.resteasy.test.request.resource.AcceptXmlResourceSecond; import org.junit.Assert; import org.junit.Test; import javax.ws.rs.core.MediaType; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; /** * @tpSubChapter Requests * @tpChapter Unit tests * @tpTestCaseDetails Test for accepting correct method. * @tpSince RESTEasy 3.0.16 */ public class AcceptTest { private static final String METHOD_ERROR_MESSAGE = "Unexpected method received"; private HttpRequest createRequest(String httpMethod, String path, MediaType contentType, List<MediaType> accepts) { MockHttpRequest request = null; try { request = MockHttpRequest.create(httpMethod, path).contentType(contentType); request.accept(accepts); } catch (URISyntaxException e) { throw new RuntimeException(e); } return request; } /** * @tpTestDetails Accepting GET method * @tpSince RESTEasy 3.0.16 */ @Test public void testAcceptGet() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptResource.class); MediaType contentType = new MediaType("text", "plain"); { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/foo")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptResource.class.getMethod("doGetFoo"), method.getMethod()); } { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/foo;q=0.1")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptResource.class.getMethod("doGetFoo"), method.getMethod()); } { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/foo")); accepts.add(MediaType.valueOf("application/bar;q=0.4")); accepts.add(MediaType.valueOf("application/baz;q=0.2")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptResource.class.getMethod("doGetFoo"), method.getMethod()); } { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/foo;q=0.4")); accepts.add(MediaType.valueOf("application/bar")); accepts.add(MediaType.valueOf("application/baz;q=0.2")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptResource.class.getMethod("doGetBar"), method.getMethod()); } { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/foo;q=0.4")); accepts.add(MediaType.valueOf("application/bar;q=0.2")); accepts.add(MediaType.valueOf("application/baz")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptResource.class.getMethod("doGetBaz"), method.getMethod()); } } /** * @tpTestDetails Accepting PUT method, schema attribute is added to media type * @tpSince RESTEasy 3.0.16 */ @Test public void testConsume() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptXmlResource.class); MediaType contentType = MediaType.valueOf("application/xml;schema=bar"); { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("PUT", "/xml", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptXmlResource.class.getMethod("putBar", String.class), method.getMethod()); } } /** * @tpTestDetails Accepting updated PUT method, schema and q attributes are added to media type * @tpSince RESTEasy 3.0.16 */ @Test public void testConsume2() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptXmlResourceSecond.class); MediaType contentType = MediaType.valueOf("application/xml;schema=bar"); { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/xml;schema=junk;q=1.0")); accepts.add(MediaType.valueOf("application/xml;schema=stuff;q=0.5")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("PUT", "/xml", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptXmlResourceSecond.class.getMethod("putBar", String.class), method.getMethod()); } } /** * @tpTestDetails Accepting PUT method, schema and q attributes are added to media type * @tpSince RESTEasy 3.0.16 */ @Test public void testConsume3() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptXmlResourceSecond.class); MediaType contentType = MediaType.valueOf("application/xml;schema=blah"); { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/xml;schema=junk;q=1.0")); accepts.add(MediaType.valueOf("application/xml;schema=stuff;q=0.5")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("PUT", "/xml", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptXmlResourceSecond.class.getMethod("put", String.class), method.getMethod()); } } /** * @tpTestDetails Accepting wild card * @tpSince RESTEasy 3.0.16 */ @Test public void testAcceptGetWildCard() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptResource.class); MediaType contentType = new MediaType("text", "plain"); { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/wildcard")); accepts.add(MediaType.valueOf("application/foo;q=0.6")); accepts.add(MediaType.valueOf("application/bar;q=0.4")); accepts.add(MediaType.valueOf("application/baz;q=0.2")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptResource.class.getMethod("doGetWildCard"), method.getMethod()); } } /** * @tpTestDetails Accepting multiple values * @tpSince RESTEasy 3.0.16 */ @Test public void testAcceptMultiple() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptMultipleResource.class); MediaType contentType = new MediaType("text", "plain"); MediaType foo = MediaType.valueOf("application/foo"); MediaType bar = MediaType.valueOf("application/bar"); { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(foo); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptMultipleResource.class.getMethod("get"), method.getMethod()); } { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(bar); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptMultipleResource.class.getMethod("get"), method.getMethod()); } { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("*/*")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptMultipleResource.class.getMethod("get"), method.getMethod()); } { ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.valueOf("application/*")); ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptMultipleResource.class.getMethod("get"), method.getMethod()); } } /** * @tpTestDetails Test content type matching * @tpSince RESTEasy 3.0.16 */ @Test public void testContentTypeMatching() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptConsumeResource.class); ArrayList<MediaType> accepts = new ArrayList<MediaType>(); { ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", MediaType.valueOf("text/plain"), accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptConsumeResource.class.getMethod("doGetWildCard"), method.getMethod()); } { ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", MediaType.valueOf("application/foo"), accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptConsumeResource.class.getMethod("doGetFoo"), method.getMethod()); } { ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", MediaType.valueOf("application/bar"), accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptConsumeResource.class.getMethod("doGetBar"), method.getMethod()); } { ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", MediaType.valueOf("application/baz"), accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptConsumeResource.class.getMethod("doGetBaz"), method.getMethod()); } } /** * @tpTestDetails Complex test * @tpSince RESTEasy 3.0.16 */ @Test public void testComplex() throws Exception { Registry registry = new ResourceMethodRegistry(ResteasyProviderFactory.getInstance()); registry.addPerRequestResource(AcceptComplexResource.class); MediaType contentType = MediaType.TEXT_XML_TYPE; ArrayList<MediaType> accepts = new ArrayList<MediaType>(); accepts.add(MediaType.WILDCARD_TYPE); accepts.add(MediaType.TEXT_HTML_TYPE); { ResourceMethodInvoker method = (ResourceMethodInvoker) registry.getResourceInvoker(createRequest("GET", "/", contentType, accepts)); Assert.assertNotNull(METHOD_ERROR_MESSAGE, method); Assert.assertEquals(METHOD_ERROR_MESSAGE, AcceptComplexResource.class.getMethod("method2"), method.getMethod()); } } }