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