From 0b2b11bad1457e7f388ab2a99af6ebf231e862e3 Mon Sep 17 00:00:00 2001 From: Steve Thomas Date: Thu, 29 Mar 2018 14:41:43 -0400 Subject: [PATCH] increasing test coverage to 10% Issue-ID: AAI-980 Change-Id: Idb816df11fa14b5668349f24bac1aafd7235e00a Signed-off-by: Steven Thomas --- .gitignore | 2 +- package.json | 83 ++-- .../selectedNodeDetails/SelectedNodeDetails.jsx | 2 +- .../SelectedNodeDetails.test.js | 141 +++++++ .../SelectedNodeDetailsReducer.test.js | 248 ++++++++++++ src/app/vnfSearch/VnfSearch.jsx | 2 +- src/app/vnfSearch/VnfSearch.test.js | 49 +++ src/app/vnfSearch/VnfSearchActions.js | 3 - src/app/vnfSearch/VnfSearchActions.test.js | 215 ++++++++++ src/app/vnfSearch/VnfSearchNfRoleVisualization.jsx | 2 +- .../vnfSearch/VnfSearchNfRoleVisualization.test.js | 154 ++++++++ src/app/vnfSearch/VnfSearchNfTypeVisualization.jsx | 2 +- .../vnfSearch/VnfSearchNfTypeVisualization.test.js | 154 ++++++++ .../VnfSearchOrchestratedStatusVisualization.jsx | 2 +- ...nfSearchOrchestratedStatusVisualization.test.js | 154 ++++++++ .../vnfSearch/VnfSearchProvStatusVisualization.jsx | 2 +- .../VnfSearchProvStatusVisualization.test.js | 154 ++++++++ src/app/vnfSearch/VnfSearchReducer.test.js | 438 +++++++++++++++++++++ .../vnfSearch/VnfSearchTotalCountVisualization.jsx | 2 +- .../VnfSearchTotalCountVisualization.test.js | 131 ++++++ src/utils/DateTimeChartUtil.test.js | 92 +++++ src/utils/SpinnerContainer.jsx | 1 - src/utils/SpinnerContainer.test.js | 35 ++ test/components/dateRange.test.js | 259 ------------ test/components/dateRangeSelector.test.js | 303 -------------- test/components/inlineMessage.test.js | 90 ----- test/components/notificationReducer.test.js | 108 ----- test/components/toggleButtonGroupReducer.test.js | 41 -- test/fileMock.js | 1 + test/setupTests.js | 5 + test/styleMock.js | 1 + .../autoCompleteSearchBar.test.js | 313 --------------- .../autoCompleteSearchBarActions.test.js | 259 ------------ .../autoCompleteSearchBarReducer.test.js | 136 ------- .../autoCompleteSearchBarTestConstants.js | 231 ----------- test/tierSupport/tierSupport.test.js | 35 -- test/utils/MockRest.js | 85 ---- .../vnfSearchVisualizations.test.js | 92 ----- .../vnfSearchVisualizationsReducer.test.js | 144 ------- 39 files changed, 2027 insertions(+), 2144 deletions(-) create mode 100644 src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.test.js create mode 100644 src/app/tierSupport/selectedNodeDetails/SelectedNodeDetailsReducer.test.js create mode 100644 src/app/vnfSearch/VnfSearch.test.js create mode 100644 src/app/vnfSearch/VnfSearchActions.test.js create mode 100644 src/app/vnfSearch/VnfSearchNfRoleVisualization.test.js create mode 100644 src/app/vnfSearch/VnfSearchNfTypeVisualization.test.js create mode 100644 src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.test.js create mode 100644 src/app/vnfSearch/VnfSearchProvStatusVisualization.test.js create mode 100644 src/app/vnfSearch/VnfSearchReducer.test.js create mode 100644 src/app/vnfSearch/VnfSearchTotalCountVisualization.test.js create mode 100644 src/utils/DateTimeChartUtil.test.js create mode 100644 src/utils/SpinnerContainer.test.js delete mode 100644 test/components/dateRange.test.js delete mode 100644 test/components/dateRangeSelector.test.js delete mode 100644 test/components/inlineMessage.test.js delete mode 100644 test/components/notificationReducer.test.js delete mode 100644 test/components/toggleButtonGroupReducer.test.js create mode 100644 test/fileMock.js create mode 100644 test/setupTests.js create mode 100644 test/styleMock.js delete mode 100644 test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBar.test.js delete mode 100644 test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarActions.test.js delete mode 100644 test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarReducer.test.js delete mode 100644 test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarTestConstants.js delete mode 100644 test/tierSupport/tierSupport.test.js delete mode 100644 test/utils/MockRest.js delete mode 100644 test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizations.test.js delete mode 100644 test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizationsReducer.test.js diff --git a/.gitignore b/.gitignore index 3e1100f..d5fd50c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .idea - +coverage dist node target diff --git a/package.json b/package.json index ddbc889..55e7652 100644 --- a/package.json +++ b/package.json @@ -3,16 +3,14 @@ "version": "1.0.0", "description": "", "main": "bundle.js", - "directories": { - "test": "test" - }, "publishConfig": { "registry": "http://10.247.57.144:8081/repository/npm-aee/" }, "scripts": { "start": "gulp", "build": "gulp build", - "test": "karma start" + "test": "jest", + "testReport": "jest --coverage" }, "author": "", "license": "SEE LICENSE IN LICENSE", @@ -30,19 +28,20 @@ "moment": "^2.13.0", "moment-timezone": "^0.5.5", "node-fetch": "^1.5.3", - "react": "^15.4.0", + "react": "^15.6.1", "react-autosuggest": "^6.0.4", - "react-bootstrap": "^0.30.0-rc.1", - "react-datepicker": "^0.53.0", - "react-dom": "^15.1.0", + "react-bootstrap": "^0.31.2", + "react-datepicker": "^0.55.0", + "react-dom": "^15.6.1", "react-fontawesome": "^0.3.3", "react-grid-layout": "^0.14.4", "react-highlight-words": "^0.4.1", "react-redux": "^4.4.1", "react-router-dom": "^4.1.1", - "react-select": "^1.0.0-beta13", + "react-select": "^1.2.1", "react-spinners": "^0.2.5", "react-split-pane": "^0.1.51", + "recharts": "^0.20.5", "redux": "^3.3.1", "redux-form": "^6.2.1", "redux-thunk": "^2.1.0", @@ -52,23 +51,25 @@ "vertical-filter-bar": "1.0.4" }, "devDependencies": { - "babel-core": "^6.9.1", - "babel-eslint": "^6.0.2", + "babel-core": "^6.25.0", + "babel-eslint": "^6.0.4", + "babel-jest": "^22.4.1", "babel-loader": "^6.2.4", "babel-preset-es2015": "^6.9.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-0": "^6.5.0", - "chai": "^3.5.0", "copy-webpack-plugin": "^4.0.1", "crypto-js": "^3.1.9-1", "css-loader": "^0.23.1", - "enzyme": "^2.5.1", + "enzyme": "^3.3.0", + "enzyme-adapter-react-15": "^1.0.5", "eslint": "^3.1.1", "eslint-loader": "^1.3.0", "eslint-plugin-import": "^0.8.1", "eslint-plugin-react": "^3.14.0", "expect": "^1.20.1", "express": "^4.13.3", + "fetch-mock": "^5.13.1", "file-loader": "^0.8.5", "gulp": "^3.9.1", "gulp-clean": "^0.3.1", @@ -82,44 +83,54 @@ "isparta-loader": "^2.0.0", "istanbul": "^1.0.0-alpha.2", "istanbul-instrumenter-loader": "^0.2.0", - "jasmine-core": "^2.8.0", + "jest": "^22.4.3", + "jest-enzyme": "^6.0.0", + "jest-fetch-mock": "^1.5.0", "json-loader": "^0.5.4", "jsx-loader": "^0.13.2", - "karma": "^0.13.22", - "karma-babel-preprocessor": "^6.0.1", - "karma-chai": "^0.1.0", - "karma-chrome-launcher": "^1.0.1", - "karma-cli": "^1.0.0", - "karma-coverage": "^1.0.0", - "karma-firefox-launcher": "^1.0.0", - "karma-jasmine": "^1.1.0", - "karma-jasmine-html-reporter": "^0.2.2", - "karma-mocha": "^1.0.1", - "karma-sinon-chai": "^1.2.3", - "karma-sourcemap-loader": "^0.3.7", - "karma-verbose-reporter": "0.0.5", - "karma-webpack": "^1.7.0", - "mocha": "^2.4.5", - "mock-require": "^1.2.1", "nock": "^8.0.0", "node-sass": "^3.8.0", "node-watch": "^0.3.5", "prompt": "^0.2.14", "react-addons-test-utils": "^15.1.0", - "react-bootstrap": "^0.30.0-rc.1", "react-hot-loader": "^3.0.0-beta.6", - "react-split-pane": "^0.1.51", - "recharts": "^0.20.5", - "redux-mock-store": "^1.1.2", + "react-test-renderer": "^15.6.1", + "redux-mock-store": "^1.4.0", "sass-loader": "^3.1.2", - "sinon": "^2.0.0-pre", - "sinon-chai": "^2.14.0", "source-map-loader": "^0.1.5", "style-loader": "^0.13.1", "url-loader": "^0.5.7", "webpack": "^1.13.1", "webpack-dev-server": "^1.14.1" }, + "jest": { + "verbose": true, + "setupTestFrameworkScriptFile": "./test/setupTests.js", + "automock": false, + "moduleNameMapper": { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/test/fileMock.js", + "\\.(css|scss)$": "/test/styleMock.js" + }, + "moduleFileExtensions": [ + "js", + "jsx" + ], + "moduleDirectories": [ + "node_modules", + "src", + "utils" + ], + "collectCoverage": true, + "collectCoverageFrom": [ + "**/*.{js,jsx}", + "!**/node_modules/**", + "!**/test/**", + "!**/resources/**", + "!**/dist/**", + "!**/scripts/**", + "!**/tools/**" + ] + }, "engines": { "node": ">=5.1", "npm": ">=3.3" diff --git a/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.jsx b/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.jsx index 88536e6..5750fd9 100644 --- a/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.jsx +++ b/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.jsx @@ -39,7 +39,7 @@ let mapStateToProps = ({tierSupport: {selectedNodeDetails}}) => { }; }; -class SelectedNodeDetails extends Component { +export class SelectedNodeDetails extends Component { static propTypes = { nodeData: React.PropTypes.object, nodeType: React.PropTypes.string, diff --git a/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.test.js b/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.test.js new file mode 100644 index 0000000..60f5530 --- /dev/null +++ b/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetails.test.js @@ -0,0 +1,141 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import {Provider} from 'react-redux' +import configureStore from 'redux-mock-store'; +import Table from 'react-bootstrap/lib/Table'; + +import ConnectedSelectedNodeDetails, { SelectedNodeDetails } from './SelectedNodeDetails.jsx'; +import { SELECTED_NODE_TABLE_COLUMN_NAMES } from './SelectedNodeDetailsConstants.js'; +import LaunchInContext from '../launchExternalResource/LaunchExternalResource.jsx'; + +describe('SelectedNodeDetails - Shallow render of component', () => { + let wrapper; + const nodeTypeProp = 'VNF'; + const uidProp = 'SomeValidUIDName'; + const nodeDataProp = { + 'interface-role': 'MPLS', + 'in-maint': 'false', + 'interface-type': 'WAN', + 'port-description': 'MPLS port on 10_NSG16_location4', + 'resource-version': '123456789', + 'interface-name': '10_port1_location4', + 'uri': 'network/pnfs/pnf/10_NSG14_location4/p-interfaces/p-interface/10_port1_location4' + }; + + beforeEach( () => { + wrapper = shallow( + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + }); + + it('Verify node type is displayed as a header', () => { + expect(wrapper.contains(

{nodeTypeProp}

)).toBe(true); + expect(wrapper.find('h2')).toHaveLength(1); + }); + + it('Verify uid is displayed', () => { + expect(wrapper.contains({uidProp} )).toBe(true); + }); + + it('Verify node data table is displayed', () => { + // verify table has a row for each node data prop plus one row for the column headers + expect(wrapper.find(Table)).toHaveLength(1); + expect(wrapper.find(Table).props().bsClass).toEqual('ts-selected-node-table'); + expect(wrapper.find(Table).children()).toHaveLength(2); // thead and tbody + + // validate the table header content + expect(wrapper.find('thead')).toHaveLength(1); + let cellClassName; + for (let index = 1; index <= SELECTED_NODE_TABLE_COLUMN_NAMES.length; index++) { + cellClassName = (index % 2 ? 'left-column-cell' : 'right-column-cell'); + expect(wrapper.contains( + {SELECTED_NODE_TABLE_COLUMN_NAMES[index-1]} + )).toBe(true); + } + + // validate the table body content + expect(wrapper.find('tbody')).toHaveLength(1); + expect(wrapper.find('tbody').children()).toHaveLength(7); // 1 row for each of the 7 properties + for (let prop in nodeDataProp) { + expect(wrapper.contains( + {prop} + )).toBe(true); + expect(wrapper.contains( + {nodeDataProp[prop]} + )).toBe(true); + } + }); +}) + +describe('SelectedNodeDetails - Shallow render of component with no node data', () => { + let wrapper; + const nodeTypeProp = 'VNF'; + const uidProp = 'SomeValidUIDName'; + const nodeDataProp = {}; + + beforeEach( () => { + wrapper = shallow( + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + }); + + it('Verify node data table is hidden', () => { + // verify table is hidden + expect(wrapper.find(Table)).toHaveLength(1); + expect(wrapper.find(Table).props().bsClass).toEqual('hidden'); + }); +}) + +describe('SelectedNodeDetails - Render React Component (wrapped in )', () => { + const initialState = { + tierSupport: { + launchExternalResourceReducer: { + externalResourcePayload: {} + }, + selectedNodeDetails: { + nodeType: 'VNF', + uid: 'AAI/CLYMR/000509/SD_WAN', + nodeData: { + 'interface-role': 'MPLS', + 'in-maint': 'false', + 'interface-type': 'WAN', + 'port-description': 'MPLS port on 10_NSG16_location4', + 'resource-version': '123456789', + 'interface-name': '10_port1_location4', + 'uri': 'network/pnfs/pnf/10_NSG14_location4/p-interfaces/p-interface/10_port1_location4' + } + } + } + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedSelectedNodeDetails).length).toEqual(1); + }); + + it('Validate props from store', () => { + expect(wrapper.find(SelectedNodeDetails).props().uid).toEqual(initialState.tierSupport.selectedNodeDetails.uid); + expect(wrapper.find(SelectedNodeDetails).props().nodeType).toEqual(initialState.tierSupport.selectedNodeDetails.nodeType); + expect(wrapper.find(SelectedNodeDetails).props().nodeData).toEqual(initialState.tierSupport.selectedNodeDetails.nodeData); + }); +}) diff --git a/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetailsReducer.test.js b/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetailsReducer.test.js new file mode 100644 index 0000000..2544a80 --- /dev/null +++ b/src/app/tierSupport/selectedNodeDetails/SelectedNodeDetailsReducer.test.js @@ -0,0 +1,248 @@ +import SelectedNodeDetailsReducer from './SelectedNodeDetailsReducer.js'; +import {tierSupportActionTypes} from 'app/tierSupport/TierSupportConstants.js'; +import { + globalAutoCompleteSearchBarActionTypes +} from 'app/globalAutoCompleteSearchBar/GlobalAutoCompleteSearchBarConstants.js'; + +describe('SelectedNodeDetails - Reducer Tests', () => { + it('Action Type: TS_NODE_SEARCH_RESULTS', () => { + const action = { + type: tierSupportActionTypes.TS_NODE_SEARCH_RESULTS, + data: { + nodes: [ + { + 'id': 'AAI/CLYMR/000509/SD_WAN', + 'itemType': 'service-instance', + 'itemNameKey': 'service-instance.AAI/SPRKY/000509/SD_WAN', + 'itemNameValue': 'AAI/SPRKY/000509/SD_WAN', + 'itemProperties': { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + }, + 'itemIntegrity' : { + 'entityId' : 'AEEhny_vnf1_under_fw-si1', + 'entityType' : 'vnf', + 'entityLink' : 'cloud-infrastr084-1377-4f49-9c72-f0_location2', + 'initialTimestamp' :'2017-11-13T16:58:01Z', + 'latestValidationTimestamp':'2017-11-13T16:58:01Z', + 'resourceVersion':'1510592264096', + 'violations': [] + }, + 'nodeMeta': { + 'className': 'selectedSearchedNodeClass', + 'nodeDebug': null, + 'selfLinkResponseTimeInMs': 628, + 'relationshipNode': false, + 'searchTarget': true, + 'enrichableNode': false, + 'nodeValidated': true, + 'nodeIssue': false, + 'maxAltitude': 4, + 'nodeType': 'serviceInstance', + 'nodeLabel1':'service-instance', + 'nodeLabel2':'AAI/SPRKY/000509/SD_WAN' + }, + 'rootNode' : false + } + ] + } + }; + let state = { + nodeType: '', + uid: '', + nodeData: {} + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: action['data']['nodes'][0]['itemType'], + uid: action['data']['nodes'][0]['itemNameValue'], + nodeData: action['data']['nodes'][0]['itemProperties'] + }); + }); + + it('Action Type: TS_NODE_SEARCH_RESULTS - searchTarget === false', () => { + const action = { + type: tierSupportActionTypes.TS_NODE_SEARCH_RESULTS, + data: { + nodes: [ + { + 'id': 'AAI/CLYMR/000509/SD_WAN', + 'itemType': 'service-instance', + 'itemNameKey': 'service-instance.AAI/SPRKY/000509/SD_WAN', + 'itemNameValue': 'AAI/SPRKY/000509/SD_WAN', + 'itemProperties': { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + }, + 'itemIntegrity' : { + 'entityId' : 'AEEhny_vnf1_under_fw-si1', + 'entityType' : 'vnf', + 'entityLink' : 'cloud-infrastr084-1377-4f49-9c72-f0_location2', + 'initialTimestamp' :'2017-11-13T16:58:01Z', + 'latestValidationTimestamp':'2017-11-13T16:58:01Z', + 'resourceVersion':'1510592264096', + 'violations': [] + }, + 'nodeMeta': { + 'className': 'selectedSearchedNodeClass', + 'nodeDebug': null, + 'selfLinkResponseTimeInMs': 628, + 'relationshipNode': false, + 'searchTarget': false, + 'enrichableNode': false, + 'nodeValidated': true, + 'nodeIssue': false, + 'maxAltitude': 4, + 'nodeType': 'serviceInstance', + 'nodeLabel1':'service-instance', + 'nodeLabel2':'AAI/SPRKY/000509/SD_WAN' + }, + 'rootNode' : false + } + ] + } + }; + let state = { + nodeType: 'Complex', + uid: 'ABC', + nodeData: { + 'service-instance-id': 'blah/blah/blah', + 'resource-version':'123456' + } + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: '', + uid: '', + nodeData: {} + }); + }); + + it('Action Type: TS_GRAPH_NODE_SELECTED', () => { + const action = { + type: tierSupportActionTypes.TS_GRAPH_NODE_SELECTED, + data: { + itemProperties: { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + }, + itemType: 'Complex', + itemNameValue: '123456' + } + }; + let state = { + nodeType: '', + uid: '', + nodeData: {} + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: action['data']['itemType'], + uid: action['data']['itemNameValue'], + nodeData: action['data']['itemProperties'] + }); + }); + + it('Action Type: TIER_SUPPORT_NETWORK_ERROR', () => { + const action = { + type: tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR, + }; + let state = { + nodeType: 'Complex', + uid: '12345', + nodeData: { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + } + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: '', + uid: '', + nodeData: {} + }); + }); + + it('Action Type: TIER_SUPPORT_CLEAR_DATA', () => { + const action = { + type: tierSupportActionTypes.TIER_SUPPORT_CLEAR_DATA, + }; + let state = { + nodeType: 'Complex', + uid: '12345', + nodeData: { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + } + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: '', + uid: '', + nodeData: {} + }); + }); + + it('Action Type: TS_NODE_SEARCH_NO_RESULTS', () => { + const action = { + type: tierSupportActionTypes.TS_NODE_SEARCH_NO_RESULTS, + }; + let state = { + nodeType: 'Complex', + uid: '12345', + nodeData: { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + } + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: '', + uid: '', + nodeData: {} + }); + }); + + it('Action Type: SEARCH_WARNING_EVENT', () => { + const action = { + type: globalAutoCompleteSearchBarActionTypes.SEARCH_WARNING_EVENT, + }; + let state = { + nodeType: 'Complex', + uid: '12345', + nodeData: { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + } + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: '', + uid: '', + nodeData: {} + }); + }); + + it('Invalid Action Type', () => { + const action = { + type: 'Nonexistent Action Type', + }; + let state = { + nodeType: 'Complex', + uid: '12345', + nodeData: { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + } + }; + state = SelectedNodeDetailsReducer(state, action); + expect(state).toEqual({ + nodeType: 'Complex', + uid: '12345', + nodeData: { + 'service-instance-id': 'AAI/SPRKY/000509/SD_WAN', + 'resource-version':'1508078039815' + } + }); + }); +}) diff --git a/src/app/vnfSearch/VnfSearch.jsx b/src/app/vnfSearch/VnfSearch.jsx index dbcc73d..a409ce2 100644 --- a/src/app/vnfSearch/VnfSearch.jsx +++ b/src/app/vnfSearch/VnfSearch.jsx @@ -157,7 +157,7 @@ let mapActionToProps = (dispatch) => { }; }; -class vnfSearch extends Component { +export class vnfSearch extends Component { static propTypes = { feedbackMsgText: React.PropTypes.string, feedbackSeverity: React.PropTypes.string, diff --git a/src/app/vnfSearch/VnfSearch.test.js b/src/app/vnfSearch/VnfSearch.test.js new file mode 100644 index 0000000..c6c63fc --- /dev/null +++ b/src/app/vnfSearch/VnfSearch.test.js @@ -0,0 +1,49 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import {Provider} from 'react-redux' +import configureStore from 'redux-mock-store'; + +import ConnectedVnfSearch, { vnfSearch } from './VnfSearch.jsx'; + +describe('VnfSearch - Shallow render of component', () => { + let wrapper; + const vnfFilters = {}; + const vnfVisualizationPanelClass = 'collapsible-panel-main-panel'; + const unifiedFilterValues = {}; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + }); +}) +// +// describe('VnfSearch - Render React Component (wrapped in )', () => { +// const initialState = { +// vnfSearch: {} +// }; +// const mockStore = configureStore(); +// let store, wrapper; +// +// beforeEach( () => { +// store = mockStore(initialState); +// wrapper = mount(); +// }) +// +// it('Render the connected component', () => { +// expect(wrapper.find(ConnectedVnfSearch).length).toEqual(1); +// }); +// +// it('Validate props from store', () => { +// expect(wrapper.find(VnfSearchNfRoleVisualization).props().enableBusyFeedback).toEqual(initialState.vnfSearch.enableBusyFeedback); +// expect(wrapper.find(VnfSearchNfRoleVisualization).props().processedNfRoleCountChartData).toEqual(initialState.vnfSearch.processedNfRoleCountChartData); +// }); +// }) diff --git a/src/app/vnfSearch/VnfSearchActions.js b/src/app/vnfSearch/VnfSearchActions.js index 4ca149d..20290d6 100644 --- a/src/app/vnfSearch/VnfSearchActions.js +++ b/src/app/vnfSearch/VnfSearchActions.js @@ -39,9 +39,6 @@ import { } from 'app/globalInlineMessageBar/GlobalInlineMessageBarActions.js'; import {MESSAGE_LEVEL_WARNING} from 'utils/GlobalConstants.js'; -let fetch = require('node-fetch'); -fetch.Promise = require('es6-promise').Promise; - const itemKeyWord = 'key'; const countKeyWord = 'doc_count'; diff --git a/src/app/vnfSearch/VnfSearchActions.test.js b/src/app/vnfSearch/VnfSearchActions.test.js new file mode 100644 index 0000000..927e6ab --- /dev/null +++ b/src/app/vnfSearch/VnfSearchActions.test.js @@ -0,0 +1,215 @@ +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk' +import fetchMock from 'fetch-mock'; + +import { + processVnfFilterPanelCollapse, + clearVnfSearchData, + setNotificationText, + processVnfVisualizationsOnFilterChange +} from './VnfSearchActions.js'; +import { + vnfActionTypes, + CHART_PROV_STATUS, + CHART_ORCH_STATUS, + CHART_NF_TYPE, + CHART_NF_ROLE, + TOTAL_VNF_COUNT, + VNF_FILTER_EMPTY_RESULT +} from 'app/vnfSearch/VnfSearchConstants.js'; +import { globalInlineMessageBarActionTypes } from 'app/globalInlineMessageBar/GlobalInlineMessageBarConstants.js'; +import { ERROR_RETRIEVING_DATA } from 'app/networking/NetworkConstants.js'; + +describe('VnfSearchAction - Action Tests', () => { + it('Action: processVnfFilterPanelCollapse - open', () => { + const result = processVnfFilterPanelCollapse(true); + expect(result).toEqual({ + type: vnfActionTypes.VNF_FILTER_PANEL_TOGGLED, + data: { + vnfVisualizationPanelClass: 'collapsible-panel-main-panel vertical-filter-panel-is-open' + } + }); + }); + + it('Action: processVnfFilterPanelCollapse - close', () => { + const result = processVnfFilterPanelCollapse(false); + expect(result).toEqual({ + type: vnfActionTypes.VNF_FILTER_PANEL_TOGGLED, + data: { + vnfVisualizationPanelClass: 'collapsible-panel-main-panel' + } + }); + }); + + it('Action: clearVnfSearchData', () => { + const result = clearVnfSearchData(); + expect(result).toEqual({ + type: vnfActionTypes.VNF_SEARCH_RESULTS_RECEIVED, + data: { + count: '', + provStatusData: CHART_PROV_STATUS.emptyData, + orchStatusData: CHART_ORCH_STATUS.emptyData, + nfTypeData: CHART_NF_TYPE.emptyData, + nfRoleData: CHART_NF_ROLE.emptyData + } + }); + }); + + it('Action: setNotificationText - with message', () => { + const middlewares = [thunk]; + const mockStore = configureStore(middlewares); + const store = mockStore({ vnfSearch: {} }); + store.dispatch(setNotificationText('test error message', 'WARNING')); + const actions = store.getActions(); + expect(actions).toEqual([{ + type: globalInlineMessageBarActionTypes.SET_GLOBAL_MESSAGE, + data: { + msgText: 'test error message', + msgSeverity: 'WARNING' + } + }]); + }); + + it('Action: processVnfVisualizationsOnFilterChange - data for filter values', () => { + const middlewares = [thunk]; + const mockStore = configureStore(middlewares); + const store = mockStore({ vnfSearch: {} }); + const filterValueMap = { + 1: 'Running', + 2: 'Junk', + 7: 'Blah', + 8: 'Doh' + }; + const expectedActions = [ + { type: vnfActionTypes.VNF_ACTIVATE_BUSY_FEEDBACK }, + { type: globalInlineMessageBarActionTypes.CLEAR_GLOBAL_MESSAGE }, + { + type: vnfActionTypes.VNF_SEARCH_RESULTS_RECEIVED, + data: { + count: 10, + provStatusData: { + values: [ + { x: 'junk', y: 10 } + ] + }, + orchStatusData: { + values: [ + { x: 'running', y: 10 } + ] + }, + nfTypeData: { + values: [ + { x: 'doh', y: 10 } + ] + }, + nfRoleData: { + values: [ + { x: 'blah', y: 10 } + ] + } + } + }, + { type: vnfActionTypes.VNF_DISABLE_BUSY_FEEDBACK } + ]; + fetchMock.mock('*', { + "total": 10, + "aggregations":{ + "nf-role":[{"doc_count":10,"key":"blah"}], + "nf-type":[{"doc_count":10,"key":"doh"}], + "prov-status":[{"doc_count":10,"key":"junk"}], + "orchestration-status":[{"doc_count":10,"key":"running"}] + } + }); + + return store.dispatch(processVnfVisualizationsOnFilterChange(filterValueMap)) + .then( () => { + const actions = store.getActions(); + expect(actions).toEqual(expectedActions); + fetchMock.restore(); + }); + }); + + it('Action: processVnfVisualizationsOnFilterChange - no data for filter values', () => { + const middlewares = [thunk]; + const mockStore = configureStore(middlewares); + const store = mockStore({ vnfSearch: {} }); + const filterValueMap = { + 1: 'Running', + 2: 'Junk', + 7: '', + 8: 'Doh' + }; + const expectedActions = [ + { type: vnfActionTypes.VNF_ACTIVATE_BUSY_FEEDBACK }, + { type: globalInlineMessageBarActionTypes.SET_GLOBAL_MESSAGE, + data: { msgSeverity: "warning", msgText: VNF_FILTER_EMPTY_RESULT } + }, + { + type: vnfActionTypes.VNF_SEARCH_RESULTS_RECEIVED, + data: { + count: TOTAL_VNF_COUNT.emptyData, + provStatusData: CHART_PROV_STATUS.emptyData, + orchStatusData: CHART_ORCH_STATUS.emptyData, + nfTypeData: CHART_NF_TYPE.emptyData, + nfRoleData: CHART_NF_ROLE.emptyData + } + }, + { type: vnfActionTypes.VNF_DISABLE_BUSY_FEEDBACK } + ]; + fetchMock.mock('*', { + "total": 0, + "aggregations":{ + "nf-role":[], + "nf-type":[], + "prov-status":[], + "orchestration-status":[] + } + }); + + return store.dispatch(processVnfVisualizationsOnFilterChange(filterValueMap)) + .then( () => { + const actions = store.getActions(); + expect(actions).toEqual(expectedActions); + fetchMock.restore(); + }); + }); + + it('Action: processVnfVisualizationsOnFilterChange - network error', () => { + const middlewares = [thunk]; + const mockStore = configureStore(middlewares); + const store = mockStore({ vnfSearch: {} }); + const filterValueMap = { + 1: 'Running', + 2: 'Junk', + 7: 'Blah', + 8: 'Doh' + }; + const expectedActions = [ + { type: vnfActionTypes.VNF_ACTIVATE_BUSY_FEEDBACK }, + { type: vnfActionTypes.VNF_DISABLE_BUSY_FEEDBACK }, + { + type: vnfActionTypes.VNF_NETWORK_ERROR, + data: { errorMsg: ERROR_RETRIEVING_DATA } + } + ]; + fetchMock.mock('*', 503); + + return store.dispatch(processVnfVisualizationsOnFilterChange(filterValueMap)) + .then( () => { + const actions = store.getActions(); + expect(actions).toEqual(expectedActions); + fetchMock.restore(); + }); + }); + + it('Action: setNotificationText - no message', () => { + const middlewares = [thunk]; + const mockStore = configureStore(middlewares); + const store = mockStore({ vnfSearch: {} }); + store.dispatch(setNotificationText('', '')); + const actions = store.getActions(); + expect(actions).toEqual([{ + type: globalInlineMessageBarActionTypes.CLEAR_GLOBAL_MESSAGE + }]); + }); +}) diff --git a/src/app/vnfSearch/VnfSearchNfRoleVisualization.jsx b/src/app/vnfSearch/VnfSearchNfRoleVisualization.jsx index 5d09ac4..a71b2ab 100644 --- a/src/app/vnfSearch/VnfSearchNfRoleVisualization.jsx +++ b/src/app/vnfSearch/VnfSearchNfRoleVisualization.jsx @@ -48,7 +48,7 @@ let mapStateToProps = ({vnfSearch}) => { }; }; -class VnfSearchNfRoleVisualization extends Component { +export class VnfSearchNfRoleVisualization extends Component { static propTypes = { processedNfRoleCountChartData: React.PropTypes.object, enableBusyFeedback: React.PropTypes.bool diff --git a/src/app/vnfSearch/VnfSearchNfRoleVisualization.test.js b/src/app/vnfSearch/VnfSearchNfRoleVisualization.test.js new file mode 100644 index 0000000..cf94925 --- /dev/null +++ b/src/app/vnfSearch/VnfSearchNfRoleVisualization.test.js @@ -0,0 +1,154 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import {Provider} from 'react-redux' +import configureStore from 'redux-mock-store'; +import { BarChart } from 'recharts'; + +import ConnectedVnfSearchNfRoleVisualization, + { VnfSearchNfRoleVisualization } from './VnfSearchNfRoleVisualization.jsx'; +import { CHART_NF_ROLE } from './VnfSearchConstants.js'; +import Spinner from 'utils/SpinnerContainer.jsx'; + +describe('VnfSearchNfRoleVisualization - Shallow render of component', () => { + let wrapper; + const processedNfRoleCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present but not visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(false); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedNfRoleCountChartDataProp.values); + }); +}) + +describe('VnfSearchNfRoleVisualization - Shallow render of component with no chart data', () => { + let wrapper; + const processedNfRoleCountChartDataProp = { + values: null + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Visualization graph hidden', () => { + expect(wrapper.length).toEqual(1); + expect(['visualizations', 'hidden'].every(className => wrapper.hasClass(className))).toEqual(true); + }); +}) + +describe('VnfSearchNfRoleVisualization - Shallow render of component with busy feedback', () => { + let wrapper; + const processedNfRoleCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present and visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(true); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedNfRoleCountChartDataProp.values); + }); +}) + +describe('VnfSearchNfRoleVisualization - Render React Component (wrapped in )', () => { + const initialState = { + vnfSearch: { + processedNfRoleCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + enableBusyFeedback: false + } + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchNfRoleVisualization).length).toEqual(1); + }); + + it('Validate props from store', () => { + expect(wrapper.find(VnfSearchNfRoleVisualization).props().enableBusyFeedback).toEqual(initialState.vnfSearch.enableBusyFeedback); + expect(wrapper.find(VnfSearchNfRoleVisualization).props().processedNfRoleCountChartData).toEqual(initialState.vnfSearch.processedNfRoleCountChartData); + }); +}) + +describe('VnfSearchNfRoleVisualization - Render React Component (wrapped in ) with default props', () => { + const initialState = { + vnfSearch: {} + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchNfRoleVisualization).length).toEqual(1); + }); + + it('Validate default props loaded', () => { + expect(wrapper.find(VnfSearchNfRoleVisualization).props().enableBusyFeedback).toEqual(false); + expect(wrapper.find(VnfSearchNfRoleVisualization).props().processedNfRoleCountChartData).toEqual(CHART_NF_ROLE.emptyData); + }); +}) diff --git a/src/app/vnfSearch/VnfSearchNfTypeVisualization.jsx b/src/app/vnfSearch/VnfSearchNfTypeVisualization.jsx index 5b540d9..492d1c9 100644 --- a/src/app/vnfSearch/VnfSearchNfTypeVisualization.jsx +++ b/src/app/vnfSearch/VnfSearchNfTypeVisualization.jsx @@ -48,7 +48,7 @@ let mapStateToProps = ({vnfSearch}) => { }; }; -class VnfSearchNfTypeVisualization extends Component { +export class VnfSearchNfTypeVisualization extends Component { static propTypes = { processedNfTypeCountChartData: React.PropTypes.object, enableBusyFeedback: React.PropTypes.bool diff --git a/src/app/vnfSearch/VnfSearchNfTypeVisualization.test.js b/src/app/vnfSearch/VnfSearchNfTypeVisualization.test.js new file mode 100644 index 0000000..bbb2907 --- /dev/null +++ b/src/app/vnfSearch/VnfSearchNfTypeVisualization.test.js @@ -0,0 +1,154 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import {Provider} from 'react-redux' +import configureStore from 'redux-mock-store'; +import { BarChart } from 'recharts'; + +import ConnectedVnfSearchNfTypeVisualization, + { VnfSearchNfTypeVisualization } from './VnfSearchNfTypeVisualization.jsx'; +import { CHART_NF_TYPE } from './VnfSearchConstants.js'; +import Spinner from 'utils/SpinnerContainer.jsx'; + +describe('VnfSearchNfTypeVisualization - Shallow render of component', () => { + let wrapper; + const processedNfTypeCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present but not visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(false); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedNfTypeCountChartDataProp.values); + }); +}) + +describe('VnfSearchNfTypeVisualization - Shallow render of component with no chart data', () => { + let wrapper; + const processedNfTypeCountChartDataProp = { + values: null + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Visualization graph hidden', () => { + expect(wrapper.length).toEqual(1); + expect(['visualizations', 'hidden'].every(className => wrapper.hasClass(className))).toEqual(true); + }); +}) + +describe('VnfSearchNfTypeVisualization - Shallow render of component with busy feedback', () => { + let wrapper; + const processedNfTypeCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present and visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(true); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedNfTypeCountChartDataProp.values); + }); +}) + +describe('VnfSearchNfTypeVisualization - Render React Component (wrapped in )', () => { + const initialState = { + vnfSearch: { + processedNfTypeCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + enableBusyFeedback: false + } + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchNfTypeVisualization).length).toEqual(1); + }); + + it('Validate props from store', () => { + expect(wrapper.find(VnfSearchNfTypeVisualization).props().enableBusyFeedback).toEqual(initialState.vnfSearch.enableBusyFeedback); + expect(wrapper.find(VnfSearchNfTypeVisualization).props().processedNfTypeCountChartData).toEqual(initialState.vnfSearch.processedNfTypeCountChartData); + }); +}) + +describe('VnfSearchNfTypeVisualization - Render React Component (wrapped in ) with default props', () => { + const initialState = { + vnfSearch: {} + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchNfTypeVisualization).length).toEqual(1); + }); + + it('Validate default props loaded', () => { + expect(wrapper.find(VnfSearchNfTypeVisualization).props().enableBusyFeedback).toEqual(false); + expect(wrapper.find(VnfSearchNfTypeVisualization).props().processedNfTypeCountChartData).toEqual(CHART_NF_TYPE.emptyData); + }); +}) diff --git a/src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.jsx b/src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.jsx index be13d07..8dc25ca 100644 --- a/src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.jsx +++ b/src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.jsx @@ -48,7 +48,7 @@ let mapStateToProps = ({vnfSearch}) => { }; }; -class VnfSearchOrchStatusVisualizations extends Component { +export class VnfSearchOrchStatusVisualizations extends Component { static propTypes = { processedOrchStatusCountChartData: React.PropTypes.object, enableBusyFeedback: React.PropTypes.bool diff --git a/src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.test.js b/src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.test.js new file mode 100644 index 0000000..1257f3a --- /dev/null +++ b/src/app/vnfSearch/VnfSearchOrchestratedStatusVisualization.test.js @@ -0,0 +1,154 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import {Provider} from 'react-redux' +import configureStore from 'redux-mock-store'; +import { BarChart } from 'recharts'; + +import ConnectedVnfSearchOrchStatusVisualizations, + { VnfSearchOrchStatusVisualizations } from './VnfSearchOrchestratedStatusVisualization.jsx'; +import { CHART_ORCH_STATUS } from './VnfSearchConstants.js'; +import Spinner from 'utils/SpinnerContainer.jsx'; + +describe('VnfSearchOrchStatusVisualizations - Shallow render of component', () => { + let wrapper; + const processedOrchStatusCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present but not visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(false); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedOrchStatusCountChartDataProp.values); + }); +}) + +describe('VnfSearchOrchStatusVisualizations - Shallow render of component with no chart data', () => { + let wrapper; + const processedOrchStatusCountChartDataProp = { + values: null + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Visualization graph hidden', () => { + expect(wrapper.length).toEqual(1); + expect(['visualizations', 'hidden'].every(className => wrapper.hasClass(className))).toEqual(true); + }); +}) + +describe('VnfSearchOrchStatusVisualizations - Shallow render of component with busy feedback', () => { + let wrapper; + const processedOrchStatusCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present and visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(true); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedOrchStatusCountChartDataProp.values); + }); +}) + +describe('VnfSearchOrchStatusVisualizations - Render React Component (wrapped in )', () => { + const initialState = { + vnfSearch: { + processedOrchStatusCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + enableBusyFeedback: false + } + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchOrchStatusVisualizations).length).toEqual(1); + }); + + it('Validate props from store', () => { + expect(wrapper.find(VnfSearchOrchStatusVisualizations).props().enableBusyFeedback).toEqual(initialState.vnfSearch.enableBusyFeedback); + expect(wrapper.find(VnfSearchOrchStatusVisualizations).props().processedOrchStatusCountChartData).toEqual(initialState.vnfSearch.processedOrchStatusCountChartData); + }); +}) + +describe('VnfSearchOrchStatusVisualizations - Render React Component (wrapped in ) with default props', () => { + const initialState = { + vnfSearch: {} + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchOrchStatusVisualizations).length).toEqual(1); + }); + + it('Validate default props loaded', () => { + expect(wrapper.find(VnfSearchOrchStatusVisualizations).props().enableBusyFeedback).toEqual(false); + expect(wrapper.find(VnfSearchOrchStatusVisualizations).props().processedOrchStatusCountChartData).toEqual(CHART_ORCH_STATUS.emptyData); + }); +}) diff --git a/src/app/vnfSearch/VnfSearchProvStatusVisualization.jsx b/src/app/vnfSearch/VnfSearchProvStatusVisualization.jsx index a7c31c0..07ba988 100644 --- a/src/app/vnfSearch/VnfSearchProvStatusVisualization.jsx +++ b/src/app/vnfSearch/VnfSearchProvStatusVisualization.jsx @@ -48,7 +48,7 @@ let mapStateToProps = ({vnfSearch}) => { }; }; -class VnfSearchProvStatusVisualization extends Component { +export class VnfSearchProvStatusVisualization extends Component { static propTypes = { processedProvStatusCountChartData: React.PropTypes.object, enableBusyFeedback: React.PropTypes.bool diff --git a/src/app/vnfSearch/VnfSearchProvStatusVisualization.test.js b/src/app/vnfSearch/VnfSearchProvStatusVisualization.test.js new file mode 100644 index 0000000..4812834 --- /dev/null +++ b/src/app/vnfSearch/VnfSearchProvStatusVisualization.test.js @@ -0,0 +1,154 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import {Provider} from 'react-redux' +import configureStore from 'redux-mock-store'; +import { BarChart } from 'recharts'; + +import ConnectedVnfSearchProvStatusVisualization, + { VnfSearchProvStatusVisualization } from './VnfSearchProvStatusVisualization.jsx'; +import { CHART_PROV_STATUS } from './VnfSearchConstants.js'; +import Spinner from 'utils/SpinnerContainer.jsx'; + +describe('VnfSearchProvStatusVisualization - Shallow render of component', () => { + let wrapper; + const processedProvStatusCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present but not visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(false); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedProvStatusCountChartDataProp.values); + }); +}) + +describe('VnfSearchProvStatusVisualization - Shallow render of component with no chart data', () => { + let wrapper; + const processedProvStatusCountChartDataProp = { + values: null + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Visualization graph hidden', () => { + expect(wrapper.length).toEqual(1); + expect(['visualizations', 'hidden'].every(className => wrapper.hasClass(className))).toEqual(true); + }); +}) + +describe('VnfSearchProvStatusVisualization - Shallow render of component with busy feedback', () => { + let wrapper; + const processedProvStatusCountChartDataProp = { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present and visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(true); + }); + + it('Verify BarChart is displayed', () => { + expect(wrapper.find(BarChart)).toHaveLength(1); + expect(wrapper.find(BarChart).props().data).toEqual(processedProvStatusCountChartDataProp.values); + }); +}) + +describe('VnfSearchProvStatusVisualization - Render React Component (wrapped in )', () => { + const initialState = { + vnfSearch: { + processedProvStatusCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + enableBusyFeedback: false + } + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchProvStatusVisualization).length).toEqual(1); + }); + + it('Validate props from store', () => { + expect(wrapper.find(VnfSearchProvStatusVisualization).props().enableBusyFeedback).toEqual(initialState.vnfSearch.enableBusyFeedback); + expect(wrapper.find(VnfSearchProvStatusVisualization).props().processedProvStatusCountChartData).toEqual(initialState.vnfSearch.processedProvStatusCountChartData); + }); +}) + +describe('VnfSearchProvStatusVisualization - Render React Component (wrapped in ) with default props', () => { + const initialState = { + vnfSearch: {} + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchProvStatusVisualization).length).toEqual(1); + }); + + it('Validate default props loaded', () => { + expect(wrapper.find(VnfSearchProvStatusVisualization).props().enableBusyFeedback).toEqual(false); + expect(wrapper.find(VnfSearchProvStatusVisualization).props().processedProvStatusCountChartData).toEqual(CHART_PROV_STATUS.emptyData); + }); +}) diff --git a/src/app/vnfSearch/VnfSearchReducer.test.js b/src/app/vnfSearch/VnfSearchReducer.test.js new file mode 100644 index 0000000..ff06770 --- /dev/null +++ b/src/app/vnfSearch/VnfSearchReducer.test.js @@ -0,0 +1,438 @@ +import VnfSearchReducer from './VnfSearchReducer.js'; +import { + vnfActionTypes, + CHART_ORCH_STATUS, + CHART_PROV_STATUS, + CHART_NF_ROLE, + CHART_NF_TYPE, + TOTAL_VNF_COUNT +} from './VnfSearchConstants.js'; +import {ERROR_RETRIEVING_DATA} from 'app/networking/NetworkConstants.js'; +import { + filterBarActionTypes, + MESSAGE_LEVEL_DANGER +} from 'utils/GlobalConstants.js'; +import { + globalAutoCompleteSearchBarActionTypes +} from 'app/globalAutoCompleteSearchBar/GlobalAutoCompleteSearchBarConstants.js'; + +describe('VnfSearchReducer - Reducer Action Type Tests', () => { + it('Action Type: VNF_NETWORK_ERROR', () => { + const action = { + type: vnfActionTypes.VNF_NETWORK_ERROR + }; + let state = { + processedProvStatusCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + processedOrchStatusCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + processedNfTypeCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + processedNfRoleCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + count: 20, + feedbackMsgText: '', + feedbackMsgSeverity: '' + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + processedProvStatusCountChartData: CHART_PROV_STATUS.emptyData, + processedOrchStatusCountChartData: CHART_ORCH_STATUS.emptyData, + processedNfTypeCountChartData: CHART_NF_TYPE.emptyData, + processedNfRoleCountChartData: CHART_NF_ROLE.emptyData, + count: TOTAL_VNF_COUNT.emptyValue, + feedbackMsgText: ERROR_RETRIEVING_DATA, + feedbackMsgSeverity: MESSAGE_LEVEL_DANGER + }); + }); + + it('Action Type: SEARCH_WARNING_EVENT', () => { + const action = { + type: globalAutoCompleteSearchBarActionTypes.SEARCH_WARNING_EVENT + }; + let state = { + processedProvStatusCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + processedOrchStatusCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + processedNfTypeCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + processedNfRoleCountChartData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + count: 20, + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + processedProvStatusCountChartData: CHART_PROV_STATUS.emptyData, + processedOrchStatusCountChartData: CHART_ORCH_STATUS.emptyData, + processedNfTypeCountChartData: CHART_NF_TYPE.emptyData, + processedNfRoleCountChartData: CHART_NF_ROLE.emptyData, + count: TOTAL_VNF_COUNT.emptyValue, + }); + }); + + it('Action Type: NEW_SELECTIONS', () => { + const action = { + type: filterBarActionTypes.NEW_SELECTIONS, + data: { + selectedValuesMap: [ + { filter1: ['someValue'] } + ], + unifiedValues: [ + { filter1: ['someValue', 'someOtherValue']} + ] + } + }; + let state = { + vnfFilterValues: {}, + unifiedFilterValues: {} + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + vnfFilterValues: action.data.selectedValuesMap, + unifiedFilterValues: action.data.unifiedValues + }); + }); + + it('Action Type: SET_UNIFIED_VALUES', () => { + const action = { + type: filterBarActionTypes.SET_UNIFIED_VALUES, + data: { + unifiedValues: [ + { filter1: ['someValue', 'someOtherValue']} + ] + } + }; + let state = { + unifiedFilterValues: {} + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + unifiedFilterValues: action.data + }); + }); + + it('Action Type: VNF_SEARCH_RESULTS_RECEIVED', () => { + const action = { + type: vnfActionTypes.VNF_SEARCH_RESULTS_RECEIVED, + data: { + provStatusData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + orchStatusData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + nfTypeData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + nfRoleData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + count: 25, + } + }; + let state = { + processedProvStatusCountChartData: {}, + processedOrchStatusCountChartData: {}, + processedNfTypeCountChartData: {}, + processedNfRoleCountChartData: {}, + count: 0, + feedbackMsgText: 'some error msg', + feedbackMsgSeverity: 'someSeverityLevel' + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + processedProvStatusCountChartData: action.data.provStatusData, + processedOrchStatusCountChartData: action.data.orchStatusData, + processedNfTypeCountChartData: action.data.nfTypeData, + processedNfRoleCountChartData: action.data.nfRoleData, + count: action.data.count, + feedbackMsgText: '', + feedbackMsgSeverity: '' + }); + }); + + it('Action Type: VNF_FILTER_PANEL_TOGGLED', () => { + const action = { + type: vnfActionTypes.VNF_FILTER_PANEL_TOGGLED, + data: { + vnfVisualizationPanelClass: 'hide', + } + }; + let state = { + vnfVisualizationPanelClass: 'show' + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + vnfVisualizationPanelClass: 'hide' + }); + }); + + it('Action Type: VNF_SEARCH_FILTERS_RECEIVED', () => { + const action = { + type: vnfActionTypes.VNF_SEARCH_FILTERS_RECEIVED, + data: [ + { filter1: 'value 1' }, + { filter2: 'value 2' } + ] + }; + let state = { + vnfFilters: [] + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + vnfFilters: action.data + }); + }); + + it('Action Type: SET_NON_CONVERTED_VALUES', () => { + const action = { + type: filterBarActionTypes.SET_NON_CONVERTED_VALUES, + data: [ + { value1: 'abc' }, + { value2: 'xyz' } + ] + }; + let state = { + nonConvertedFilters: [] + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + nonConvertedFilters: action.data + }); + }); + + it('Action Type: SET_CONVERTED_VALUES', () => { + const action = { + type: filterBarActionTypes.SET_CONVERTED_VALUES, + data: { + convertedValues: { + value1: 'abc', + value2: 'xyz' + }, + nonConvertedValues: { + value1: 123, + value2: 456 + } + } + }; + let state = { + nonConvertedFilters: { + filter1: 'one', + filter2: 'two' + }, + unifiedFilterValues: {}, + vnfFilterValues: {} + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + nonConvertedFilters: {}, + unifiedFilterValues: action.data.convertedValues, + vnfFilterValues: action.data.nonConvertedValues + }); + }); + + it('Action Type: VNF_ACTIVATE_BUSY_FEEDBACK', () => { + const action = { + type: vnfActionTypes.VNF_ACTIVATE_BUSY_FEEDBACK + }; + let state = { + enableBusyFeedback: false + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + enableBusyFeedback: true + }); + }); + + it('Action Type: VNF_DISABLE_BUSY_FEEDBACK', () => { + const action = { + type: vnfActionTypes.VNF_DISABLE_BUSY_FEEDBACK + }; + let state = { + enableBusyFeedback: true + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + enableBusyFeedback: false + }); + }); + + it('Action Type: CLEAR_FILTERS', () => { + const action = { + type: filterBarActionTypes.CLEAR_FILTERS + }; + let state = { + vnfFilters: { + filter1: 'filterName1' + }, + vnfFilterValues: { + filter1: 'value 1' + }, + nonConvertedFilters: { + nonConvertedFilter1: 'some fitler props' + }, + unifiedFilterValues: { + unifiedFilter1: 'some unified props' + } + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + vnfFilters: {}, + vnfFilterValues: {}, + nonConvertedFilters: {}, + unifiedFilterValues: {} + }); + }); + + it('Invalid Action Type', () => { + const action = { + type: 'Nonexistent Action Type', + }; + let state = { + vnfFilters: { + filter1: 'filterName1' + }, + vnfFilterValues: { + filter1: 'value 1' + }, + nonConvertedFilters: { + nonConvertedFilter1: 'some fitler props' + }, + unifiedFilterValues: { + unifiedFilter1: 'some unified props' + }, + enableBusyFeedback: true, + provStatusData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + orchStatusData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + nfTypeData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + nfRoleData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + count: 25 + }; + state = VnfSearchReducer(state, action); + expect(state).toEqual({ + vnfFilters: { + filter1: 'filterName1' + }, + vnfFilterValues: { + filter1: 'value 1' + }, + nonConvertedFilters: { + nonConvertedFilter1: 'some fitler props' + }, + unifiedFilterValues: { + unifiedFilter1: 'some unified props' + }, + enableBusyFeedback: true, + provStatusData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + orchStatusData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + nfTypeData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + nfRoleData: { + values: [ + {x: 'col 1', y: 3}, + {x: 'col 2', y: 7}, + {x: 'col 3', y: 2} + ] + }, + count: 25 + }); + }); +}) diff --git a/src/app/vnfSearch/VnfSearchTotalCountVisualization.jsx b/src/app/vnfSearch/VnfSearchTotalCountVisualization.jsx index 3a767b9..3c73d22 100644 --- a/src/app/vnfSearch/VnfSearchTotalCountVisualization.jsx +++ b/src/app/vnfSearch/VnfSearchTotalCountVisualization.jsx @@ -38,7 +38,7 @@ let mapStateToProps = ({vnfSearch}) => { }; }; -class VnfSearchTotalCountVisualization extends Component { +export class VnfSearchTotalCountVisualization extends Component { static propTypes = { count: React.PropTypes.oneOfType([ React.PropTypes.string, diff --git a/src/app/vnfSearch/VnfSearchTotalCountVisualization.test.js b/src/app/vnfSearch/VnfSearchTotalCountVisualization.test.js new file mode 100644 index 0000000..e891c12 --- /dev/null +++ b/src/app/vnfSearch/VnfSearchTotalCountVisualization.test.js @@ -0,0 +1,131 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import {Provider} from 'react-redux' +import configureStore from 'redux-mock-store'; + +import ConnectedVnfSearchTotalCountVisualization, + { VnfSearchTotalCountVisualization } from './VnfSearchTotalCountVisualization.jsx'; +import { TOTAL_VNF_COUNT } from './VnfSearchConstants.js'; +import Spinner from 'utils/SpinnerContainer.jsx'; + +describe('VnfSearchTotalCountVisualization - Shallow render of component', () => { + let wrapper; + const countProp = 25; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present but not visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(false); + }); + + it('Verify total count is displayed', () => { + expect(wrapper.contains({countProp})).toBe(true); + }); +}) + +describe('VnfSearchTotalCountVisualization - Shallow render of component with no chart data', () => { + let wrapper; + const countProp = null; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Visualization graph hidden', () => { + expect(wrapper.length).toEqual(1); + expect(['visualizations', 'hidden'].every(className => wrapper.hasClass(className))).toEqual(true); + }); +}) + +describe('VnfSearchTotalCountVisualization - Shallow render of component with busy feedback', () => { + let wrapper; + const countProp = 25; + + beforeEach( () => { + wrapper = shallow( + + ); + }) + + it('Render basic component', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.hasClass('visualizations')).toEqual(true); + }); + + it('Verify Spinner is present and visible', () => { + expect(wrapper.find(Spinner)).toHaveLength(1); + expect(wrapper.find(Spinner).props().loading).toEqual(true); + }); + + it('Verify total count is displayed', () => { + expect(wrapper.contains({countProp})).toBe(true); + }); +}) + +describe('VnfSearchTotalCountVisualization - Render React Component (wrapped in )', () => { + const initialState = { + vnfSearch: { + count: 25, + enableBusyFeedback: false + } + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchTotalCountVisualization).length).toEqual(1); + }); + + it('Validate props from store', () => { + expect(wrapper.find(VnfSearchTotalCountVisualization).props().enableBusyFeedback).toEqual(initialState.vnfSearch.enableBusyFeedback); + expect(wrapper.find(VnfSearchTotalCountVisualization).props().count).toEqual(initialState.vnfSearch.count); + }); +}) + +describe('VnfSearchTotalCountVisualization - Render React Component (wrapped in ) with default props', () => { + const initialState = { + vnfSearch: {} + }; + const mockStore = configureStore(); + let store, wrapper; + + beforeEach( () => { + store = mockStore(initialState); + wrapper = mount(); + }) + + it('Render the connected component', () => { + expect(wrapper.find(ConnectedVnfSearchTotalCountVisualization).length).toEqual(1); + }); + + it('Validate default props loaded', () => { + expect(wrapper.find(VnfSearchTotalCountVisualization).props().enableBusyFeedback).toEqual(false); + expect(wrapper.find(VnfSearchTotalCountVisualization).props().count).toEqual(TOTAL_VNF_COUNT.emptyValue); + }); +}) diff --git a/src/utils/DateTimeChartUtil.test.js b/src/utils/DateTimeChartUtil.test.js new file mode 100644 index 0000000..b1e9d69 --- /dev/null +++ b/src/utils/DateTimeChartUtil.test.js @@ -0,0 +1,92 @@ +import { + sortDataByField, + dateFormatLocalTimeZoneMMDDYYYY, + dateFormatLocalTimeZoneYYYYMMDD, + getTicks, + getTicksData +} from './DateTimeChartUtil.js'; + +describe('DateTimeChartUtil Tests', () => { + it('sortDataByField', () => { + let initialData = [ + {word: 'plum', number: 2}, + {word: 'apple', number: 3}, + {word: 'banana', number: 1} + ]; + + sortDataByField(initialData, 'number'); + expect(initialData[0]['number']).toBe(1); + expect(initialData[0]['word']).toBe('banana'); + expect(initialData[1]['number']).toBe(2); + expect(initialData[1]['word']).toBe('plum'); + expect(initialData[2]['number']).toBe(3); + expect(initialData[2]['word']).toBe('apple'); + }); + + it('dateFormatLocalTimeZoneMMDDYYYY', () => { + const timestamp = Date.parse('Mon, 25 Dec 1995 13:30:00 GMT'); + let formattedDate = dateFormatLocalTimeZoneMMDDYYYY(timestamp); + expect(formattedDate).toBe('12/25/1995'); + }); + + it('dateFormatLocalTimeZoneYYYYMMDD', () => { + const timestamp = Date.parse('Mon, 25 Dec 1995 13:30:00 GMT'); + let formattedDate = dateFormatLocalTimeZoneYYYYMMDD(timestamp); + expect(formattedDate).toBe('1995-12-25'); + }); + + it('getTicks', () => { + const timestamps = [ + {timestamp: 1521691200000, date: 'Thu, 22 Mar 2018 04:00:00 GMT'}, + {timestamp: 1521777600000, date: 'Thu, 23 Mar 2018 04:00:00 GMT'}, + {timestamp: 1521950400000, date: 'Thu, 25 Mar 2018 04:00:00 GMT'}, + {timestamp: 1522296000000, date: 'Thu, 29 Mar 2018 04:00:00 GMT'} + ]; + let ticksPerDay = getTicks(timestamps, 'timestamp'); + // expect 1 tick (timestamp) for each day between March 22 - March 29 + expect(ticksPerDay.length).toBe(8); + }); + + it('getTicks - empty data', () => { + const timestamps = []; + let ticksPerDay = getTicks(timestamps, 'timestamp'); + expect(ticksPerDay.length).toBe(0); + }); + + it('getTicksData', () => { + const timestamps = [ + {timestamp: 1521691200000, date: 'Thu, 22 Mar 2018 04:00:00 GMT'}, + {timestamp: 1521777600000, date: 'Thu, 23 Mar 2018 04:00:00 GMT'}, + {timestamp: 1521950400000, date: 'Thu, 25 Mar 2018 04:00:00 GMT'}, + {timestamp: 1522296000000, date: 'Thu, 29 Mar 2018 04:00:00 GMT'} + ]; + let ticksPerDay = getTicks(timestamps, 'timestamp'); + let mergedData = getTicksData(timestamps, ticksPerDay, 'timestamp'); + // expect original 4 objects plus 4 additional objects for the missing days + // (4 additional objects will only have timestamp attribute, no date attribute) + expect(mergedData.length).toBe(8); + expect(mergedData[0]['timestamp']).toBe(1521691200000); + expect(mergedData[0]['date']).toBe('Thu, 22 Mar 2018 04:00:00 GMT'); + expect(mergedData[1]['timestamp']).toBe(1521777600000); + expect(mergedData[1]['date']).toBe('Thu, 23 Mar 2018 04:00:00 GMT'); + expect(mergedData[2]['timestamp']).toBe(1521950400000); + expect(mergedData[2]['date']).toBe('Thu, 25 Mar 2018 04:00:00 GMT'); + expect(mergedData[3]['timestamp']).toBe(1522296000000); + expect(mergedData[3]['date']).toBe('Thu, 29 Mar 2018 04:00:00 GMT'); + expect(mergedData[4]['timestamp']).toBeTruthy(); + expect(mergedData[4]['date']).toBeUndefined(); + expect(mergedData[5]['timestamp']).toBeTruthy(); + expect(mergedData[5]['date']).toBeUndefined(); + expect(mergedData[6]['timestamp']).toBeTruthy(); + expect(mergedData[6]['date']).toBeUndefined(); + expect(mergedData[7]['timestamp']).toBeTruthy(); + expect(mergedData[7]['date']).toBeUndefined(); + }); + + it('getTicksData - empty data', () => { + const timestamps = []; + let ticksPerDay = getTicks(timestamps, 'timestamp'); + let mergedData = getTicksData(timestamps, ticksPerDay, 'timestamp'); + expect(mergedData.length).toBe(0); + }); +}) diff --git a/src/utils/SpinnerContainer.jsx b/src/utils/SpinnerContainer.jsx index d787554..1c8b1cd 100644 --- a/src/utils/SpinnerContainer.jsx +++ b/src/utils/SpinnerContainer.jsx @@ -47,4 +47,3 @@ SpinnerContainer.propTypes = { SpinnerContainer.defaultProps = { loading: false }; - diff --git a/src/utils/SpinnerContainer.test.js b/src/utils/SpinnerContainer.test.js new file mode 100644 index 0000000..a217b8a --- /dev/null +++ b/src/utils/SpinnerContainer.test.js @@ -0,0 +1,35 @@ +import React from 'react'; +import { ClipLoader } from 'react-spinners'; +import { mount } from 'enzyme'; + +import SpinnerContainer from './SpinnerContainer.jsx'; +import {COLOR_BLUE} from 'utils/GlobalConstants.js'; + +describe('SpinnerContainer', () => { + it('render spinner - visible', () => { + const spinner = mount( + +
Testing Spinner Child
+
Testing Spinner Child
+
+ ); + expect(spinner.props().loading).toEqual(true); // check that the props match + expect(spinner.find(ClipLoader)).toHaveLength(1); // ensure the ClipLoader is mounted + expect(spinner.find(ClipLoader).props().color).toEqual(COLOR_BLUE); // ensure spinner is blue + expect(spinner.find(ClipLoader).props().loading).toEqual(true); // ensure spinner is showing + expect(spinner.find('div.spinner-content')).toHaveLength(1); // ensure the children are grayed out + expect(spinner.find('div.spinner-content').children()).toHaveLength(2); // ensure number of children is accurate + }); + + it('render spinner - not visible', () => { + const spinner = mount( + +
Testing Spinner
+
+ ); + expect(spinner.props().loading).toEqual(false); + expect(spinner.find(ClipLoader)).toHaveLength(1); + expect(spinner.find(ClipLoader).props().loading).toEqual(false); // ensure spinner is not showing + expect(spinner.find('div.spinner-content')).toHaveLength(0); + }); +}) diff --git a/test/components/dateRange.test.js b/test/components/dateRange.test.js deleted file mode 100644 index 161a57a..0000000 --- a/test/components/dateRange.test.js +++ /dev/null @@ -1,259 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import React from 'react'; -import TestUtils from 'react-dom/test-utils'; -import {Provider} from 'react-redux'; -import {expect} from 'chai'; -import i18n from 'utils/i18n/i18n'; - -import store from 'app/AppStore.js'; -import DateRange from 'generic-components/dateRange/DateRange.jsx'; -import { - dateRangeActionTypes, - LABEL_START_DATE, - LABEL_END_DATE, - DATE_PICKER_PLACEHOLDER, - IS_AFTER_END_DATE, - IS_BEFORE_START_DATE, - END_DATE, - START_DATE} from 'generic-components/dateRange/DateRangeConstants.js'; -import DateRangeActions from 'generic-components/dateRange/DateRangeActions.js'; -import reducer from 'generic-components/dateRange/DateRangeReducer.js'; -import sinon from 'sinon'; - -import { moment } from 'moment'; - -describe('Core Date Range suite', function() { - - beforeEach(function() { - this.component = TestUtils.renderIntoDocument(); - }); - - // test structure - it('Date Range - Validate start & end lables', function() { - let labels = TestUtils.scryRenderedDOMComponentsWithTag(this.component, 'label'); - expect(labels.length).to.equal(2); - expect(labels[0].textContent).to.equal(LABEL_START_DATE + ': '); - expect(labels[1].textContent).to.equal(LABEL_END_DATE + ': '); - }); - - it('Date Range - Start Date Picker exists', function() { - let datePicker = TestUtils.findRenderedDOMComponentWithClass(this.component, 'start-date-picker'); - expect(datePicker).to.exist; - expect(datePicker.type).to.equal('text'); - expect(datePicker.placeholder).to.equal(DATE_PICKER_PLACEHOLDER); - }); - - it('Date Range - End Date Picker exists', function() { - let datePicker = TestUtils.findRenderedDOMComponentWithClass(this.component, 'end-date-picker'); - expect(datePicker).to.exist; - expect(datePicker.type).to.equal('text'); - expect(datePicker.placeholder).to.equal(DATE_PICKER_PLACEHOLDER); - }); - - // Reducer Tests - it('Date Range Reducer ... set start date (no initial dates)', function() { - var moment = require('moment'); - const initialState = {}; - const dateChangeAction = {type: dateRangeActionTypes.DATE_RANGE_CHANGE, data: {dateRange: {startDate: moment(new Date('05/04/2016'))}, errorMsg: ''}}; - const newState = reducer(initialState, dateChangeAction); - expect(newState.dateRangeStart).to.exist; - expect(newState.dateRangeStart.toDate().getTime()).to.equal(new Date('05/04/2016').getTime()); - expect(newState.dateRangeEnd).to.not.exist; - expect(newState.dateRangeError).to.equal(''); - }); - it('Date Range Reducer ... update start date (no end date)', function() { - var moment = require('moment'); - const initialStartDate = new Date('05/01/2016'); - const initialState = {dateRange: {startDate: moment(initialStartDate)}}; - const dateChangeAction = {type: dateRangeActionTypes.DATE_RANGE_CHANGE, data: {dateRange: {startDate: moment(new Date('05/04/2016'))}, errorMsg: ''}}; - const newState = reducer(initialState, dateChangeAction); - expect(newState.dateRangeStart).to.exist; - expect(newState.dateRangeStart.toDate().getTime()).to.equal(new Date('05/04/2016').getTime()); - expect(newState.dateRangeEnd).to.not.exist; - expect(newState.dateRangeError).to.equal(''); - }); - it('Date Range Reducer - set end date (no start date)', function() { - var moment = require('moment'); - const initialState = {}; - const dateChangeAction = {type: dateRangeActionTypes.DATE_RANGE_CHANGE, data: {dateRange: {endDate: moment(new Date('05/04/2016'))}, errorMsg: ''}}; - const newState = reducer(initialState, dateChangeAction); - expect(newState.dateRangeEnd).to.exist; - expect(newState.dateRangeEnd.toDate().getTime()).to.equal(new Date('05/04/2016').getTime()); - expect(newState.dateRangeStart).to.not.exist; - expect(newState.dateRangeError).to.equal(''); - }); - it('Date Range Reducer - update end date (no start date)', function() { - var moment = require('moment'); - const initialEndDate = new Date('05/01/2016'); - const initialState = {dateRange: {endDate: moment(initialEndDate)}}; - const dateChangeAction = {type: dateRangeActionTypes.DATE_RANGE_CHANGE, data: {dateRange: {endDate: moment(new Date('05/04/2016'))}, errorMsg: ''}}; - const newState = reducer(initialState, dateChangeAction); - expect(newState.dateRangeEnd).to.exist; - expect(newState.dateRangeEnd.toDate().getTime()).to.equal(new Date('05/04/2016').getTime()); - expect(newState.dateRangeStart).to.not.exist; - expect(newState.dateRangeError).to.equal(''); - }); - it('Date Range Reducer - set end date with initial start date', function() { - var moment = require('moment'); - const initialStartDate = new Date('05/01/2016'); - const initialState = {dateRange: {startDate: moment(initialStartDate)}}; - const dateChangeAction = {type: dateRangeActionTypes.DATE_RANGE_CHANGE, data: {dateRange: {startDate: moment(new Date('05/01/2016')), endDate: moment(new Date('05/04/2016'))}, errorMsg: ''}}; - const newState = reducer(initialState, dateChangeAction); - expect(newState.dateRangeStart).to.exist; - expect(newState.dateRangeStart.toDate().getTime()).to.equal(new Date('05/01/2016').getTime()); - expect(newState.dateRangeEnd).to.exist; - expect(newState.dateRangeEnd.toDate().getTime()).to.equal(new Date('05/04/2016').getTime()); - expect(newState.dateRangeError).to.equal(''); - }); - it('Date Range Reducer - set start date with initial end date', function() { - var moment = require('moment'); - const initialEndDate = new Date('05/04/2016'); - const initialState = {dateRange: {endDate: moment(initialEndDate)}}; - const dateChangeAction = {type: dateRangeActionTypes.DATE_RANGE_CHANGE, data: {dateRange: {startDate: moment(new Date('05/01/2016')), endDate: moment(new Date('05/04/2016'))}, errorMsg: ''}}; - const newState = reducer(initialState, dateChangeAction); - expect(newState.dateRangeStart).to.exist; - expect(newState.dateRangeStart.toDate().getTime()).to.equal(new Date('05/01/2016').getTime()); - expect(newState.dateRangeEnd).to.exist; - expect(newState.dateRangeEnd.toDate().getTime()).to.equal(new Date('05/04/2016').getTime()); - expect(newState.dateRangeError).to.equal(''); - }); - it('Date Range Reducer - verify INVALID_DATE_RANGE event', function() { - var moment = require('moment'); - const errMsg = 'Some error message'; - const initialEndDate = new Date('05/01/2016'); - const initialStartDate = new Date('05/02/2016'); - const initialState = {startDate: moment(initialStartDate), endDate: moment(initialEndDate)}; - const invalidRangeAction = {type: dateRangeActionTypes.INVALID_DATE_RANGE, data: {dateRange: {startDate: moment(initialStartDate), endDate: moment(initialEndDate)}, errorMsg: errMsg}}; - const newState = reducer(initialState, invalidRangeAction); - expect(newState.endDate.toDate().getTime()).to.equal(new Date('05/01/2016').getTime()); - expect(newState.startDate.toDate().getTime()).to.equal(new Date('05/02/2016').getTime()); - expect(newState.dateRangeError).to.equal(errMsg); - }); - - // test Actions - it('Date Range Action - valid start date change', function() { - var moment = require('moment'); - const startDate = moment(new Date('07/19/2016')); - const endDate = moment(new Date('07/20/2016')); - const expectedAction = { - type: dateRangeActionTypes.DATE_RANGE_CHANGE, - data: { - dateRange: { - startDate: startDate, - endDate: endDate - }, - } - - }; - const results = DateRangeActions.onStartDateChange(startDate, endDate); - - expect(results.type).to.equal(expectedAction.type); - expect(results.data.dateRange.startDate).to.equal(expectedAction.data.dateRange.startDate); - expect(results.data.dateRange.endDate).to.equal(expectedAction.data.dateRange.endDate); - }); - it('Date Range Action - valid end date change', function() { - var moment = require('moment'); - const startDate = moment(new Date('07/19/2016')); - const endDate = moment(new Date('07/20/2016')); - const expectedAction = { - type: dateRangeActionTypes.DATE_RANGE_CHANGE, - data: { - dateRange: { - startDate: startDate, - endDate: endDate - }, - } - - }; - const results = DateRangeActions.onEndDateChange(startDate, endDate); - - expect(results.type).to.equal(expectedAction.type); - expect(results.data.dateRange.startDate).to.equal(expectedAction.data.dateRange.startDate); - expect(results.data.dateRange.endDate).to.equal(expectedAction.data.dateRange.endDate); - }); - it('Date Range Action - end date before start date', function() { - var moment = require('moment'); - const startDate = moment(new Date('07/21/2016')); - const endDate = moment(new Date('07/20/2016')); - const errorMsg = i18n(END_DATE) + ': ' + - moment(new Date(endDate)).format(DATE_PICKER_PLACEHOLDER) + - ' ' + i18n(IS_BEFORE_START_DATE); - const expectedAction = { - type: dateRangeActionTypes.INVALID_DATE_RANGE, - data: { - dateRange: { - startDate: startDate, - endDate: endDate - }, - errorMsg: errorMsg - } - - }; - const results = DateRangeActions.onEndDateChange(startDate, endDate); - - expect(results.type).to.equal(expectedAction.type); - expect(results.data.dateRange.startDate).to.equal(expectedAction.data.dateRange.startDate); - expect(results.data.dateRange.endDate).to.equal(expectedAction.data.dateRange.endDate); - expect(results.data.errorMsg).to.equal(expectedAction.data.errorMsg); - }); - it('Date Range Action - start date after date', function() { - var moment = require('moment'); - const startDate = moment(new Date('07/21/2016')); - const endDate = moment(new Date('07/20/2016')); - const errorMsg = i18n(START_DATE) + ': ' + - moment(new Date(startDate)).format(DATE_PICKER_PLACEHOLDER) + - ' ' + i18n(IS_AFTER_END_DATE); - const expectedAction = { - type: dateRangeActionTypes.INVALID_DATE_RANGE, - data: { - dateRange: { - startDate: startDate, - endDate: endDate - }, - errorMsg: errorMsg - } - - }; - const results = DateRangeActions.onStartDateChange(startDate, endDate); - - expect(results.type).to.equal(expectedAction.type); - expect(results.data.dateRange.startDate).to.equal(expectedAction.data.dateRange.startDate); - expect(results.data.dateRange.endDate).to.equal(expectedAction.data.dateRange.endDate); - expect(results.data.errorMsg).to.equal(expectedAction.data.errorMsg); - }); - it('Date Range Action - confirm onStartDateChange action called on startDate change', function() { - const spy = sinon.spy(DateRangeActions, 'onStartDateChange'); - let startDatePicker = TestUtils.findRenderedDOMComponentWithClass(this.component, 'start-date-picker'); - startDatePicker.value = '05/09/2016'; - TestUtils.Simulate.change(startDatePicker); - expect(DateRangeActions.onStartDateChange.calledOnce).to.be.true; - DateRangeActions.onStartDateChange.restore(); - }); - it('Date Range Action - confirm onEndDateChange action called on endDate change', function() { - const spy = sinon.spy(DateRangeActions, 'onEndDateChange'); - let endDatePicker = TestUtils.findRenderedDOMComponentWithClass(this.component, 'end-date-picker'); - endDatePicker.value = '05/09/2016'; - TestUtils.Simulate.change(endDatePicker); - expect(DateRangeActions.onEndDateChange.calledOnce).to.be.true; - DateRangeActions.onEndDateChange.restore(); - }); -}); diff --git a/test/components/dateRangeSelector.test.js b/test/components/dateRangeSelector.test.js deleted file mode 100644 index 134d6c6..0000000 --- a/test/components/dateRangeSelector.test.js +++ /dev/null @@ -1,303 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import React from "react"; -import TestUtils from "react-dom/test-utils"; -import {Provider} from "react-redux"; -import {expect} from "chai"; -import {moment} from "moment"; -import store from "app/AppStore.js"; -import DateRangeSelector from "generic-components/dateRangeSelector/DateRangeSelector.jsx"; -import DateRangeSelectorActions from "generic-components/dateRangeSelector/DateRangeSelectorActions.js"; -import { - dateRangeSelectorActionTypes, - TODAY, - YESTERDAY, - LAST_WEEK, - LAST_MONTH, - CUSTOM, - ICON_CLASS_CALENDAR, - ICON_CLASS_DOWN_CARET, - ERROR_UNKNOWN_PERIOD} from "generic-components/dateRangeSelector/DateRangeSelectorConstants.js"; -import reducer from "generic-components/dateRangeSelector/DateRangeSelectorReducer.js"; -import {dateRangeActionTypes, DATE_PICKER_PLACEHOLDER} from "generic-components/dateRange/DateRangeConstants.js"; -import {MESSAGE_LEVEL_DANGER} from "utils/GlobalConstants.js"; - -describe("Date Range Selector Test Suite", function() { - - beforeEach(function () { - this.component = TestUtils.renderIntoDocument( ); - }); - - // test structure - it("Date Range Selector - Validate selector button", function () { - var moment = require('moment'); - let currentDate = moment(new Date()).format(DATE_PICKER_PLACEHOLDER); - let button = TestUtils.findRenderedDOMComponentWithTag(this.component, 'button'); - expect(button).exists; - expect(button.childNodes.length).to.equal(3); - expect(button.childNodes[0].className).to.have.string(ICON_CLASS_CALENDAR); - expect(button.childNodes[1].innerHTML).to.have.string(currentDate + ' - ' + currentDate); - expect(button.childNodes[2].className).to.have.string(ICON_CLASS_DOWN_CARET); - }); - - it("Date Range Selector - Validate quick pick options", function () { - let button = TestUtils.findRenderedDOMComponentWithTag(this.component, 'button'); - TestUtils.Simulate.click(button); - - let popoverMenu = document.body.getElementsByClassName('popover-content'); - // TODO - need to figure out how to get the popover menu (above doesn't work) - }); - - // test reducer - it("Date Range Selector Reducer ... Vaidate DATE_RANGE_CHANGE event)", function() { - var moment = require('moment'); - const initialState = { - startDate: moment(new Date('07/20/2016')), - endDate: moment(new Date('07/09/2016')), - period: CUSTOM, - periodErrText: 'some error text', - periodErrSev: 'some error severity' - }; - const rangeChangeAction = { - type: dateRangeActionTypes.DATE_RANGE_CHANGE, - data: { - dateRange: { - startDate: moment(new Date('05/04/2016')), - endDate: moment(new Date('06/05/2016')) - }, - errorMsg: '' - }}; - const newState = reducer(initialState, rangeChangeAction); - expect(newState.startDate).to.exist; - expect(newState.startDate.toDate().getTime()).to.equal(new Date('05/04/2016').getTime()); - expect(newState.endDate).to.exist; - expect(newState.endDate.toDate().getTime()).to.equal(new Date('06/05/2016').getTime()); - expect(newState.period).to.equal(CUSTOM); - expect(newState.periodErrText).to.equal(''); - expect(newState.periodErrSev).to.equal(''); - }); - it("Date Range Selector Reducer ... Vaidate INVALID_DATE_RANGE event)", function() { - var moment = require('moment'); - const initialState = {}; - const rangeChangeAction = { - type: dateRangeActionTypes.INVALID_DATE_RANGE, - data: { - dateRange: { - startDate: moment(new Date('07/04/2016')), - endDate: moment(new Date('06/05/2016')) - }, - errorMsg: 'some eror message' - }}; - const newState = reducer(initialState, rangeChangeAction); - expect(newState.startDate).to.exist; - expect(newState.startDate.toDate().getTime()).to.equal(new Date('07/04/2016').getTime()); - expect(newState.endDate).to.exist; - expect(newState.endDate.toDate().getTime()).to.equal(new Date('06/05/2016').getTime()); - expect(newState.period).to.not.exist; - expect(newState.periodErrText).to.equal('some eror message'); - expect(newState.periodErrSev).to.equal(MESSAGE_LEVEL_DANGER); - }); - it("Date Range Selector Reducer ... Vaidate PERIOD_CHANGE event)", function() { - var moment = require('moment'); - const initialState = { - startDate: moment(new Date('07/20/2016')), - endDate: moment(new Date('07/09/2016')), - period: CUSTOM, - periodErrText: 'some error text', - periodErrSev: 'some error severity' - }; - const rangeChangeAction = { - type: dateRangeSelectorActionTypes.EVENT_PERIOD_CHANGE, - data: { - dateRange: { - startDate: moment(new Date('07/04/2016')), - endDate: moment(new Date('07/05/2016')) - }, - period: YESTERDAY - } - }; - const newState = reducer(initialState, rangeChangeAction); - expect(newState.startDate).to.exist; - expect(newState.startDate.toDate().getTime()).to.equal(new Date('07/04/2016').getTime()); - expect(newState.endDate).to.exist; - expect(newState.endDate.toDate().getTime()).to.equal(new Date('07/05/2016').getTime()); - expect(newState.period).to.equal(YESTERDAY); - expect(newState.periodErrText).to.equal(''); - expect(newState.periodErrSev).to.equal(''); - }); - - // test Actions - it("Date Range Selector Action - test EVENT_PERIOD_CHANGE (period = Today)", function() { - var moment = require('moment'); - const startDate = moment(new Date()); - const endDate = moment(new Date()); - const period = TODAY; - - const results = DateRangeSelectorActions.onPeriodChange(startDate, endDate, period); - - const expectedStartTime = moment(new Date()); - setTime(expectedStartTime, 0, 0, 0); - const expectedEndTime = moment(new Date()); - setTime(expectedEndTime, 23, 59, 59); - const expectedAction = buildExpectedPeriodChangeAction(expectedStartTime, expectedEndTime, TODAY); - - expect(results.type).to.equal(expectedAction.type); - validateDates(results.data.dateRange.startDate, expectedAction.data.dateRange.startDate); - validateDates(results.data.dateRange.endDate, expectedAction.data.dateRange.endDate); - expect(results.data.period).to.equal(expectedAction.data.period); - }); - it("Date Range Selector Action - test EVENT_PERIOD_CHANGE (period = Yesterday)", function() { - var moment = require('moment'); - const startDate = moment(new Date()); - const endDate = moment(new Date()); - const period = YESTERDAY; - - const results = DateRangeSelectorActions.onPeriodChange(startDate, endDate, period); - - const expectedStartTime = moment(new Date()).subtract(1, 'days'); - setTime(expectedStartTime, 0, 0, 0); - const expectedEndTime = moment(new Date()); - setTime(expectedEndTime, 23, 59, 59); - const expectedAction = buildExpectedPeriodChangeAction(expectedStartTime, expectedEndTime, YESTERDAY); - - expect(results.type).to.equal(expectedAction.type); - validateDates(results.data.dateRange.startDate, expectedAction.data.dateRange.startDate); - validateDates(results.data.dateRange.endDate, expectedAction.data.dateRange.endDate); - expect(results.data.period).to.equal(expectedAction.data.period); - }); - it("Date Range Selector Action - test EVENT_PERIOD_CHANGE (period = Last Week)", function() { - var moment = require('moment'); - const startDate = moment(new Date()); - const endDate = moment(new Date()); - const period = LAST_WEEK; - - const results = DateRangeSelectorActions.onPeriodChange(startDate, endDate, period); - - const expectedStartTime = moment(new Date()).subtract(7, 'days'); - setTime(expectedStartTime, 0, 0, 0); - const expectedEndTime = moment(new Date()); - setTime(expectedEndTime, 23, 59, 59); - const expectedAction = buildExpectedPeriodChangeAction(expectedStartTime, expectedEndTime, LAST_WEEK); - - expect(results.type).to.equal(expectedAction.type); - validateDates(results.data.dateRange.startDate, expectedAction.data.dateRange.startDate); - validateDates(results.data.dateRange.endDate, expectedAction.data.dateRange.endDate); - expect(results.data.period).to.equal(expectedAction.data.period); - }); - it("Date Range Selector Action - test EVENT_PERIOD_CHANGE (period = Last Month)", function() { - var moment = require('moment'); - const startDate = moment(new Date()); - const endDate = moment(new Date()); - const period = LAST_MONTH; - - const results = DateRangeSelectorActions.onPeriodChange(startDate, endDate, period); - - const expectedStartTime = moment(new Date()).subtract(1, 'months'); - setTime(expectedStartTime, 0, 0, 0); - const expectedEndTime = moment(new Date()); - setTime(expectedEndTime, 23, 59, 59); - const expectedAction = buildExpectedPeriodChangeAction(expectedStartTime, expectedEndTime, LAST_MONTH); - - expect(results.type).to.equal(expectedAction.type); - validateDates(results.data.dateRange.startDate, expectedAction.data.dateRange.startDate); - validateDates(results.data.dateRange.endDate, expectedAction.data.dateRange.endDate); - expect(results.data.period).to.equal(expectedAction.data.period); - }); - it("Date Range Selector Action - test EVENT_PERIOD_CHANGE (period = Custom)", function() { - var moment = require('moment'); - const startDate = moment(new Date()).subtract(3, 'months'); - const endDate = moment(new Date()).add(6, 'days'); - const period = CUSTOM; - - const results = DateRangeSelectorActions.onPeriodChange(startDate, endDate, period); - - setTime(startDate, 0, 0, 0); - setTime(endDate, 23, 59, 59); - const expectedAction = buildExpectedPeriodChangeAction(startDate, endDate, CUSTOM); - - expect(results.type).to.equal(expectedAction.type); - validateDates(results.data.dateRange.startDate, expectedAction.data.dateRange.startDate); - validateDates(results.data.dateRange.endDate, expectedAction.data.dateRange.endDate); - expect(results.data.period).to.equal(expectedAction.data.period); - }); - it("Date Range Selector Action - test EVENT_PERIOD_CHANGE (period = Unknown)", function() { - var moment = require('moment'); - const startDate = moment(new Date()).subtract(3, 'months'); - const endDate = moment(new Date()).add(6, 'days'); - const period = 'Some Unknown Period'; - - const results = DateRangeSelectorActions.onPeriodChange(startDate, endDate, period); - - let expectedErrorMsg = ERROR_UNKNOWN_PERIOD + ': ' + period; - const expectedAction = buildExpectedUnknownPeriodAction(startDate, endDate, period, expectedErrorMsg); - - expect(results.type).to.deep.equal(expectedAction.type); - validateDates(results.data.dateRange.startDate, expectedAction.data.dateRange.startDate); - validateDates(results.data.dateRange.endDate, expectedAction.data.dateRange.endDate); - expect(results.data.period).to.equal(expectedAction.data.period); - }); - - // TODO - need tests to confirm DateRangeSelectorActions.onPeriodChange is called when clicking any of the 'quick link' periods - - - // helper functions - function setTime(moment, hours, minutes, seconds) { - moment.toDate(); - moment.hour(hours); - moment.minute(minutes); - moment.second(seconds); - } - - function validateDates(actualDate, expectedDates) { - expect(actualDate.toDate().getYear()).to.equal(expectedDates.toDate().getYear()); - expect(actualDate.toDate().getMonth()).to.equal(expectedDates.toDate().getMonth()); - expect(actualDate.toDate().getDay()).to.equal(expectedDates.toDate().getDay()); - expect(actualDate.toDate().getHours()).to.equal(expectedDates.toDate().getHours()); - expect(actualDate.toDate().getMinutes()).to.equal(expectedDates.toDate().getMinutes()); - } - - function buildExpectedPeriodChangeAction(start, end, period) { - return { - type: dateRangeSelectorActionTypes.EVENT_PERIOD_CHANGE, - data: { - dateRange: { - startDate: start, - endDate: end - }, - period: period - } - }; - } - - function buildExpectedUnknownPeriodAction(start, end, period, errorMsg) { - return { - type: dateRangeSelectorActionTypes.EVENT_PERIOD_ERROR, - data: { - dateRange: { - startDate: start, - endDate: end - }, - period: period, - errorMsg: errorMsg - } - }; - } -}); diff --git a/test/components/inlineMessage.test.js b/test/components/inlineMessage.test.js deleted file mode 100644 index b56a97f..0000000 --- a/test/components/inlineMessage.test.js +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import { expect } from 'chai'; -import React from 'react'; -import TestUtils from 'react-dom/test-utils'; -import InlineMessage from 'generic-components/InlineMessage/InlineMessage.jsx'; -import InlineMessageConstants from 'generic-components/InlineMessage/InlineMessageConstants.js'; - -describe('Core Inline Message Suite', function() { - - let _successMessage; - let _warningMessage; - let _dangerMessage; - let _defaultMessage; - - beforeEach(function() { - _warningMessage = TestUtils.renderIntoDocument(); - _successMessage = TestUtils.renderIntoDocument(); - _dangerMessage = TestUtils.renderIntoDocument(); - _defaultMessage = TestUtils.renderIntoDocument(); - }); - - // test structure - it('Inline Message - validate success message panel', function() { - let alertPanel = TestUtils.findRenderedDOMComponentWithClass(_successMessage, 'alert'); - expect(alertPanel).to.exist; // alert panel exists - let alertPanel_style = TestUtils.findRenderedDOMComponentWithClass(_successMessage, 'alert-success'); - expect(alertPanel_style).to.exist; // alert panel has proper styling - let messagePanel = TestUtils.findRenderedDOMComponentWithClass(_successMessage, InlineMessageConstants.MESSAGE_PANEL_CLASSNAME); - expect(messagePanel).to.exist; - expect(messagePanel.innerHTML).to.have.string('Success Message'); // messagePanel panel has proper message - let iconPanel = TestUtils.findRenderedDOMComponentWithClass(_successMessage, InlineMessageConstants.ICON_PANEL_CLASSNAME); - expect(iconPanel).to.exist; - expect(iconPanel.innerHTML).to.have.string(InlineMessageConstants.SUCCESS_CLASSNAME); // notification panel has proper styling - }); - it('Inline Message - validate info message panel', function() { - let alertPanel = TestUtils.findRenderedDOMComponentWithClass(_defaultMessage, 'alert'); - expect(alertPanel).to.exist; // alert panel exists - let alertPanel_style = TestUtils.findRenderedDOMComponentWithClass(_defaultMessage, 'alert-info'); - expect(alertPanel_style).to.exist; // alert panel has proper styling - let messagePanel = TestUtils.findRenderedDOMComponentWithClass(_defaultMessage, InlineMessageConstants.MESSAGE_PANEL_CLASSNAME); - expect(messagePanel).to.exist; - expect(messagePanel.innerHTML).to.have.string('Info Message'); // messagePanel panel has proper message - let iconPanel = TestUtils.findRenderedDOMComponentWithClass(_defaultMessage, InlineMessageConstants.ICON_PANEL_CLASSNAME); - expect(iconPanel).to.exist; - expect(iconPanel.innerHTML).to.have.string(InlineMessageConstants.DEFAULT_CLASSNAME); // icon panel has proper styling - }); - it('Inline Message - validate warning message panel', function() { - let alertPanel = TestUtils.findRenderedDOMComponentWithClass(_warningMessage, 'alert'); - expect(alertPanel).to.exist; // alert panel exists - let alertPanel_style = TestUtils.findRenderedDOMComponentWithClass(_warningMessage, 'alert-warning'); - expect(alertPanel_style).to.exist; // alert panel has proper styling - let messagePanel = TestUtils.findRenderedDOMComponentWithClass(_warningMessage, InlineMessageConstants.MESSAGE_PANEL_CLASSNAME); - expect(messagePanel).to.exist; - expect(messagePanel.innerHTML).to.have.string('Warning Message'); // messagePanel panel has proper message - let iconPanel = TestUtils.findRenderedDOMComponentWithClass(_warningMessage, InlineMessageConstants.ICON_PANEL_CLASSNAME); - expect(iconPanel).to.exist; - expect(iconPanel.innerHTML).to.have.string(InlineMessageConstants.WARNING_CLASSNAME); // icon panel has proper styling - }); - it('Inline Message - validate danger message panel', function() { - let alertPanel = TestUtils.findRenderedDOMComponentWithClass(_dangerMessage, 'alert'); - expect(alertPanel).to.exist; // alert panel exists - let alertPanel_style = TestUtils.findRenderedDOMComponentWithClass(_dangerMessage, 'alert-danger'); - expect(alertPanel_style).to.exist; // alert panel has proper styling - let messagePanel = TestUtils.findRenderedDOMComponentWithClass(_dangerMessage, InlineMessageConstants.MESSAGE_PANEL_CLASSNAME); - expect(messagePanel).to.exist; - expect(messagePanel.innerHTML).to.have.string('Danger Message'); // messagePanel panel has proper message - let iconPanel = TestUtils.findRenderedDOMComponentWithClass(_dangerMessage, InlineMessageConstants.ICON_PANEL_CLASSNAME); - expect(iconPanel).to.exist; - expect(iconPanel.innerHTML).to.have.string(InlineMessageConstants.DANGER_CLASSNAME); // icon panel has proper styling - }); -}); diff --git a/test/components/notificationReducer.test.js b/test/components/notificationReducer.test.js deleted file mode 100644 index 9600a82..0000000 --- a/test/components/notificationReducer.test.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import { expect } from 'chai'; -import NotificationConstants from 'generic-components/notifications/NotificationConstants.js'; -import reducer from 'generic-components/notifications/NotificationReducer.js'; - -describe("Notification reducer test suite", function() { - const initialState = { - title: '', - msg: '', - timeout: 0 - }; - - it("NOTIFY_INFO event", function() { - const action = { - type: NotificationConstants.NOTIFY_INFO, - data: { - title: 'some title', - msg: 'some message', - timeout: 1 - } - } - const newState = reducer(initialState, action); - - expect(newState.type).to.equal('default'); - expect(newState.title).to.equal('some title'); - expect(newState.msg).to.equal('some message'); - expect(newState.timeout).to.equal(1); - }); - - it("NOTIFY_ERROR event", function() { - const action = { - type: NotificationConstants.NOTIFY_ERROR, - data: { - title: 'some title', - msg: 'some message', - timeout: 1 - } - } - const newState = reducer(initialState, action); - - expect(newState.type).to.equal('error'); - expect(newState.title).to.equal('some title'); - expect(newState.msg).to.equal('some message'); - expect(newState.timeout).to.equal(1); - }); - - it("NOTIFY_WARNING event", function() { - const action = { - type: NotificationConstants.NOTIFY_WARNING, - data: { - title: 'some title', - msg: 'some message', - timeout: 1 - } - } - const newState = reducer(initialState, action); - - expect(newState.type).to.equal('warning'); - expect(newState.title).to.equal('some title'); - expect(newState.msg).to.equal('some message'); - expect(newState.timeout).to.equal(1); - }); - - it("NOTIFY_SUCCESS event", function() { - const action = { - type: NotificationConstants.NOTIFY_SUCCESS, - data: { - title: 'some title', - msg: 'some message', - timeout: 1 - } - } - const newState = reducer(initialState, action); - - expect(newState.type).to.equal('success'); - expect(newState.title).to.equal('some title'); - expect(newState.msg).to.equal('some message'); - expect(newState.timeout).to.equal(1); - }); - - it("NOTIFY_CLOSE event", function() { - const action = { - type: NotificationConstants.NOTIFY_CLOSE - } - const newState = reducer(initialState, action); - - expect(newState).to.be.null; - }); -}); diff --git a/test/components/toggleButtonGroupReducer.test.js b/test/components/toggleButtonGroupReducer.test.js deleted file mode 100644 index 93ddaf9..0000000 --- a/test/components/toggleButtonGroupReducer.test.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import { expect } from 'chai'; -import {BUTTON_TOGGLED} from 'generic-components/toggleButtonGroup/ToggleButtonGroupConstants.js'; -import reducer from 'generic-components/toggleButtonGroup/ToggleButtonGroupReducer.js'; - -describe("Toggle Button Group reducer test suite", function() { - const initialState = { - selectedButton: '' - }; - - it("BUTTON_TOGGLED event", function () { - const action = { - type: BUTTON_TOGGLED, - data: { - button: 'some button name' - } - } - const newState = reducer(initialState, action); - - expect(newState.selectedButton).to.equal('some button name'); - }); -}); diff --git a/test/fileMock.js b/test/fileMock.js new file mode 100644 index 0000000..86059f3 --- /dev/null +++ b/test/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub'; diff --git a/test/setupTests.js b/test/setupTests.js new file mode 100644 index 0000000..7237dc9 --- /dev/null +++ b/test/setupTests.js @@ -0,0 +1,5 @@ +import { configure } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-15'; +import 'jest-enzyme'; + +configure({ adapter: new Adapter() }); diff --git a/test/styleMock.js b/test/styleMock.js new file mode 100644 index 0000000..f053ebf --- /dev/null +++ b/test/styleMock.js @@ -0,0 +1 @@ +module.exports = {}; diff --git a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBar.test.js b/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBar.test.js deleted file mode 100644 index dc4ebf4..0000000 --- a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBar.test.js +++ /dev/null @@ -1,313 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import {expect, deep} from 'chai'; -import React from 'react'; -import {Provider} from 'react-redux'; -import sinon from 'sinon'; -import configureStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import {storeCreator} from 'app/AppStore.js'; -import TestUtils from 'react-dom/test-utils'; -import { - autoCompleteSearchBarActionTypes, - ERROR_INVALID_SEARCH_TERMS, - TS_BACKEND_SEARCH_SELECTED_NODE_URL, - NO_MATCHES_FOUND -} from 'generic-components/autoCompleteSearchBar/AutoCompleteSearchBarConstants.js'; -import {AutoCompleteSearchBar} from 'generic-components/autoCompleteSearchBar/AutoCompleteSearchBar.jsx'; -import {ERROR_RETRIEVING_DATA, POST, POST_HEADER} from 'app/networking/NetworkConstants.js'; -import {tierSupportActionTypes, TSUI_SEARCH_URL} from 'app/tierSupport/TierSupportConstants.js'; - -import {mount, shallow} from 'enzyme'; -import i18n from 'utils/i18n/i18n'; -import { - queryRequestedValues, - clearSuggestionsTextField, - onSuggestionsChange, - onSuggestionsClearRequested, - querySelectedNodeElement, - getInvalidSearchInputEvent -} from 'app/globalAutoCompleteSearchBar/GlobalAutoCompleteSearchBarActions.js'; -import * as networkCall from 'app/networking/NetworkCalls.js'; -import autoCompleteSearchBarTestConstants from './autoCompleteSearchBarTestConstants'; - -const middlewares = [thunk]; // add your middlewares like `redux-thunk` -const mockStore = configureStore(middlewares); - - -describe('Core AutoCompleteSearchBar suite', function() { - - describe('AutoCompleteSearchBar - View test ', function() { - let wrapper = undefined; - - beforeEach(() => { - wrapper = mount( - {}} - value='' - suggestions={[]} - cachedSuggestions={[]} - feedbackMsgText='' - feedbackMsgSeverity='' - /> - ); - }); - - function createState(currentScreen, tierSupport) { - return { - currentScreen: currentScreen, - tierSupport: tierSupport - }; - } - - - - 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 => { - const mStore = mockStore({}); - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').once().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.validResponseJsonForNodeSearchFromFetchWithHits)); - let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, - suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - onNewSearch: (searchRequestObject, value) => { - if (Object.keys(searchRequestObject).length === 0) { - mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword)); - } else { - mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest)); - } - } - - }); - - function onSucessfullNodeDetailsFoundEvent(){ - return { - type: tierSupportActionTypes.TS_NODE_SEARCH_RESULTS, - data: autoCompleteSearchBarTestConstants.validResponseJsonForNodeSearchFromFetchWithHits - }; - } - wrapper.find('.auto-complete-search-button').simulate('click'); - mockNetwork.verify(); - mockNetwork.restore(); - setTimeout(() => expect(mStore.getActions()[0]).to.deep.equal(onSucessfullNodeDetailsFoundEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - 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 => { - - const mStore = mockStore({}); - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').once().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.inValidResponseJsonForNodeSearchFromFetchWithHits)); - let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, - suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - onNewSearch: (searchRequestObject, value) => { - if (Object.keys(searchRequestObject).length === 0) { - mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword)); - } else { - mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest)); - } - } - - }); - - function onNofullNodeDetailsFoundEvent(){ - return { - type: tierSupportActionTypes.TS_NODE_SEARCH_NO_RESULTS, - data: {searchTag: autoCompleteSearchBarTestConstants.nodeSearchKeyword} - }; - } - wrapper.find('.auto-complete-search-button').simulate('click'); - mockNetwork.verify(); - mockNetwork.restore(); - setTimeout(() => { - expect(mStore.getActions()[0]).to.deep.equal(onNofullNodeDetailsFoundEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut; - }); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Test flow - test onNewSearch() failure: Expect tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR action being passed When Network fails', done => { - const mStore = mockStore({}); - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').once().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError)); - let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, - suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - onNewSearch: (searchRequestObject, value) => { - if (Object.keys(searchRequestObject).length === 0) { - mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword)); - } else { - mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest)); - } - } - - }); - - function onInvalidSelectedNodeSearchEvent(){ - return { - type: tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR, - data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_RETRIEVING_DATA} - }; - } - wrapper.find('.auto-complete-search-button').simulate('click'); - mockNetwork.verify(); - mockNetwork.restore(); - setTimeout(() => { - expect(mStore.getActions()[0]).to.deep.equal(onInvalidSelectedNodeSearchEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut; - }); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - - it('Test flow - test onNewSearch() failure: Expect tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS action being passed When no cached suggestions are found', done => { - const mStore = mockStore({}); - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').never().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError)); - let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, - suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - cachedSuggestions: [], - onNewSearch: (searchRequestObject, value) => { - if (Object.keys(searchRequestObject).length === 0) { - mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword)); - } else { - mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest)); - } - } - - }); - - function onInvalidSearchInputEvent(){ - return { - type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS, - data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_INVALID_SEARCH_TERMS} - }; - } - wrapper.find('.auto-complete-search-button').simulate('click'); - mockNetwork.verify(); - mockNetwork.restore(); - setTimeout(() => { - expect(mStore.getActions()[0]).to.deep.equal(onInvalidSearchInputEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut; - }); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Test flow - test onNewSearch() failure: Expect no matches found When no cached suggestions does not have the node searched for', done => { - const mStore = mockStore({}); - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').never().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError)); - let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, - suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType2.hits.hits, - onNewSearch: (searchRequestObject, value) => { - if (Object.keys(searchRequestObject).length === 0) { - mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword)); - } else { - mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest)); - } - } - - }); - - function onInvalidSearchInputEvent(){ - return { - type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS, - data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_INVALID_SEARCH_TERMS} - }; - } - wrapper.find('.auto-complete-search-button').simulate('click'); - mockNetwork.verify(); - mockNetwork.restore(); - setTimeout(() => { - expect(mStore.getActions()[0]).to.deep.equal(onInvalidSearchInputEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut; - }); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Test flow - test onNewSearch() failure: Expect no node search When no matches are found in lookup search', done => { - const mStore = mockStore({}); - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').never().withArgs(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError)); - let mockedNetworkFetchRequest = () => networkCall.fetchRequest(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST, POST_HEADER, autoCompleteSearchBarTestConstants.nodeSearchKeyword); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.multipleNodeSearchKeyword, - suggestions: [{_source:{ entityType:i18n(NO_MATCHES_FOUND),searchTags:''}}], - cachedSuggestions: [{_source:{ entityType:i18n(NO_MATCHES_FOUND),searchTags:''}}], - onNewSearch: (searchRequestObject, value) => { - if (Object.keys(searchRequestObject).length === 0) { - mStore.dispatch(getInvalidSearchInputEvent(autoCompleteSearchBarTestConstants.nodeSearchKeyword)); - } else { - mStore.dispatch(querySelectedNodeElement(searchRequestObject, autoCompleteSearchBarTestConstants.nodeSearchKeyword, mockedNetworkFetchRequest)); - } - } - - }); - - function onInvalidSearchInputEvent(){ - return { - type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS, - data: {value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, errorMsg: ERROR_INVALID_SEARCH_TERMS} - }; - - } - wrapper.find('.react-autosuggest__input').simulate('focus'); - wrapper.find('.auto-complete-search-button').simulate('click'); - mockNetwork.verify(); - mockNetwork.restore(); - setTimeout(() => { - expect(mStore.getActions()[0]).to.deep.equal(onInvalidSearchInputEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut; - }); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Expect the list to be populated when a the auto suggest input box is focused', function() { - const mStore = mockStore({}); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.nodeSearchKeywordWithOutEqualSign, - suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits, - - }); - wrapper.find('.react-autosuggest__input').simulate('focus'); - expect(wrapper.find('Item').children()).to.have.length(6); - }); - - it('Expect small list to be populated when a the auto suggest input box is focused', function() { - const mStore = mockStore({}); - wrapper.setProps({ - value: autoCompleteSearchBarTestConstants.nodeSearchKeyword, - suggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType2.hits.hits, - cachedSuggestions: autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType2.hits.hits, - - }); - wrapper.find('.react-autosuggest__input').simulate('focus'); - expect(wrapper.find('Item').children()).to.have.length(3); - }); - }); -}); diff --git a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarActions.test.js b/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarActions.test.js deleted file mode 100644 index b1b89e0..0000000 --- a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarActions.test.js +++ /dev/null @@ -1,259 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import {expect, deep} from "chai"; -import React from "react"; -import {Provider} from "react-redux"; -import sinon from "sinon"; -import configureStore from "redux-mock-store"; -import thunk from "redux-thunk"; -import {storeCreator} from "app/AppStore.js"; -import { - autoCompleteSearchBarActionTypes, - TS_BACKEND_SEARCH_SELECTED_NODE_URL, - ERROR_INVALID_SEARCH_TERMS, - TIER_SUPPORT_NETWORK_ERROR -} from 'generic-components/autoCompleteSearchBar/AutoCompleteSearchBarConstants.js'; -import { - searchResultsFound, - clearSuggestionsTextField, - onSuggestionsChange, - onSuggestionsClearRequested, - getInvalidSearchInputEvent, - fetchRequestedValues, - fetchSelectedNodeElement, - queryRequestedValues -} from 'app/globalAutoCompleteSearchBar/GlobalAutoCompleteSearchBarActions.js'; -import {tierSupportActionTypes, TSUI_SEARCH_URL} from "app/tierSupport/TierSupportConstants.js"; -import {getDynamicTSUISearchURL} from "app/tierSupport/TierSupportActions.js"; -import * as networkCall from "app/networking/NetworkCalls.js"; -import {POST, - POST_HEADER, - ERROR_RETRIEVING_DATA} from "app/networking/NetworkConstants.js"; -import autoCompleteSearchBarTestConstants from "./autoCompleteSearchBarTestConstants"; - -const middlewares = [thunk]; // add your middlewares like `redux-thunk` -const mockStore = configureStore(middlewares); - - -describe('Core AutoCompleteSearchBar suite', function() { - - describe('AutoCompleteSearchBar - Actions test ', function() { - - function createState(currentScreen, tierSupport) { - return { - currentScreen: currentScreen, - tierSupport: tierSupport - }; - } - - it('Expect CLEAR_SUGGESTIONS_TEXT_FIELD action being passed When clearSuggestionsTextField is dispatched.', function(){ - const store = mockStore({}); - function clearSuggestionsTextFieldSuccess() { - return { - type: autoCompleteSearchBarActionTypes.CLEAR_SUGGESTIONS_TEXT_FIELD - } - } - - store.dispatch(clearSuggestionsTextField()); - expect(store.getActions()[0]).to.deep.equal(clearSuggestionsTextFieldSuccess()); - }); - - it('Expect CLEAR_SUGGESTIONS action being passed When onSuggestionsClearRequested is dispatched.', function() { - const store = mockStore({}); - function onSuggestionsClearRequestedSuccess() { - return { - type: autoCompleteSearchBarActionTypes.CLEAR_SUGGESTIONS - } - } - - store.dispatch(onSuggestionsClearRequested()); - expect(store.getActions()[0]).to.deep.equal(onSuggestionsClearRequestedSuccess()); - - }); - - it('Expect TS_NODE_SEARCH_INVALID_TERMS action being passed When getInvalidSearchInputEvent is dispatched.', function(){ - const store = mockStore({}); - const value = 'test'; - - function onGetInvalidSearchInputEvent(){ - return{ - type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS, - data: {value: value, errorMsg: ERROR_INVALID_SEARCH_TERMS} - } - } - - store.dispatch(getInvalidSearchInputEvent(value)); - expect(store.getActions()[0]).to.deep.equal(onGetInvalidSearchInputEvent()); - - }); - - }); - - it('Expect SUGGESTION_CHANGED action being passed When onSuggestionsChangeSuccess is dispatched with tab key.', function() { - const store = mockStore({}); - const value = 'test'; - - function onSuggestionsChangeSuccess() { - return { - type: autoCompleteSearchBarActionTypes.SUGGESTION_CHANGED, - data: value - } - } - - var event = { - keyCode: 9 - }; - - store.dispatch(onSuggestionsChange(event, value)); - expect(store.getActions()[0]).to.deep.equal(onSuggestionsChangeSuccess()); - - }); - - it('Expect SUGGESTION_CHANGED action being passed When onSuggestionsChange is dispatched with enter key.', function() { - const store = mockStore({}); - const value = 'test'; - - function onSuggestionsChangeSucessfull() { - return {type: autoCompleteSearchBarActionTypes.SUGGESTION_CHANGED, data: value}; - } - - var event = { - keyCode: 13 - }; - - store.dispatch(onSuggestionsChange(event, value)); - expect(store.getActions()[0]).to.deep.equal(onSuggestionsChangeSucessfull()); - }); - - it('Expect fetchRequest being called once and SUGGESTION_FOUND action being when passed fetchRequestedValues is dispatched, and a valid response is sent in mock', done => { - const store = mockStore({}); - const value = 'test'; - - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').once().withArgs(TSUI_SEARCH_URL, POST, POST_HEADER, value).returns(Promise.resolve(autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1)); - store.dispatch(fetchRequestedValues(() => networkCall.fetchRequest(TSUI_SEARCH_URL, POST, POST_HEADER, value))); - mockNetwork.verify(); - mockNetwork.restore(); - - function onCreateSuggestionFoundEvent() { - return { - type: autoCompleteSearchBarActionTypes.SUGGESTION_FOUND, - data: {suggestions : autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits } - }; - } - - setTimeout(() => expect(store.getActions()[0]).to.deep.equal(onCreateSuggestionFoundEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - - - }); - - it('Expect fetchRequest being called once and SUGGESTION_NOT_FOUND action being when passed fetchRequestedValues is dispatched, and a valid response with no hits is sent in mock', done => { - const store = mockStore({}); - const value = 'test'; - - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').once().withArgs(TSUI_SEARCH_URL, POST, POST_HEADER, value).returns(Promise.resolve(autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithOutHits)); - store.dispatch(fetchRequestedValues(() => networkCall.fetchRequest(TSUI_SEARCH_URL, POST, POST_HEADER, value))); - mockNetwork.verify(); - mockNetwork.restore(); - function onCreateSuggestionNotFoundEvent() { - return { - type: autoCompleteSearchBarActionTypes.SUGGESTION_NOT_FOUND - }; - } - - setTimeout(() => expect(store.getActions()[0]).to.deep.equal(onCreateSuggestionNotFoundEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Expect fetchRequest being called once and TIER_SUPPORT_NETWORK_ERROR action being when passed fetchRequestedValues is dispatched, and network error is sent in mock', done => { - const store = mockStore({}); - const value = 'test'; - - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').once().withArgs(TSUI_SEARCH_URL, POST, POST_HEADER, value).returns(Promise.resolve(autoCompleteSearchBarTestConstants.networkError)); - store.dispatch(fetchRequestedValues(() => networkCall.fetchRequest(TSUI_SEARCH_URL, POST, POST_HEADER, value))); - mockNetwork.verify(); - mockNetwork.restore(); - - function onGetInvalidQueryEvent() { - return { - type: tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR, - data: {value: value, errorMsg: ERROR_RETRIEVING_DATA} - }; - } - - setTimeout(() => { - expect(store.getActions()[0].type.toString()).to.equal(tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR.toString()), autoCompleteSearchBarTestConstants.mockRequestTimeOut - }); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Expect fetchRequest being called once and SUGGESTION_FOUND action being when passed queryRequestedValues is dispatched, and network error is sent in mock', done => { - const store = mockStore({}); - const value = 'test'; - - let mockNetwork = sinon.mock(networkCall); - mockNetwork.expects('fetchRequest').once().withArgs(TSUI_SEARCH_URL, POST, POST_HEADER, value).returns(Promise.resolve(autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1)); - store.dispatch(fetchRequestedValues(() => networkCall.fetchRequest(TSUI_SEARCH_URL, POST, POST_HEADER, value))); - mockNetwork.verify(); - mockNetwork.restore(); - - function onCreateSuggestionFoundEvent() { - return { - type: autoCompleteSearchBarActionTypes.SUGGESTION_FOUND, - data: {suggestions : autoCompleteSearchBarTestConstants.validResponseJsonForRequestFromFetchWithHitsType1.hits.hits } - }; - } - - setTimeout(() => expect(store.getActions()[0]).to.deep.equal(onCreateSuggestionFoundEvent()), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Expect TIER_SUPPORT_NETWORK_ERROR action being passed when clearSuggestionsTextField is dispatched with no mock, and network error is sent in mock', done => { - const store = mockStore({}); - const value = 'test'; - - store.dispatch(clearSuggestionsTextField()); - - function onClearSuggestionsTextField() { - return {type: autoCompleteSearchBarActionTypes.CLEAR_SUGGESTIONS_TEXT_FIELD}; - } - - setTimeout(() => expect(store.getActions()[0]).to.deep.equal(onClearSuggestionsTextField()), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); - - it('Expect CLEAR_SUGGESTIONS action being passed when onSuggestionsClearRequested is dispatched with no mock, and network error is sent in mock', done => { - const store = mockStore({}); - const value = 'test'; - - store.dispatch(onSuggestionsClearRequested()); - - function onSuggestionsClearRequestedExpected() { - return{type: autoCompleteSearchBarActionTypes.CLEAR_SUGGESTIONS}; - } - - setTimeout(() => expect(store.getActions()[0]).to.deep.equal(onSuggestionsClearRequestedExpected()), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - setTimeout(() => done(), autoCompleteSearchBarTestConstants.mockRequestTimeOut); - }); -}); diff --git a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarReducer.test.js b/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarReducer.test.js deleted file mode 100644 index a4c35e6..0000000 --- a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarReducer.test.js +++ /dev/null @@ -1,136 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import {expect} from 'chai'; -import React from 'react'; -import {Provider} from 'react-redux'; -import TestUtils from 'react-dom/test-utils'; -import {tierSupportActionTypes} from 'app/tierSupport/TierSupportConstants.js'; -import reducer from 'app/globalAutoCompleteSearchBar/GlobalAutoCompleteSearchBarReducer.js'; -import {MESSAGE_LEVEL_WARNING, MESSAGE_LEVEL_DANGER} from 'utils/GlobalConstants.js'; -import { - autoCompleteSearchBarActionTypes, - NO_MATCHES_FOUND, - ERROR_INVALID_SEARCH_TERMS} from 'generic-components/autoCompleteSearchBar/AutoCompleteSearchBarConstants.js'; -import { - ERROR_RETRIEVING_DATA} from 'app/networking/NetworkConstants.js'; - -describe('AutoCompleteSearchBar - Reducer test ', function() { - - const testSuggestionData = [ - {_source:{ entityType: 'vserver',searchTags:'testing'}}, - {_source:{ entityType: 'vserver',searchTags:'someTag'}}, - {_source:{ entityType: 'vserver',searchTags:'test2'}}]; - - it('AutoCompleteSearchBar reducer - Suggestion not found', function() { - const feedbackMsgText = ''; - const suggestions = []; - const action = {type: autoCompleteSearchBarActionTypes.SUGGESTION_NOT_FOUND}; - const initialState = { - suggestions: suggestions - }; - - const newState = reducer(initialState, action); - expect(newState.suggestions).to.have.deep.property('[0]._source.entityType', 'No Matches Found'); - }); - - it('AutoCompleteSearchBar reducer - Suggestion found', function() { - const feedbackMsgText = ''; - const action = - { - type: autoCompleteSearchBarActionTypes.SUGGESTION_FOUND, - data: { - suggestions: testSuggestionData - } - }; - const initialState = { - suggestions: [] - }; - - const newState = reducer(initialState, action); - expect(newState.suggestions).to.have.deep.property('[0]._source.searchTags', 'testing'); - expect(newState.suggestions).to.have.deep.property('[1]._source.searchTags', 'someTag'); - expect(newState.suggestions).to.have.deep.property('[2]._source.searchTags', 'test2'); - }); - - it('AutoCompleteSearchBar reducer - Clear Suggestion field', function() { - const feedbackMsgText = ''; - const action = {type: autoCompleteSearchBarActionTypes.CLEAR_SUGGESTIONS_TEXT_FIELD, value: 'test'}; - const initialState = { - suggestions: testSuggestionData - }; - - const newState = reducer(initialState, action); - expect(newState.suggestions).to.be.empty; - expect(newState.value).to.equal(''); - }); - - it('AutoCompleteSearchBar reducer - Clear Suggestions', function() { - const feedbackMsgText = ''; - const action = {type: autoCompleteSearchBarActionTypes.CLEAR_SUGGESTIONS, value: 'test'}; - const initialState = { - suggestions: testSuggestionData - }; - - const newState = reducer(initialState, action); - expect(newState.suggestions).to.be.empty; - }); - - it('AutoCompleteSearchBar reducer - Suggestions changed', function() { - const feedbackMsgText = ''; - const action = {type: autoCompleteSearchBarActionTypes.SUGGESTION_CHANGED, value: 'test'}; - const initialState = { - suggestions: testSuggestionData - }; - - const newState = reducer(initialState, action); - expect(newState.suggestions).to.have.deep.property('[0]._source.searchTags', 'testing'); - expect(newState.suggestions).to.have.deep.property('[1]._source.searchTags', 'someTag'); - expect(newState.suggestions).to.have.deep.property('[2]._source.searchTags', 'test2'); - }); - - it('AutoCompleteSearchBar reducer - Network error', function() { - const feedbackMsgText = ''; - const feedbackMsgSeverity = ''; - const action = {type: tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR, data: {value: 'test', errorMsg: ERROR_RETRIEVING_DATA}}; - const initialState = { - suggestions: testSuggestionData - }; - - const newState = reducer(initialState, action); - expect(newState.suggestions).to.be.empty; - expect(newState.feedbackMsgText).to.equal(ERROR_RETRIEVING_DATA); - expect(newState.feedbackMsgSeverity).to.equal(MESSAGE_LEVEL_DANGER); - }); - - it('AutoCompleteSearchBar reducer - TS_NODE_SEARCH_INVALID_TERMS', function(){ - const feedbackMsgText = ERROR_INVALID_SEARCH_TERMS; - const action = {type: tierSupportActionTypes.TS_NODE_SEARCH_INVALID_TERMS, data: {value: 'test', errorMsg: ERROR_INVALID_SEARCH_TERMS}}; - const initialState = { - suggestions: testSuggestionData - }; - const newState = reducer(initialState, action); - expect(newState.suggestions).to.be.empty; - expect(newState.cachedSuggestions).to.be.empty; - expect(newState.feedbackMsgText).to.equal(ERROR_INVALID_SEARCH_TERMS); - expect(newState.feedbackMsgSeverity).to.equal(MESSAGE_LEVEL_WARNING); - }); - -}); diff --git a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarTestConstants.js b/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarTestConstants.js deleted file mode 100644 index 57f7af8..0000000 --- a/test/tierSupport/autoCompleteSearchBar/autoCompleteSearchBarTestConstants.js +++ /dev/null @@ -1,231 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -const validResponseJsonForRequestFromFetchWithHitsType1 = { - "took": 5, - "timed_out": false, - "_shards": { - "total": 5, - "successful": 5, - "failed": 0 - }, - "hits": { - "total": 9376, - "max_score": 3.3899312, - "hits": [ - { - "_index": "entitysearchindex-localhost", - "_type": "aaiEntities", - "_id": "4785c7ec8ae11be12ca742248713346ea03a473ef65aa84bbea102c67fa5d", - "_score": 3.3899312, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1", - "searchTagIDs": "0", - "searchTags": "service-instance-id=a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1" - } - }, - { - "_index": "entitysearchindex-localhost", - "_type": "aaiEntities", - "_id": "8e9baedcbf1cb2f9439f6b8b5eeaf0b8fa364086c8ef5ee6edcf6f5da114", - "_score": 3.1589103, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "d1f3c3be-7a7f-42ea-a9ac-ca20af1588b8", - "searchTagIDs": "0", - "searchTags": "service-instance-id=d1f3c3be-7a7f-42ea-a9ac-ca20af1588b8" - } - }, - { - "_index": "entitysearchindex-localhost", - "_type": "aaiEntities", - "_id": "dd4bdbf810f5c1bc7be7d91f241b0221d75617a45f574f2ed6207e9c8ceb9e", - "_score": 3.147036, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "6c27a7cb-d8e1-45a8-aa12-61a694201cca", - "searchTagIDs": "0", - "searchTags": "service-instance-id=6c27a7cb-d8e1-45a8-aa12-61a694201cca" - } - }, - { - "_index": "entitysearchindex-localhost2", - "_type": "aaiEntities", - "_id": "4785c7ec8ae11be12ca742248713346ea03a473ef65aa84bbea102c67fa5d", - "_score": 3.3899312, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1", - "searchTagIDs": "0", - "searchTags": "service-instance-id=a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1" - } - }, - { - "_index": "entitysearchindex-localhost2", - "_type": "aaiEntities", - "_id": "8e9baedcbf1cb2f9439f6b8b5eeaf0b8fa364086c8ef5ee6edcf6f5da114", - "_score": 3.1589103, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "d1f3c3be-7a7f-42ea-a9ac-ca20af1588b8", - "searchTagIDs": "0", - "searchTags": "service-instance-id=d1f3c3be-7a7f-42ea-a9ac-ca20af1588b8" - } - }, - { - "_index": "entitysearchindex-localhost2", - "_type": "aaiEntities", - "_id": "dd4bdbf810f5c1bc7be7d91f241b0221d75617a45f574f2ed6207e9c8ceb9e", - "_score": 3.147036, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "6c27a7cb-d8e1-45a8-aa12-61a694201cca", - "searchTagIDs": "0", - "searchTags": "service-instance-id=6c27a7cb-d8e1-45a8-aa12-61a694201cca" - } - } - ] - } -}; - -const validResponseJsonForRequestFromFetchWithHitsType2 = { - "took": 5, - "timed_out": false, - "_shards": { - "total": 5, - "successful": 5, - "failed": 0 - }, - "hits": { - "total": 9376, - "max_score": 3.3899312, - "hits": [ - { - "_index": "entitysearchindex-localhost", - "_type": "aaiEntities", - "_id": "4785c7ec8ae11be12ca742248713346ea03a473ef65aa84bbea102c67fa5d", - "_score": 3.3899312, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "entityPrimaryKeyValue": "a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1", - "searchTagIDs": "0", - "searchTags": "hostname-id=a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1" - } - }, - { - "_index": "entitysearchindex-localhost", - "_type": "aaiEntities", - "_id": "8e9baedcbf1cb2f9439f6b8b5eeaf0b8fa364086c8ef5ee6edcf6f5da114", - "_score": 3.1589103, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "d1f3c3be-7a7f-42ea-a9ac-ca20af1588b8", - "searchTagIDs": "0", - "searchTags": "hostname-id=d1f3c3be-7a7f-42ea-a9ac-ca20af1588b8" - } - }, - { - "_index": "entitysearchindex-localhost", - "_type": "aaiEntities", - "_id": "dd4bdbf810f5c1bc7be7d91f241b0221d75617a45f574f2ed6207e9c8ceb9e", - "_score": 3.147036, - "_source": { - "entityType": "service-instance", - "edgeTagQueryEntityFieldName": "service-instance.service-instance-id", - "edgeTagQueryEntityFieldValue": "6c27a7cb-d8e1-45a8-aa12-61a694201cca", - "searchTagIDs": "0", - "searchTags": "hostname-id=6c27a7cb-d8e1-45a8-aa12-61a694201cca" - } - } - ] - } -}; - -const validResponseJsonForRequestFromFetchWithOutHits = { - "took": 5, - "timed_out": false, - "_shards": { - "total": 5, - "successful": 5, - "failed": 0 - }, - "hits": { - "total": 0, - "max_score": 3.3899312, - "hits": [] - } -}; - -const networkError = { - "error": "Network Error" -}; - -const validResponseJsonForNodeSearchFromFetchWithHits = { - "graphMeta":{}, - "nodes" : [ { - "id" : "service-instance.PRUCPEHOST0627002", - "itemType" : "service-instance", - "itemNameKey" : "service-instance.PRUCPEHOST0627002", - "itemNameValue" : "PRUCPEHOST0627002", - "itemProperties" : { - "resource-version" : "1467233099", - "service-instance-id" : "PRUCPEHOST0627002" - }, - "nodeMeta" : { - "className" : "selectedSearchedNodeClass", - "nodeDebug" : null, - "selfLinkResponseTimeInMs" : 131, - "relationshipNode" : false, - "searchTarget" : true, - "enrichableNode" : false - } - } ] -}; - -const inValidResponseJsonForNodeSearchFromFetchWithHits = { - "graphMeta":{}, - "nodes" : [] -}; - -const nodeSearchKeyword = 'service-instance-id=a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1'; -const nodeSearchKeywordWithOutEqualSign = 'a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1'; -const multipleNodeSearchKeyword = 'service-instance-id=a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1, service-instance-id=a162a2a2-ea7e-4e94-afc3-e9d064a3c2a1'; -const mockRequestTimeOut = 1; -export default{ - validResponseJsonForRequestFromFetchWithHitsType1: validResponseJsonForRequestFromFetchWithHitsType1, - validResponseJsonForRequestFromFetchWithHitsType2: validResponseJsonForRequestFromFetchWithHitsType2, - validResponseJsonForRequestFromFetchWithOutHits: validResponseJsonForRequestFromFetchWithOutHits, - networkError: networkError, - validResponseJsonForNodeSearchFromFetchWithHits: validResponseJsonForNodeSearchFromFetchWithHits, - inValidResponseJsonForNodeSearchFromFetchWithHits: inValidResponseJsonForNodeSearchFromFetchWithHits, - nodeSearchKeyword: nodeSearchKeyword, - nodeSearchKeywordWithOutEqualSign: nodeSearchKeywordWithOutEqualSign, - multipleNodeSearchKeyword: multipleNodeSearchKeyword, - mockRequestTimeOut: mockRequestTimeOut -}; diff --git a/test/tierSupport/tierSupport.test.js b/test/tierSupport/tierSupport.test.js deleted file mode 100644 index 533a6bf..0000000 --- a/test/tierSupport/tierSupport.test.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import React from 'react'; -import {Provider} from 'react-redux'; - -import TestUtilities from 'react-addons-test-utils'; -import { expect } from 'chai'; - -import TierSupport from 'app/tierSupport/TierSupport.jsx'; - -describe("Tier Support", function() { - - beforeEach(function() { - this.component = TestUtilities.renderIntoDocument(); - }); - -}); diff --git a/test/utils/MockRest.js b/test/utils/MockRest.js deleted file mode 100644 index b6840e2..0000000 --- a/test/utils/MockRest.js +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -const queue = { - fetch: [], - put: [], - post: [], - destroy: [] -}; - -const initQueue = () => { - queue['fetch'] = []; - queue['put'] = []; - queue['post'] = []; - queue['destroy'] = []; -}; - -const handleOperation = (handler, options) => { - if(typeof handler === 'function') { - return Promise.resolve(handler(options)); - } - else { - return Promise.resolve(handler); - } -}; - -export default { - - fetch(baseUrl, options) { - const {fetch} = queue; - if(!fetch.length) { - throw new Error(`Fetch operation was called without proper handler. baseUrl: '${baseUrl}' options: '${options}'`); - } - return handleOperation(fetch.shift(), {options, baseUrl}); - }, - - put(baseUrl, data, options) { - const {put} = queue; - if(!put.length) { - throw new Error(`put operation was called without proper handler. baseUrl: '${baseUrl}' options: '${options}'`); - } - return handleOperation(put.shift(), {data, options, baseUrl}); - }, - - post(baseUrl, data, options) { - const {post} = queue; - if(!post.length) { - throw new Error(`post operation was called without proper handler. baseUrl: '${baseUrl}' options: '${options}'`); - } - return handleOperation(post.shift(), {data, options, baseUrl}); - }, - - destroy(baseUrl, options) { - const {destroy} = queue; - if(!destroy.length) { - throw new Error(`Destroy operation was called without proper handler. baseUrl: '${baseUrl}' options: '${options}'`); - } - return handleOperation(destroy.shift(), {options, baseUrl}); - }, - - addHandler(operation, handler) { - queue[operation].push(handler); - }, - - resetQueue() { - initQueue(); - } -}; diff --git a/test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizations.test.js b/test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizations.test.js deleted file mode 100644 index 0b893a9..0000000 --- a/test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizations.test.js +++ /dev/null @@ -1,92 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import React from 'react'; -import TestUtils from 'react-dom/test-utils'; -import {storeCreator} from 'app/AppStore.js'; -import {Provider} from 'react-redux'; -import { expect } from 'chai'; -import VnfSearchOrchStatusVisualizations from 'app/vnfSearch/VnfSearchOrchestratedStatusVisualization.jsx'; -import VnfSearchProvStatusVisualizations from 'app/vnfSearch/VnfSearchProvStatusVisualization.jsx'; -import VnfSearchTotalCountVisualization from 'app/vnfSearch/VnfSearchTotalCountVisualization.jsx'; -import { - CHART_PROV_STATUS, - CHART_ORCH_STATUS, - TOTAL_VNF_COUNT} from 'app/vnfSearch/VnfSearchConstants.js'; - -describe('VNF Visualizations Structure Tests', function () { - - function createState(processedOrchStatusCountChartData, - processedProvStatusCountChartData) { - return { - vnfSearch: { - auditVisualizationsData: { - processedOrchStatusCountChartData: processedOrchStatusCountChartData, - processedProvStatusCountChartData: processedProvStatusCountChartData - } - } - }; - } - - it('VNF: Visualization layout VNF Orch Status, no data', function () { - const store = storeCreator(createState( - CHART_ORCH_STATUS.clearingEmptyData, - CHART_PROV_STATUS.clearingEmptyData - )); - this.component = TestUtils.renderIntoDocument( - - - - ); - let visualizationContainer = TestUtils.scryRenderedDOMComponentsWithClass(this.component, 'visualizations'); - expect(visualizationContainer).to.exist; // there is always a visualizations container - expect(visualizationContainer[0].className).to.contain('hidden'); // make sure visualizations is hidden - }); - - it('VNF: Visualization layout VNF Prov Status, no data', function () { - const store = storeCreator(createState( - CHART_ORCH_STATUS.clearingEmptyData, - CHART_PROV_STATUS.clearingEmptyData - )); - this.component = TestUtils.renderIntoDocument( - - - - ); - let visualizationContainer = TestUtils.scryRenderedDOMComponentsWithClass(this.component, 'visualizations'); - expect(visualizationContainer).to.exist; // there is always a visualizations container - expect(visualizationContainer[0].className).to.contain('hidden'); // make sure visualizations is hidden - }); - - - it('VNF: Visualization layout Total VNF, no data', function () { - const store = storeCreator(createState( - TOTAL_VNF_COUNT.clearingEmptyValue - )); - this.component = TestUtils.renderIntoDocument( - - - - ); - let visualizationContainer = TestUtils.scryRenderedDOMComponentsWithClass(this.component, 'visualizations'); - expect(visualizationContainer).to.exist; // there is always a visualizations container - expect(visualizationContainer[0].className).to.contain('hidden'); // make sure visualizations is hidden - }); -}); diff --git a/test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizationsReducer.test.js b/test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizationsReducer.test.js deleted file mode 100644 index 81ed2bf..0000000 --- a/test/vnfSearch/vnfSearchVisualizations/vnfSearchVisualizationsReducer.test.js +++ /dev/null @@ -1,144 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -import React from 'react'; -import { expect } from 'chai'; -import reducer from 'app/vnfSearch/VnfSearchReducer.js'; -import { - CHART_ORCH_STATUS, - CHART_PROV_STATUS, vnfSearchVisualizationsActionTypes} from 'app/vnfSearch/VnfSearchConstants.js'; - - - -describe('VNF: Audit Visualizations Reducers test suite', function() { - const initialState = { - processedProvStatusCountChartData: CHART_PROV_STATUS.clearingEmptyData, - processedOrchStatusCountChartData: CHART_ORCH_STATUS.clearingEmptyData - }; - const initStateWithData = { - processedProvStatusCountChartData: [ - { - values: [ - { - x: 'complex', - y: 60 - } - ] - } - ], - processedOrchStatusCountChartData: [ - { - values: [ - { - x: 'prov-status', - y: 60 - } - ] - } - ] - }; - - - - it('VNF: COUNT_BY_ORCH_STATUS_RECEIVED event', function() { - const chartData = [ - { - 'values': [ - { 'x': 'physical-location-id', 'y': 22}, - { 'x': 'prov-status', 'y': 14}, - { 'x': 'status-type-3', 'y': 24} - ] - } - ]; - - const action = { - type: vnfSearchVisualizationsActionTypes.COUNT_BY_ORCH_STATUS_RECEIVED, - data: { - orchStatusCountChartData: { - chartData: chartData, - } - } - }; - - const newState = reducer(initialState, action); - expect(newState.processedOrchStatusCountChartData[0].values.length).to.equal(3); - expect(newState.processedOrchStatusCountChartData[0].values[0]['x']).to.equal('physical-location-id'); - expect(newState.processedOrchStatusCountChartData[0].values[1]['x']).to.equal('prov-status'); - expect(newState.processedOrchStatusCountChartData[0].values[2]['x']).to.equal('status-type-3'); - expect(newState.processedOrchStatusCountChartData[0].values[0]['y']).to.equal(22); - expect(newState.processedOrchStatusCountChartData[0].values[1]['y']).to.equal(14); - expect(newState.processedOrchStatusCountChartData[0].values[2]['y']).to.equal(24); - }); - - it('VNF: COUNT_BY_PROV_STATUS_RECEIVED event', function() { - const chartData = [ - { - 'values': [ - { 'x': 'physical-location-id', 'y': 22}, - { 'x': 'prov-status', 'y': 14}, - { 'x': 'status-type-3', 'y': 24} - ] - } - ]; - - const action = { - type: vnfSearchVisualizationsActionTypes.COUNT_BY_PROV_STATUS_RECEIVED, - data: { - provStatusCountChartData: { - chartData: chartData, - } - } - }; - - const newState = reducer(initialState, action); - expect(newState.processedProvStatusCountChartData[0].values.length).to.equal(3); - expect(newState.processedProvStatusCountChartData[0].values[0]['x']).to.equal('physical-location-id'); - expect(newState.processedProvStatusCountChartData[0].values[1]['x']).to.equal('prov-status'); - expect(newState.processedProvStatusCountChartData[0].values[2]['x']).to.equal('status-type-3'); - expect(newState.processedProvStatusCountChartData[0].values[0]['y']).to.equal(22); - expect(newState.processedProvStatusCountChartData[0].values[1]['y']).to.equal(14); - expect(newState.processedProvStatusCountChartData[0].values[2]['y']).to.equal(24); - }); - - - it('VNF: Total VNF event', function() { - - - const action = { - type: vnfSearchVisualizationsActionTypes.TOTAL_VNF_COUNT_RECEIVED, - data: {count: 10} - }; - - const newState = reducer(initialState, action); - expect(newState.count).to.equal(10); - - }); - - - it('VNF: NETWORK_ERROR event', function() { - const action = { - type: vnfSearchVisualizationsActionTypes.VNF_SEARCH_NETWORK_ERROR - } - const newState = reducer(initStateWithData, action); - expect(newState.processedProvStatusCountChartData).to.deep.equal(CHART_PROV_STATUS.clearingEmptyData); - expect(newState.processedOrchStatusCountChartData).to.deep.equal(CHART_ORCH_STATUS.clearingEmptyData); - }); - -}); -- 2.16.6