VersionRouterTest.java revision f960939937129342299f260d606817b22da8d035
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz/*
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner * The contents of this file are subject to the terms of the Common Development and
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * Distribution License (the License). You may not use this file except in compliance with the
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * License.
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz *
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * specific language governing permission and limitations under the License.
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz *
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * When distributing Covered Software, include this CDDL Header Notice in each file and include
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * Header, with the fields enclosed by brackets [] replaced by your own identifying
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * information: "Portions copyright [year] [name of copyright owner]".
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz *
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz * Copyright 2014 ForgeRock AS.
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz */
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzpackage org.forgerock.openam.rest.service;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.forgerock.json.resource.VersionSelector;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.restlet.Request;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.restlet.Response;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.restlet.Restlet;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.restlet.data.Reference;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.restlet.data.Status;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.testng.annotations.BeforeClass;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.testng.annotations.BeforeMethod;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.testng.annotations.DataProvider;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport org.testng.annotations.Test;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
ea8e98e298f33f9362293f392c8fb192722b8904Eugen Kuksaimport javax.servlet.http.HttpServletRequest;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport static org.mockito.BDDMockito.given;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport static org.mockito.Matchers.anyString;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport static org.mockito.Matchers.eq;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport static org.mockito.Mockito.mock;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport static org.mockito.Mockito.verify;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport static org.mockito.Mockito.verifyZeroInteractions;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzimport static org.forgerock.openam.rest.service.VersionRouter.HEADER_X_VERSION_API;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulzpublic class VersionRouterTest {
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz private VersionRouter router;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz private Restlet handlerOne;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz private Restlet handlerTwo;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder private Restlet handlerThree;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz private Request request;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz private Response response;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz private HttpServletRequest httpRequest;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz @BeforeClass
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz public void setUpClass() {
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz handlerOne = mock(Restlet.class);
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz handlerTwo = mock(Restlet.class);
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz handlerThree = mock(Restlet.class);
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz }
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz @BeforeMethod
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz public void setUp() {
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz router = new VersionRouter(new VersionSelector()) {
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz @Override
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz HttpServletRequest getHttpRequest(Request request) {
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz return httpRequest;
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz }
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz };
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz router.addVersion("1.0", handlerOne);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz router.addVersion("1.5", handlerTwo);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz router.addVersion("2.1", handlerThree);
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz request = mock(Request.class);
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz response = mock(Response.class);
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz httpRequest = mock(HttpServletRequest.class);
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz }
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz @DataProvider(name = "data")
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz private Object[][] dataProvider() {
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz return new Object[][]{
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz {"resource=3.0", true, null},
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz {"resource=1.0", false, handlerTwo},
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz {"resource=1.1", false, handlerTwo},
f33f8ec33a87a0eaee746cb7355054f2c0469579Ewaryst Schulz {"resource=1.9", true, null},
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz {"resource=2.1", false, handlerThree},
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz {null, false, handlerThree}
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz };
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz }
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz @Test (dataProvider = "data")
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz public void shouldHandleVersionRoute(String requestedVersion, boolean expectedException, Restlet handler) {
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //Given
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz given(httpRequest.getHeader(HEADER_X_VERSION_API)).willReturn(requestedVersion);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz Reference resourceRef = mock(Reference.class);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz given(request.getResourceRef()).willReturn(resourceRef);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //When
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz router.handle(request, response);
ea8e98e298f33f9362293f392c8fb192722b8904Eugen Kuksa
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //Then
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz if (expectedException) {
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz verify(response).setStatus(eq(Status.CLIENT_ERROR_NOT_FOUND), anyString());
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz verifyZeroInteractions(handlerOne, handlerTwo, handlerThree);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz } else {
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz verify(handler).handle(request, response);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz }
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz }
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz @Test
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz public void shouldNotHandleVersionRouteWithNewerProtocolMinorVersion() {
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //Given
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder given(httpRequest.getHeader(HEADER_X_VERSION_API)).willReturn("protocol=1.1,resource=1.0");
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //When
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz router.handle(request, response);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //Then
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz verify(response).setStatus(eq(Status.CLIENT_ERROR_BAD_REQUEST), anyString());
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz verifyZeroInteractions(handlerOne, handlerTwo, handlerThree);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz }
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz @Test
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz public void shouldNotHandleVersionRouteWithNewerProtocolMajorVersion() {
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //Given
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz given(httpRequest.getHeader(HEADER_X_VERSION_API)).willReturn("protocol=2.0,resource=1.0");
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //When
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz router.handle(request, response);
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz
dde363c92873e122a139e2db23862dfd7d265b73Ewaryst Schulz //Then
verify(response).setStatus(eq(Status.CLIENT_ERROR_BAD_REQUEST), anyString());
verifyZeroInteractions(handlerOne, handlerTwo, handlerThree);
}
@Test
public void shouldHandleVersionRouteWithOldestBehaviour() {
//Given
router.defaultToOldest();
//When
router.handle(request, response);
//Then
verify(handlerOne).handle(request, response);
}
}