package com.google.sitebricks.routing; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.util.HashMap; import java.util.Map; /** * @author Dhanji R. Prasanna (dhanji@gmail.com) */ public class PathMatcherTest { private static final String EXACT_PATHS = "exactPaths"; private static final String SINGLE_VAR_PATHS = "getSingleVarPaths"; private static final String ANTI_VAR_PATHS = "antiVarPaths"; private static final String VARPATHS_MATCHES = "varpathsMatches"; private static final String VARPATHS_ANTIMATCHES = "varpaths_antimatches"; @DataProvider(name = EXACT_PATHS) public Object[][] getExactPaths() { return new Object[][] { { "/wiki", "/wiki", }, { "/wiki/pensylvania","/wiki/pensylvania", }, { "/12", "/12", }, { "/", "/", }, }; } @Test(dataProvider = EXACT_PATHS) public final void matchExactUriPath(final String path, final String incoming) { assert new PathMatcherChain.SimplePathMatcher(path) .matches(incoming); } @SuppressWarnings({"UnusedDeclaration"}) @Test(dataProvider = EXACT_PATHS) public final void matchGreedy(final String path, final String incoming) { assert new PathMatcherChain.GreedyPathMatcher("ogog") .matches(incoming); } @DataProvider(name = SINGLE_VAR_PATHS) public Object[][] getVarPaths() { return new Object[][] { { "/wiki/:title", "/wiki/hello", }, { "/wiki/:title", "/wiki/ashello", }, { "/wiki/:title", "/wiki/hoolig An+*", }, { "/wiki/:title/page/:id", "/wiki/hello/page/12", }, { "/wiki/:title/page/:id", "/wiki/couwdury/page/12424", }, { "/wiki/:title/page/:id", "/wiki/sokdoasd/page/aoskpaokda", }, { "/wiki", "/wiki/", }, { "/wiki/:title", "/wiki/hello/", }, }; } @Test(dataProvider = SINGLE_VAR_PATHS) public final void matchPathTemplate(final String path, final String incoming) { assert new PathMatcherChain(path) .matches(incoming); } @DataProvider(name = VARPATHS_MATCHES) public Object[][] getVarPathsAndMatches() { return new Object[][] { { "/wiki/:title", "/wiki/hello", new HashMap() {{ put("title", "hello"); }}, }, { "/wiki/:title/:page/:id", "/wiki/hello/page/12", new HashMap() {{ put("title", "hello"); put("page", "page"); put("id", "12"); }}, }, { "/wiki/:title/page/:id", "/wiki/sokdoasd/page/aoskpaokda", new HashMap() {{ put("title", "sokdoasd"); put("id", "aoskpaokda"); }}, }, }; } @Test(dataProvider = VARPATHS_MATCHES) public final void findMatchVariables(final String path, final String incoming, Map<String, String> map) { final Map<String, String> stringMap = new PathMatcherChain(path) .findMatches(incoming); assert null != stringMap; assert stringMap.size() == map.size(); for (Map.Entry<String, String> entry : stringMap.entrySet()) { assert map.containsKey(entry.getKey()); assert map.get(entry.getKey()).equals(entry.getValue()); } } @DataProvider(name = VARPATHS_ANTIMATCHES) public Object[][] getVarPathsAntiMatches() { return new Object[][] { { "/wiki/:title", "/wiki/hello", new HashMap() {{ put("title", "hellol"); }}, }, { "/wiki/:title/:page/:id", "/wiki/hello/page/12", new HashMap() {{ put("title", "hello"); put("id", "12"); }}, }, { "/wiki/:title/page/:id", "/wiki/sokdoasd/page/aoskpaokda", new HashMap() {{ put("title", "sokdoasd"); put("id", "aoskpaokda"); put("pid", "aoskpaokda"); }}, }, }; } @Test(dataProvider = VARPATHS_ANTIMATCHES, expectedExceptions = AssertionError.class) public final void notFindMatchVariables(final String path, final String incoming, Map<String, String> map) { final Map<String, String> stringMap = new PathMatcherChain(path) .findMatches(incoming); assert null != stringMap; assert stringMap.size() == map.size(); for (Map.Entry<String, String> entry : stringMap.entrySet()) { assert map.containsKey(entry.getKey()); assert map.get(entry.getKey()).equals(entry.getValue()); } } @DataProvider(name = ANTI_VAR_PATHS) public Object[][] getAntiVarPaths() { return new Object[][] { { "/wiki/:title", "/clicky/hello", }, { "/wiki/:title/page/:id", "/wiki/hello/dago/12", }, { "/wiki/:title/page/:id", "/wiki/couwdury/1/12424", }, { "/wiki/:title/page/:id", "/wikit/sokdoasd/page/aoskpaokda", }, { "/wiki/:title", "/wikia", }, { "/wiki", "/", }, { "/wiki/fencepost", "/", }, { "/wiki/fencepost/stupid", "/", }, { "/wiki/hicki", "/wiki", }, { "/wiki/:title", "/wiki/", }, { "/wiki/:hickory/dickory", "/wiki/dickory", }, { "/wiki/:title", "/wiki/hello/bye", }, }; } @Test(dataProvider = ANTI_VAR_PATHS) public final void notMatchPathTemplate(final String path, final String incoming) { assert !new PathMatcherChain(path) .matches(incoming); } }