package core.framework.impl.web.route; import core.framework.impl.web.request.PathParams; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; /** * @author neo */ public class PathNodeTest { @Rule public ExpectedException exception = ExpectedException.none(); @Test public void rootPath() { PathNode root = new PathNode(); URLHandler rootHandler = root.register("/"); URLHandler found = root.find("/", new PathParams()); Assert.assertNotNull(found); Assert.assertSame(rootHandler, found); } @Test public void dynamicPathPattern() { PathNode root = new PathNode(); URLHandler handler1 = root.register("/:var1"); URLHandler handler2 = root.register("/path1/:var1"); URLHandler handler3 = root.register("/path1/:var1/path2"); URLHandler handler4 = root.register("/path1/:var1/:var2"); PathParams pathParams = new PathParams(); URLHandler found = root.find("/value", pathParams); Assert.assertSame(handler1, found); Assert.assertEquals("value", pathParams.get("var1")); pathParams = new PathParams(); found = root.find("/path1/value", pathParams); Assert.assertSame(handler2, found); Assert.assertEquals("value", pathParams.get("var1")); pathParams = new PathParams(); found = root.find("/path1/value/path2", pathParams); Assert.assertSame(handler3, found); Assert.assertEquals("value", pathParams.get("var1")); pathParams = new PathParams(); found = root.find("/path1/value1/value2", pathParams); Assert.assertSame(handler4, found); Assert.assertEquals("value1", pathParams.get("var1")); Assert.assertEquals("value2", pathParams.get("var2")); } @Test public void dynamicPathPatternNotMatchTrailingSlash() { PathNode root = new PathNode(); root.register("/path1/:var1"); PathParams pathParams = new PathParams(); URLHandler foundHandler = root.find("/path1/", pathParams); Assert.assertNull(foundHandler); } @Test public void dynamicPathPatternsWithTrailingSlash() { PathNode root = new PathNode(); URLHandler handler1 = root.register("/path1/:var"); URLHandler handler2 = root.register("/path1/:var/"); PathParams pathParams = new PathParams(); URLHandler found = root.find(Path.parse("/path1/value"), pathParams); Assert.assertSame(handler1, found); Assert.assertEquals("value", pathParams.get("var")); pathParams = new PathParams(); found = root.find(Path.parse("/path1/value/"), pathParams); Assert.assertSame(handler2, found); Assert.assertEquals("value", pathParams.get("var")); } @Test public void wildcardPathPattern() { PathNode root = new PathNode(); root.register("/:var1"); root.register("/path1/path2/path3/path4/:var1"); URLHandler handler = root.register("/path1/path2/:url(*)"); PathParams pathParams = new PathParams(); URLHandler matchedHandler = root.find("/path1/path2/path3/value", pathParams); Assert.assertSame(handler, matchedHandler); Assert.assertEquals("path3/value", pathParams.get("url")); pathParams = new PathParams(); matchedHandler = root.find("/path1/path2/path3/value/", pathParams); Assert.assertSame(handler, matchedHandler); Assert.assertEquals("path3/value/", pathParams.get("url")); } @Test public void conflictDynamicPathPattern() { exception.expect(Error.class); exception.expectMessage("var1"); exception.expectMessage("var2"); PathNode root = new PathNode(); root.register("/path1/:var1/path2"); root.register("/path1/:var2/path3"); } @Test public void conflictWildcardPathPattern() { exception.expect(Error.class); exception.expectMessage("var1"); exception.expectMessage("var2"); PathNode root = new PathNode(); root.register("/path/:var1(*)"); root.register("/path/:var2(*)"); } }