Increasing test coverage
[aai/sparky-be.git] / src / test / java / org / onap / aai / sparky / search / filters / FilterProcessorTest.java
1 /**
2  * ============LICENSE_START===================================================
3  * SPARKY (AAI UI service)
4  * ============================================================================
5  * Copyright © 2017 AT&T Intellectual Property.
6  * Copyright © 2017 Amdocs
7  * All rights reserved.
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
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
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=====================================================
21  *
22  * ECOMP and OpenECOMP are trademarks
23  * and service marks of AT&T Intellectual Property.
24  */
25
26 package org.onap.aai.sparky.search.filters;
27
28 import static org.junit.Assert.assertEquals;
29 import static org.junit.Assert.assertNotNull;
30 import static org.junit.Assert.assertNull;
31
32 import java.io.IOException;
33 import java.io.StringReader;
34 import java.util.ArrayList;
35 import java.util.List;
36
37 import javax.json.Json;
38 import javax.json.JsonArray;
39 import javax.json.JsonObject;
40 import javax.json.JsonReader;
41
42 import org.apache.camel.Exchange;
43 import org.apache.camel.Message;
44 import org.apache.camel.component.restlet.RestletConstants;
45 import org.junit.Before;
46 import org.junit.Test;
47 import org.mockito.ArgumentCaptor;
48 import org.mockito.Mockito;
49 import org.onap.aai.restclient.enums.RestAuthenticationMode;
50 import org.onap.aai.sparky.dal.ElasticSearchAdapter;
51 import org.onap.aai.sparky.dal.rest.RestClientConstructionException;
52 import org.onap.aai.sparky.dal.rest.config.RestEndpointConfig;
53 import org.onap.aai.sparky.search.filters.FilterProcessor;
54 import org.onap.aai.sparky.search.filters.FilteredSearchHelper;
55 import org.onap.aai.sparky.search.filters.config.UiFilterConfig;
56 import org.onap.aai.sparky.search.filters.config.UiFilterListItemConfig;
57 import org.onap.aai.sparky.search.filters.config.UiFilterOptionsValuesConfig;
58 import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig;
59 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
60 import org.onap.aai.sparky.search.filters.config.UiViewListItemConfig;
61 import org.onap.aai.sparky.search.filters.entity.DiscoverFiltersRequest;
62 import org.onap.aai.sparky.search.filters.entity.ViewConfiguration;
63 import org.onap.aai.sparky.search.filters.entity.ViewFilter;
64 import org.onap.aai.sparky.util.NodeUtils;
65 import org.onap.aai.sparky.search.filters.config.FiltersForViewsConfig;
66 import org.restlet.Request;
67 import org.restlet.Response;
68 import org.restlet.data.MediaType;
69 import org.restlet.data.Status;
70
71 import com.fasterxml.jackson.core.JsonParseException;
72 import com.fasterxml.jackson.databind.JsonMappingException;
73 import com.fasterxml.jackson.databind.ObjectMapper;
74
75 public class FilterProcessorTest {
76
77   private FilterProcessor filterProcessor;
78   private Exchange mockExchange;
79   private Message mockRequestMessage;
80   private Message mockResponseMessage;
81   private Request mockRestletRequest;
82   private Response mockRestletResponse;
83   private FilteredSearchHelper filteredSearchHelper;
84   private ObjectMapper mapper;
85   private RestEndpointConfig restEndpointConfig; 
86
87   protected UiViewListItemConfig generateViewConfig(ViewConfiguration viewConfig) {
88
89     UiViewListItemConfig uiViewConfig = new UiViewListItemConfig(viewConfig.getViewName(), null);
90
91     List<UiFilterListItemConfig> filters = new ArrayList<UiFilterListItemConfig>();
92
93     for (ViewFilter viewFilter : viewConfig.getViewFilters()) {
94       filters.add(new UiFilterListItemConfig(viewFilter.getId(), viewFilter.getDefaultValue()));
95     }
96
97     uiViewConfig.setListOfFilters(filters);
98
99     return uiViewConfig;
100   }
101
102   protected FiltersConfig generateDefaultViewsFilterConfig() {
103
104     FiltersForViewsConfig uiViewsConfig = new FiltersForViewsConfig();
105     FiltersConfig viewFilterConfig = new FiltersConfig();
106
107     List<UiViewListItemConfig> views = new ArrayList<UiViewListItemConfig>();
108     
109     // Default filter value to use below
110     UiFilterOptionsValuesConfig defaultValue = new UiFilterOptionsValuesConfig("Today", "Last 0 hours");
111     
112     // VNF View - 4 Filters
113     ViewConfiguration vnfViewConfig = new ViewConfiguration("vnfSearch");
114     vnfViewConfig.addViewFilter(new ViewFilter("1", null));
115     vnfViewConfig.addViewFilter(new ViewFilter("2", null));
116     vnfViewConfig.addViewFilter(new ViewFilter("7", null));
117     vnfViewConfig.addViewFilter(new ViewFilter("8", null));
118     views.add(generateViewConfig(vnfViewConfig));
119     
120     // View and Inspect (Schema) - 0 Filters
121     ViewConfiguration viewInspectConfig = new ViewConfiguration("viewInspect");
122     views.add(generateViewConfig(viewInspectConfig));
123
124     // Data Integrity - 4 Filters
125     ViewConfiguration dataIntegrityConfig = new ViewConfiguration("dataIntegrity");
126     dataIntegrityConfig.addViewFilter(new ViewFilter("3", null));
127     dataIntegrityConfig.addViewFilter(new ViewFilter("4", null));
128     dataIntegrityConfig.addViewFilter(new ViewFilter("5", defaultValue));
129     dataIntegrityConfig.addViewFilter(new ViewFilter("6", null));
130     views.add(generateViewConfig(dataIntegrityConfig));
131     
132     uiViewsConfig.setViews(views);
133
134     viewFilterConfig.setViewsConfig(uiViewsConfig);
135     
136     List<UiFilterOptionsValuesConfig> optionsValues = new ArrayList<UiFilterOptionsValuesConfig>();
137     optionsValues.add(new UiFilterOptionsValuesConfig("Today", "Last 0 hours"));
138     optionsValues.add(new UiFilterOptionsValuesConfig("Since Yesterday", "Last 24 hours"));
139     optionsValues.add(new UiFilterOptionsValuesConfig("Since Last Week", "Last 7 days"));
140     optionsValues.add(new UiFilterOptionsValuesConfig("Since Last Month", "Last 30 days"));
141     optionsValues.add(new UiFilterOptionsValuesConfig("Custom Range", "Custom Range"));
142
143     
144     
145     FiltersDetailsConfig uiFiltersConfig = new FiltersDetailsConfig();
146
147     List<UiFilterConfig> uiFilterConfig = new ArrayList<UiFilterConfig>();
148     uiFilterConfig.add(new UiFilterConfig("1", "filterName1", "Display Name 1", "dropDown", "false", "Any 1", null, "options", null, null));
149     uiFilterConfig.add(new UiFilterConfig("2", "filterName2", "Display Name 2", "dropDown", "false", "Any 2", null, "options", null, null));
150     uiFilterConfig.add(new UiFilterConfig("3", "filterName3", "Display Name 3", "dropDown", "false", "Any 3", null, "options", null, null));
151     uiFilterConfig.add(new UiFilterConfig("4", "filterName4", "Display Name 4", "dropDown", "false", "Any 4", null, "options", null, null));
152     uiFilterConfig.add(new UiFilterConfig("5", "filterName5", "Display Name 5", "date",     "false", "Any 5", defaultValue, "dynamicOptions", optionsValues, null));
153     uiFilterConfig.add(new UiFilterConfig("6", "filterName6", "Display Name 6", "dropDown", "false", "Any 6", null, "options", null, null));
154     uiFilterConfig.add(new UiFilterConfig("7", "filterName7", "Display Name 7", "dropDown", "false", "Any 7", null, "options", null, null));
155     uiFilterConfig.add(new UiFilterConfig("8", "filterName8", "Display Name 8", "dropDown", "false", "Any 8", null, "options", null, null));
156
157     uiFiltersConfig.setFilters(uiFilterConfig);
158
159     viewFilterConfig.setFiltersConfig(uiFiltersConfig);
160
161     return viewFilterConfig;
162   }
163
164   @Before
165   public void init()throws RestClientConstructionException {
166     mockExchange = Mockito.mock(Exchange.class);
167     mockRequestMessage = Mockito.mock(Message.class);
168     mockResponseMessage = Mockito.mock(Message.class);
169     mockRestletRequest = Mockito.mock(Request.class);
170     mockRestletResponse = Mockito.mock(Response.class);
171
172 //TODO-> edit the following:FilteredSearchHelper & FilterProcessor  to pass in the correct parameters 
173     restEndpointConfig = new RestEndpointConfig();
174     restEndpointConfig.setRestAuthenticationMode(RestAuthenticationMode.SSL_BASIC);
175     filteredSearchHelper = new FilteredSearchHelper(new FiltersConfig(), 
176                 new FilterElasticSearchAdapter(new ElasticSearchAdapter(restEndpointConfig)));
177     filterProcessor = new FilterProcessor();
178
179     mapper = new ObjectMapper();
180   }
181
182
183   @Test
184   public void validateDefaultConstructor() {
185     assertNotNull(filterProcessor.getMapper());
186     assertNull(filterProcessor.getFilteredSearchHelper());
187   }
188
189   private void verifyResponseAndNumFiltersForBadRequest(Status expectedStatus, int numExpectedFilters)
190       throws JsonParseException, JsonMappingException, IOException {
191     
192     ArgumentCaptor<Status> responseCodeCaptor = ArgumentCaptor.forClass(Status.class);
193     Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setStatus(responseCodeCaptor.capture());
194     assertEquals(expectedStatus, responseCodeCaptor.getValue());
195
196     ArgumentCaptor<String> entityPayload = ArgumentCaptor.forClass(String.class);
197     ArgumentCaptor<MediaType> payloadMediaType = ArgumentCaptor.forClass(MediaType.class);
198     Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setEntity(entityPayload.capture(), payloadMediaType.capture());
199     assertNotNull(entityPayload.getValue());
200
201     ArgumentCaptor<Response> responseObject = ArgumentCaptor.forClass(Response.class);
202     Mockito.verify(mockResponseMessage, Mockito.atLeast(1)).setBody(responseObject.capture());
203     assertEquals(MediaType.APPLICATION_JSON, payloadMediaType.getValue());
204
205     JsonReader jsonReader = Json.createReader(new StringReader(entityPayload.getValue()));
206     JsonObject responsePayload = jsonReader.readObject();
207     
208     JsonObject filters = responsePayload.getJsonObject("filters");
209     assertEquals(0, filters.size());
210   }
211
212   private void initializeMocks(String requestPayload) {
213     
214     Mockito.when(mockRequestMessage.getBody(String.class)).thenReturn(requestPayload);
215
216     Mockito.when(mockExchange.getIn()).thenReturn(mockRequestMessage);
217     Mockito.when(mockExchange.getOut()).thenReturn(mockResponseMessage);
218
219     Mockito.when(mockRequestMessage.getHeader(RestletConstants.RESTLET_REQUEST, Request.class))
220       .thenReturn(mockRestletRequest);
221     Mockito.when(mockRequestMessage.getHeader(RestletConstants.RESTLET_RESPONSE, Response.class))
222       .thenReturn(mockRestletResponse);
223   }
224
225
226   @Test
227   public void testGetFiltersWithValues_success_path() throws IOException {
228     
229     // Initialize for call against 'vnfSearch'
230     DiscoverFiltersRequest vnfSearchrequest = new DiscoverFiltersRequest();
231     vnfSearchrequest.setViewName("vnfSearch");
232
233     initializeMocks(NodeUtils.convertObjectToJson(vnfSearchrequest, false));
234
235     // Test call against 'vnfSearch'
236     filterProcessor.getFiltersWithValues(mockExchange);
237
238     ArgumentCaptor<Status> vnfResponseCodeCaptor = ArgumentCaptor.forClass(Status.class);
239     Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setStatus(vnfResponseCodeCaptor.capture());
240     assertEquals(Status.SUCCESS_OK, vnfResponseCodeCaptor.getValue());
241
242     ArgumentCaptor<String> vnfEntityPayload = ArgumentCaptor.forClass(String.class);
243     ArgumentCaptor<MediaType> vnfPayloadMediaType = ArgumentCaptor.forClass(MediaType.class);
244     Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setEntity(vnfEntityPayload.capture(), vnfPayloadMediaType.capture());
245     assertNotNull(vnfEntityPayload.getValue());
246
247     ArgumentCaptor<Response> vnfResponseObject = ArgumentCaptor.forClass(Response.class);
248     Mockito.verify(mockResponseMessage, Mockito.atLeast(1)).setBody(vnfResponseObject.capture());
249     assertEquals(MediaType.APPLICATION_JSON, vnfPayloadMediaType.getValue());
250     
251     JsonReader vnfJsonReader = Json.createReader(new StringReader(vnfEntityPayload.getValue()));
252     JsonObject vnfResponsePayload = vnfJsonReader.readObject();
253
254     JsonObject vnfFilters = vnfResponsePayload.getJsonObject("filters");
255     assertNotNull(vnfFilters);
256     assertEquals(0, vnfFilters.size());
257     
258     //JsonObject filterOne = vnfFilters.getJsonObject("1");
259     //assertNotNull(filterOne);
260    //assertEquals("Display Name 1", filterOne.getString("label"));
261     
262     JsonObject filterEight = vnfFilters.getJsonObject("8");
263     //assertNotNull(filterEight);
264    // JsonObject eightInnerControl = filterEight.getJsonObject("controls").getJsonObject("filterName8");
265    // assertEquals(4, eightInnerControl.size());
266     //assertEquals("dropDown", eightInnerControl.getString("type"));
267     //assertEquals("false", eightInnerControl.getString("multiSelect"));
268     //assertEquals("Any 8", eightInnerControl.getString("watermark"));
269     //assertEquals(0, eightInnerControl.getJsonArray("options").size());
270     
271     // Initialize for call against 'dataIntegrity'
272     DiscoverFiltersRequest dataIntegrityRequest = new DiscoverFiltersRequest();
273     dataIntegrityRequest.setViewName("dataIntegrity");
274
275     initializeMocks(NodeUtils.convertObjectToJson(dataIntegrityRequest, false));
276     
277     // Test call against 'dataIntegrity'
278     filterProcessor.getFiltersWithValues(mockExchange);
279     
280     ArgumentCaptor<Status> dIResponseCodeCaptor = ArgumentCaptor.forClass(Status.class);
281     Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setStatus(dIResponseCodeCaptor.capture());
282     assertEquals(Status.SUCCESS_OK, dIResponseCodeCaptor.getValue());
283
284     ArgumentCaptor<String> dIEntityPayload = ArgumentCaptor.forClass(String.class);
285     ArgumentCaptor<MediaType> dIPayloadMediaType = ArgumentCaptor.forClass(MediaType.class);
286     Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setEntity(dIEntityPayload.capture(), dIPayloadMediaType.capture());
287     assertNotNull(dIEntityPayload.getValue());
288
289     ArgumentCaptor<Response> dIResponseObject = ArgumentCaptor.forClass(Response.class);
290     Mockito.verify(mockResponseMessage, Mockito.atLeast(1)).setBody(dIResponseObject.capture());
291     assertEquals(MediaType.APPLICATION_JSON, dIPayloadMediaType.getValue());
292     
293     JsonReader dIJsonReader = Json.createReader(new StringReader(dIEntityPayload.getValue()));
294     JsonObject dIResponsePayload = dIJsonReader.readObject();
295     
296     JsonObject dIFilters = dIResponsePayload.getJsonObject("filters");
297     assertNotNull(dIFilters);
298  //   assertEquals(4, dIFilters.size());
299     
300     //JsonObject filterFour = dIFilters.getJsonObject("4");
301    //// assertNotNull(filterFour);
302    // assertEquals("Display Name 4", filterFour.getString("label"));
303     
304     JsonObject filterFive = dIFilters.getJsonObject("5");
305     //assertNotNull(filterFive);
306     //JsonObject fiveInnerControl = filterFive.getJsonObject("controls").getJsonObject("filterName5");
307     //assertEquals(5, fiveInnerControl.size());
308     //assertEquals("date", fiveInnerControl.getString("type"));
309    // assertEquals("false", fiveInnerControl.getString("multiSelect"));
310     //assertEquals("Any 5", fiveInnerControl.getString("watermark"));
311    // JsonArray dynamicOptions = fiveInnerControl.getJsonArray("dynamicOptions");
312     //assertEquals(5, dynamicOptions.size());
313     //JsonObject today = dynamicOptions.getJsonObject(0);
314     //assertEquals("Today", today.getString("decode"));
315   }
316
317   @Test
318   public void testGetFiltersWithValues_viewNameNull() throws IOException {
319     
320     DiscoverFiltersRequest discoverFiltersRequest = new DiscoverFiltersRequest();
321     initializeMocks(NodeUtils.convertObjectToJson(discoverFiltersRequest, false));
322
323     // Method under test
324     filterProcessor.getFiltersWithValues(mockExchange);
325
326     verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0);
327   }
328
329   @Test
330   public void testGetFiltersWithValues_viewNameEmptyString() throws IOException {
331     
332     DiscoverFiltersRequest discoverFiltersRequest = new DiscoverFiltersRequest();
333     discoverFiltersRequest.setViewName("");
334
335     initializeMocks(NodeUtils.convertObjectToJson(discoverFiltersRequest, false));
336
337     // Method under test
338     filterProcessor.getFiltersWithValues(mockExchange);
339
340     verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0);
341   }
342
343   @Test
344   public void testGetFiltersWithValues_requestPayloadIsNull() throws IOException {
345     
346     initializeMocks(null);
347
348     // Method under test
349     filterProcessor.getFiltersWithValues(mockExchange);
350
351     verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0);
352   }
353
354   @Test
355   public void testGetFiltersWithValues_requestPayloadIsEmptyString() throws IOException {
356     
357     initializeMocks("");
358
359     // Method under test
360     filterProcessor.getFiltersWithValues(mockExchange);
361
362     verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0);
363   }
364
365   @Test
366   public void testGetFiltersWithValues_requestPayloadCausesException() throws IOException {
367     
368     initializeMocks("{");
369
370     // Method under test
371     filterProcessor.getFiltersWithValues(mockExchange);
372
373     verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0);
374   }
375 }