package org.jboss.seam.example.restbay.test;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
import org.jboss.seam.mock.JUnitSeamTest;
import org.jboss.seam.mock.ResourceRequestEnvironment;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
import javax.servlet.http.Cookie;
import javax.ws.rs.core.MediaType;
import java.util.Map;
import java.util.HashMap;
/**
* <p>
* This is the test matrix for resources:
* </p>
*
* <pre>
* | EVENT | CONVERSATION | SESSION | APPLICATION | STATELESS
* ---------------------------------------------------------------------------------------------
* Plain JAX-RS Resource | OK | - | - | - | -
* ---------------------------------------------------------------------------------------------
* POJO Seam Component Resource | OK | ? | ? | OK | OK
* ---------------------------------------------------------------------------------------------
* POJO interface-annotated Component | OK | ? | ? | OK | OK
* ---------------------------------------------------------------------------------------------
* EJB Plain SLSB Resource | - | - | - | - | OK
* ---------------------------------------------------------------------------------------------
* EJB SLSB Seam Component Resource | - | - | - | - | OK
* ---------------------------------------------------------------------------------------------
* EJB SFSB Seam Component Resource | ? | ? | ? | ? | -
* ---------------------------------------------------------------------------------------------
* </pre>
*
* <p>
* Note that all EJB resources are always @Path annotated on their interface, not the implementation class.
* </p>
*
* <p>
* This is the test matrix for providers:
* </p>
*
* <pre>
* | EVENT | CONVERSATION | SESSION | APPLICATION | STATELESS
* ---------------------------------------------------------------------------------------------
* Plain JAX-RS Provider | - | - | - | - | OK
* ---------------------------------------------------------------------------------------------
* RESTEasy StringConverter Provider | - | - | - | - | OK
* ---------------------------------------------------------------------------------------------
* RESTEasy StringConverter Component | ? | - | - | ? | ?
* ---------------------------------------------------------------------------------------------
* POJO Seam Component Provider | ? | - | - | OK | ?
* ---------------------------------------------------------------------------------------------
* POJO interface-annotated Component | ? | - | - | OK | ?
* ---------------------------------------------------------------------------------------------
* EJB Plain SLSB Provider | - | - | - | - | ?
* ---------------------------------------------------------------------------------------------
* EJB SLSB Seam Component Provider | - | - | - | - | ?
* ---------------------------------------------------------------------------------------------
* EJB SFSB Seam Component Resource | ? | - | - | ? | -
* ---------------------------------------------------------------------------------------------
* </pre>
*
*/
@RunWith(Arquillian.class)
public class BasicServiceTest extends JUnitSeamTest
{
@Deployment(name="BasicServiceTest")
@OverProtocol("Servlet 3.0")
public static Archive<?> createDeployment()
{
EnterpriseArchive er = Deployments.restbayDeployment();
WebArchive web = er.getAsType(WebArchive.class, "restbay-web.war");
web.addClasses(BasicServiceTest.class);
return er;
}
ResourceRequestEnvironment requestEnv;
@Before
public void prepareEnv() throws Exception
{
requestEnv = new ResourceRequestEnvironment(this)
{
@Override
public Map<String, Object> getDefaultHeaders()
{
return new HashMap<String, Object>()
{{
put("Accept", "text/plain");
}};
}
@Override
public String getServletPath()
{
return "/override/seam/resource/is/not/my/path/for/SeamResourceServlet";
}
};
}
public String[] getQueryPaths()
{
return new String[] {
"/restv1/plainTest",
"/restv1/eventComponentTest",
"/restv1/applicationComponentTest",
"/restv1/statelessComponentTest",
"/restv1/interfaceEventComponentTest",
"/restv1/interfaceApplicationComponentTest",
"/restv1/interfaceStatelessComponentTest",
"/restv1/statelessEjbTest",
"/restv1/statelessEjbComponentTest"
};
}
@Test
public void testRootResource() throws Exception {
new ResourceRequest(requestEnv, Method.GET, "/restv1/")
{
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assertEquals(200, response.getStatus());
assertEquals("Root", response.getContentAsString());
}
}.run();
}
@Test
public void testExeptionMapping() throws Exception
{
for (String resourcePath : getQueryPaths())
{
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/trigger/unsupported")
{
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 501;
assert response.getStatusMessage().equals("The request operation is not supported: foo");
}
}.run();
}
}
@Test
public void testEchos() throws Exception
{
for (String resourcePath : getQueryPaths())
{
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echouri")
{
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().endsWith("/echouri");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echoquery")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.setQueryString("asdf=123");
request.addQueryParameter("bar", "bbb");
request.addQueryParameter("baz", "bzzz");
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("bbb");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echoheader")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.addHeader("bar", "baz");
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("baz");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echocookie")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.addCookie(new Cookie("bar", "baz"));
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("baz");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/foo/bar/asdf")
{
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("bar: asdf");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echotwoparams/foo/bar")
{
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("foobar");
}
}.run();
}
}
@Test
public void testEncoding() throws Exception
{
for (String resourcePath : getQueryPaths())
{
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echoencoded/foo bar")
{
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("foo%20bar");
}
}.run();
}
}
@Test
public void testFormHandling() throws Exception
{
for (String resourcePath : getQueryPaths())
{
new ResourceRequest(requestEnv, Method.POST, resourcePath + "/echoformparams")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
request.addParameter("foo", new String[]
{"bar", "baz"});
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("barbaz");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.POST, resourcePath + "/echoformparams2")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
request.addParameter("foo", new String[]
{"bar", "baz"});
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("barbaz");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.POST, resourcePath + "/echoformparams3")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
request.addHeader("bar", "foo");
request.addParameter("foo", new String[]
{"bar", "baz"});
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("foobarbaz");
}
}.run();
reset();
}
}
@Test()
public void testStringConverter() throws Exception
{
final String ISO_DATE = "2007-07-10T14:54:56-0500";
final String ISO_DATE_MILLIS = "1184097296000";
for (String resourcePath : getQueryPaths())
{
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/convertDate/" + ISO_DATE)
{
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assertEquals(ISO_DATE_MILLIS, response.getContentAsString());
}
}.run();
}
}
@Test
public void testProvider() throws Exception
{
for (String resourcePath : getQueryPaths())
{
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/commaSeparated")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.addHeader("Accept", "text/csv");
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("foo,bar\r\nasdf,123\r\n");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/commaSeparatedStrings")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.addHeader("Accept", "text/plain");
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("abc,foo,bar,baz");
}
}.run();
reset();
new ResourceRequest(requestEnv, Method.GET, resourcePath + "/commaSeparatedIntegers")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
request.addHeader("Accept", "text/plain");
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assert response.getStatus() == 200;
assert response.getContentAsString().equals("abc,1,2,3");
}
};
// }.run();
// TODO: Retracted support for Seam component providers, injection shouldn't happen, see https://jira.jboss.org/jira/browse/JBSEAM-4247
}
}
@Test
// JBPAPP-3713
public void synchronizationsLookup() throws Exception
{
new ResourceRequest(requestEnv, Method.GET, "/restv1/eventComponentTest/synchronizationsLookup")
{
@Override
protected void prepareRequest(EnhancedMockHttpServletRequest request)
{
super.prepareRequest(request);
}
@Override
protected void onResponse(EnhancedMockHttpServletResponse response)
{
assertEquals("Unexpected response code.", 200, response.getStatus(), 200);
assert response.getContentAsString().equals("true");
}
}.run();
}
}