2 * ============LICENSE_START===================================================
3 * SPARKY (AAI UI service)
4 * ============================================================================
5 * Copyright © 2017 AT&T Intellectual Property.
6 * Copyright © 2017 Amdocs
8 * ============================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=====================================================
22 * ECOMP and OpenECOMP are trademarks
23 * and service marks of AT&T Intellectual Property.
26 package org.onap.aai.sparky.search.filters;
28 import static org.junit.Assert.assertEquals;
29 import static org.junit.Assert.assertNotNull;
30 import static org.junit.Assert.assertNull;
32 import java.io.IOException;
33 import java.io.StringReader;
34 import java.util.ArrayList;
35 import java.util.List;
37 import javax.json.Json;
38 import javax.json.JsonArray;
39 import javax.json.JsonObject;
40 import javax.json.JsonReader;
41 import javax.json.stream.JsonParsingException;
42 import javax.servlet.http.HttpServletRequest;
44 import org.apache.camel.CamelContext;
45 import org.apache.camel.Exchange;
46 import org.apache.camel.Message;
47 import org.apache.camel.component.restlet.RestletConstants;
48 import org.apache.camel.impl.DefaultCamelContext;
49 import org.apache.camel.impl.DefaultExchange;
50 import org.junit.Before;
51 import org.junit.Test;
52 import org.mockito.ArgumentCaptor;
53 import org.mockito.Mockito;
54 import org.onap.aai.restclient.enums.RestAuthenticationMode;
55 import org.onap.aai.sparky.config.SparkyResourceLoader;
56 import org.onap.aai.sparky.dal.ElasticSearchAdapter;
57 import org.onap.aai.sparky.dal.rest.RestClientConstructionException;
58 import org.onap.aai.sparky.dal.rest.config.RestEndpointConfig;
59 import org.onap.aai.sparky.search.filters.FilterProcessor;
60 import org.onap.aai.sparky.search.filters.FilteredSearchHelper;
61 import org.onap.aai.sparky.search.filters.config.UiFilterConfig;
62 import org.onap.aai.sparky.search.filters.config.UiFilterListItemConfig;
63 import org.onap.aai.sparky.search.filters.config.UiFilterOptionsValuesConfig;
64 import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig;
65 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
66 import org.onap.aai.sparky.search.filters.config.UiViewListItemConfig;
67 import org.onap.aai.sparky.search.filters.entity.DiscoverFiltersRequest;
68 import org.onap.aai.sparky.search.filters.entity.ViewConfiguration;
69 import org.onap.aai.sparky.search.filters.entity.ViewFilter;
70 import org.onap.aai.sparky.util.HttpServletHelper;
71 import org.onap.aai.sparky.util.NodeUtils;
72 import org.onap.aai.sparky.util.SparkyTestConstants;
73 import org.onap.aai.sparky.search.filters.config.FiltersForViewsConfig;
74 import org.restlet.Request;
75 import org.restlet.Response;
76 import org.restlet.data.MediaType;
77 import org.restlet.data.Status;
78 import org.springframework.core.io.DefaultResourceLoader;
80 import com.fasterxml.jackson.core.JsonParseException;
81 import com.fasterxml.jackson.databind.JsonMappingException;
82 import com.fasterxml.jackson.databind.ObjectMapper;
84 public class FilterProcessorTest {
86 private FilterProcessor filterProcessor;
87 private FilteredSearchHelper filteredSearchHelper;
88 private ObjectMapper mapper;
89 private RestEndpointConfig restEndpointConfig;
91 private Exchange exchange;
92 private CamelContext camelContext;
93 private Message mockRequestMessage;
96 protected UiViewListItemConfig generateViewConfig(ViewConfiguration viewConfig) {
98 UiViewListItemConfig uiViewConfig = new UiViewListItemConfig(viewConfig.getViewName(), null);
100 List<UiFilterListItemConfig> filters = new ArrayList<UiFilterListItemConfig>();
102 for (ViewFilter viewFilter : viewConfig.getViewFilters()) {
103 filters.add(new UiFilterListItemConfig(viewFilter.getId(), viewFilter.getDefaultValue()));
106 uiViewConfig.setListOfFilters(filters);
111 protected FiltersConfig generateDefaultViewsFilterConfig() {
113 FiltersForViewsConfig uiViewsConfig = new FiltersForViewsConfig();
114 FiltersConfig viewFilterConfig = new FiltersConfig();
116 List<UiViewListItemConfig> views = new ArrayList<UiViewListItemConfig>();
118 // Default filter value to use below
119 UiFilterOptionsValuesConfig defaultValue = new UiFilterOptionsValuesConfig("Today", "Last 0 hours");
121 // VNF View - 4 Filters
122 ViewConfiguration vnfViewConfig = new ViewConfiguration("vnfSearch");
123 vnfViewConfig.addViewFilter(new ViewFilter("1", null));
124 vnfViewConfig.addViewFilter(new ViewFilter("2", null));
125 vnfViewConfig.addViewFilter(new ViewFilter("7", null));
126 vnfViewConfig.addViewFilter(new ViewFilter("8", null));
127 views.add(generateViewConfig(vnfViewConfig));
129 // View and Inspect (Schema) - 0 Filters
130 ViewConfiguration viewInspectConfig = new ViewConfiguration("viewInspect");
131 views.add(generateViewConfig(viewInspectConfig));
133 // Data Integrity - 4 Filters
134 ViewConfiguration dataIntegrityConfig = new ViewConfiguration("dataIntegrity");
135 dataIntegrityConfig.addViewFilter(new ViewFilter("3", null));
136 dataIntegrityConfig.addViewFilter(new ViewFilter("4", null));
137 dataIntegrityConfig.addViewFilter(new ViewFilter("5", defaultValue));
138 dataIntegrityConfig.addViewFilter(new ViewFilter("6", null));
139 views.add(generateViewConfig(dataIntegrityConfig));
141 uiViewsConfig.setViews(views);
143 viewFilterConfig.setViewsConfig(uiViewsConfig);
145 List<UiFilterOptionsValuesConfig> optionsValues = new ArrayList<UiFilterOptionsValuesConfig>();
146 optionsValues.add(new UiFilterOptionsValuesConfig("Today", "Last 0 hours"));
147 optionsValues.add(new UiFilterOptionsValuesConfig("Since Yesterday", "Last 24 hours"));
148 optionsValues.add(new UiFilterOptionsValuesConfig("Since Last Week", "Last 7 days"));
149 optionsValues.add(new UiFilterOptionsValuesConfig("Since Last Month", "Last 30 days"));
150 optionsValues.add(new UiFilterOptionsValuesConfig("Custom Range", "Custom Range"));
154 FiltersDetailsConfig uiFiltersConfig = new FiltersDetailsConfig();
156 List<UiFilterConfig> uiFilterConfig = new ArrayList<UiFilterConfig>();
157 uiFilterConfig.add(new UiFilterConfig("1", "filterName1", "Display Name 1", "dropDown", "false", "Any 1", null, "options", null, null));
158 uiFilterConfig.add(new UiFilterConfig("2", "filterName2", "Display Name 2", "dropDown", "false", "Any 2", null, "options", null, null));
159 uiFilterConfig.add(new UiFilterConfig("3", "filterName3", "Display Name 3", "dropDown", "false", "Any 3", null, "options", null, null));
160 uiFilterConfig.add(new UiFilterConfig("4", "filterName4", "Display Name 4", "dropDown", "false", "Any 4", null, "options", null, null));
161 uiFilterConfig.add(new UiFilterConfig("5", "filterName5", "Display Name 5", "date", "false", "Any 5", defaultValue, "dynamicOptions", optionsValues, null));
162 uiFilterConfig.add(new UiFilterConfig("6", "filterName6", "Display Name 6", "dropDown", "false", "Any 6", null, "options", null, null));
163 uiFilterConfig.add(new UiFilterConfig("7", "filterName7", "Display Name 7", "dropDown", "false", "Any 7", null, "options", null, null));
164 uiFilterConfig.add(new UiFilterConfig("8", "filterName8", "Display Name 8", "dropDown", "false", "Any 8", null, "options", null, null));
166 uiFiltersConfig.setFilters(uiFilterConfig);
168 viewFilterConfig.setFiltersConfig(uiFiltersConfig);
170 return viewFilterConfig;
174 public void init()throws RestClientConstructionException {
176 camelContext = new DefaultCamelContext();
177 exchange = new DefaultExchange(camelContext);
179 mockRequestMessage = Mockito.mock(Message.class);
181 exchange.setIn(mockRequestMessage);
183 //TODO-> edit the following:FilteredSearchHelper & FilterProcessor to pass in the correct parameters
184 restEndpointConfig = new RestEndpointConfig();
185 restEndpointConfig.setRestAuthenticationMode(RestAuthenticationMode.SSL_BASIC);
186 filteredSearchHelper = new FilteredSearchHelper(new FiltersConfig(),
187 new FilterElasticSearchAdapter(new ElasticSearchAdapter(restEndpointConfig)));
188 filterProcessor = new FilterProcessor();
190 mapper = new ObjectMapper();
195 public void validateDefaultConstructor() {
196 assertNotNull(filterProcessor.getMapper());
197 assertNull(filterProcessor.getFilteredSearchHelper());
200 private void verifyResponseAndNumFiltersForBadRequest(Exchange exchange, Status expectedStatus, int numExpectedFilters)
201 throws JsonParseException, JsonMappingException, IOException {
203 assertEquals(expectedStatus.getCode(), exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE));
205 String entityPayload = exchange.getOut().getBody(String.class);
206 assertNotNull(entityPayload);
208 JsonReader jsonReader = Json.createReader(new StringReader(entityPayload));
209 JsonObject responsePayload = jsonReader.readObject();
211 JsonObject filters = responsePayload.getJsonObject("filters");
212 assertEquals(0, filters.size());
215 private void initializeMocks(String requestPayload) throws IOException {
217 HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
218 if ( requestPayload != null) {
219 HttpServletHelper.setRequestPayload(request, "application/json", requestPayload);
222 Mockito.when(request.getRequestURI()).thenReturn("fakeUri");
223 Mockito.when(request.getLocalPort()).thenReturn(8001);
224 Mockito.when(mockRequestMessage.getBody(Mockito.eq(HttpServletRequest.class))).thenReturn(request);
225 Mockito.when(mockRequestMessage.getBody(Mockito.eq(String.class))).thenReturn(requestPayload);
227 SparkyResourceLoader resourceLoader = new SparkyResourceLoader();
228 resourceLoader.setResourceLoader(new DefaultResourceLoader());
230 filterProcessor.setFilteredSearchHelper(filteredSearchHelper);
232 FiltersConfig filtersConfig = new FiltersConfig();
233 filtersConfig.initializeFiltersDetailsConfig(resourceLoader.getResourceAsFile(SparkyTestConstants.FILTERS_JSON_FILE, false));
234 filtersConfig.initializeFiltersForViewsConfig(resourceLoader.getResourceAsFile(SparkyTestConstants.VIEWS_JSON_FILE, false));
236 filteredSearchHelper.setFiltersConfig(filtersConfig);
242 public void testGetFiltersWithValues_success_path() throws IOException {
244 // Initialize for call against 'vnfSearch'
245 DiscoverFiltersRequest vnfSearchrequest = new DiscoverFiltersRequest();
246 vnfSearchrequest.setViewName("vnfSearch");
248 initializeMocks(NodeUtils.convertObjectToJson(vnfSearchrequest, false));
250 // Test call against 'vnfSearch'
251 filterProcessor.getFiltersWithValues(exchange);
253 assertEquals(200, exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE));
255 String entityPayload = exchange.getOut().getBody(String.class);
256 assertNotNull(entityPayload);
258 JsonReader vnfJsonReader = Json.createReader(new StringReader(entityPayload));
259 JsonObject vnfResponsePayload = vnfJsonReader.readObject();
261 JsonObject vnfFilters = vnfResponsePayload.getJsonObject("filters");
262 assertNotNull(vnfFilters);
263 assertEquals(0, vnfFilters.size());
265 //JsonObject filterOne = vnfFilters.getJsonObject("1");
266 //assertNotNull(filterOne);
267 //assertEquals("Display Name 1", filterOne.getString("label"));
269 JsonObject filterEight = vnfFilters.getJsonObject("8");
270 //assertNotNull(filterEight);
271 // JsonObject eightInnerControl = filterEight.getJsonObject("controls").getJsonObject("filterName8");
272 // assertEquals(4, eightInnerControl.size());
273 //assertEquals("dropDown", eightInnerControl.getString("type"));
274 //assertEquals("false", eightInnerControl.getString("multiSelect"));
275 //assertEquals("Any 8", eightInnerControl.getString("watermark"));
276 //assertEquals(0, eightInnerControl.getJsonArray("options").size());
278 // Initialize for call against 'dataIntegrity'
279 DiscoverFiltersRequest dataIntegrityRequest = new DiscoverFiltersRequest();
280 dataIntegrityRequest.setViewName("dataIntegrity");
282 initializeMocks(NodeUtils.convertObjectToJson(dataIntegrityRequest, false));
284 // Test call against 'dataIntegrity'
285 filterProcessor.getFiltersWithValues(exchange);
287 assertEquals(200, exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE));
289 entityPayload = exchange.getOut().getBody(String.class);
290 assertNotNull(entityPayload);
292 JsonReader dIJsonReader = Json.createReader(new StringReader(entityPayload));
293 JsonObject dIResponsePayload = dIJsonReader.readObject();
295 JsonObject dIFilters = dIResponsePayload.getJsonObject("filters");
296 assertNotNull(dIFilters);
297 // assertEquals(4, dIFilters.size());
299 //JsonObject filterFour = dIFilters.getJsonObject("4");
300 //// assertNotNull(filterFour);
301 // assertEquals("Display Name 4", filterFour.getString("label"));
303 JsonObject filterFive = dIFilters.getJsonObject("5");
304 //assertNotNull(filterFive);
305 //JsonObject fiveInnerControl = filterFive.getJsonObject("controls").getJsonObject("filterName5");
306 //assertEquals(5, fiveInnerControl.size());
307 //assertEquals("date", fiveInnerControl.getString("type"));
308 // assertEquals("false", fiveInnerControl.getString("multiSelect"));
309 //assertEquals("Any 5", fiveInnerControl.getString("watermark"));
310 // JsonArray dynamicOptions = fiveInnerControl.getJsonArray("dynamicOptions");
311 //assertEquals(5, dynamicOptions.size());
312 //JsonObject today = dynamicOptions.getJsonObject(0);
313 //assertEquals("Today", today.getString("decode"));
317 public void testGetFiltersWithValues_viewNameNull() throws IOException {
319 DiscoverFiltersRequest discoverFiltersRequest = new DiscoverFiltersRequest();
320 initializeMocks(NodeUtils.convertObjectToJson(discoverFiltersRequest, false));
323 filterProcessor.getFiltersWithValues(exchange);
325 verifyResponseAndNumFiltersForBadRequest(exchange, Status.CLIENT_ERROR_NOT_FOUND, 0);
329 public void testGetFiltersWithValues_viewNameEmptyString() throws IOException {
331 DiscoverFiltersRequest discoverFiltersRequest = new DiscoverFiltersRequest();
332 discoverFiltersRequest.setViewName("");
334 initializeMocks(NodeUtils.convertObjectToJson(discoverFiltersRequest, false));
337 filterProcessor.getFiltersWithValues(exchange);
339 verifyResponseAndNumFiltersForBadRequest(exchange, Status.CLIENT_ERROR_NOT_FOUND, 0);
343 public void testGetFiltersWithValues_requestPayloadIsNull() throws IOException {
345 initializeMocks(null);
348 filterProcessor.getFiltersWithValues(exchange);
350 verifyResponseAndNumFiltersForBadRequest(exchange, Status.CLIENT_ERROR_NOT_FOUND, 0);
354 public void testGetFiltersWithValues_requestPayloadIsEmptyString() throws IOException {
359 filterProcessor.getFiltersWithValues(exchange);
361 verifyResponseAndNumFiltersForBadRequest(exchange, Status.CLIENT_ERROR_NOT_FOUND, 0);
364 @Test(expected=JsonParsingException.class)
365 public void testGetFiltersWithValues_requestPayloadCausesException() throws IOException {
367 initializeMocks("{");
370 filterProcessor.getFiltersWithValues(exchange);
372 verifyResponseAndNumFiltersForBadRequest(exchange, Status.SERVER_ERROR_INTERNAL, 0);