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