package org.jboss.resteasy.test.resource; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.ws.rs.core.Configurable; import javax.ws.rs.core.HttpHeaders; import org.jboss.resteasy.core.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.spi.metadata.ResourceBuilder; import org.jboss.resteasy.spi.metadata.ResourceClass; import org.jboss.resteasy.test.resource.resource.ProgrammaticResource; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * @tpSubChapter Resource tests * @tpChapter Unit tests * @tpTestCaseDetails Tests programmatic creation of resources. * @tpSince RESTEasy 3.0.20 */ public class ProgammaticTest { private static Dispatcher dispatcher; @BeforeClass public static void BeforeClass() { dispatcher = MockDispatcherFactory.createDispatcher(); } @Before public void before() { ResteasyProviderFactory.getContextDataMap().put(Configurable.class, dispatcher.getProviderFactory()); } /** * @tpTestDetails Programmatically create resource class * @tpSince RESTEasy 3.0.20 */ @Test public void testPerRequest() throws Exception { Method get = ProgrammaticResource.class.getMethod("get", String.class); Method put = ProgrammaticResource.class.getMethod("put", String.class); Method setter = ProgrammaticResource.class.getMethod("setHeaders", HttpHeaders.class); Field uriInfo = ProgrammaticResource.class.getDeclaredField("uriInfo"); Field configurable = ProgrammaticResource.class.getDeclaredField("configurable"); Constructor<?> constructor = ProgrammaticResource.class.getConstructor(Configurable.class); ResourceClass resourceclass = ResourceBuilder.rootResource(ProgrammaticResource.class) .constructor(constructor).param(0).context().buildConstructor() .method(get).get().path("test").produces("text/plain").param(0).queryParam("a").buildMethod() .method(put).put().path("test").consumes("text/plain").param(0).messageBody().buildMethod() .field(uriInfo).context().buildField() .field(configurable).context().buildField() .setter(setter).context().buildSetter() .buildClass(); dispatcher.getRegistry().addPerRequestResource(resourceclass); MockHttpRequest request = MockHttpRequest.get("/test?a=hello"); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); Assert.assertEquals(response.getContentAsString(), "hello"); request = MockHttpRequest.put("/test").content("hello".getBytes()).contentType("text/plain"); response = new MockHttpResponse(); dispatcher.invoke(request, response); Assert.assertEquals(204, response.getStatus()); dispatcher.getRegistry().removeRegistrations(resourceclass); } /** * @tpTestDetails Programmatically create singleton * @tpSince RESTEasy 3.0.20 */ @Test public void testSingleton() throws Exception { Method get = ProgrammaticResource.class.getMethod("get", String.class); Method setter = ProgrammaticResource.class.getMethod("setHeaders", HttpHeaders.class); Field uriInfo = ProgrammaticResource.class.getDeclaredField("uriInfo"); Field configurable = ProgrammaticResource.class.getDeclaredField("configurable"); ResourceClass resourceclass = ResourceBuilder.rootResource(ProgrammaticResource.class) .method(get).get().path("test").produces("text/plain").param(0).queryParam("a").buildMethod() .field(uriInfo).context().buildField() .field(configurable).context().buildField() .setter(setter).context().buildSetter() .buildClass(); ProgrammaticResource resource = new ProgrammaticResource(); dispatcher.getRegistry().addSingletonResource(resource, resourceclass); MockHttpRequest request = MockHttpRequest.get("/test?a=hello"); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); Assert.assertEquals("hello", response.getContentAsString()); Assert.assertEquals(1, resource.counter); dispatcher.getRegistry().removeRegistrations(resourceclass); } }