package org.springframework.cloud.netflix.zuul.filters; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.junit.Test; /** * @author Johannes Edmeier */ public class CompositeRouteLocatorTests { private CompositeRouteLocator locator; public CompositeRouteLocatorTests() { List<RouteLocator> locators = new ArrayList<>(); locators.add(new TestRouteLocator(asList("ign1"), asList(createRoute("1", "/pathA")))); locators.add( new TestRouteLocator(asList("ign1", "ign2"), asList(createRoute("2", "/pathA"), createRoute("2", "/pathB")))); this.locator = new CompositeRouteLocator(locators); } @Test public void test_getIgnoredPaths() { assertThat(locator.getIgnoredPaths(), hasItems("ign1", "ign2")); } @Test public void test_getRoutes() { assertThat(locator.getRoutes(), hasItems(createRoute("1", "/pathA"), createRoute("2", "/pathB"))); } @Test public void test_getMatchingRoute() { assertThat(locator.getMatchingRoute("/pathA"), notNullValue()); assertThat(locator.getMatchingRoute("/pathA").getId(), is("1")); assertThat("Locator 1 should take precedence", locator.getMatchingRoute("/pathB").getId(), is("2")); assertThat(locator.getMatchingRoute("/pathNot"), nullValue()); } @Test public void test_refresh() { RefreshableRouteLocator mock = mock(RefreshableRouteLocator.class); new CompositeRouteLocator(asList(mock)).refresh(); verify(mock).refresh(); } private Route createRoute(String id, String path) { return new Route(id, path, null, null, false, Collections.<String>emptySet()); } private static class TestRouteLocator implements RouteLocator { private Collection<String> ignoredPaths; private List<Route> routes; public TestRouteLocator(Collection<String> ignoredPaths, List<Route> routes) { this.ignoredPaths = ignoredPaths; this.routes = routes; } @Override public Collection<String> getIgnoredPaths() { return this.ignoredPaths; } @Override public List<Route> getRoutes() { return this.routes; } @Override public Route getMatchingRoute(String path) { for (Route route : routes) { if (path.startsWith(route.getPath())) { return route; } } return null; } } }