/* * Copyright 2013-2017 Erudika. https://erudika.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * For issues and patches go to: https://github.com/erudika */ package com.erudika.para.rest; import com.erudika.para.Para; import com.erudika.para.cache.Cache; import com.erudika.para.cache.MockCache; import com.erudika.para.core.App; import com.erudika.para.core.utils.ParaObjectUtils; import com.erudika.para.core.Sysprop; import com.erudika.para.core.Tag; import com.erudika.para.core.utils.CoreUtils; import com.erudika.para.persistence.DAO; import com.erudika.para.persistence.MockDAO; import static com.erudika.para.rest.RestUtils.*; import com.erudika.para.search.Search; import com.erudika.para.utils.Config; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.inject.Binder; import com.google.inject.Module; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response.Status; import org.junit.AfterClass; import static org.junit.Assert.*; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; /** * * @author Alex Bogdanovski [alex@erudika.com] */ public class RestUtilsTest { public RestUtilsTest() { } @BeforeClass public static void setUpClass() { System.setProperty("para.env", "embedded"); System.setProperty("para.app_name", "para-test"); System.setProperty("para.cluster_name", "para-test"); System.setProperty("para.print_logo", "false"); Para.initialize(new Module() { public void configure(Binder binder) { binder.bind(DAO.class).toInstance(new MockDAO()); binder.bind(Cache.class).toInstance(new MockCache()); binder.bind(Search.class).toInstance(Mockito.mock(Search.class)); } }); CoreUtils.getInstance().setDao(Para.getDAO()); CoreUtils.getInstance().setSearch(Para.getSearch()); } @AfterClass public static void tearDownClass() { Para.destroy(); } private InputStream getInputStream(Object obj) throws JsonProcessingException { if (obj != null) { return new ByteArrayInputStream(ParaObjectUtils.getJsonWriter(). forType(obj.getClass()).writeValueAsBytes(obj)); } return null; } @Test public void testGetReadResponse() { App app = new App("test"); App root = new App(Config.APP_NAME_NS); assertEquals(Status.NOT_FOUND.getStatusCode(), getReadResponse(null, null).getStatus()); assertEquals(Status.OK.getStatusCode(), getReadResponse(app, new Tag("tag")).getStatus()); assertEquals(Status.OK.getStatusCode(), getReadResponse(root, new App("test1")).getStatus()); } @Test public void testGetCreateUpdateDeleteResponse() throws JsonProcessingException { Tag t = new Tag("tag"); App rootApp = new App(Config.APP_NAME_NS); App notRootApp = new App("anotherApp"); assertEquals(Status.BAD_REQUEST.getStatusCode(), getCreateResponse(null, null, null).getStatus()); assertEquals(Status.BAD_REQUEST.getStatusCode(), getCreateResponse(rootApp, rootApp.getType(), getInputStream(rootApp)).getStatus()); assertEquals(Status.BAD_REQUEST.getStatusCode(), getCreateResponse(rootApp, rootApp.getType(), getInputStream(rootApp)).getStatus()); assertEquals(Status.BAD_REQUEST.getStatusCode(), getCreateResponse(notRootApp, rootApp.getType(), getInputStream(rootApp)).getStatus()); assertEquals(Status.BAD_REQUEST.getStatusCode(), getCreateResponse(rootApp, rootApp.getType(), getInputStream(notRootApp)).getStatus()); assertEquals(Status.BAD_REQUEST.getStatusCode(), getUpdateResponse(notRootApp, rootApp, getInputStream(rootApp)).getStatus()); assertEquals(Status.BAD_REQUEST.getStatusCode(), getCreateResponse(rootApp, notRootApp.getType(), getInputStream(notRootApp)).getStatus()); assertEquals(Status.CREATED.getStatusCode(), getCreateResponse(rootApp, t.getType(), getInputStream(t)).getStatus()); assertNotNull(CoreUtils.getInstance().getDao().read(t.getId())); Map<String, Object> map = new HashMap<String, Object>(); assertEquals(Status.NOT_FOUND.getStatusCode(), getUpdateResponse(rootApp, null, null).getStatus()); assertEquals(Status.OK.getStatusCode(), getUpdateResponse(rootApp, t, getInputStream(map)).getStatus()); assertNotNull(CoreUtils.getInstance().getDao().read(t.getId())); assertEquals(Status.OK.getStatusCode(), getUpdateResponse(notRootApp, notRootApp, getInputStream(notRootApp)).getStatus()); assertEquals(Status.OK.getStatusCode(), getUpdateResponse(rootApp, notRootApp, getInputStream(notRootApp)).getStatus()); assertEquals(Status.NOT_FOUND.getStatusCode(), getDeleteResponse(rootApp, null).getStatus()); assertEquals(Status.NOT_FOUND.getStatusCode(), getDeleteResponse(null, t).getStatus()); assertEquals(Status.BAD_REQUEST.getStatusCode(), getDeleteResponse(notRootApp, rootApp).getStatus()); assertEquals(Status.OK.getStatusCode(), getDeleteResponse(rootApp, t).getStatus()); assertEquals(Status.OK.getStatusCode(), getDeleteResponse(rootApp, notRootApp).getStatus()); assertEquals(Status.OK.getStatusCode(), getDeleteResponse(notRootApp, notRootApp).getStatus()); assertNull(CoreUtils.getInstance().getDao().read(t.getId())); } @Test public void testRegisterNewTypes() { App app = new App("test"); Sysprop custom = new Sysprop("ctype"); custom.setType("cat"); app.addDatatypes(custom); assertEquals("cat", app.getDatatypes().get("cats")); } @Test public void testGetJSONResponse() { assertEquals(Status.BAD_REQUEST.getStatusCode(), getStatusResponse(null).getStatus()); assertEquals(Status.OK.getStatusCode(), getStatusResponse(Status.OK).getStatus()); } @Test public void testGetExceptionResponse() { assertEquals(Status.FORBIDDEN.getStatusCode(), GenericExceptionMapper.getExceptionResponse(403, null).getStatus()); assertEquals(MediaType.APPLICATION_JSON, GenericExceptionMapper.getExceptionResponse(403, "").getMediaType().toString()); } @Test public void testExtractAccessKey() { HttpServletRequest req = Mockito.mock(HttpServletRequest.class); Mockito.when(req.getHeader(HttpHeaders.AUTHORIZATION)).thenReturn(null); String appid = "app:test-123"; assertEquals("", extractAccessKey(null)); assertEquals(null, extractAccessKey(req)); Mockito.when(req.getHeader(HttpHeaders.AUTHORIZATION)).thenReturn("Anonymous " + appid); assertEquals(appid, extractAccessKey(req)); Mockito.when(req.getHeader(HttpHeaders.AUTHORIZATION)).thenReturn(null); Mockito.when(req.getParameter("X-Amz-Credential")).thenReturn("AWS4-HMAC-SHA256 Credential=" + appid + "/123/"); assertEquals(appid, extractAccessKey(req)); Mockito.when(req.getParameter("X-Amz-Credential")).thenReturn(null); Mockito.when(req.getParameter("accessKey")).thenReturn(appid); assertEquals(appid, extractAccessKey(req)); Mockito.when(req.getParameter("accessKey")).thenReturn(null); Mockito.when(req.getHeader(HttpHeaders.AUTHORIZATION)).thenReturn("AWS4-HMAC-SHA256 Credential=" + appid + "/0/"); assertEquals(appid, extractAccessKey(req)); } @Test public void testExtractResourcePath() { HttpServletRequest req = Mockito.mock(HttpServletRequest.class); Mockito.when(req.getRequestURI()).thenReturn(""); assertEquals(extractResourcePath(null), ""); assertEquals(extractResourcePath(req), ""); Mockito.when(req.getRequestURI()).thenReturn("/v1"); assertEquals("", extractResourcePath(req)); Mockito.when(req.getRequestURI()).thenReturn("/v1/"); assertEquals("", extractResourcePath(req)); Mockito.when(req.getRequestURI()).thenReturn("/v1/_"); assertEquals("_", extractResourcePath(req)); Mockito.when(req.getRequestURI()).thenReturn("/v1/_test"); assertEquals("_test", extractResourcePath(req)); Mockito.when(req.getRequestURI()).thenReturn("/v1/_test/path/id"); assertEquals("_test/path/id", extractResourcePath(req)); // new feature - specific resource paths Mockito.when(req.getRequestURI()).thenReturn("/v2.0/posts/123"); assertEquals("posts/123", extractResourcePath(req)); } @Test public void testReadResourcePath() { String appid = "test-app-1"; App app = new App(appid); Sysprop s = new Sysprop(); s.setAppid(appid); s.setName("noname"); app.create(); Para.getDAO().create(appid, s); assertNull(readResourcePath(appid, null)); assertNull(readResourcePath(appid, "")); assertNull(readResourcePath(null, "/")); assertNull(readResourcePath(appid, "users")); assertNull(readResourcePath(appid, "sysprops")); assertNull(readResourcePath(appid, "sysprop")); assertNull(readResourcePath(appid, "sysprop/")); assertNotNull(readResourcePath(appid, "sysprop/" + s.getId())); assertNull(readResourcePath(appid, "/v1/sysprop/" + s.getId())); assertNull(readResourcePath(appid, "one/two/three/" + s.getId())); assertNotNull(readResourcePath(appid, "type/" + s.getId() + "/subresource/test")); assertEquals(s, readResourcePath(appid, "type/" + s.getId() + "/subresource/test")); assertNotNull(readResourcePath(appid, "/type/" + s.getId() + "/subresource/test?query=string")); Para.getDAO().delete(appid, s); assertNull(readResourcePath(appid, "sysprop/" + s.getId())); app.delete(); } }