From 55e085c6b8fbac94207e0f69ac2b17c561dbc203 Mon Sep 17 00:00:00 2001 From: "Lamont, William (wl2432)" Date: Mon, 15 Jan 2018 13:15:33 -0500 Subject: Add ability to do optional params for custom query Change-Id: I1e61bbee2def41db5e7064ad3a3e916b7afcc299 Issue-ID: AAI-652 Signed-off-by: Lamont, William (wl2432) --- .../src/test/java/org/onap/aai/HttpTestUtil.java | 369 +++++++++++++++++++ .../src/test/java/org/onap/aai/PayloadUtil.java | 113 ++++++ .../aai/dbgraphmap/SearchGraphNamedQueryTest.java | 406 +++++++++++++++++++++ .../aai/rest/search/GetCustomQueryConfigTest.java | 62 ++++ .../java/org/onap/aai/rest/search/QueryTest.java | 2 +- .../util/ConvertQueryPropertiesToJsonTest.java | 31 ++ 6 files changed, 982 insertions(+), 1 deletion(-) create mode 100644 aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java create mode 100644 aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java create mode 100644 aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java create mode 100644 aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java create mode 100644 aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java (limited to 'aai-traversal/src/test/java') diff --git a/aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java b/aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java new file mode 100644 index 0000000..1ec1a05 --- /dev/null +++ b/aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java @@ -0,0 +1,369 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.javatuples.Pair; +import org.mockito.Mockito; +import org.onap.aai.dbmap.DBConnectionType; +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.introspection.Introspector; +import org.onap.aai.introspection.Loader; +import org.onap.aai.introspection.ModelType; +import org.onap.aai.introspection.Version; +import org.onap.aai.parsers.query.QueryParser; +import org.onap.aai.parsers.uri.URIToObject; +import org.onap.aai.rest.db.DBRequest; +import org.onap.aai.rest.db.HttpEntry; +import org.onap.aai.restcore.HttpMethod; +import org.onap.aai.restcore.RESTAPI; +import org.onap.aai.serialization.engines.QueryStyle; +import org.onap.aai.serialization.engines.TransactionalGraphEngine; + +import javax.ws.rs.core.*; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.util.*; + +import static org.mockito.Matchers.anyObject; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +public class HttpTestUtil extends RESTAPI { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(HttpTestUtil.class); + + protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json"); + + private static final String EMPTY = ""; + + protected HttpHeaders httpHeaders; + protected UriInfo uriInfo; + + protected MultivaluedMap headersMultiMap; + protected MultivaluedMap queryParameters; + + protected List aaiRequestContextList; + protected List outputMediaTypes; + + public void init(){ + + httpHeaders = Mockito.mock(HttpHeaders.class); + uriInfo = Mockito.mock(UriInfo.class); + + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + + headersMultiMap.add("X-FromAppId", "JUNIT"); + headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); + headersMultiMap.add("Real-Time", "true"); + headersMultiMap.add("Accept", "application/json"); + headersMultiMap.add("aai-request-context", ""); + + outputMediaTypes = new ArrayList<>(); + outputMediaTypes.add(APPLICATION_JSON); + + aaiRequestContextList = new ArrayList<>(); + aaiRequestContextList.add(""); + + when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap); + when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes); + + when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList); + + when(uriInfo.getQueryParameters()).thenReturn(queryParameters); + when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters); + + doReturn(null).when(queryParameters).remove(anyObject()); + when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON); + } + + public Response doPut(String uri, String payload) throws UnsupportedEncodingException, AAIException { + + this.init(); + Response response = null; + boolean success = true; + TransactionalGraphEngine dbEngine = null; + + try { + + uri = uri.replaceAll("/aai/", ""); + logger.info("Starting the put request for the uri {} with payload {}", uri, payload); + + String [] arr = uri.split("/"); + + Version version = null; + + if(arr != null && arr.length > 1){ + if(arr[0].matches("^v\\d+")){ + version = Version.valueOf(arr[0]); + uri = uri.replaceAll("^v\\d+", ""); + } + } + + if(version == null){ + version = Version.getLatest(); + } + Mockito.when(uriInfo.getPath()).thenReturn(uri); + + DBConnectionType type = DBConnectionType.REALTIME; + HttpEntry httpEntry = new HttpEntry(version, ModelType.MOXY, QueryStyle.TRAVERSAL, type); + Loader loader = httpEntry.getLoader(); + dbEngine = httpEntry.getDbEngine(); + + URI uriObject = UriBuilder.fromPath(uri).build(); + URIToObject uriToObject = new URIToObject(loader, uriObject); + + String objType = uriToObject.getEntityName(); + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); + + + logger.info("Unmarshalling the payload to this {}", objType); + + Introspector obj; + HttpMethod httpMethod; + if(uri.contains("/relationship-list/relationship")){ + obj = loader.unmarshal("relationship", payload, org.onap.aai.restcore.MediaType.getEnum("application/json")); + httpMethod = HttpMethod.PUT_EDGE; + } else { + obj = loader.unmarshal(objType, payload, org.onap.aai.restcore.MediaType.getEnum("application/json")); + httpMethod = HttpMethod.PUT; + this.validateIntrospector(obj, loader, uriObject, httpMethod); + } + + + DBRequest dbRequest = + new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION") + .rawRequestContent(payload).build(); + + List dbRequestList = new ArrayList<>(); + dbRequestList.add(dbRequest); + + Pair>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT"); + response = responsesTuple.getValue1().get(0).getValue1(); + + } catch (AAIException e) { + response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e); + success = false; + } catch(Exception e){ + AAIException ex = new AAIException("AAI_4000", e); + response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex); + success = false; + } finally { + if(success){ + if(response != null){ + if((response.getStatus() / 100) == 2){ + logger.info("Successfully completed the PUT request with status {} and committing it to DB", response.getStatus()); + } else { + logFailure(HttpMethod.PUT, response); + } + } + dbEngine.commit(); + } else { + if(response != null) { + logFailure(HttpMethod.PUT, response); + } + dbEngine.rollback(); + } + } + + return response; + } + + public Response doGet(String uri) throws UnsupportedEncodingException, AAIException { + + this.init(); + Response response = null; + boolean success = true; + TransactionalGraphEngine dbEngine = null; + + try { + + uri = uri.replaceAll("/aai/", ""); + logger.info("Starting the GET request for the uri {} with depth {}", uri, "all"); + + String [] arr = uri.split("/"); + + Version version = null; + + if(arr != null && arr.length > 1){ + if(arr[0].matches("^v\\d+")){ + version = Version.valueOf(arr[0]); + uri = uri.replaceAll("^v\\d+", ""); + } + } + + if(version == null){ + version = Version.getLatest(); + } + + DBConnectionType type = DBConnectionType.REALTIME; + HttpEntry httpEntry = new HttpEntry(version, ModelType.MOXY, QueryStyle.TRAVERSAL, type); + Loader loader = httpEntry.getLoader(); + dbEngine = httpEntry.getDbEngine(); + + URI uriObject = UriBuilder.fromPath(uri).build(); + URIToObject uriToObject = new URIToObject(loader, uriObject); + + String objType = uriToObject.getEntityName(); + queryParameters.add("depth", "all"); + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, queryParameters); + + Mockito.when(uriInfo.getPath()).thenReturn(uri); + + logger.info("Unmarshalling the payload to this {}", objType); + + Introspector obj = loader.introspectorFromName(objType); + + DBRequest dbRequest = + new DBRequest.Builder(HttpMethod.GET, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION") + .build(); + + List dbRequestList = new ArrayList<>(); + dbRequestList.add(dbRequest); + + Pair>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT"); + response = responsesTuple.getValue1().get(0).getValue1(); + + } catch (AAIException e) { + response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e); + success = false; + } catch(Exception e){ + AAIException ex = new AAIException("AAI_4000", e); + response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex); + success = false; + } finally { + if(success){ + if(response != null){ + if((response.getStatus() / 100) == 2){ + logger.info("Successfully completed the GET request with status {} and committing it to DB", response.getStatus()); + } else { + logFailure(HttpMethod.GET, response); + } + } + dbEngine.commit(); + } else { + logFailure(HttpMethod.GET, response); + dbEngine.rollback(); + } + } + + return response; + } + + public Response doDelete(String uri, String resourceVersion) throws UnsupportedEncodingException, AAIException { + + this.init(); + Response response = null; + boolean success = true; + TransactionalGraphEngine dbEngine = null; + + try { + + uri = uri.replaceAll("/aai/", ""); + logger.info("Starting the delete request for the uri {} with resource version {}", uri, resourceVersion); + + String [] arr = uri.split("/"); + + Version version = null; + + if(arr != null && arr.length > 1){ + if(arr[0].matches("^v\\d+")){ + version = Version.valueOf(arr[0]); + if(!uri.contains("relationship-list/relationship")){ + uri = uri.replaceAll("^v\\d+", ""); + } + } + } + + if(version == null){ + version = Version.getLatest(); + } + + Mockito.when(uriInfo.getPath()).thenReturn(uri); + DBConnectionType type = DBConnectionType.REALTIME; + HttpEntry httpEntry = new HttpEntry(version, ModelType.MOXY, QueryStyle.TRAVERSAL, type); + Loader loader = httpEntry.getLoader(); + dbEngine = httpEntry.getDbEngine(); + + URI uriObject = UriBuilder.fromPath(uri).build(); + URIToObject uriToObject = new URIToObject(loader, uriObject); + + String objType = uriToObject.getEntityName(); + queryParameters.add("resource-version", resourceVersion); + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, queryParameters); + + logger.info("Unmarshalling the payload to this {}", objType); + + Introspector obj; + HttpMethod httpMethod; + if(uri.contains("/relationship-list/relationship")){ + obj = loader.introspectorFromName("relationship"); + httpMethod = HttpMethod.DELETE_EDGE; + } else { + obj = loader.introspectorFromName(objType); + httpMethod = HttpMethod.DELETE; + } + + DBRequest dbRequest = + new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION") + .build(); + + List dbRequestList = new ArrayList<>(); + dbRequestList.add(dbRequest); + + Pair>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT"); + response = responsesTuple.getValue1().get(0).getValue1(); + + } catch (AAIException e) { + response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e); + success = false; + } catch(Exception e){ + AAIException ex = new AAIException("AAI_4000", e); + response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex); + success = false; + } finally { + if(success){ + if(response != null){ + if((response.getStatus() / 100) == 2){ + logger.info("Successfully completed the DELETE request with status {} and committing it to DB", response.getStatus()); + } else { + logFailure(HttpMethod.DELETE, response); + } + } + dbEngine.commit(); + } else { + logFailure(HttpMethod.DELETE, response); + dbEngine.rollback(); + } + } + + return response; + } + + public static void logFailure(HttpMethod httpMethod, Response response){ + logger.info("Unable to complete the {} request with status {} and rolling back", httpMethod.toString(), response.getStatus()); + logger.info("Response body of failed request {}", response.getEntity()); + + } +} diff --git a/aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java b/aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java new file mode 100644 index 0000000..8925ecd --- /dev/null +++ b/aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java @@ -0,0 +1,113 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai; + +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.junit.Assert.assertNotNull; + +public class PayloadUtil { + + private static final Map cache = new HashMap<>(); + private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\$\\{[^}]+\\}"); + + public static String getExpectedPayload(String fileName) throws IOException { + + InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/expected/" + fileName); + + String message = String.format("Unable to find the %s in src/test/resources", fileName); + assertNotNull(message, inputStream); + + String resource = IOUtils.toString(inputStream); + + inputStream.close(); + return resource; + } + + public static String getResourcePayload(String fileName) throws IOException { + + InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/resource/" + fileName); + + String message = String.format("Unable to find the %s in src/test/resources", fileName); + assertNotNull(message, inputStream); + + String resource = IOUtils.toString(inputStream); + + inputStream.close(); + return resource; + } + + public static String getTemplatePayload(String fileName, Map templateValueMap) throws Exception { + + InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/templates/" + fileName); + + String message = String.format("Unable to find the %s in src/test/resources", fileName); + assertNotNull(message, inputStream); + + String resource; + + if(cache.containsKey(fileName)){ + resource = cache.get(fileName); + } else { + resource = IOUtils.toString(inputStream); + cache.put(fileName, resource); + } + + Matcher matcher = TEMPLATE_PATTERN.matcher(resource); + + String resourceWithTemplateValues = resource; + + while(matcher.find()){ + int start = matcher.start() + 2; + int end = matcher.end() - 1; + String key = resource.substring(start, end); + if(templateValueMap.containsKey(key)){ + resourceWithTemplateValues = resourceWithTemplateValues.replaceAll("\\$\\{" + key +"\\}", templateValueMap.get(key)); + } else { + throw new RuntimeException("Unable to find the key value pair in map for the template processing for key " + key); + } + } + + inputStream.close(); + return resourceWithTemplateValues; + } + + public static String getNamedQueryPayload(String fileName) throws IOException { + + InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/named-queries/" + fileName); + + String message = String.format("Unable to find the %s in src/test/resources/payloads/named-queries", fileName); + assertNotNull(message, inputStream); + + String resource = IOUtils.toString(inputStream); + + inputStream.close(); + return resource; + } +} diff --git a/aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java b/aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java new file mode 100644 index 0000000..552dbe4 --- /dev/null +++ b/aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java @@ -0,0 +1,406 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.dbgraphmap; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.aai.HttpTestUtil; +import org.onap.aai.PayloadUtil; +import org.onap.aai.dbmap.DBConnectionType; +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.extensions.AAIExtensionMap; +import org.onap.aai.introspection.*; +import org.onap.aai.serialization.engines.QueryStyle; +import org.onap.aai.util.AAIApiVersion; +import org.onap.aai.util.AAIConstants; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.*; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Mockito.*; + +public class SearchGraphNamedQueryTest { + + private SearchGraph searchGraph; + + protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json"); + + private static final Set VALID_HTTP_STATUS_CODES = new HashSet<>(); + + private final static Version version = Version.getLatest(); + private final static ModelType introspectorFactoryType = ModelType.MOXY; + private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL; + private final static DBConnectionType type = DBConnectionType.REALTIME; + + static { + VALID_HTTP_STATUS_CODES.add(200); + VALID_HTTP_STATUS_CODES.add(201); + VALID_HTTP_STATUS_CODES.add(204); + } + + private HttpHeaders httpHeaders; + + private MultivaluedMap headersMultiMap; + private MultivaluedMap queryParameters; + + private List aaiRequestContextList; + + private List outputMediaTypes; + + private static boolean ranOnce = false; + + private HttpTestUtil httpTestUtil; + + + private String getJsonValue(String json, String key ) { + JsonObject jsonObj = new JsonParser().parse(json).getAsJsonObject(); + String strValue = ""; + if ( jsonObj.isJsonObject()) { + strValue = jsonObj.get(key).getAsString(); + } + return strValue; + } + + private void addWidgets() { + String widgetPath = "." + AAIConstants.AAI_FILESEP + "bundleconfig-local" + AAIConstants.AAI_FILESEP + "etc" + + AAIConstants.AAI_FILESEP + "scriptdata"+ AAIConstants.AAI_FILESEP + "widget-model-json"; + + File dir = new File(widgetPath); + File[] files = dir.listFiles(); + for ( File file : files) { + try { + Path path = Paths.get(widgetPath + AAIConstants.AAI_FILESEP + file.getName()); + String widgetPayload = new String(Files.readAllBytes(path)); + String modelInvariantId = getJsonValue(widgetPayload, "model-invariant-id"); + String widgetUri = "/aai/v12/service-design-and-creation/models/model/" + modelInvariantId; + Response response = httpTestUtil.doPut(widgetUri, widgetPayload); + assertEquals("Expected the named-query to be created", 201, response.getStatus()); + } catch ( AAIException | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + private void addNamedQueries() { + String namedQueryPath = "." + AAIConstants.AAI_FILESEP + "bundleconfig-local" + AAIConstants.AAI_FILESEP + "etc" + + AAIConstants.AAI_FILESEP + "scriptdata"+ AAIConstants.AAI_FILESEP + "named-query-json"; + + File dir = new File(namedQueryPath); + File[] files = dir.listFiles(); + for ( File file : files) { + try { + Path path = Paths.get(namedQueryPath + AAIConstants.AAI_FILESEP + file.getName()); + String namedQueryPayload = new String(Files.readAllBytes(path)); + String namedQueryUuid = getJsonValue(namedQueryPayload, "named-query-uuid"); + String namedQueryUri = "/aai/v12/service-design-and-creation/named-queries/named-query/" + namedQueryUuid; + + Response response = httpTestUtil.doPut(namedQueryUri, namedQueryPayload); + assertEquals("Expected the named-query to be created", 201, response.getStatus()); + } catch ( AAIException | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + private String addVersionToUri(String uri ) { + return "/aai/" + Version.getLatest() + "/" + uri; + } + + @Before + public void setup(){ + + httpTestUtil = new HttpTestUtil(); + + System.setProperty("AJSC_HOME", "."); + System.setProperty("BUNDLECONFIG_DIR", "bundleconfig-local"); + + + searchGraph = new SearchGraph(); + + httpHeaders = mock(HttpHeaders.class); + + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + + headersMultiMap.add("X-FromAppId", "JUNIT"); + headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); + headersMultiMap.add("Real-Time", "true"); + headersMultiMap.add("Accept", "application/json"); + headersMultiMap.add("aai-request-context", ""); + + outputMediaTypes = new ArrayList<>(); + outputMediaTypes.add(APPLICATION_JSON); + + aaiRequestContextList = new ArrayList<>(); + aaiRequestContextList.add(""); + + when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes); + when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap); + when(httpHeaders.getRequestHeader("X-FromAppId")).thenReturn(Arrays.asList("JUNIT")); + when(httpHeaders.getRequestHeader("X-TransactionId")).thenReturn(Arrays.asList("JUNIT")); + + when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList); + + + // TODO - Check if this is valid since RemoveDME2QueryParameters seems to be very unreasonable + Mockito.doReturn(null).when(queryParameters).remove(anyObject()); + + when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON); + + if ( !ranOnce ) { + ranOnce = true; + addWidgets(); + addNamedQueries(); + } + } + + + @Test + public void getDHVLogicalLinkByCircuitId_1_0_Test() throws Exception { + + AAIExtensionMap aaiExtMap = new AAIExtensionMap(); + aaiExtMap.setHttpHeaders(httpHeaders); + String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.DHVLogicalLinkByCircuitId-1.0.json"); + String putPayload = PayloadUtil.getNamedQueryPayload("logical-link.DHVLogicalLinkByCircuitId-1.0.json"); + + String linkName = getJsonValue(putPayload, "link-name"); + String putUri = addVersionToUri("network/logical-links/logical-link/" + linkName); + + Response response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the logical-link to be created", 201, response.getStatus()); + + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + Mockito.when(request.getContentType()).thenReturn("application/json"); + + aaiExtMap.setUri("/search/named-query"); + aaiExtMap.setApiVersion(AAIApiVersion.get()); + aaiExtMap.setServletRequest(request); + + SearchGraph searchGraph = new SearchGraph(); + response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap); + System.out.println("response was\n" + response.getEntity().toString()); + assertEquals("Expected success from query", 200, response.getStatus()); + boolean hasLinkName = response.getEntity().toString().indexOf(linkName) > 0 ? true : false; + assertTrue("Response contains linkName", hasLinkName ); + } + + @Test + public void getSvcSubscriberModelInfo_1_0_Test() throws Exception { + + AAIExtensionMap aaiExtMap = new AAIExtensionMap(); + aaiExtMap.setHttpHeaders(httpHeaders); + String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.SvcSubscriberModelInfo-1.0.json"); + + String putPayload = PayloadUtil.getNamedQueryPayload("model.SvcSubscriberModelInfo-1.0.json"); + String modelInvariantId = getJsonValue(putPayload, "model-invariant-id"); + String putUri = addVersionToUri("service-design-and-creation/models/model/" + modelInvariantId); + Response response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the model to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("customer.SvcSubscriberModelInfo-1.0.json"); + String globalCustomerId = getJsonValue(putPayload, "global-customer-id"); + putUri = addVersionToUri("business/customers/customer/" + globalCustomerId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the customer to be created", 201, response.getStatus()); + + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + Mockito.when(request.getContentType()).thenReturn("application/json"); + + aaiExtMap.setUri("/search/named-query"); + aaiExtMap.setApiVersion(AAIApiVersion.get()); + aaiExtMap.setServletRequest(request); + + SearchGraph searchGraph = new SearchGraph(); + response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap); + assertEquals("Expected success from query", 200, response.getStatus()); + boolean hasModelName = response.getEntity().toString().indexOf("junit-model-name") > 0 ? true : false; + assertTrue("Response contains modelName from model-ver", hasModelName ); + } + + @Test + public void getClosedLoopNamedQuery_1_0_Test() throws Exception { + + AAIExtensionMap aaiExtMap = new AAIExtensionMap(); + aaiExtMap.setHttpHeaders(httpHeaders); + String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.closed-loop-named-query-1.0.json"); + + String putPayload = PayloadUtil.getNamedQueryPayload("model.closed-loop-named-query-1.0.json"); + String modelInvariantId = getJsonValue(putPayload, "model-invariant-id"); + String putUri = addVersionToUri("service-design-and-creation/models/model/" + modelInvariantId); + Response response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the model to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("cloud-region.closed-loop-named-query-1.0.json"); + String cloudOwner = getJsonValue(putPayload, "cloud-owner"); + String cloudRegionId = getJsonValue(putPayload, "cloud-region-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the cloud-region to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("cloud-region2.closed-loop-named-query-1.0.json"); + String cloudOwner2 = getJsonValue(putPayload, "cloud-owner"); + String cloudRegionId2 = getJsonValue(putPayload, "cloud-region-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner2 + "/" + cloudRegionId2); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the cloud-region2 to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("tenant.closed-loop-named-query-1.0.json"); + String tenantId = getJsonValue(putPayload, "tenant-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId + + "/tenants/tenant/" + tenantId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the tenant to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("tenant2.closed-loop-named-query-1.0.json"); + String tenantId2 = getJsonValue(putPayload, "tenant-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner2 + "/" + cloudRegionId2 + + "/tenants/tenant/" + tenantId2); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the tenant2 to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("vserver.closed-loop-named-query-1.0.json"); + String vserverId = getJsonValue(putPayload, "vserver-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId + + "/tenants/tenant/" + tenantId + "/vservers/vserver/" + vserverId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the vserver to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("vserver2.closed-loop-named-query-1.0.json"); + String vserverId2 = getJsonValue(putPayload, "vserver-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner2 + "/" + cloudRegionId2 + + "/tenants/tenant/" + tenantId2 + "/vservers/vserver/" + vserverId2); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the vserver2 to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("customer.closed-loop-named-query-1.0.json"); + String globalCustomerId = getJsonValue(putPayload, "global-customer-id"); + putUri = addVersionToUri("business/customers/customer/" + globalCustomerId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the customer to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("generic-vnf.closed-loop-named-query-1.0.json"); + String vnfId = getJsonValue(putPayload, "vnf-id"); + putUri = addVersionToUri("network/generic-vnfs/generic-vnf/" + vnfId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the generic-vnf to be created", 201, response.getStatus()); + + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + Mockito.when(request.getContentType()).thenReturn("application/json"); + + aaiExtMap.setUri("/search/named-query"); + aaiExtMap.setApiVersion(AAIApiVersion.get()); + aaiExtMap.setServletRequest(request); + + SearchGraph searchGraph = new SearchGraph(); + response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap); + assertEquals("Expected success from query", 200, response.getStatus()); + boolean hasModelName = response.getEntity().toString().indexOf("example-model-name-val-closed-loop") > 0 ? true : false; + assertTrue("Response contains modelName from model-ver", hasModelName ); + } + + @Test + public void getComponentList_1_2_Test() throws Exception { + + AAIExtensionMap aaiExtMap = new AAIExtensionMap(); + aaiExtMap.setHttpHeaders(httpHeaders); + String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.ComponentList-1.2.json"); + + String putPayload = PayloadUtil.getNamedQueryPayload("model.ComponentList-1.2.json"); + String modelInvariantId = getJsonValue(putPayload, "model-invariant-id"); + String putUri = addVersionToUri("service-design-and-creation/models/model/" + modelInvariantId); + Response response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the model to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("customer.ComponentList-1.2.json"); + String globalCustomerId = getJsonValue(putPayload, "global-customer-id"); + putUri = addVersionToUri("business/customers/customer/" + globalCustomerId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the customer to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("generic-vnf.ComponentList-1.2.json"); + String vnfId = getJsonValue(putPayload, "vnf-id"); + putUri = addVersionToUri("network/generic-vnfs/generic-vnf/" + vnfId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the generic-vnf to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("vf-module.ComponentList-1.2.json"); + String vfModuleId = getJsonValue(putPayload, "vf-module-id"); + putUri = addVersionToUri("network/generic-vnfs/generic-vnf/" + vnfId + "/vf-modules/vf-module/" + vfModuleId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the vf-module to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("cloud-region.ComponentList-1.2.json"); + String cloudOwner = getJsonValue(putPayload, "cloud-owner"); + String cloudRegionId = getJsonValue(putPayload, "cloud-region-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the cloud-region to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("tenant.ComponentList-1.2.json"); + String tenantId = getJsonValue(putPayload, "tenant-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId + + "/tenants/tenant/" + tenantId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the tenant to be created", 201, response.getStatus()); + + putPayload = PayloadUtil.getNamedQueryPayload("vserver.ComponentList-1.2.json"); + String vserverId = getJsonValue(putPayload, "vserver-id"); + putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId + + "/tenants/tenant/" + tenantId + "/vservers/vserver/" + vserverId); + response = httpTestUtil.doPut(putUri, putPayload); + assertEquals("Expected the vserver to be created", 201, response.getStatus()); + + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + Mockito.when(request.getContentType()).thenReturn("application/json"); + + aaiExtMap.setUri("/search/named-query"); + aaiExtMap.setApiVersion(AAIApiVersion.get()); + aaiExtMap.setServletRequest(request); + + SearchGraph searchGraph = new SearchGraph(); + response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap); + assertEquals("Expected success from query", 200, response.getStatus()); + boolean hasModelName = response.getEntity().toString().indexOf("example-model-name-val-component-list") > 0 ? true : false; + assertTrue("Response contains modelName from model-ver", hasModelName ); + } +} \ No newline at end of file diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java b/aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java new file mode 100644 index 0000000..58c5876 --- /dev/null +++ b/aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java @@ -0,0 +1,62 @@ +package org.onap.aai.rest.search; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.Lists; + +public class GetCustomQueryConfigTest { + + private String configJson; + + @Before + public void setUp() throws Exception { + System.setProperty("AJSC_HOME", "."); + System.setProperty("BUNDLECONFIG_DIR", "bundleconfig-local"); + + + configJson = "{\n \"stored-queries\": [{\n" + + " \"queryName1\": {\n \"query\": {\n \"required-properties\": [\"prop1\", \"prop2\"],\n \"optional-properties\": [\"prop3\", \"prop4\"]\n },\n \"stored-query\": \"out('blah').has('something','foo')\"\n }\n }, {\n" + + " \"queryName2\": {\n \"query\": {\n \"optional-properties\": [\"prop5\"]\n },\n \"stored-query\": \"out('bar').has('stuff','baz')\"\n }\n }, {\n" + + " \"queryName3\": {\n \"stored-query\": \"out('bar1').has('stuff','baz1')\"\n }\n }]\n}"; + } + + + @Test + public void testGetStoredQueryNameWithOptAndReqProps() { + + GetCustomQueryConfig getCustomQueryConfig = new GetCustomQueryConfig(configJson); + CustomQueryConfig cqc = getCustomQueryConfig.getStoredQuery("queryName1"); + + assertEquals(Lists.newArrayList("prop3", "prop4"), cqc.getQueryOptionalProperties()); + assertEquals(Lists.newArrayList("prop1", "prop2"), cqc.getQueryRequiredProperties()); + assertEquals("out('blah').has('something','foo')", cqc.getQuery()); + + } + + @Test + public void testGetStoredQueryNameWithOptProps() { + + GetCustomQueryConfig getCustomQueryConfig = new GetCustomQueryConfig(configJson); + CustomQueryConfig cqc = getCustomQueryConfig.getStoredQuery("queryName2"); + + assertEquals(Lists.newArrayList("prop5"), cqc.getQueryOptionalProperties()); + assertEquals(null, cqc.getQueryRequiredProperties()); + assertEquals("out('bar').has('stuff','baz')", cqc.getQuery()); + + } + + @Test + public void testGetStoredQueryNameWithNoProps() { + + GetCustomQueryConfig getCustomQueryConfig = new GetCustomQueryConfig(configJson); + CustomQueryConfig cqc = getCustomQueryConfig.getStoredQuery("queryName3"); + + assertEquals(null, cqc.getQueryOptionalProperties()); + assertEquals(null, cqc.getQueryRequiredProperties()); + assertEquals("out('bar1').has('stuff','baz1')", cqc.getQuery()); + + } +} diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java b/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java index 5457937..a7c8470 100644 --- a/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java +++ b/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java @@ -73,7 +73,7 @@ public abstract class QueryTest { public void run() { - String query = gremlinServerSingleton.getStoredQuery(getQueryName()); + String query = gremlinServerSingleton.getStoredQueryFromConfig(getQueryName()); Map params = new HashMap<>(); addParam(params); when(dbEngine.getQueryBuilder(any(QueryStyle.class))).thenReturn(new GremlinTraversal<>(loader, graph.traversal())); diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java b/aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java new file mode 100644 index 0000000..b324a94 --- /dev/null +++ b/aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java @@ -0,0 +1,31 @@ +package org.onap.aai.rest.util; + +import static org.junit.Assert.assertNotNull; + +import java.util.Properties; + +import org.junit.Test; + +public class ConvertQueryPropertiesToJsonTest { + @Test + public void testRqdProperty(){ + + ConvertQueryPropertiesToJson convert = new ConvertQueryPropertiesToJson(); + Properties props = new Properties(); + props.setProperty("queryName1", "builder.getVerticesByProperty('rqdProp', rqdPropId).getVerticesByProperty('rqdProp2', rqdPropId2).createEdgeTraversal(EdgeType.TREE, 'node1', 'child-node1')"); + props.setProperty("lastQueryName", "builder.getVerticesByProperty('notRqdProp', \"OUT\").createEdgeTraversal(EdgeType.TREE, 'node2', 'child-node2')"); + String json = convert.convertProperties(props); + assertNotNull(json); + } + + @Test + public void testLastQueryRqdProperty(){ + + ConvertQueryPropertiesToJson convert = new ConvertQueryPropertiesToJson(); + Properties props = new Properties(); + props.setProperty("queryName1", "builder.createEdgeTraversal(EdgeType.TREE, 'node1', 'child-node1')"); + props.setProperty("lastQueryName", "builder.getVerticesByProperty('rqdProp', rqdPropId).createEdgeTraversal(EdgeType.TREE, 'node2', 'child-node2')"); + String json = convert.convertProperties(props); + assertNotNull(json); + } +} -- cgit 1.2.3-korg