changed the header and license
[aai/sparky-fe.git] / test / tierSupport / autoCompleteSearchBar / autoCompleteSearchBar.test.js
1 /*
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017-2018 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 import {expect, deep} from 'chai';
22 import React from 'react';
23 import {Provider} from 'react-redux';
24 import sinon from 'sinon';
25 import configureStore from 'redux-mock-store';
26 import thunk from 'redux-thunk';
27 import {storeCreator} from 'app/AppStore.js';
28 import TestUtils from 'react-dom/test-utils';
29 import {
30         autoCompleteSearchBarActionTypes,
31         ERROR_INVALID_SEARCH_TERMS,
32         TS_BACKEND_SEARCH_SELECTED_NODE_URL,
33         NO_MATCHES_FOUND
34 } from 'generic-components/autoCompleteSearchBar/AutoCompleteSearchBarConstants.js';
35 import {AutoCompleteSearchBar} from 'generic-components/autoCompleteSearchBar/AutoCompleteSearchBar.jsx';
36 import {ERROR_RETRIEVING_DATA, POST, POST_HEADER} from 'app/networking/NetworkConstants.js';
37 import {tierSupportActionTypes, TSUI_SEARCH_URL} from 'app/tierSupport/TierSupportConstants.js';
38
39 import {mount, shallow} from 'enzyme';
40 import i18n from 'utils/i18n/i18n';
41 import {
42         queryRequestedValues,
43         clearSuggestionsTextField,
44         onSuggestionsChange,
45         onSuggestionsClearRequested,
46         querySelectedNodeElement,
47         getInvalidSearchInputEvent
48 } from 'app/globalAutoCompleteSearchBar/GlobalAutoCompleteSearchBarActions.js';
49 import * as networkCall from 'app/networking/NetworkCalls.js';
50 import autoCompleteSearchBarTestConstants from './autoCompleteSearchBarTestConstants';
51
52 const middlewares = [thunk]; // add your middlewares like `redux-thunk`
53 const mockStore = configureStore(middlewares);
54
55
56 describe('Core AutoCompleteSearchBar suite', function() {
57
58   describe('AutoCompleteSearchBar - View test ', function() {
59     let wrapper = undefined;
60
61     beforeEach(() => {
62       wrapper = mount(
63                                 <AutoCompleteSearchBar
64                         onSuggestionsFetchRequested={() => {}}
65                         value=''
66                         suggestions={[]}
67                         cachedSuggestions={[]}
68                         feedbackMsgText=''
69                         feedbackMsgSeverity=''
70                                 />
71                         );
72     });
73
74     function createState(currentScreen, tierSupport) {
75       return {
76         currentScreen: currentScreen,
77         tierSupport: tierSupport
78       };
79     }
80
81
82
83     it('Test flow - test onNewSearch() success test: Expect tierSupportActionTypes.TS_NODE_SEARCH_RESULTS action being passed When the selected node is found in the main database and e', done => {
84       const mStore = mockStore({});
85       let mockNetwork = sinon.mock(networkCall);
86       mockNetwork.expects('fetchRequest').once().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.validResponseJsonForNodeSearchFromFetchWithHits));
87       let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword);
88       wrapper.setProps({
89         value: autoCompleteSearchBarTestConstants.nodeSearchKeyword,
90         suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
91         cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
92         onNewSearch: (searchRequestObject, value) => {
93           if (Object.keys(searchRequestObject).length === 0) {
94             mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword));
95           } else {
96             mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest));
97           }
98         }
99
100       });
101
102       function onSucessfullNodeDetailsFoundEvent(){
103         return {
104           type: tierSupportActionTypes.TS_NODE_SEARCH_RESULTS,
105           data: autoCompleteSearchBarTestConstants.validResponseJsonForNodeSearchFromFetchWithHits
106         };
107       }
108       wrapper.find('.auto-complete-search-button').simulate('click');
109       mockNetwork.verify();
110       mockNetwork.restore();
111       setTimeout(() => expect(mStore.getActions()[0]).to.deep.equal(onSucessfullNodeDetailsFoundEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut);
112       setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut);
113     });
114
115     it('Test flow - test onNewSearch() failure test: Expect tierSupportActionTypes.TS_NODE_SEARCH_NO_RESULTS action being passed When the selected node is not found in the main database and e', done => {
116
117       const mStore = mockStore({});
118       let mockNetwork = sinon.mock(networkCall);
119       mockNetwork.expects('fetchRequest').once().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.inValidResponseJsonForNodeSearchFromFetchWithHits));
120       let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword);
121       wrapper.setProps({
122         value: autoCompleteSearchBarTestConstants.nodeSearchKeyword,
123         suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
124         cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
125         onNewSearch: (searchRequestObject, value) => {
126           if (Object.keys(searchRequestObject).length === 0) {
127             mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword));
128           } else {
129             mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest));
130           }
131         }
132
133       });
134
135       function onNofullNodeDetailsFoundEvent(){
136         return {
137           type: tierSupportActionTypes.TS_NODE_SEARCH_NO_RESULTS,
138           data: {searchTag: autoCompleteSearchBarTestConstants.nodeSearchKeyword}
139         };
140       }
141       wrapper.find('.auto-complete-search-button').simulate('click');
142       mockNetwork.verify();
143       mockNetwork.restore();
144       setTimeout(() => {
145         expect(mStore.getActions()[0]).to.deep.equal(onNofullNodeDetailsFoundEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut;
146       });
147       setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut);
148     });
149
150     it('Test flow - test onNewSearch() failure: Expect tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR action being passed When Network fails', done => {
151       const mStore = mockStore({});
152       let mockNetwork = sinon.mock(networkCall);
153       mockNetwork.expects('fetchRequest').once().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError));
154       let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword);
155       wrapper.setProps({
156         value: autoCompleteSearchBarTestConstants.nodeSearchKeyword,
157         suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
158         cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
159         onNewSearch: (searchRequestObject, value) => {
160           if (Object.keys(searchRequestObject).length === 0) {
161             mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword));
162           } else {
163             mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest));
164           }
165         }
166
167       });
168
169       function onInvalidSelectedNodeSearchEvent(){
170         return {
171           type: tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR,
172           data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_RETRIEVING_DATA}
173         };
174       }
175       wrapper.find('.auto-complete-search-button').simulate('click');
176       mockNetwork.verify();
177       mockNetwork.restore();
178       setTimeout(() => {
179         expect(mStore.getActions()[0]).to.deep.equal(onInvalidSelectedNodeSearchEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut;
180       });
181       setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut);
182     });
183
184
185     it('Test flow - test onNewSearch() failure: Expect tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS action being passed When no cached suggestions are found', done => {
186       const mStore = mockStore({});
187       let mockNetwork = sinon.mock(networkCall);
188       mockNetwork.expects('fetchRequest').never().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError));
189       let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword);
190       wrapper.setProps({
191         value: autoCompleteSearchBarTestConstants.nodeSearchKeyword,
192         suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
193         cachedSuggestions: [],
194         onNewSearch: (searchRequestObject, value) => {
195           if (Object.keys(searchRequestObject).length === 0) {
196             mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword));
197           } else {
198             mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest));
199           }
200         }
201
202       });
203
204       function onInvalidSearchInputEvent(){
205         return {
206           type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS,
207           data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_INVALID_SEARCH_TERMS}
208         };
209       }
210       wrapper.find('.auto-complete-search-button').simulate('click');
211       mockNetwork.verify();
212       mockNetwork.restore();
213       setTimeout(() => {
214         expect(mStore.getActions()[0]).to.deep.equal(onInvalidSearchInputEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut;
215       });
216       setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut);
217     });
218
219     it('Test flow - test onNewSearch() failure: Expect no matches found When no cached suggestions does not have the node searched for', done => {
220       const mStore = mockStore({});
221       let mockNetwork = sinon.mock(networkCall);
222       mockNetwork.expects('fetchRequest').never().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError));
223       let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword);
224       wrapper.setProps({
225         value: autoCompleteSearchBarTestConstants.nodeSearchKeyword,
226         suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
227         cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType2.hits.hits,
228         onNewSearch: (searchRequestObject, value) => {
229           if (Object.keys(searchRequestObject).length === 0) {
230             mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword));
231           } else {
232             mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest));
233           }
234         }
235
236       });
237
238       function onInvalidSearchInputEvent(){
239         return {
240           type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS,
241           data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_INVALID_SEARCH_TERMS}
242         };
243       }
244       wrapper.find('.auto-complete-search-button').simulate('click');
245       mockNetwork.verify();
246       mockNetwork.restore();
247       setTimeout(() => {
248         expect(mStore.getActions()[0]).to.deep.equal(onInvalidSearchInputEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut;
249       });
250       setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut);
251     });
252
253     it('Test flow - test onNewSearch() failure: Expect no node search When no matches are found in lookup search', done => {
254       const mStore = mockStore({});
255       let mockNetwork = sinon.mock(networkCall);
256       mockNetwork.expects('fetchRequest').never().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError));
257       let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword);
258       wrapper.setProps({
259         value: autoCompleteSearchBarTestConstants.multipleNodeSearchKeyword,
260         suggestions: [{_source:{ entityType:i18n(NO_MATCHES_FOUND),searchTags:''}}],
261         cachedSuggestions: [{_source:{ entityType:i18n(NO_MATCHES_FOUND),searchTags:''}}],
262         onNewSearch: (searchRequestObject, value) => {
263           if (Object.keys(searchRequestObject).length === 0) {
264             mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword));
265           } else {
266             mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest));
267           }
268         }
269
270       });
271
272       function onInvalidSearchInputEvent(){
273         return {
274           type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS,
275           data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_INVALID_SEARCH_TERMS}
276         };
277
278       }
279       wrapper.find('.react-autosuggest__input').simulate('focus');
280       wrapper.find('.auto-complete-search-button').simulate('click');
281       mockNetwork.verify();
282       mockNetwork.restore();
283       setTimeout(() => {
284         expect(mStore.getActions()[0]).to.deep.equal(onInvalidSearchInputEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut;
285       });
286       setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut);
287     });
288
289     it('Expect the list to be populated when a the auto suggest input box is focused', function() {
290       const mStore = mockStore({});
291       wrapper.setProps({
292         value: autoCompleteSearchBarTestConstants.nodeSearchKeywordWithOutEqualSign,
293         suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
294         cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits,
295
296       });
297       wrapper.find('.react-autosuggest__input').simulate('focus');
298       expect(wrapper.find('Item').children()).to.have.length(6);
299     });
300
301     it('Expect small list to be populated when a the auto suggest input box is focused', function() {
302       const mStore = mockStore({});
303       wrapper.setProps({
304         value: autoCompleteSearchBarTestConstants.nodeSearchKeyword,
305         suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType2.hits.hits,
306         cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType2.hits.hits,
307
308       });
309       wrapper.find('.react-autosuggest__input').simulate('focus');
310       expect(wrapper.find('Item').children()).to.have.length(3);
311     });
312   });
313 });