package org.jboss.resteasy.test.resource.path; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingAnotherResourceLocator; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingAnotherSubResource; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingErrorResource; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingMainSubResource; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingMediaWriter; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingNoMediaResource; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingStringBean; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingStringBeanEntityProvider; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingWeightResource; import org.jboss.resteasy.test.resource.path.resource.ResourceMatchingYetAnotherSubresource; import org.jboss.resteasy.util.HttpResponseCodes; import org.jboss.resteasy.utils.PortProviderUtil; import org.jboss.resteasy.utils.TestUtil; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.Assert; import org.junit.runner.RunWith; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; /** * @tpSubChapter Resteasy-client * @tpChapter Integration tests * @tpSince RESTEasy 3.0.16 */ @RunWith(Arquillian.class) @RunAsClient public class ResourceMatchingTest { public static final String readFromStream(InputStream stream) throws IOException { InputStreamReader isr = new InputStreamReader(stream); return readFromReader(isr); } public static final String readFromReader(Reader reader) throws IOException { BufferedReader br = new BufferedReader(reader); String entity = br.readLine(); br.close(); return entity; } static Client client; @BeforeClass public static void setup() { client = ClientBuilder.newClient(); } @Deployment public static Archive<?> deploy() { WebArchive war = TestUtil.prepareArchive(ResourceMatchingTest.class.getSimpleName()); war.addClasses(ResourceMatchingStringBean.class, ResourceMatchingAnotherResourceLocator.class); return TestUtil.finishContainerPrepare(war, null, ResourceMatchingYetAnotherSubresource.class, ResourceMatchingMainSubResource.class, ResourceMatchingAnotherSubResource.class, ResourceMatchingWeightResource.class, ResourceMatchingErrorResource.class, ResourceMatchingNoMediaResource.class, ResourceMatchingStringBeanEntityProvider.class, ResourceMatchingMediaWriter.class); } private String generateURL(String path) { return PortProviderUtil.generateURL(path, ResourceMatchingTest.class.getSimpleName()); } @AfterClass public static void close() { client.close(); } /** * @tpTestDetails Client sends GET request, the returned response Mediatype is APPLICATION_SVG_XML_TYPE as set up * by the custom MessageBodyWriter. * @tpPassCrit The correct mediatype and response code 200 (Success) is returned * @tpSince RESTEasy 3.0.16 */ @Test public void testMediaTypeFromProvider() { Response response = client.target(generateURL("/nomedia/list")).request().get(); Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus()); Assert.assertEquals(MediaType.APPLICATION_SVG_XML_TYPE, response.getMediaType()); response.close(); } /** * @tpTestDetails Client sends GET request, the returned response Mediatype is APPLICATION_OCTET_STREAM_TYPE as * set up by the custom MessageBodyWriter. * @tpPassCrit The correct mediatype and response code 200 (Success) is returned * @tpSince RESTEasy 3.0.16 */ @Test public void testNoProduces() { Response response = client.target(generateURL("/nomedia/nothing")).request().get(); Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus()); Assert.assertEquals(MediaType.APPLICATION_OCTET_STREAM_TYPE, response.getMediaType()); response.close(); } /** * @tpTestDetails Client sends GET request with request header of media type "text/*". The matching resource path * doesn't accept this mediatype. According to HTTP 1.1 specification: * "HTTP/1.1 servers are allowed to return responses which are not acceptable according to the accept headers * sent in the request." * @tpPassCrit The response code 406 (Not Acceptable) is returned * @tpSince RESTEasy 3.0.16 */ @Test public void testNonConcreteMatch() { Response response = client.target(generateURL("/error")).request("text/*").get(); Assert.assertEquals(HttpResponseCodes.SC_NOT_ACCEPTABLE, response.getStatus()); response.close(); } /** * @tpTestDetails Client sends GET request, with header accept type "testi/*", the more specific resource is chosen * @tpPassCrit The response code 200 (Success) is returned and the correct resource is chosen * @tpSince RESTEasy 3.0.16 */ @Test public void testWildcard() { Response response = client.target(generateURL("/yas")).request("testi/*").get(); Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus()); Assert.assertEquals("test/text", response.readEntity(String.class)); response.close(); } /** * @tpTestDetails Client sends GET request, with header accept type "testiii/textiii" and "application/xml", * "application/xml" media type has in the resource higher probability to be chosen (indicates that by higher "qs" * than other resources) * @tpPassCrit The returned resource is the resource with media type "application/xml" * @tpSince RESTEasy 3.0.16 */ @Test public void testQS() { Response response = client.target(generateURL("/yas")).request("testiii/textiii", "application/xml").get(); Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus()); Assert.assertEquals("application/xml", response.readEntity(String.class)); response.close(); } /** * @tpTestDetails Client sends empty POST request, with specified header Content-Type "text/plain", * @tpPassCrit The correct subresource is chosen * @tpSince RESTEasy 3.0.16 */ @Test public void testOverride() { Response response = client.target(generateURL("/resource/subresource/sub")).request() .header("Content-Type", "text/plain").post(null); Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus()); Assert.assertEquals("The incorrect subresource was chosen", ResourceMatchingAnotherSubResource.class.getSimpleName(), response.readEntity(String.class)); response.close(); } /** * @tpTestDetails Client sends OPTIONS request, which allows it to determine which HTTP methods it can issue without * initiating resource retrieval. * @tpPassCrit The response code 200 (Success) is returned and response contains GET option. * @tpSince RESTEasy 3.0.16 */ @Test public void testOptions() { Response response = client.target(generateURL("/resource/subresource/something")).request().options(); Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus()); String actual = response.readEntity(String.class); Assert.assertTrue("GET is not in the list of available methods for the specified resource", actual.contains("GET")); response.close(); } /** * @tpTestDetails Client sends empty POST request with mediatype q parameter specified. It gives higher weight (q=0.9) * to a mediatype "application/*" then to mediatype "application/xml" (q=0.1). * @tpPassCrit The more specific mediatype will be chosen by the server ("application/xml") * @tpSince RESTEasy 3.0.16 */ @Test public void testAvoidWildcard() { Response response = client.target(generateURL("/weight")).request("application/*;q=0.9", "application/xml;q=0.1") .post(null); Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus()); MediaType mediaType = response.getMediaType(); String actual = response.readEntity(String.class); Assert.assertEquals("application/xml", actual); Assert.assertEquals("MediaType of the response doesn't match the expected type", "application/xml;charset=UTF-8", mediaType.toString()); response.close(); } }