package er.rest.routes;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import com.webobjects.appserver.WOActionResults;
import com.webobjects.appserver.WORequest;
import com.webobjects.foundation.NSArray;
import er.rest.routes.jsr311.DELETE;
import er.rest.routes.jsr311.GET;
import er.rest.routes.jsr311.POST;
import er.rest.routes.jsr311.PUT;
import er.rest.routes.jsr311.Path;
import er.rest.routes.jsr311.Paths;
public class ERXRouteRequestHandlerTest {
@Test
public void testRouteForMethodAndPattern() {
ERXRouteRequestHandler handler = new ERXRouteRequestHandler();
ERXRoute route1 = new ERXRoute("SomeEntity", "somepattern", ERXRoute.Method.Post);
handler.addRoute(route1);
// We create this object just to get the constructor-generated url pattern
ERXRoute route2 = new ERXRoute("SomeEntity", "somepattern");
ERXRoute route3 = handler.routeForMethodAndPattern(ERXRoute.Method.Post, route2.routePattern().pattern());
assertTrue(route3 != null);
assertTrue(route3 == route1);
}
// Checks error on verify conflict
@Test
public void testVerifyRouteConflict() {
ERXRouteRequestHandler handler = new ERXRouteRequestHandler();
ERXRoute route1 = new ERXRoute("SomeEntity", "somepattern");
handler.addRoute(route1);
ERXRoute route2 = new ERXRoute("SomeEntity", "somepattern", SomeController.class, "someAction");
try {
handler.verifyRoute(route2);
fail("Expected IllegalStateException");
}
catch (IllegalStateException e) {
System.out.println(e.getMessage());
}
}
// No error thrown when routes and controller/action are identical
@Test
public void testAddRouteSameNoConflict() {
ERXRouteRequestHandler handler = new ERXRouteRequestHandler();
ERXRoute route1 = new ERXRoute("SomeEntity", "somepattern", SomeController.class, "someAction");
System.out.println("route1 = " + route1);
handler.addRoute(route1);
ERXRoute route2 = new ERXRoute("SomeEntity", "somepattern", SomeController.class, "someAction");
System.out.println("route2 = " + route2);
handler.addRoute(route2);
// Two identical routes mapping to same controller and action exist.
assertEquals(handler.routes().count(), 2);
}
// Ensures declared methods are added correctly
@Test
public void testAddDeclaredMethods() {
ERXRouteRequestHandler handler = new ERXRouteRequestHandler();
handler.addDeclaredRoutes("SomeEntity", SomeController.class, true);
NSArray<ERXRoute> routes = handler.routes();
assertEquals(routes.count(), 6);
boolean didFindRoute1 = false;
boolean didFindRoute2 = false;
boolean didFindRoute3 = false;
boolean didFindRoute4 = false;
boolean didFindRouteXPut = false;
boolean didFindRouteXDefaultGet = false;
for (ERXRoute route : routes) {
System.out.println(route);
if (route.routePattern().pattern().contains("thing1")) {
assertEquals(route.method(), ERXRoute.Method.Get);
// Note that ERRest chops off trailing "Action"
assertEquals(route.action(), "some");
didFindRoute1 = true;
}
if (route.routePattern().pattern().contains("thing2")) {
assertEquals(route.method(), ERXRoute.Method.Post);
assertEquals(route.action(), "someAction2");
didFindRoute2 = true;
}
if (route.routePattern().pattern().contains("thing3")) {
assertEquals(route.method(), ERXRoute.Method.Put);
assertEquals(route.action(), "someAction3");
didFindRoute3 = true;
}
if (route.routePattern().pattern().contains("thing4")) {
assertEquals(route.method(), ERXRoute.Method.Delete);
assertEquals(route.action(), "someAction4");
didFindRoute4 = true;
}
if (route.routePattern().pattern().contains("thingX")) {
String routeAction = route.action();
if (routeAction.equals("someAction3")) {
assertEquals(route.method(), ERXRoute.Method.Put);
didFindRouteXPut = true;
} else if (routeAction.equals("someActionX")) {
assertEquals(route.method(), ERXRoute.Method.Get);
didFindRouteXDefaultGet = true;
}
}
}
assertTrue(didFindRoute1);
assertTrue(didFindRoute2);
assertTrue(didFindRoute3);
assertTrue(didFindRoute4);
assertTrue(didFindRouteXPut);
assertTrue(didFindRouteXDefaultGet);
}
// Throws error where actions have conflicting route declarations
@Test
public void testAddDeclaredMethodsWithConflicts() {
ERXRouteRequestHandler handler = new ERXRouteRequestHandler();
try {
handler.addDeclaredRoutes("FaultyEntity", FaultyController.class, true);
fail("Expected an IllegalStateException");
}
catch (IllegalStateException e) {
;
}
}
// Throws error where actions have conflicting route declarations
@Test
public void testAddDeclaredMethodsWithConflicts2() {
ERXRouteRequestHandler handler = new ERXRouteRequestHandler();
try {
handler.addDeclaredRoutes("FaultyEntity", FaultyController2.class, true);
fail("Expected an IllegalStateException");
}
catch (IllegalStateException e) {
;
}
}
// A dummy controller for testing with valid declarations
private static class SomeController extends ERXRouteController {
public SomeController(WORequest request) {
super(request);
}
@GET
@Path("/somethings/thing1")
public WOActionResults someAction() {
return null;
}
@POST
@Path("/somethings/thing2")
public WOActionResults someAction2() {
return null;
}
@PUT
@Paths({@Path("/somethings/thing3"), @Path("/somethings/thingX")})
public WOActionResults someAction3() {
return null;
}
@DELETE
@Path("/somethings/thing4")
public WOActionResults someAction4() {
return null;
}
// No http method declaration should default to @GET
@Path("/somethings/thingX")
public WOActionResults someActionX() {
return null;
}
}
// A dummy controller for testing
// This class deliberately has two duplicate declared route conflicts
private static class FaultyController extends ERXRouteController {
public FaultyController(WORequest request) {
super(request);
}
@GET
@Path("/somethings/thing1")
public WOActionResults someAction() {
return null;
}
// This will default to @GET and so should conflict with "someAction"
@Path("/somethings/thing1")
public WOActionResults someAction2() {
return null;
}
}
// A dummy controller for testing
// This class deliberately has a duplicate declared route conflict
private static class FaultyController2 extends ERXRouteController {
public FaultyController2(WORequest request) {
super(request);
}
@PUT
@Paths({@Path("/somethings/thing3"), @Path("/somethings/thingX")})
public WOActionResults someAction3() {
return null;
}
// This should conflict with the same method/path declaration on someAction3
@PUT
@Path("/somethings/thingX")
public WOActionResults someAction4() {
return null;
}
}
}