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